danielperna84 / hahomematic

Python 3 Interface for Home Assistant to interact with HomeMatic devices
MIT License
134 stars 21 forks source link

Offline devices not shown as offline (again) #212

Closed eikowagenknecht closed 2 years ago

eikowagenknecht commented 2 years ago

custom_component/hahomematic version (if applicable): latest

Home Assistant version (if applicable): 2021.11.10

CCU version: CCU3 with Raspberrymatic

Problem-relevant configuration: Do you use tls? no Do you use callback? no Do you use username and password? yes Which interfaces do you use? hm, hmip

Describe the bug The CCU shows some of my devices (correctly) as offline:

image

Home Assistant does not:

e.g. image image

I can't see any logs related to this, the debug of initializing it is:

2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] __init__: Initialized device: CCU3-HmIP-RF, 0001D3C99C8C56, HMIP-PSM, Sauna Stehlampe (Gerät)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_event: Creating event for 0001D3C99C8C56:0, CONFIG_PENDING, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:0, DUTY_CYCLE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: binary_sensor: 0001D3C99C8C56:0 DUTY_CYCLE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entities: Skipping INSTALL_TEST (no event or internal)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: ERROR_OVERHEAT (0001D3C99C8C56:0)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: OPERATING_VOLTAGE_STATUS (0001D3C99C8C56:0)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: ACTUAL_TEMPERATURE_STATUS (0001D3C99C8C56:0)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:0, RSSI_PEER, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:0 RSSI_PEER
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: ERROR_CODE (0001D3C99C8C56:0)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: UPDATE_PENDING (0001D3C99C8C56:0)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_event: Creating event for 0001D3C99C8C56:0, UNREACH, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:0, RSSI_DEVICE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:0 RSSI_DEVICE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:0, ACTUAL_TEMPERATURE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:0 ACTUAL_TEMPERATURE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:0, OPERATING_VOLTAGE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:0 OPERATING_VOLTAGE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_event: Creating event for 0001D3C99C8C56:1, PRESS_LONG_RELEASE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_event: Creating event for 0001D3C99C8C56:1, PRESS_SHORT, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_event: Creating event for 0001D3C99C8C56:1, PRESS_LONG_START, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_event: Creating event for 0001D3C99C8C56:1, PRESS_LONG, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION_STATUS (0001D3C99C8C56:2)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: PROCESS (0001D3C99C8C56:2)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:2, STATE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: binary_sensor: 0001D3C99C8C56:2 STATE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION (0001D3C99C8C56:2)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION_STATUS (0001D3C99C8C56:3)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: COMBINED_PARAMETER (0001D3C99C8C56:3)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: ON_TIME (0001D3C99C8C56:3)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: PROCESS (0001D3C99C8C56:3)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:3, STATE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: switch: 0001D3C99C8C56:3 STATE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION (0001D3C99C8C56:3)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION_STATUS (0001D3C99C8C56:4)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: COMBINED_PARAMETER (0001D3C99C8C56:4)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: ON_TIME (0001D3C99C8C56:4)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: PROCESS (0001D3C99C8C56:4)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:4, STATE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: switch: 0001D3C99C8C56:4 STATE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION (0001D3C99C8C56:4)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION_STATUS (0001D3C99C8C56:5)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: COMBINED_PARAMETER (0001D3C99C8C56:5)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: ON_TIME (0001D3C99C8C56:5)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: PROCESS (0001D3C99C8C56:5)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:5, STATE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: switch: 0001D3C99C8C56:5 STATE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: SECTION (0001D3C99C8C56:5)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:6, VOLTAGE, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:6 VOLTAGE
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: POWER_STATUS (0001D3C99C8C56:6)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:6, ENERGY_COUNTER, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:6 ENERGY_COUNTER
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: CURRENT_STATUS (0001D3C99C8C56:6)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:6, FREQUENCY, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:6 FREQUENCY
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: ENERGY_COUNTER_OVERFLOW (0001D3C99C8C56:6)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:6, POWER, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:6 POWER
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: VOLTAGE_STATUS (0001D3C99C8C56:6)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Creating entity for 0001D3C99C8C56:6, CURRENT, CCU3-HmIP-RF
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: sensor: 0001D3C99C8C56:6 CURRENT
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: FREQUENCY_STATUS (0001D3C99C8C56:6)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: COMBINED_PARAMETER (0001D3C99C8C56:8)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: WEEK_PROGRAM_TARGET_CHANNEL_LOCK (0001D3C99C8C56:8)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: WEEK_PROGRAM_TARGET_CHANNEL_LOCKS (0001D3C99C8C56:8)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entity: Ignoring parameter: WEEK_PROGRAM_CHANNEL_LOCKS (0001D3C99C8C56:8)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.device] create_entities: Handling custom entity integration: CCU3-HmIP-RF, 0001D3C99C8C56, HMIP-PSM
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.devices.switch] BaseHmSwitch.__init__(CCU3-HmIP-RF, 0001D3C99C8C56, hahm_0001d3c99c8c56_3)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.devices.switch] BaseHmSwitch.__init__(CCU3-HmIP-RF, 0001D3C99C8C56, hahm_0001d3c99c8c56_4)
2022-01-18 12:51:42 DEBUG (MainThread) [hahomematic.devices.switch] BaseHmSwitch.__init__(CCU3-HmIP-RF, 0001D3C99C8C56, hahm_0001d3c99c8c56_5)

