sfudeus / homematic_exporter

Prometheus exporter for homematic ccu3
Apache License 2.0
23 stars 17 forks source link

HmIP-SWDO state not available #37

Closed mic0rr closed 1 year ago

mic0rr commented 1 year ago

With --dump_parameters XXXXXXXXXXXXX:1 i get

getParamset:
{'STATE': 0}

when closed and {'STATE': 1} when open. But in the metrics are only

homematic_config_pending
homematic_duty_cycle
homematic_low_bat
homematic_unreach
homematic_rssi_device
homematic_operating_voltage
homematic_update_pending
homematic_error_code
homematic_sabotage
homematic_state_set
homematic_state_set

CCU3 / Firmware 3.65.8

sfudeus commented 1 year ago

Can you provide the full output of dump_parameters and the log output when using --debug in normal mode? I don't have a HmIP-SWDO myself, so I cannot debug myself.

mic0rr commented 1 year ago
--dump_parameters 0000DD89A33234:0
getParamset:
{'CONFIG_PENDING': False,
 'DUTY_CYCLE': False,
 'ERROR_CODE': 0,
 'LOW_BAT': False,
 'OPERATING_VOLTAGE': 1.4,
 'OPERATING_VOLTAGE_STATUS': 0,
 'RSSI_DEVICE': -85,
 'SABOTAGE': False,
 'UNREACH': False,
 'UPDATE_PENDING': False}

At channel :1 STATE represents Closed 0, Open 1

--dump_parameters 0000DD89A33234:1
getParamset:
{'STATE': 0}
--dump_parameters 0000DD89A33234:2
getParamset:
{}

Debug log part of SWDO device. Complete log with all devices attached as file

2022-10-20 20:17:58,263 - INFO - Found top-level device 0000DD89A33234 of type HMIP-SWDO with 3 children
2022-10-20 20:17:58,265 - DEBUG - {'ADDRESS': '0000DD89A33234',
 'AES_ACTIVE': 1,
 'AVAILABLE_FIRMWARE': '0.0.0',
 'CHILDREN': ['0000DD89A33234:0', '0000DD89A33234:1', '0000DD89A33234:2'],
 'DIRECTION': 0,
 'FIRMWARE': '1.16.8',
 'FIRMWARE_UPDATE_STATE': 'UP_TO_DATE',
 'FLAGS': 1,
 'GROUP': '',
 'INDEX': 0,
 'INTERFACE': '',
 'LINK_SOURCE_ROLES': '',
 'LINK_TARGET_ROLES': '',
 'PARAMSETS': ['MASTER', 'SERVICE'],
 'PARENT': '',
 'PARENT_TYPE': '',
 'RF_ADDRESS': 8201009,
 'ROAMING': 0,
 'RX_MODE': 4,
 'SUBTYPE': 'SWD',
 'TEAM': '',
 'TEAM_CHANNELS': [],
 'TEAM_TAG': '',
 'TYPE': 'HMIP-SWDO',
 'UPDATABLE': True,
 'VERSION': 2}
2022-10-20 20:17:58,265 - DEBUG - Found device 0000DD89A33234:0 of type MAINTENANCE in supported parent type HMIP-SWDO
2022-10-20 20:17:58,266 - DEBUG - {'ADDRESS': '0000DD89A33234:0',
 'AES_ACTIVE': 1,
 'AVAILABLE_FIRMWARE': '',
 'CHILDREN': [],
 'DIRECTION': 0,
 'FIRMWARE': '',
 'FIRMWARE_UPDATE_STATE': '',
 'FLAGS': 1,
 'GROUP': '',
 'INDEX': 0,
 'INTERFACE': '',
 'LINK_SOURCE_ROLES': '',
 'LINK_TARGET_ROLES': '',
 'PARAMSETS': ['MASTER', 'VALUES', 'SERVICE'],
 'PARENT': '0000DD89A33234',
 'PARENT_TYPE': 'HMIP-SWDO',
 'RF_ADDRESS': 0,
 'ROAMING': 0,
 'RX_MODE': 0,
 'SUBTYPE': '',
 'TEAM': '',
 'TEAM_CHANNELS': [],
 'TEAM_TAG': '',
 'TYPE': 'MAINTENANCE',
 'UPDATABLE': True,
 'VERSION': 2}
