Bläddra i källkod

Complete rewrite of the WATO configuration page.
Now there are categories for better sorting.

Extensive rewrite of the FHEM-plugin was necessary.

erdoking 8 år sedan
förälder
incheckning
a6563037af
2 ändrade filer med 516 tillägg och 338 borttagningar
  1. 96 57
      local/share/check_mk/checks/fhem
  2. 420 281
      local/share/check_mk/web/plugins/wato/fhem.py

+ 96 - 57
local/share/check_mk/checks/fhem

@@ -3,6 +3,7 @@
 
 import time
 import datetime
+import re
 
 # Example for output from agent
 # ---------------------------------------------------------
@@ -167,6 +168,7 @@ def check_fhem(item, params, info):
           display_value = "" 
           ignoreit        = ""
 #          var_data_age = ""
+          fetch_plain = None
 
 
           ## check if device output data (temperature, humidity, ... )
@@ -179,6 +181,23 @@ def check_fhem(item, params, info):
                     var_min = 'level_%s_min' % title
                     var_data_age = '%s_date' % title
                     var_plain = 'var_%s' % title        ## e.g. contact: open (var_plain => open)
+                    var_params = '%s_params' % title
+
+                    ## set upper level to default values if exist else we set to null
+                    if eval("var_max") in params:
+                            upper_warn, upper_crit = params[eval("var_max")]
+                    else:
+                            upper_warn, upper_crit = 0, 0
+
+                    ## set lower level to default values if exist else we set to null
+                    if eval("var_min") in params:
+                            lower_warn, lower_crit = params[eval("var_min")]
+                    else:
+                            lower_warn, lower_crit = 0, 0
+
+                    ## set plain text variables to default
+                    if eval("var_plain") in params:
+                            fetch_plain = params[eval("var_plain")]
 
         #            print var_data_age
         #                    if  params[eval("desiredtemp_date")]:
@@ -187,46 +206,58 @@ def check_fhem(item, params, info):
         #            except:
         #                   pass
 
-                    try:
-                        if params[eval("var_max")]:
-                                ## check the difference between dewpoint and temperature
-                                if key == 'dewpoint':
-                                        max_warn_dewpoint, max_crit_dewpoint = params[eval("var_max")]
-                                        max_warn = float(data['temperature']['value']) - max_warn_dewpoint
-                                        max_crit = float( data['temperature']['value']) - max_crit_dewpoint
-                                else:   
-                                        max_warn, max_crit = params[eval("var_max")]
-                        pass
-                    except:
-                        max_warn, max_crit = 0, 0
-                        pass
-                    try:
-                        if params[eval("var_min")]:
-                                min_warn, min_crit = params[eval("var_min")]
-                        pass
-                    except:
-                        min_warn, min_crit = 0, 0
-                        pass
-                    try:
-                        if params[eval("var_plain")]:
-                                var_plain = params[eval("var_plain")]
-                        pass
-                    except:
-                        var_plain = None
-                        pass
-
-                    try:
-                        if eval(var_data_age) and eval(var_data_age) != "":
-                                local_timestamp = time.time()
-                                var_data_timestamp = time.mktime(datetime.datetime.strptime(eval(var_data_age) , "%Y-%m-%d %H:%M:%S").timetuple())
-                                data_age = int( ( local_timestamp - var_data_timestamp ) / 60 )
-                        pass
-                    except:
-                        ## bugfix, at beginning all timestamp up-to-date 
-                        ## necessary because some devices don't send all data (weather-provider has no battery)
-                        data_age = 0
-                        pass
-
+                    for param_group in params.keys():
+
+                      ## just loop over param categories (WATO)
+                      ## all categories need to named "*_params"
+                      if re.match('[a-z]+_params', param_group) is not None:
+
+                        ## loop over sub-categories
+                        for param_subgroup in params[param_group]:
+
+                            ## get configuration from WATO
+                            ## we create the runtime variable "fetch_params"
+                            try:
+                                ## like: fetch_params = params["climate_params"]
+                                fetch_params = params[param_group][param_subgroup]
+                            except:
+                                pass
+
+                            ## get minimal thresholds
+                            try:
+                                if eval("var_min") in fetch_params:
+                                        ## like: if level_temperature_min in fetch_params["climate_params"]:
+                                        lower_warn, lower_crit = fetch_params[eval("var_min")]
+                            except:
+                                       pass
+
+                            ## get maximal thresholds
+                            try:
+                                ## like: if level_temperature_max in fetch_params[]:
+                                if eval("var_max") in fetch_params: 
+                                        upper_warn, upper_crit = fetch_params[eval("var_max")]
+                            except:
+                                pass
+
+                            ## get plain text
+                            try:
+                                ## like: if level_temperature_min in fetch_params[]:
+                                if eval("var_plain") in fetch_params:
+                                        fetch_plain = fetch_params[eval("var_plain")]
+                            except:
+                                pass
+ 
+                     ## not used (yet)                                    
+#                    try:
+#                        if eval(var_data_age) and eval(var_data_age) != "":
+#                                local_timestamp = time.time()
+#                                var_data_timestamp = time.mktime(datetime.datetime.strptime(eval(var_data_age) , "%Y-%m-%d %H:%M:%S").timetuple())
+#                                data_age = int( ( local_timestamp - var_data_timestamp ) / 60 )
+#                    except:
+#                        ## bugfix, at beginning all timestamp up-to-date 
+#                        ## necessary because some devices don't send all data (weather-provider has no battery)
+#                        data_age = 0
+#                        pass
 
         #            if data_age > dage_crit:
         ##                 print ("data_age = %s, dage_crit = %s" % (data_age, dage_crit))
