FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: holle75 am 08 Juni 2021, 18:36:43

Titel: Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: holle75 am 08 Juni 2021, 18:36:43
Edit: Ah,blöd, jetzt sehe ich gerade, dass der state auch ein ACK hat, also wohl dann auch ein "response timeout" bekommt. Mann, mann .... blind (resp. schwer zu testen, sehen)

Habe ein bißchen gestöbert, aber alles was ich an Anleitung finden konnte waren Bezüge zu Werte in Readings oder Events.

Was ich versuche:

Alle hm485 Module (TYPE hm485) durchlaufen und wenn mehr als 0 Module im "DeviceOverview" (was wohl kein Reading und auch kein Event ist) ein "response timeout" haben ... irgendwas machen.
Da ich mutwillig nur mit Eingriff in den Bus ein "response timeout" erzwingen kann, frage ich mal um möglichst wenig Testerei zu haben.

Grüße!
H.

Edit: wie frage ich nach TYPE? wird automatisch durchlaufen? einfach:

define ResponseTimeout DOIF ([#"HM485":state:"response timeout"] != 0) (tu was) DOELSEIF ([#"HM485":state:"response timeout"] = 0) ()
attr ResponseTimeout do always


... wobei ich ja nichtmal das do always bräuchte wenn die tu was message nicht nerven soll ;)
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: Damian am 08 Juni 2021, 19:01:35
Zitat von: holle75 am 08 Juni 2021, 18:36:43
Edit: Ah,blöd, jetzt sehe ich gerade, dass der state auch ein ACK hat, also wohl dann auch ein "response timeout" bekommt. Mann, mann .... blind (resp. schwer zu testen, sehen)

Habe ein bißchen gestöbert, aber alles was ich an Anleitung finden konnte waren Bezüge zu Werte in Readings oder Events.

Was ich versuche:

Alle hm485 Module (TYPE hm485) durchlaufen und wenn mehr als 0 Module im "DeviceOverview" (was wohl kein Reading und auch kein Event ist) ein "response timeout" haben ... irgendwas machen.
Da ich mutwillig nur mit Eingriff in den Bus ein "response timeout" erzwingen kann, frage ich mal um möglichst wenig Testerei zu haben.

Grüße!
H.

Edit: wie frage ich nach TYPE? wird automatisch durchlaufen? einfach:

define ResponseTimeout DOIF ([#"HM485":state:"response timeout"] != 0) (tu was) DOELSEIF ([#"HM485":state:"response timeout"] = 0) ()
attr ResponseTimeout do always



[#"<DEV Regex>":state:$_ eq "response timeout" and $TYPE eq "HM485"]

Du musst dir dann noch überlegen wie der Trigger sein soll: <DEV Regex>

mit "" würdest du auf alles reagieren - das ist "teuer"

evtl. mit Zeittrigger arbeiten, wenn du für deine HM485-Geräte keine systematischen Namensgebung hast.
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: holle75 am 08 Juni 2021, 23:10:03
Ah, jetzt sehs auch ich. Hier ist es auch gut beschrieben

https://forum.fhem.de/index.php/topic,70624.msg621112.html#msg621112 (https://forum.fhem.de/index.php/topic,70624.msg621112.html#msg621112)

Danke

Ja blöd, natürlich für HM485 Devices keine "ordentlichen" Namen vergeben. Für die Schalter an sich schon, nur die Module nicht.
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: Damian am 08 Juni 2021, 23:12:24
Der Blick hierhin hätte es auch getan: https://fhem.de/commandref_DE.html#DOIF_aggregation

Commandref sollte immer die erste Suchquelle sein.
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: holle75 am 08 Juni 2021, 23:20:47
Jo, einfach überlesen :)

Ich such jetzt mal eine REgex für _12_7_ ODER _2_2_ ODER _12_
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: holle75 am 08 Juni 2021, 23:35:59
(_12_7_)|(_2_2_)|(_12_)

brauchts da sonst nochwas? Bei Regex gibts doch immer noch ein special

[#"(_12_7_)|(_2_2_)|(_12_)":state:$_ eq "response timeout" and $TYPE eq "HM485"]

edit: das ist es jetzt geworden

defmod ACKResponseTimeoutDOIF DOIF ([#"(_12_7_)|(_2_2_)|(_12_)":state:$_ eq "response timeout" and $TYPE eq "HM485"] != 0) ({DebianMail('info@xxxxxxxxx.com','HM485 Modul response timeout seit 10 min','HM485 Modul response timeout seit 10 min: [@"(_12_7_)|(_2_2_)|(_12_)":state:$_ eq "response timeout" and $TYPE eq "HM485"] um '.$hms,'')}) DOELSE ()
attr ACKResponseTimeoutDOIF group System
attr ACKResponseTimeoutDOIF wait 600,0
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: Damian am 10 Juni 2021, 08:36:40
Zitat von: holle75 am 08 Juni 2021, 23:35:59
(_12_7_)|(_2_2_)|(_12_)

brauchts da sonst nochwas? Bei Regex gibts doch immer noch ein special

[#"(_12_7_)|(_2_2_)|(_12_)":state:$_ eq "response timeout" and $TYPE eq "HM485"]

edit: das ist es jetzt geworden

defmod ACKResponseTimeoutDOIF DOIF ([#"(_12_7_)|(_2_2_)|(_12_)":state:$_ eq "response timeout" and $TYPE eq "HM485"] != 0) ({DebianMail('info@xxxxxxxxx.com','HM485 Modul response timeout seit 10 min','HM485 Modul response timeout seit 10 min: [@"(_12_7_)|(_2_2_)|(_12_)":state:$_ eq "response timeout" and $TYPE eq "HM485"] um '.$hms,'')}) DOELSE ()
attr ACKResponseTimeoutDOIF group System
attr ACKResponseTimeoutDOIF wait 600,0


Die runden Klammern sollten hier nicht nötig sein. Dann reagierst du auf alle Events dieser Devices, das solltest du auch eingrenzen.


z. B.

[#"_12_7_|_2_2_|_12_:response timeout":state:$_ eq "response timeout" and $TYPE eq "HM485"]
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: holle75 am 10 Juni 2021, 11:08:43
Danke Damian, wie immer sehr hilfreich.

Thorsten hat mit hier -> https://forum.fhem.de/index.php/topic,121538.msg1161833.html#msg1161833 (https://forum.fhem.de/index.php/topic,121538.msg1161833.html#msg1161833)

freundlicherweise gerade das HM485 Verhalten bezüglich "response timeout" erklärt.

Jetzt muß ich herausfinden, wie man ein

set <regEx Devices Type HM485> raw 68

im Ausführungsteil bastelt. Wäre das eine Richtung?

(set [@"_12_7_|_2_2_|_12_" and $TYPE eq "HM485"] raw68)

oder muß da noch mehr Definition mit rein? (scheint so, siehe Edit folgender Code)

Idee wäre jetzt (ich weiß noch nicht, ob es "response timeout" oder "RESPONSE TIMEOUT") ist:

define ACKResponseTimeoutDOIF DOIF ([#"_12_7_|_2_2_|_12_:RESPONSE TIMEOUT":state:$_ eq "RESPONSE TIMEOUT" and $TYPE eq "HM485"] != 0) \
               ({DebianMail('info@xxxxxxxxxxxx.com','HM485 Modul response timeout seit 10 min','HM485 Modul response timeout seit 10 min: [@"_12_7_|_2_2_|_12_":state:$_ eq "RESPONSE TIMEOUT" and $TYPE eq "HM485"] um '.$hms,'')}) \
DOELSE \
               (set [@"_12_7_|_2_2_|_12_":state:"ACK","0" and $TYPE eq "HM485"] raw 68)
attr ACKResponseTimeoutDOIF group System
attr ACKResponseTimeoutDOIF repeatcmd 0:3600
attr ACKResponseTimeoutDOIF wait 600,0


Edit: Ah nein, dann läuft das DOIF ja bei jedem Schaltvorgang heiß. Mmh, nochmal weiterüberlegen.

Edit2: heißzulaufen scheint da nichts. Sprich, beim Schalten der einzelnen Kanäle werden die Module an sich hier nicht getriggert.

Edit3: da es wohl auch "RESPONSE TIMEOUT:RegisterRead" im state haben könnte:

wäre das noch mit zusätzlich .* funktional? (RegEx ist nicht meins):

([#"_12_7_|_2_2_|_12_:RESPONSE TIMEOUT":state:$_ eq "RESPONSE TIMEOUT.*" and $TYPE eq "HM485"] != 0)
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: Damian am 11 Juni 2021, 15:47:27
statt ([#"_12_7_|_2_2_|_12_:RESPONSE TIMEOUT":state:$_ eq "RESPONSE TIMEOUT.*" and $TYPE eq "HM485"] != 0)

eher:

([#"_12_7_|_2_2_|_12_:RESPONSE TIMEOUT":state:$_ =~ "RESPONSE TIMEOUT" and $TYPE eq "HM485"] != 0)

wahrscheinlich reicht aber schon:

(["_12_7_|_2_2_|_12_:RESPONSE TIMEOUT"])

Denn, wenn dieses Event kommt dann gibt es mindestens eins. und ich vermute, dass "RESPONSE TIMEOUT" sonst nirgendwo vorkommt.
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: holle75 am 11 Juni 2021, 17:18:39
Danke!
Titel: Antw:Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview
Beitrag von: holle75 am 30 Juni 2021, 16:27:49
Mir ist gerade aufgefallen, dass das DOIF nach Neustart "nicht losläuft", also nicht in cmd_2 wechselt um dann stündlich das set auszuführen.

Geholfen habe ich mir so
defmod MAIL_ACKResponseTimeoutDOIF DOIF ([#"_12_7_|_2_2_|_12_:RESPONSE TIMEOUT":state:$_ =~ "RESPONSE TIMEOUT" and $TYPE eq "HM485"] != 0) \
({DebianMail('xxx@yyyyy.com','HM485 Modul response timeout seit 10 min','HM485 Modul response timeout seit 10 min: [@"_12_7_|_2_2_|_12_":state:$_ =~ "RESPONSE TIMEOUT" and $TYPE eq "HM485"] um '.$hms,'')}) \
DOELSE \
(set [@"_12_7_|_2_2_|_12_":state:"ACK","0" and $TYPE eq "HM485"] raw 68)
attr MAIL_ACKResponseTimeoutDOIF group System
attr MAIL_ACKResponseTimeoutDOIF initialize initialized
attr MAIL_ACKResponseTimeoutDOIF repeatcmd 0:3600
attr MAIL_ACKResponseTimeoutDOIF wait 600,0


und einem

set ACKResponseTimeoutDOIF checkall

im "Neustart DOIF" nach 2 Minuten.

Was mich wundert, warum funktioniert kein

attr MAIL_ACKResponseTimeoutDOIF startup set $SELF cmd_2

?

Dann wird das DOIF zwar in cmd_2 geschickt, aber der timer für die Wiederholung läuft trotzdem nicht.