2022-10-20 20:17:58,299 - DEBUG - Found BOOL param SABOTAGE with value False
2022-10-20 20:17:58,299 - DEBUG - Found BOOL param CONFIG_PENDING with value False
2022-10-20 20:17:58,300 - DEBUG - Found BOOL param DUTY_CYCLE with value False
2022-10-20 20:17:58,300 - DEBUG - Found BOOL param LOW_BAT with value False
2022-10-20 20:17:58,300 - DEBUG - Found BOOL param INSTALL_TEST with value None
2022-10-20 20:17:58,301 - DEBUG - Found BOOL param UNREACH with value False
2022-10-20 20:17:58,301 - DEBUG - Found ENUM: desc: {'MIN': 'NORMAL', 'OPERATIONS': 5, 'MAX': 'EXTERNAL', 'FLAGS': 1, 'ID': 'OPERATING_VOLTAGE_STATUS', 'TYPE': 'ENUM', 'DEFAULT': 'NORMAL', 'VALUE_LIST': ['NORMAL', 'UNKNOWN', 'OVERFLOW', 'EXTERNAL']} key: 0
2022-10-20 20:17:58,301 - DEBUG - Found INTEGER param RSSI_DEVICE with value -85
2022-10-20 20:17:58,302 - DEBUG - Found FLOAT param OPERATING_VOLTAGE with value 1.4
2022-10-20 20:17:58,302 - DEBUG - Found INTEGER param RSSI_PEER with value None
2022-10-20 20:17:58,302 - DEBUG - Found INTEGER param ERROR_CODE with value 0
2022-10-20 20:17:58,302 - DEBUG - Found BOOL param UPDATE_PENDING with value False
2022-10-20 20:17:58,303 - DEBUG - ParamsetDescription for 0000DD89A33234:0
2022-10-20 20:17:58,307 - DEBUG - {'CONFIG_PENDING': {'DEFAULT': False,
                    'FLAGS': 9,
                    'ID': 'CONFIG_PENDING',
                    'MAX': True,
                    'MIN': False,
                    'OPERATIONS': 5,
                    'TYPE': 'BOOL'},
 'DUTY_CYCLE': {'DEFAULT': False,
                'FLAGS': 1,
                'ID': 'DUTY_CYCLE',
                'MAX': True,
                'MIN': False,
                'OPERATIONS': 5,
                'TYPE': 'BOOL'},
 'ERROR_CODE': {'DEFAULT': 0,
                'FLAGS': 9,
                'ID': 'ERROR_CODE',
                'MAX': 255,
                'MIN': 0,
                'OPERATIONS': 5,
                'TYPE': 'INTEGER'},
 'INSTALL_TEST': {'DEFAULT': False,
                  'FLAGS': 2,
                  'ID': 'INSTALL_TEST',
                  'MAX': True,
                  'MIN': False,
                  'OPERATIONS': 3,
                  'TYPE': 'BOOL'},
 'LOW_BAT': {'DEFAULT': False,
             'FLAGS': 9,
             'ID': 'LOW_BAT',
             'MAX': True,
             'MIN': False,
             'OPERATIONS': 5,
             'TYPE': 'BOOL'},
 'OPERATING_VOLTAGE': {'DEFAULT': 0.0,
                       'FLAGS': 1,
                       'ID': 'OPERATING_VOLTAGE',
                       'MAX': 25.2,
                       'MIN': 0.0,
                       'OPERATIONS': 5,
                       'TYPE': 'FLOAT'},
 'OPERATING_VOLTAGE_STATUS': {'DEFAULT': 'NORMAL',
                              'FLAGS': 1,
                              'ID': 'OPERATING_VOLTAGE_STATUS',
                              'MAX': 'EXTERNAL',
                              'MIN': 'NORMAL',
                              'OPERATIONS': 5,
                              'TYPE': 'ENUM',
                              'VALUE_LIST': ['NORMAL',
                                             'UNKNOWN',
                                             'OVERFLOW',
                                             'EXTERNAL']},
 'RSSI_DEVICE': {'DEFAULT': 0,
                 'FLAGS': 1,
                 'ID': 'RSSI_DEVICE',
                 'MAX': 127,
                 'MIN': -128,
                 'OPERATIONS': 5,
                 'TYPE': 'INTEGER'},
 'RSSI_PEER': {'DEFAULT': 0,
               'FLAGS': 1,
               'ID': 'RSSI_PEER',
               'MAX': 127,
               'MIN': -128,
               'OPERATIONS': 5,
               'TYPE': 'INTEGER'},
 'SABOTAGE': {'CONTROL': 'MAINTENANCE.SABOTAGE',
              'DEFAULT': False,
              'FLAGS': 9,
              'ID': 'SABOTAGE',
              'MAX': True,
              'MIN': False,
              'OPERATIONS': 5,
              'TYPE': 'BOOL'},
 'UNREACH': {'DEFAULT': False,
             'FLAGS': 25,
             'ID': 'UNREACH',
             'MAX': True,
             'MIN': False,
             'OPERATIONS': 5,
             'TYPE': 'BOOL'},
 'UPDATE_PENDING': {'DEFAULT': False,
                    'FLAGS': 9,
                    'ID': 'UPDATE_PENDING',
                    'MAX': True,
                    'MIN': False,
                    'OPERATIONS': 5,
                    'TYPE': 'BOOL'}}