@@ -237,6 +268,12 @@ def check_fhem(item, params, info):
         #                 warnlevel = 1
         #            else:
 
+                    ## calulate warn level for dewpoint 
+                    if key == 'dewpoint':
+                        upper_warn = float(data['temperature']['value']) - upper_warn
+                        upper_crit = float(data['temperature']['value']) - upper_crit
+
+                    ## ignore humidity by default if dewpoint is given
                     if key == 'humidity' and params['var_dewpoint_override'] == 'true':
                         ignoreit = 'true'
 
@@ -245,38 +282,39 @@ def check_fhem(item, params, info):
                     ## Just filter out some HomeMatic-channel
                     if channel == '' or data[key]['channel'] == "%s_%s" % (item, channel):
                             ## check critical level (max/min)
-                            if ( (max_crit != 0 and float(value) >= max_crit) or (min_crit != 0 and float(value) <= min_crit) ) and not ignoreit:
-                                if max_crit != 0 and float(value) >= max_crit:
-                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!!)' % ( value, unit, max_warn, unit, max_crit, unit))
-                                elif float(value) <= min_crit:
-                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!!)' % ( value, unit, min_warn, unit, min_crit, unit)) 
+                            if ( (upper_crit != 0 and float(value) >= upper_crit) or (lower_crit != 0 and float(value) <= lower_crit) ) and not ignoreit:
+                                if upper_crit != 0 and float(value) >= upper_crit:
+                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!!)' % ( value, unit, upper_warn, unit, upper_crit, unit))
+                                elif float(value) <= lower_crit:
+                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!!)' % ( value, unit, lower_warn, unit, lower_crit, unit)) 
                                 errorlevel = 2
                             ## check warning level (max/min)
-                            elif ( (max_warn != 0 and float(value) >= max_warn) or (min_warn != 0 and float(value) <= min_warn) ) and not ignoreit:
-                                if max_warn != 0 and float(value) >= max_warn:
-                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!)' % ( value, unit, max_warn, unit, max_crit, unit))
-                                elif float(value) <= min_warn:
-                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!)' % ( value, unit, min_warn, unit, min_crit, unit))
+                            elif ( (upper_warn != 0 and float(value) >= upper_warn) or (lower_warn != 0 and float(value) <= lower_warn) ) and not ignoreit:
+                                if upper_warn != 0 and float(value) >= upper_warn:
+                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!)' % ( value, unit, upper_warn, unit, upper_crit, unit))
+                                elif float(value) <= lower_warn:
+                                        display_value = ('%s%s (warn/crit at %s%s/%s%s) (!)' % ( value, unit, lower_warn, unit, lower_crit, unit))
                                 warnlevel = 1
-                            elif var_plain:
+                            elif fetch_plain:
                                 ## just alert if value not identic or ignored
