Aggregieren nach $TYPE HM485 mit "response timeout" im DeviceOverview

Begonnen von holle75, 08 Juni 2021, 18:36:43

Vorheriges Thema - Nächstes Thema

holle75

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 ;)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Ah, jetzt sehs auch ich. Hier ist es auch gut beschrieben

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.

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Jo, einfach überlesen :)

Ich such jetzt mal eine REgex für _12_7_ ODER _2_2_ ODER _12_

holle75

(_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

Damian

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"]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Danke Damian, wie immer sehr hilfreich.

Thorsten hat mit hier -> 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)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF


holle75

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.