2022-10-20 20:17:58,308 - DEBUG - Paramset for 0000DD89A33234:0
2022-10-20 20:17:58,308 - DEBUG - {'CONFIG_PENDING': False,
 'DUTY_CYCLE': False,
 'ERROR_CODE': 0,
 'LOW_BAT': False,
 'OPERATING_VOLTAGE': 1.4,
 'OPERATING_VOLTAGE_STATUS': 0,
 'RSSI_DEVICE': -85,
 'SABOTAGE': False,
 'UNREACH': False,
 'UPDATE_PENDING': False}
2022-10-20 20:17:58,308 - DEBUG - Found device 0000DD89A33234:1 of type SHUTTER_CONTACT in supported parent type HMIP-SWDO
2022-10-20 20:17:58,309 - DEBUG - {'ADDRESS': '0000DD89A33234:1',
 'AES_ACTIVE': 1,
 'AVAILABLE_FIRMWARE': '',
 'CHILDREN': [],
 'DIRECTION': 1,
 'FIRMWARE': '',
 'FIRMWARE_UPDATE_STATE': '',
 'FLAGS': 1,
 'GROUP': '',
 'INDEX': 1,
 'INTERFACE': '',
 'LINK_SOURCE_ROLES': 'CONDITIONAL_SWITCH WINDOW_SWITCH',
 'LINK_TARGET_ROLES': '',
 'PARAMSETS': ['MASTER', 'VALUES', 'LINK', 'SERVICE'],
 'PARENT': '0000DD89A33234',
 'PARENT_TYPE': 'HMIP-SWDO',
 'RF_ADDRESS': 0,
 'ROAMING': 0,
 'RX_MODE': 0,
 'SUBTYPE': '',
 'TEAM': '',
 'TEAM_CHANNELS': [],
 'TEAM_TAG': '',
 'TYPE': 'SHUTTER_CONTACT',
 'UPDATABLE': True,
 'VERSION': 2}
2022-10-20 20:17:58,335 - DEBUG - Found ENUM: desc: {'MIN': 'CLOSED', 'UNIT': '""', 'OPERATIONS': 5, 'MAX': 'OPEN', 'FLAGS': 1, 'ID': 'STATE', 'TAB_ORDER': 0, 'TYPE': 'ENUM', 'DEFAULT': 'CLOSED', 'VALUE_LIST': ['CLOSED', 'OPEN'], 'CONTROL': 'DOOR_SENSOR.STATE'} key: 0
2022-10-20 20:17:58,335 - DEBUG - ParamsetDescription for 0000DD89A33234:1
2022-10-20 20:17:58,336 - DEBUG - {'STATE': {'CONTROL': 'DOOR_SENSOR.STATE',
           'DEFAULT': 'CLOSED',
           'FLAGS': 1,
           'ID': 'STATE',
           'MAX': 'OPEN',
           'MIN': 'CLOSED',
           'OPERATIONS': 5,
           'TAB_ORDER': 0,
           'TYPE': 'ENUM',
           'UNIT': '""',
           'VALUE_LIST': ['CLOSED', 'OPEN']}}