-                                if value == var_plain or var_plain == "ignore":
+                                if value == fetch_plain or fetch_plain == "ignore":
                                         if show:
                                                 display_value = ('%s%s' % ( value, unit ))
                                         if perfd:
                                                 perfdata.append( ( title, 1, "" ) )
                                 else:
-                                        display_value = ("%s (expected: %s) (!!)" % (value, var_plain))
+                                        display_value = ("%s (expected: %s) (!!)" % (value, fetch_plain))
                                         errorlevel = 2
                                         if perfd:
                                                 perfdata.append( ( title, 0, "" ) )
                             ## define output
                             elif show:
-                                display_value = ('%s%s' % ( value, unit ))
+                                display_value = ('%s%s' % ( value, unit))
+
 
                             ## define perfdata (just add numeric values)
-                            if perfd and not var_plain:
-                                perfdata.append( ( title, value, max_warn, max_crit, "", "" ) )
+                            if perfd and not fetch_plain:
+                                perfdata.append( ( title, value, upper_warn, upper_crit, "", "" ) )
 
 
                             ## not used (yet)
@@ -319,7 +357,7 @@ factory_settings["fhem_default_params"] = {
         "level_batteryLevel_min"       : (2.3, 2.1),       # warn/crit for max. temperature
         "level_download_min"           : (10.0, 8.0),      # warn/crit for min download (speedtest)
         "level_upload_min"             : (1.5, 1.0),       # warn/crit for min upload (speedtest)
-        "level_ping"                   : (100, 150),       # warn/crit for ping (speedtest)
+        "level_ping_max"               : (100, 150),       # warn/crit for ping (speedtest)
         "var_activity"                 : ("alive"),        # default for alive
         "var_presence"                 : ("present"),      # default for presence
         "var_contact"                  : ("ignore"),       # default for contact
@@ -330,6 +368,7 @@ factory_settings["fhem_default_params"] = {
         "var_modusBtnLock"             : ("ignore"),       # modus button lock
         "var_RGB_color"                : ("ignore"),       # RGB color hexcode
         "var_brightness"               : ("ignore"),       # color brightness
+        "var_state"                    : ("ignore"),       # reading state
 }
 
 check_info['fhem'] = {

+ 420 - 281
local/share/check_mk/web/plugins/wato/fhem.py

@@ -9,257 +9,393 @@ register_check_parameters(
     subgroup_environment,
     "fhem",
     _("FHEM"),
-    Transform(
-        Dictionary(
-            elements = [
-                ( "level_temperature_max",
-                  Tuple(
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to 1000 to disable."),
-                      title = _("Upper Temperature Levels"),
-                      elements = [
-                          Integer(title = _("Warning at"), unit = u"°C", default_value = 26),
-                          Integer(title = _("Critical at"), unit = u"°C", default_value = 30),
-                      ]
-                )),
-                ( "level_temperature_min",
-                  Tuple(
-                      title = _("Lower Temperature Levels"),
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to -1000 to disable."),
-                      elements = [
-                          Integer(title = _("Warning below"), unit = u"°C", default_value = 0),
-                          Integer(title = _("Critical below"), unit = u"°C", default_value = -10),
-                      ]
-                )),
-#                ( "output_unit",
-#                  DropdownChoice(
-#                      title = _("Display values in "),
-#                      choices = [
-#                        ( "c", _("Celsius") ),
-#                        ( "f", _("Fahrenheit") ),
-#                        ( "k", _("Kelvin") ),
-#                      ]
-#                )),
-                ( "level_humidity_max",
-                  Tuple(
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to 1000 to disable."),
-                      title = _("Upper huminity levels"),
-                      elements = [
-                          Integer(title = _("Warning at"), unit = u"%", default_value = 70),
-                          Integer(title = _("Critical at"), unit = u"%", default_value = 80),
-                      ]
-                )),
-                ( "level_humidity_min",
-                  Tuple(
-                      title = _("Lower huminity levels"),
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to -1000 to disable."),
-                      elements = [
-                          Integer(title = _("Warning below"), unit = u"%", default_value = 50),
-                          Integer(title = _("Critical below"), unit = u"%", default_value = 45),
-                      ]
-                )),
-                ( "level_dewpoint_max",
-                  Tuple(
-                      title = _("diff to temperatur (exp. 17°C (dewp) vs 20°C(temp)"),
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to 999 to disable."),
-                      elements = [
-                          Integer(title = _("Warning below"), unit = u"%", default_value = 3),
-                          Integer(title = _("Critical below"), unit = u"%", default_value = 1),
-                      ]
-                )),
-               ("var_dewpoint_override",
-                 Alternative(
-                    title = _('state'),
-                    style = "dropdown",
-                    allow_empty = False,
-                    help = _("don't alert humidity if dewpoint given. (default: true)"),
-                    elements = [
-                        FixedValue(
-                            'true',
-                            totext = "true",
-                            title = _("true"),
-                        ),
-                        FixedValue(
-                            'false',
-                            totext = "false",
-                            title = _("false"),
-                        ),
-                   ]
-                )),
+    Dictionary(
+        title = _('FHEM parameters'),
+        help = _('configure FHEM devices'),
+        elements = [
+            ## ####################################################
+            ## Category common
+            ## ####################################################
+            ('common_params', Dictionary(
+             title = "Common",
+             required_keys = [],
+             elements = [
+              ## ----------------------------------------------------
+              ## Sub-category Temperatur
+              ## ----------------------------------------------------
+              ('state_params', Dictionary(
+               title = "Device state",
+               required_keys = [],
+               elements = [
+                       ## Device state (reading)
+                       ("var_state",
+                         Alternative(
+                            title = _('Decice state (r: state)'),
+                            style = "dropdown",
+                            allow_empty = False,
+                            help = _("Check state of reading 'state' (default: ignore) "),
+                            elements = [
+                                FixedValue(
+                                    'ok',
+                                    totext = "ok",
+                                    title = _("ok"),
+                                ),
+                                TextAscii(
+                                    title = _("custom"),
+                                    label = _("custom:"),
+                                    size = 50,
+                                ),
+                           ]
 
-                ( "level_data_age",
-                  Tuple(
-                      title = _("Time left until data becoming obsolet."),
-                      help = _("Time before data becoming obsolete. Set to 0 to disable."),
-                      elements = [
-                          Integer(title = _("Warning older than"), unit = "minutes", default_value = 30),
-                          Integer(title = _("Critical older than"), unit = "minutes", default_value = 90),
-                      ]
-                )),
-                ( "level_batteryLevel_min",
-                  Tuple(
-                      title = _("Level for batterie voltage"),
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable."),
-                      elements = [
-                          Percentage(title = _("Warning at"), unit = "V", default_value = 2.3),
-                          Percentage(title = _("Critical at"), unit = "V", default_value = 2.1),
-                      ]
-                )),
-               ("var_battery",
-                 Alternative(
-                    title = _('State of battery'),
-                    style = "dropdown",
-                    allow_empty = False,
-                    help = _("Check state of reading 'battery' (default: ok) "),
-                    elements = [
-                        FixedValue(
-                            'ignore',
-                            totext = "ignore",
-                            title = _("ignore"),
-                        ),
-                        TextAscii(
-                            title = _("custom"),
-                            label = _("custom:"),
-                            size = 50,
-                        ),
-                   ]
+                        )),
+                       ## Device presence (reading)
+                       ## maybe Sonoff specified?
+                       ("var_presence",
+                         Alternative(
+                            title = _('Decice presence (r: presence)'),
+                            style = "dropdown",
+                            allow_empty = False,
+                            help = _("Check state of reading 'presence' (default: present) "),
+                            elements = [
+                                FixedValue(
+                                    'ignore',
+#                                    totext = "ignore",
+                                    title = _("ignore"),
+                                ),
+                                FixedValue(
+                                    'present',
+                                    totext = "present",
+                                    title = _("present"),
+                                ),
+                                FixedValue(
+                                    'absent',
+                                    totext = "absent",
+                                    title = _("absent"),
+                                ),
 
-                )),
+                                TextAscii(
+                                    title = _("custom"),
+                                    label = _("custom:"),
+                                    size = 50,
+                                ),
+                           ]
 
-                ( "level_download_min",
-                  Tuple(
-                      title = _("Level for speedtest download "),
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable."),
-                      elements = [
-                          Percentage(title = _("Warning at"), unit = "Mbit/s", default_value = 10.0),
-                          Percentage(title = _("Critical at"), unit = "Mbit/s", default_value = 8.0),
-                      ]
-                )),
-                ( "level_upload_min",
-                  Tuple(
-                      title = _("Level for speedtest upload"),
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable."),
-                      elements = [
-                          Percentage(title = _("Warning at"), unit = "Mbit/s", default_value = 1.5),
-                          Percentage(title = _("Critical at"), unit = "Mbit/s", default_value = 1.0),
-                      ]
-                )),
-                ( "level_ping",
-                  Tuple(
-                      title = _("Level for speedtest ping"),
-                      help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable."),
-                      elements = [  
-                          Integer(title = _("Warning at"), unit = "ms", default_value = 100),
-                          Integer(title = _("Critical at"), unit = "ms", default_value = 150),
-                      ]
-                )), 
-               ("var_state",
-                 Alternative(
-                    title = _('state'),
-                    style = "dropdown",
-                    allow_empty = False,
-                    help = _("Check state of reading 'state' (default: ignore) "),
-                    elements = [
-                        FixedValue(
-                            'ok',
-                            totext = "ok",
-                            title = _("ok"),
-                        ),
-                        TextAscii(
-                            title = _("custom"),
-                            label = _("custom:"),
-                            size = 50,
-                        ),
-                   ]
+                        )),
+               ],
+              )),
+              ## ----------------------------------------------------
+              ## Sub-category Battery
+              ## ----------------------------------------------------
+              ('battery_params', Dictionary(
+               title = "Battery state",
+               required_keys = [],
+               elements = [
+                       ## Battery state
+                       ("var_battery",
+                         Alternative(
+                            title = _('State of battery (r: battery'),
+                            style = "dropdown",
+                            allow_empty = False,
+                            help = _("Check state of reading 'battery' (default: ok) "),
+                            elements = [
+                                FixedValue(
+                                    'ignore',
+                                    totext = "ignore",
+                                    title = _("ignore"),
+                                ),
+                                TextAscii(
+                                    title = _("custom"),
+                                    label = _("custom:"),
+                                    size = 50,
+                                ),
+                           ]
 
-                )),
-                ("var_controlMode", 
-                 Alternative(
-                    title = _('Control Mode'),
-                    style = "dropdown",
-                    allow_empty = False,
-                    help = _("Check current control mode. (default: ignore)"),
-                    elements = [
-                        FixedValue(
-                            'auto',
-                            totext = "auto",
-                            title = _("auto"),
-                        ),
-                        FixedValue(
-                            'manual',
-                            totext = "manual",
-                            title = _("manual"),
-                        ),
-                        FixedValue(
-                            'boost',
-                            totext = "boost",
-                            title = _("boost"),
-                        ),
-                        FixedValue(
-                            'day',
-                            totext = "day",
-                            title = _("day"),
-                        ),
-                        FixedValue(
-                            'night',
-                            totext = "night",
-                            title = _("night"),
-                        ),
+                        )),
+                        ## Battery voltage
+                        ( "level_batteryLevel_min",
+                          Tuple(
+                              title = _("Level for batterie voltage (r: batteryLevel)"),
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable."),
+                              elements = [
+                                  Percentage(title = _("Warning at"), unit = "V", default_value = 2.3),
+                                  Percentage(title = _("Critical at"), unit = "V", default_value = 2.1),
+                              ]
+                        )),
 
-                        TextAscii(
-                            title = _("custom"),
-                            label = _("custom:"),
-                            size = 50,
-                        ),
-                   ]
-                )),
-                ("var_alive",
-                 Alternative(
-                    title = _('Alive state'),
-                    style = "dropdown",
-                    allow_empty = False,
-                    help = _("Check state of reading 'alive' on HomeMatic devices (default: ignore) "),
-                    elements = [
-                        FixedValue(
-                            'alive',
-                            totext = "alive",
-                            title = _("alive"),
-                        ),
-                        FixedValue(
-                            'dead',
-                            totext = "dead",
-                            title = _("dead"),
-                        ),
-                        TextAscii(
-                            title = _("custom"),
-                            label = _("custom:"),
-                            size = 50,
-                        ),
-                   ]
-                )),
-                ("var_contact",
-                 Alternative(
-                    title = _('Contact state'),
-                    style = "dropdown",
-                    allow_empty = False,
-                    help = _("Check state of reading 'contact' (default: ignore) "),
-                    elements = [
-                        FixedValue(
-                            'open',
-                            totext = "open",
-                            title = _("open"),
-                        ),
-                        FixedValue(
-                            'closed',
-                            totext = "closed",
-                            title = _("closed"),
-                        ),
-                        TextAscii(
-                            title = _("custom"),
-                            label = _("custom:"),
-                            size = 50,
-                        ),
-                   ]
-               )),
+               ],
+              )),
+
+             ]
+            )),
+
+            ## ####################################################
+            ## Category Climate
+            ## ####################################################
+            ('climate_params', Dictionary(
+             title = "Climate",
+             required_keys = [],
+             elements = [
+              ## ----------------------------------------------------
+              ## Sub-category Temperature
+              ## ----------------------------------------------------
+              ('temperature_params', Dictionary(
+               title = "Temperature",
+               required_keys = [],
+               elements = [
+                       ## Temperature upper level
+                       ( "level_temperature_max",
+                          Tuple(
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to 1000 to disable."),
+                              title = _("Upper Levels (r: temperature)"),
+                              elements = [
+                                  Integer(title = _("Warning at"), unit = u"°C", default_value = 26),
+                                  Integer(title = _("Critical at"), unit = u"°C", default_value = 30),
+                              ]
+                        )),
+                        ## Temperature lower level
+                        ( "level_temperature_min",
+                          Tuple(
+                              title = _("Lower Levels (r: temperature)"),
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to -1000 to disable."),
+                              elements = [
+                                  Integer(title = _("Warning below"), unit = u"°C", default_value = 0),
+                                  Integer(title = _("Critical below"), unit = u"°C", default_value = -10),
+                              ]
+                        )),
+               ]
+              )),
+              ## ----------------------------------------------------
+              ## Sub-category Humidity 
+              ## ----------------------------------------------------
+              ('humidity_params', Dictionary(
+               title = "Humidity",
+               required_keys = [],
+               elements = [
+                        ## Humidity upper level
+                        ( "level_humidity_max",
+                          Tuple(
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to 1000 to disable."),
+                              title = _("Upper levels (r: humidity)"),
+                              elements = [
+                                  Integer(title = _("Warning at"), unit = u"%", default_value = 70),
+                                  Integer(title = _("Critical at"), unit = u"%", default_value = 80),
+                              ]
+                        )),
+                        ## Humidity lower level
+                        ( "level_humidity_min",
+                          Tuple(
+                              title = _("Lower levels (r: humidity)"),
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to -1000 to disable."),
+                              elements = [
+                                  Integer(title = _("Warning below"), unit = u"%", default_value = 50),
+                                  Integer(title = _("Critical below"), unit = u"%", default_value = 45),
+                              ]
+                        )),
+               ]
+              )),
+              ## ----------------------------------------------------
+              ## Sub-category dewpoint
+              ## ----------------------------------------------------
+              ('dewpoint_params', Dictionary(
+               title = "Dewpoint",
+               required_keys = [],
+               elements = [
+                        ## Dewpoint upper level
+                        ( "level_dewpoint_max",
+                          Tuple(
+                              title = _("diff to temperatur"),
+                              help = _("exp. 17°C [dewp] vs 20°C [temp] (r: dewpoint) "),
+                              elements = [
+                                  Integer(title = _("Warning below"), unit = u"°C", default_value = 3),
+                                  Integer(title = _("Critical below"), unit = u"°C", default_value = 1),
+                              ]
+                        )),
+                        ## ignore humidity
+                        ("var_dewpoint_override",
+                         Alternative(
+                            title = _('ignore humidity (r: humidity+dewpoint)'),
+                            style = "dropdown",
+                            allow_empty = False,
+                            help = _("don't alert humidity if dewpoint given. (default: true)"),
+                            elements = [
+                                FixedValue(
+                                    'true',
+                                    totext = "true",
+                                    title = _("true"),
+                                ),
+                                FixedValue(
+                                    'false',
+                                    totext = "false",
+                                    title = _("false"),
+                                ),
+                           ]
+                        )),
+               ]
+              )),
+             ],
+            )),
+            ## ####################################################
+            ## Category Various 
+            ## ####################################################
+            ('various_params', Dictionary(
+             title = "Various",
+             help = _("everything else ..."),
+             elements = [
+              ## ----------------------------------------------------
+              ## Sub-category Speedtest 
+              ## ----------------------------------------------------
+              ('speedtest_params', Dictionary(
+               title = "Speedtest",
+               required_keys = [],
+               elements = [
+                        ## speedtest download
+                        ( "level_download_min",
+                          Tuple(
+                              title = _("Level for speedtest download "),
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable. (r: download)"),
+                              elements = [
+                                  Percentage(title = _("Warning at"), unit = "Mbit/s", default_value = 10.0),
+                                  Percentage(title = _("Critical at"), unit = "Mbit/s", default_value = 8.0),
+                              ]
+                        )),
+                        ## speedtest upload
+                        ( "level_upload_min",
+                          Tuple(
+                              title = _("Level for speedtest upload"),
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable. (r: upload)"),
+                              elements = [
+                                  Percentage(title = _("Warning at"), unit = "Mbit/s", default_value = 1.5),
+                                  Percentage(title = _("Critical at"), unit = "Mbit/s", default_value = 1.0),
+                              ]
+                        )),
+                        ## speedtest ping
+                        ( "level_ping_max",
+                          Tuple(
+                              title = _("Level for speedtest ping"),
+                              help = _("You can adjust the levels before this service goes into warning/critical. Set to 0 to disable. (r: ping)"),
+                              elements = [
+                                  Integer(title = _("Warning at"), unit = "ms", default_value = 100),
+                                  Integer(title = _("Critical at"), unit = "ms", default_value = 150),
+                              ]
+                        )),
+               ]
+              )),
+             ],
+            )),
+            ## ####################################################
+            ## Category Device types
+            ## ####################################################
+            ('devicetypes_params', Dictionary(
+             title = "Device types",
+             required_keys = [],
+             elements = [
+              ## ----------------------------------------------------
+              ## Sub-category Light 
+              ## ----------------------------------------------------
+              ('light_params', Dictionary(
+               title = "Light",
+               required_keys = [],
+               elements = [
+                       ("var_RGB_color",
+                         Alternative(
+                            title = _('RGB color (r: RGB)'),
+                            style = "dropdown",
+                            allow_empty = False,
+                            help = _("Check state of reading 'RGB' (without #)"),
+                            elements = [
+                                FixedValue(
+                                    'FFFFFF',
+                                    totext = "white",
+                                    title = _("white"),
+                                ),
+                                TextAscii(
+                                    title = _("custom"),
+                                    label = _("custom:"),
+                                    size = 6,
+                                ),
+                           ]
+
+                        )),
+                       ("var_brightness",
+                         Alternative(
+                            title = _('light brightness (r: brightness)'),
+                            style = "dropdown",
+                            allow_empty = False,
+                            help = _("Check state of reading 'brightness' (default: ignore) "),
+                            elements = [
+                                FixedValue(
+                                    '100',
+                                    totext = "100%",
+                                    title = _("100%"),
+                                ),
+                                FixedValue(
+                                    '0',
+                                    totext = "0%",
+                                    title = _("0%"),
+                                ),
+                                TextAscii(
+                                    title = _("custom"),
+                                    label = _("custom:"),
+                                    size = 3,
+                                ),
+                           ]
+
+                        )),
+
+               ]
+              )),
+              ## ----------------------------------------------------
+              ## Sub-category Contact sensor
+              ## ----------------------------------------------------
+              ('contactsensor_params', Dictionary(
+               title = "Contact sensor",
+               required_keys = [],
+               elements = [
+                        ("var_contact",
+                         Alternative(
+                            title = _('Contact state (r: contact)'),
+                            style = "dropdown",
+                            allow_empty = False,
+                            help = _("Check state of reading 'contact' (default: ignore) "),
+                            elements = [
+                                FixedValue(
+                                    'open',
+                                    totext = "open",
+                                    title = _("open"),
+                                ),
+                                FixedValue(
+                                    'closed',
+                                    totext = "closed",
+                                    title = _("closed"),
+                                ),
+                                TextAscii(
+                                    title = _("custom"),
+                                    label = _("custom:"),
+                                    size = 50,
+                                ),
+                           ]
+                       )),
+
+               ]
+              )),           
+
+             ],
+            )),
+            ## ####################################################
+            ## Category Manufacturer
+            ## ####################################################
+            ('manufacturer_params', Dictionary(
+             title = "Manufacturer",
+             help = _("Manufacturer specific parameter"),
+             elements = [
+              ## ----------------------------------------------------
+              ## Sub-category HomeMatic
+              ## ----------------------------------------------------
+              ('homematic_params', Dictionary(
+               title = "HomeMatic",
+               help = _("HomeMatic specific parameter"),
+               allow_empty = False,
+               elements = [
                ("var_btnLock",
                  Alternative(
                     title = _('btnLock state'),
@@ -290,8 +426,8 @@ register_check_parameters(
                     title = _('globalBtnLock state'),
                     style = "dropdown",
                     allow_empty = False,
-                    help = _("Check state of reading 'globalBtnLock' (default: ignore) "),
-                    elements = [ 
+                    help = _("Check state of reading 'globalBtnLock' [default: ignore] (r: globalBtnLock) "),
+                    elements = [
                         FixedValue(
                             'on',
                             totext = "on",
@@ -315,7 +451,7 @@ register_check_parameters(
                     title = _('modusBtnLock state'),
                     style = "dropdown",
                     allow_empty = False,
-                    help = _("Check state of reading 'modusBtnLock' (default: ignore) "),
+                    help = _("Check state of reading 'modusBtnLock' [default: ignore] (r: modusBtnLock) "),
                     elements = [
                         FixedValue(
                             'on',
@@ -335,61 +471,64 @@ register_check_parameters(
                    ]
 
                 )),
-               ("var_RGB_color",
+                ("var_controlMode",
                  Alternative(
-                    title = _('RGB color'),
+                    title = _('Control Mode'),
                     style = "dropdown",
                     allow_empty = False,
-                    help = _("Check state of reading 'RGB' (without #)"),
+                    help = _("Check current control mode. (default: ignore)"),
                     elements = [
                         FixedValue(
-                            'FFFFFF',
-                            totext = "white",
-                            title = _("white"),
+                            'auto',
+                            totext = "auto",
+                            title = _("auto"),
                         ),
-                        TextAscii(
-                            title = _("custom"),
-                            label = _("custom:"),
-                            size = 6,
+                        FixedValue(
+                            'manual',
+                            totext = "manual",
+                            title = _("manual"),
                         ),
-                   ]
-
-                )),
-               ("var_brightness",
-                 Alternative(
-                    title = _('light brightness'),
-                    style = "dropdown",
-                    allow_empty = False,
-                    help = _("Check state of reading 'brightness' (default: ignore) "),
-                    elements = [
                         FixedValue(
-                            '100',
-                            totext = "100%",
-                            title = _("100%"),
+                            'boost',
+                            totext = "boost",
+                            title = _("boost"),
                         ),
                         FixedValue(
-                            '0',
-                            totext = "0%",
-                            title = _("0%"),
+                            'day',
+                            totext = "day",
+                            title = _("day"),
                         ),
+                        FixedValue(
+                            'night',
+                            totext = "night",
+                            title = _("night"),
+                        ),
+
                         TextAscii(
                             title = _("custom"),
                             label = _("custom:"),
-                            size = 3,
+                            size = 50,
                         ),
                    ]
-
                 )),
 
+               ]
+              )),
 
-            ],
-#                optional_keys = False,
-        ),
-        forth = lambda v: type(v) == tuple and { "levels" : v } or v,
+             ],
+            )),
+
+
+        ],
+#        required_keys = [ 'service_description', 'imap_parameters' ]
     ),
     TextAscii(
         title = _("fhem device"),
         help = _("Specify the name of the FHEM device, i.e. <tt>eg.bad.heizung</tt>"),
+        allow_empty = False,
+        default_value = 0,
     ),
     "dict",
 )
+
+