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 ;)
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.
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.
Der Blick hierhin hätte es auch getan: https://fhem.de/commandref_DE.html#DOIF_aggregation
Commandref sollte immer die erste Suchquelle sein.
Jo, einfach überlesen :)
Ich such jetzt mal eine REgex für _12_7_ ODER _2_2_ ODER _12_
(_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
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"]
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)
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.
Danke!
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.