Maybe related later:

2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.client] get_value failed with ProxyException ((<Fault -5: 'Unknown Parameter value for value key: FREQUENCY'>,)): 0001D3C99C8C56:6, FREQUENCY
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.entity]  sensor: Failed to get value for HMIP-PSM, 0001D3C99C8C56:6, FREQUENCY: 
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.client] get_value failed with ProxyException ((<Fault -5: 'Unknown Parameter value for value key: POWER'>,)): 0001D3C99C8C56:6, POWER
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.entity]  sensor: Failed to get value for HMIP-PSM, 0001D3C99C8C56:6, POWER: 
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.client] get_value failed with ProxyException ((<Fault -5: 'Unknown Parameter value for value key: CURRENT'>,)): 0001D3C99C8C56:6, CURRENT
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.entity]  sensor: Failed to get value for HMIP-PSM, 0001D3C99C8C56:6, CURRENT: 
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.client] get_value failed with ProxyException ((<Fault -5: 'Unknown Parameter value for value key: VOLTAGE'>,)): 0001D3C99C8C56:6, VOLTAGE
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.entity]  sensor: Failed to get value for HMIP-PSM, 0001D3C99C8C56:6, VOLTAGE: 
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.client] get_value failed with ProxyException ((<Fault -5: 'Unknown Parameter value for value key: ENERGY_COUNTER'>,)): 0001D3C99C8C56:6, ENERGY_COUNTER
2022-01-18 12:51:44 DEBUG (MainThread) [hahomematic.entity]  sensor: Failed to get value for HMIP-PSM, 0001D3C99C8C56:6, ENERGY_COUNTER: 
2022-01-18 12:51:45 DEBUG (MainThread) [hahomematic.client] get_value failed with ProxyException ((<Fault -5: 'Unknown Parameter value for value key: STATE'>,)): 0001D3C99C8C56:3, STATE
2022-01-18 12:51:45 DEBUG (MainThread) [hahomematic.entity]  switch: Failed to get value for HMIP-PSM, 0001D3C99C8C56:3, STATE: 

Expected behavior Offline devices should be seen as "not reachable"

Additional context This worked fine for some days now since you fixed the old issue https://github.com/danielperna84/hahomematic/issues/157. I just noticed it today again, maybe one of the newer changes broke it again?

SukramJ commented 2 years ago

Also das ist ein echtes Sch.. Thema, weil es echt schlecht zu testen ist. Ich glaube es gibt 3 Usecases:

  1. Die CCU ist im Betrieb nicht mehr erreichbar. Funktioniert. Alle Entitäten werden not available
  2. Ein Gerät wird im laufen Betrieb nicht erreichbar. Funktioniert: Alle Entitäten des Gerätes werden not available
  3. Ein Gerät ist während des CCU-Starts nicht erreichbar. Funktioniert nicht.

Ich glaube Du redest über den dritten Fall. Hier ist das Problem, das wir die nicht Erreichbarkeit eines Gerätes über das UNREACH Event auswerten. Die CCU sendet das UNREACH Event direct nach dem initialisieren des Clients, also zu einer Zeit wo Gerät eventuell noch nicht in HA initialisiert wurde. Ich muss mal schauen wie man das noch abfangen kann. Aber für die Zwischenzeit sollten die nicht verfügbaren Geräte in den Persistenten Notifications auftauchen.:wink:

Ich wüsste jetzt aber auch nicht das Fall 3 sauber funktioniert hat. Das hab ich bisher nicht so ausgetestet.

danielperna84 commented 2 years ago

Vielleicht verwandt mit dem Issue:

Ich habe 2 HmIP-SMI55, welche aus Sicht der CCU eigentlich immer funktionieren. Wenn ich jedoch die neue Integration (oder generell Home Assistant) neu starte, dann sind sie hinterher in HA nicht verfügbar, und auf der CCU werden hierzu auch Service-Meldungen erzeugt. Etwa eine Stunde später erwachen sie dann allerdings wieder zum leben und funktionieren ganz normal.

Ich habe das bisher so interpretiert (und vorerst für mich behalten), dass - weil es batteriebetriebene Sensoren sind - die CCU halt nichts von dem Verbindungsabbruch mitbekommt, und erst durch das getValue beim Start merkt, dass sie das Gerät nicht erreichen kann. Interessanterweise ist aber immer nur das entity für den CURRENT_ILLUMINATION Parameter betroffen. Was es eigentlich noch merkwürdiger macht.

Ist wie gesagt nur eine Beobachtung über die ich mir gerade noch Gedanken mache. Aber da es thematisch passt dachte ich ich erwähnte es trotzdem mal. Vielleicht ist ja gerade der Punkt mit dem 1-2 Stunden warten in diesem Kontext relevant.

