ioBroker / ioBroker.hm-rega

Connects HomeMatic CCU "Logic Layer" ("ReGaHSS") to ioBroker
www.iobroker.org
MIT License
43 stars 15 forks source link

Alarm State nicht mit lc abfragbar #68

Closed Baenker closed 5 years ago

Baenker commented 5 years ago

Ich kann mit Alarm States keine Dif bilden.

Natürlich hat der State sich schon einmal verändert.

Ich erhalte folgende Ausgabe:

javascript.0 | 2019-07-22 19:07:31.668 | info | script.js.Test.lc_Abfrage: dif2 38252
-- | -- | -- | --
javascript.0 | 2019-07-22 19:07:31.668 | info | script.js.Test.lc_Abfrage: dif1 NaN
javascript.0 | 2019-07-22 19:07:31.668 | info | script.js.Test.lc_Abfrage: dif NaN
javascript.0 | 2019-07-22 19:07:31.668 | info | script.js.Test.lc_Abfrage: Letzte Änderung am unreach: 19.07.19 13:05:28 Uhr
javascript.0 | 2019-07-22 19:07:31.667 | info | script.js.Test.lc_Abfrage: Letzte Änderung am sticky_unreach: 19.07.19 13:05:28 Uhr
javascript.0 | 2019-07-22 19:07:31.667 | info | script.js.Test.lc_Abfrage: Letzte Änderung am Sate: 22.07.19 22:30:00 Uhr
javascript.0 | 2019-07-22 19:07:31.659 | info | Start javascript script.js.Test.lc_Abfrage.

Wie man sieht hatte ich am 19.07 eine Servicemeldung (Kommunikationsstörung). Deshalb sollte das Script bei einer Division ein Erbenis liefern (beim State Befehl funktioniert es ja auch wie man im Log sieht).

Hier nochmal das Script:

var aktuelles_Datum = new Date();

var id_state = "hm-rpc.0.OEQ1544741.1.STATE"/Wohnzimmer Stehlampe:1.STATE/; var id_sticky_unreach = "hm-rpc.0.OEQ1544741.0.STICKY_UNREACH_ALARM"/Wohnzimmer Stehlampe:0.STICKY_UNREACH_ALARM/; var id_unreach = "hm-rpc.0.OEQ1544741.0.UNREACH_ALARM"/Wohnzimmer Stehlampe:0.UNREACH_ALARM/; var dif = Math.round((aktuelles_Datum - getState(id_unreach).lc)/1000); var dif1 = Math.round((aktuelles_Datum - getState(id_sticky_unreach).lc)/1000); var dif2 = Math.round((aktuelles_Datum - getState(id_state).lc)/1000);

log('Letzte Änderung am Sate: ' +formatDate(getState(id_state).lc, "TT.MM.JJ SS:mm:ss")+' Uhr '); log('Letzte Änderung am sticky_unreach: ' +formatDate(getState(id_sticky_unreach).lc, "TT.MM.JJ SS:mm:ss")+' Uhr '); log('Letzte Änderung am unreach: ' +formatDate(getState(id_unreach).lc, "TT.MM.JJ SS:mm:ss")+' Uhr '); log('dif ' +dif); log('dif1 ' +dif1); log('dif2 ' +dif2);

Apollon77 commented 5 years ago

gib doch mal den exakten Wert "lc" eines Alarm-States aus. Was meinst Du mit "Du hast die schonmal geändert"? Diese "ALARM" sind spezielle ioBroker-States ... Im Zweifel musst Du prüfen ob "...lc" einen Wert hat und nur dann die Differenz bilden oder sonst "0" annehmen.

Baenker commented 5 years ago

Ich erhalte:

`script.js.Test.lc_Abfrage: ohne Format state 1563827400004

script.js.Test.lc_Abfrage: ohne Format unreach_ALARM 2019-07-19T11:05:28.000Z`

Mit verändert meine ich das sowohl der UNREACH_ALARM als auch der STICKY_UNREACH_ARLAM sich regelmäßig ändern und zwar immer dann wenn eine Kommunikationsstörung vorliegt. Dann springt der Status von 2 (Kommunikation war gestört) oder 0 (keine Kommunaktionsstörung) auf 1. In der CCU hat man dann eine Servicemeldung. Kurze Zeit später wechselt der Status dann i. d. R. wieder auf 2. Somit ist die Störung in der CCU nicht mehr sichtbar.

Wie man im Log sieht ist das Ergebnis unterschiedlich und das sollte nicht sein...

Einmal abgefragte auf State und einmal auf UNREACH_ALARM

foxriver76 commented 5 years ago

Nein, Problem ist, dass die Alarm States die lc Werte selbst setzen, sprich es werden die Zeitangaben aus Rega genutzt. Hierbei wird anscheinend nicht zu Date geparsed.

Das funktioniert: var dif = Math.round((aktuelles_Datum - new Date(getState(id_unreach).lc).getTime()) / 1000);

Jedoch sollte das schon der Adapter korrekt machen.

foxriver76 commented 5 years ago

Bitte 2.4.2 probieren. Der Fehler wurde früher schon mal gemeldet, daraufhin habe ich es als Date geparsed und laut Tester hatte es angeblich funktioniert. Jedoch muss es als ms angegeben werden. Habe dies nun gefixt und dein Example läuft nun bei mir. Bedenke, dass hm-rega für nie getriggerte Alarme den 01-01-1970 liefert also 0 ms.

Baenker commented 5 years ago

Werde ich heute Abend testen. Mit den 01-01-1970 ist mir bekannt.

Baenker commented 5 years ago

Wie nicht anders zu erwarten funktioniert nun alles wie es soll. Die Ausgabe von Dif ergibt einen Wert und die Ausgabe von lc hat das gleiche Format wie von state.

Ich habe es schon öfters geschrieben: Vielen, vielen Dank @foxriver76 für den Bugfix und für Deinen Einsatz. Ohne Dich wäre der Adapter wirklich nur halb so gut. Und das ganze bei jeden Problem innerhalb weniger Stunden eine Lösung.

Danke und Grüße

foxriver76 commented 5 years ago

Gerne 👌