2022-10-20 20:17:58,336 - DEBUG - Paramset for 0000DD89A33234:1
2022-10-20 20:17:58,336 - DEBUG - {'STATE': 0}
2022-10-20 20:17:58,336 - DEBUG - Found device 0000DD89A33234:2 of type ALARM_COND_SWITCH_TRANSMITTER in supported parent type HMIP-SWDO
2022-10-20 20:17:58,337 - DEBUG - {'ADDRESS': '0000DD89A33234:2',
 'AES_ACTIVE': 1,
 'AVAILABLE_FIRMWARE': '',
 'CHILDREN': [],
 'DIRECTION': 0,
 'FIRMWARE': '',
 'FIRMWARE_UPDATE_STATE': '',
 'FLAGS': 0,
 'GROUP': '',
 'INDEX': 2,
 'INTERFACE': '',
 'LINK_SOURCE_ROLES': '',
 'LINK_TARGET_ROLES': '',
 'PARAMSETS': ['MASTER', 'VALUES', 'SERVICE'],
 'PARENT': '0000DD89A33234',
 'PARENT_TYPE': 'HMIP-SWDO',
 'RF_ADDRESS': 0,
 'ROAMING': 0,
 'RX_MODE': 0,
 'SUBTYPE': '',
 'TEAM': '',
 'TEAM_CHANNELS': [],
 'TEAM_TAG': '',
 'TYPE': 'ALARM_COND_SWITCH_TRANSMITTER',
 'UPDATABLE': True,
 'VERSION': 2}

exporter-debug.txt

Unostot commented 1 year ago

Hello,

I've played a bit around and found the reason somehow. Window Sensors only show up in the metrics, when open.

homematic_state_set{ccu="x.x.x.x",device="ABCDEF01234567:1",device_type="SHUTTER_CONTACT",homematic_state_set="CLOSED",mapped_name="Fenster",parent_device_type="HMIP-SWDO"} 0.0
homematic_state_set{ccu="x.x.x.x",device="ABCDEF01234567:1",device_type="SHUTTER_CONTACT",homematic_state_set="OPEN",mapped_name="Fenster",parent_device_type="HMIP-SWDO"} 1.0

since there is a

if not value:
  return

in the process_enum the window enum gets only processed somehow, when it is open. I've just scanned a bit through the code, so I don't habe a real understanding how it (should) work or why it is written this way.

So this is just some comment to let you know, the SDWO (and probably other window/door sensors) is somehow working, but I'm not sure if this is like it should be. In the current state it seems like all enum values are put into a gauge (and given a value of 0 or 1 depending on "this enum value is on or not), when the read value of the enum is different from zero/false. Otherwise those enums are missing completely.

I would like a metric like "window open" = 1/0 which is always available (instead of current mode: "no metric" or "2 metrics: open=1, closed=0"), but I'm not sure at the moment, how sfudeus has planned this exporter or how he wants/needs the metrics exported.

So perhaps I just have a different approach how I would like my homematic metrics exported. Some explanation how the structure of the data is intended to be used would be nice :)

Greetings, Uno

Edit: I seems that the enums stay visible after they got "switched on" one time (at least here there is an increasing number of shutter contacts now exported). So there are two solutions: open each window once, after each exporter restart or wait for a fix which makes enum metrics available even if they are right now at "zero state"

Unostot commented 1 year ago

Ok, some more testing shows, that the window states get updated only, when STATE = 1.

After this the metric is still exported, but when the window gets closed, it will not update. So it stays with the open state. (probably because with STATE = 0 the enum function returns immediatly)

sfudeus commented 1 year ago

The analysis from @Unostot is mostly correct I think. The cause of this issues is a defect check for the value - and if it is set for the first item in the enum (with index 0), then the update is not done. This is easily fixed.

The other problem is that the handling for enums (esp. for bi-state enums like open/closed) is not intuitive. This is caused by two reasons:

Unostot commented 1 year ago

Thanks for the fix :)