SukramJ commented 2 years ago

Bei mir wird ein HmIP-SLO immer beim starten einer HA Instanz nicht verfügbar. Das wird auch so auf parallellaufenden Ha Instanzen angezeigt (Fall 2), da die CCU wohl ein UNREACH Event sendet. Mein Gefühl sagt, da die CCU bei getValue wirklich auf das Gerät durchgreift, wohingegen bei anderen Geräten, auch batteriebetriebenen Sensoren, normalerweise Werte aus dem CCU-Cache gelesen werden. Ist aber eher so meine Theorie.

Ich hab das noch nicht richtig untersucht, aber manchmal werden Entitäten als nicht verfügbar angezeigt wenn der value None ist. Das würde zu deinem HmIP-SMI55 passen, und eigentlich den Fall 3 abbilden.

SukramJ commented 2 years ago

@danielperna84 Lösung Fall 3 Bei den generischen Entitäten könnte man den Status auch vom Entity Value abhängig machen. Wenn beim initialisieren im HA keine initialen Daten geladen werden können, dann ist die Entity not available. Der Status löst sich dann wieder auf wenn Events eintreffen. Ich gehe mal davon aus, das eine Entität im Normalfall nicht den Wert None erhält. Bei custom Entitäten ist der Status von den verwendeten generischen Entitäten abhängig, die ja die Werte halten. Hier bin ich mir noch unsicher ob eine Entität not available reicht, oder ob alle Entitäten not available sein müssen. Das Ganze ist natürlich nur in der Startphase relevant. Danach kommen Daten über die Daten Events, oder ein Signal über das UNREACH Event.

SukramJ commented 2 years ago

.... oder man initialisiert beim starten UNREACH.

danielperna84 commented 2 years ago

Ich finde den Lösungsansatz gut.

Wobei mir hier noch die Idee kommt zu schauen, ob in den Paramsets LOWBAT / LOW_BAT enthalten ist. So wie ich HomeMatic bisher gesehen habe ist es so, dass netzbetriebene Geräte zyklisch ihren Status mitteilen, und sich die CCU deshalb sehr sicher sein kann was der aktuelle Status ist. Und wenn ein Gerät offline ist merkt sie das ja auch. Ohne einer der lowbat-Varianten im Paramset wissen wir also, dass eine getValue Exception gleichbedeutend mit not available sein muss. In dem Fall müsste es also auch immer schon vorab eine passende Servicemeldung geben. Und den Zustand liefert die CCU vermutlich aus dem Cache.

Die Exception besagt im Prinzip auch dasselbe für batteriebetriebene Sensoren, nur wird hier durch die Anfrage per getValue erst von der CCU bemerkt, dass der Sensor nicht verfügbar ist. Das kann grundsätzlich genauso behandelt werden. Also Gerät / Entity ist dann erst mal not available, und wenn dann das Event ankommt wird es aktiv. Hierdurch wird dann aber erst zu diesem Zeitpunkt die Servicemeldung auf der CCU erzeugt.

Auf UNREACH würde ich glaube ich nicht prüfen. Da würde man bei einem Gerät außer Reichweite ja genauso eine Exception bekommen wie für z.B. STATE. Da kann man sich den Request eigentlich sparen. Zumal ich auch schon gesehen habe, dass das getValue nur bei manchen Parametern nicht klappt, bei anderen hingegen schon. Und nicht zu vergessen sind hier auch z.B. die Stromzähler wo man verschiedene Sensoren dran hängen kann. Da wäre es dann völlig normal bei bestimmten Parametern immer eine Exception (oder zumindest None) zu bekommen.

Also zusammengefasst: das getValue kommt in ein try-except. Bei einer Exception oder None ist der Parameter (nicht das Gerät) unavailable. Erzeugt wird das Entity trotzdem, und irgendwann kommt dann per Event der aktuelle Staus rein (oder auch nicht) und aktiviert das Entity.

eikowagenknecht commented 2 years ago

So wie ich HomeMatic bisher gesehen habe ist es so, dass netzbetriebene Geräte zyklisch ihren Status mitteilen, und sich die CCU deshalb sehr sicher sein kann was der aktuelle Status ist.

Nur ein kleiner Kommentar: Da würde ich mich nicht drauf verlassen, es ist ein frei konfigurierbarer Parameter bei quasi allen Homematic (IP) Geräten, ob und wie oft es seinen Status meldet. Im Default ist es so, wie du sagst, aber gerade bei größeren Installationen, wo das niedrig halten des Duty Cycle relevant wird, schaltet auch der ein oder andere bei netzbetriebenen Geräten die zyklischen Statusmeldungen komplett ab.

danielperna84 commented 2 years ago

Guter Einwand. Dann kann man sich wohl doch nur bei wired-Geräten auf das getValue verlassen. 🤔

SukramJ commented 2 years ago

@eikowagenknecht versuch mal die 0.25.0

eikowagenknecht commented 2 years ago

Sieht soweit ich es beurteilen kann gut aus, die Entitäten werden korrekt als Offline angezeigt und es gibt keine Warnungen oder Fehler in den Logs. Danke!