Hallo,
trotz intensiver Suche komme ich leider nicht mehr weiter.
Ich Habe ein HM-Device HM_OU_LED16 (Statusanzeige, 16 LEDs) und möchte dieses schlafen schicken wenn keine LED leuchtet.
Nun hat das Teil aber 16 verschiedene Readings, wie schafe ich nun das ich ein DOIF erstelle, welches ein Event auslöst wenn EIN
Kanal den Status 1 oder 3 hat?
Die Readings sind 1.LED_STATUS bis 16.LED_STATUS - und diese können den Wert 0, 1, 2 oder 3 haben.
Meine Idee bisher:
([HM_OU_LED16_REQ1304779:"*._STATUS$"] =~ 0 or 1 or 3) (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0)
DOELSE (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1)
funktioniert leider nicht.
Hat jemand nen Ansatz für mich?
VG
Thorsten
z. B.
([HM_OU_LED16_REQ1304779:"*._STATUS$",""] =~ /0|1|3/) (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0)
DOELSE (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1)
Vielen Dank für die schnelle Antwort.
Allerding bekomme ich nun folgenden Error in den Readings:
condition c01: Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE ._STATUS$/ at ./FHEM/98_DOIF.pm line 1133.
Hier noch das Listing vom Device:
Internals:
CFGFN
DEF ([HM_OU_LED16_REQ1304779:"*._STATUS$",""] =~ /0|1|3/) (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0) DOELSE (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1)
FUUID 601d8364-f33f-e7fd-b612-1218d805a3ff417a
MODEL FHEM
NAME doif_HM_OU_LED16_REQ1304779_2
NOTIFYDEV HM_OU_LED16_REQ1304779,global
NR 5931
NTFY_ORDER 50-doif_HM_OU_LED16_REQ1304779_2
STATE cmd_1
TYPE DOIF
VERSION 23235 2020-11-25 22:42:28
READINGS:
2021-02-06 13:46:29 Device HM_OU_LED16_REQ1304779
2021-02-06 13:45:47 cmd 1
2021-02-06 13:45:47 cmd_event doif_HM_OU_LED16_REQ1304779_2
2021-02-06 13:45:47 cmd_nr 1
2021-02-06 13:46:29 e_HM_OU_LED16_REQ1304779_events 9.LED_STATUS: 2
2021-02-06 13:46:29 error condition c01: Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE ._STATUS$/ at ./FHEM/98_DOIF.pm line 1133.
2021-02-06 13:45:06 mode enabled
2021-02-06 13:45:47 state cmd_1
Regex:
accu:
cond:
HM_OU_LED16_REQ1304779:
0:
&STATE ^HM_OU_LED16_REQ1304779$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::EventDoIf('HM_OU_LED16_REQ1304779',$hash,'*._STATUS$',1) =~ /0|1|3/
devices:
do:
0:
0 set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0
1:
0 set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1
helper:
DEVFILTER ^global$|^HM_OU_LED16_REQ1304779$
NOTIFYDEV global|HM_OU_LED16_REQ1304779
event 9.LED_STATUS: 2
globalinit 1
last_timer 0
sleeptimer -1
timerdev
timerevent 9.LED_STATUS: 2
timerevents
timereventsState
triggerDev
internals:
readings:
trigger:
all HM_OU_LED16_REQ1304779
uiState:
uiTable:
Attributes:
room Homematic_NEU
Woran kann das liegen? bzw was mache ich falsch?
Was sollte ich einstellen damit die Befehle nur übertragen werden wenn sich ein Wert wirklich ändert?
VG
Thorsten
*. ist falsch auch die korrekte Angaben .* ist beim DOIF überflüssig:
[HM_OU_LED16_REQ1304779:"_STATUS$",""]
Also er schaltet nun das Display schonmal an wenn ein Kanal den State 1 hat - Nur auschalten geht noch nicht.
Das Doif hat auch immer den state "initialized"
Anbei das aktuelle Listing:
Internals:
CFGFN
DEF [HM_OU_LED16_REQ1304779:"_STATUS$",""] =~ /0|1|3/) (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0) DOELSE (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1)
FUUID 601d8364-f33f-e7fd-b612-1218d805a3ff417a
MODEL Perl
NAME doif_HM_OU_LED16_REQ1304779_2
NOTIFYDEV global
NR 5931
NTFY_ORDER 50-doif_HM_OU_LED16_REQ1304779_2
STATE initialized
TYPE DOIF
VERSION 23235 2020-11-25 22:42:28
READINGS:
2021-02-06 14:10:30 mode enabled
2021-02-06 14:10:30 state initialized
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
devices:
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 0
sleeptimer -1
perlblock:
uiState:
uiTable:
Attributes:
room Homematic_NEU
ohne Klammer auf am Anfang kann es auch nicht funktionieren
Sorry, mein Fehler.
Vielen Dank schonmal für Deine Hilfe
Aber irgendwie ist noch der Wurm drin...
ich habe jetzt mal folgendes eingetragen:
([HM_OU_LED16_REQ1304779:"_STATUS$",""] =~ /8|9/) (set HMIP_Display_UG on) DOELSE (set HMIP_Display_UG off)
Des Device HM_OU_LED16_REQ1304779 hat 16 Kanäle (z.B. 1.LED_STATUS), jeder kann den Status 0,1,2 oder 3 haben.
Mit dem o.g. Doif müsste das Doif ja eigentlich cmd2 ausführen und den Dummy auf off schalten - es KANN ja kein Kanal/Reading den Status 8 oder 9 haben.
Das tut es auch brav, wenn ich jedoch das Doif in:
([HM_OU_LED16_REQ1304779:"_STATUS$",""] =~ /1|3/) (set HMIP_Display_UG on) DOELSE (set HMIP_Display_UG off)
ändere, müsste es doch eigentlich cmd1 ausführen wenn ein Kanal den Status 1 oder 3 bekommt, richtig?
Das tut es nämlich leider nicht - immer cmd2
Hilfe? :) Bitte
Da dürfte noch einiges im Argen liegen:
Das Event besteht ja aus dem Readingnamen und seinem Inhalt (siehe Eventmonitor)
"_STATUS$" dürfte schon falsch sein, weil danach noch etwas kommt, nämlich der Wert,
daher
"_STATUS"
Hi,
sieht gut aus.... wenn ich jetzt ein checkall internals mache - merkt er sogar das er cmd2 ausführen muss. Aber nicht von alleine.
Allerdings springt er immer wieder auf cmd1 obwohl kein Kanal den Status 1 oder 3 hat.
So sieht das aus wenn ich via Eventmonitor ein Doif erstellen würde:
define HM_OU_LED16_REQ1304779_DOIF_1 DOIF ([HM_OU_LED16_REQ1304779:"^datapoint.9.LED_STATUS.2$"]) ()
Und das ganze halt nur so das es egal ist welcher Datapoint Status 1 oder 3 hat - set HMIP_Display_UG on bei allen anderen Werten (0 oder 2) set HMIP_Display_UG off.
Und ich weiss langsam nicht mehr was ich noch versuchen soll.
Wann soll er denn off schalten?
Quasi das in elegant:
([HM_OU_LED16_REQ1304779:9.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:9.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:1.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:1.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:2.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:2.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:3.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:3.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:4.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:4.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:5.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:5.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:6.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:6.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:7.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:7.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:8.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:8.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:9.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:9.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:10.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:10.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:11.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:11.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:12.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:12.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:13.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:13.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:14.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:14.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:15.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:15.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSEIF ([HM_OU_LED16_REQ1304779:16.LED_STATUS] eq "1" or [HM_OU_LED16_REQ1304779:16.LED_STATUS] eq "3") (set HMIP_Display_UG on)
DOELSE (set HMIP_Display_UG off)
Und nach Möglichkeit den Schaltbefehl nur dann senden wenn sich ein Reading verändert - nicht jedesmal wenn das HMIP Device den Status schreibt.
Sorry, ich weiss, blöde Anforderungen... aber ich packs leider nicht anders als oben beschrieben.
("[HM_OU_LED16_REQ1304779:_STATUS$",""] =~ /1|3/) (set HMIP_Display_UG on) DOELSEIF ("[HM_OU_LED16_REQ1304779:_STATUS$",""] =~ /0|2/) (set HMIP_Display_UG off)
sollte jetzt funktionieren.
Ggf. musst du noch den DOELSEIF anpassen.
Die Zeile sieht gut aus...bringt leider einen Erroer:
condition c01: Can't find string terminator "'" anywhere before EOF, line 1.
Aber ich denke das mit dem DOELSEIF wird Probleme machen....
Das Display soll NUR angehen WENN einer der 16 Kanäle von HM_OU_LED16_REQ1304779
den Status 1 oder 3 hat - wenn NICHT (also irgendein anderer) soll es ausgeschaltet werden oder bleiben.
Es ist so, die 16 Kanäle zeigen verschiedene Stati - im Idealfall sind alle 16 grün (2), wenn nun ein Kanal auf rot (1) oder
orange (3) springt, soll das Display auf on gehen; sollte der entsprechende Kanal wieder auf grün (2) springen -> alle 16 grün -> Display wieder off.
Ich habe mal versucht im Eventmonitor zu schauen was passiert und mit der integrierten DOIF-Funktion was versucht:
([HM_OU_LED16_REQ1304779:"^.*.LED_STATUS:.*$"] eq "1" or [HM_OU_LED16_REQ1304779:"^.*.LED_STATUS:.*$"] eq "3") (set HMIP_Display_UG on) DOELSE (set HMIP_Display_UG off)
Leider ist es wohl so dieses nicht so ganz funktioniert. Irgendwie schaltet das Doif zwar das Display an...aber wenn alles wieder grün ist, nicht off.
Nur mal zum Verständnis:
Reine Ereignistrigger der Art ["...."] sind nur wahr zum Triggerzeitpunkt, sonst sind sie nicht wahr - sie kann man nicht sinnvoll nach Inhalten abfragen. Eine Ausnahme ist die Syntax ["....",<Defaultwert>], diese liefert den Wert des Ereignisses. Bei Ereignistriggern wird kein DOELSE-Fall ausgelöst, weil jedes Event von anderen Devices in FHEM zum ELSE-Fall gehört. Hier kann man also nur sinnvoll über DOELSEIF unterscheiden.
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
ZitatEs ist so, die 16 Kanäle zeigen verschiedene Stati - im Idealfall sind alle 16 grün (2), wenn nun ein Kanal auf rot (1) oder
orange (3) springt, soll das Display auf on gehen; sollte der entsprechende Kanal wieder auf grün (2) springen -> alle 16 grün -> Display wieder off.
Das kannst du einfach mit Aggregationsfunktionen lösen:
https://fhem.de/commandref_DE.html#DOIF_aggregation
Aber die Readings sind doch nicht gleichnamig? 1.LED_STATUS 1 2.LED_STATUS 2 3.LED_STATUS 1 usw.
Oder habe ich da einen Denk- oder Verständniss-Fehler?
Zitat von: smeagel am 07 Februar 2021, 18:03:18
Aber die Readings sind doch nicht gleichnamig? 1.LED_STATUS 1 2.LED_STATUS 2 3.LED_STATUS 1 usw.
Oder habe ich da einen Denk- oder Verständniss-Fehler?
Worauf bezieht sich diese Frage?
Bei der Aggregation kann man Readings per RegEx filtern.
Das ich nicht weiß wie ich es umsetzen soll... weil mir leider das Verständnis felht :'(
Dann probiere mal:
DOIF ([#"HM_OU_LED16_REQ1304779:LED_STATUS$":"LED_STATUS$": $_ =~ /1|3/] > 0) (set HMIP_Display_UG on) DOELSE (set HMIP_Display_UG off)
Bedeutung:
# Anzahl
"HM_OU_LED16_REQ1304779:LED_STATUS$" Trigger
"LED_STATUS$" RegEx für Reading
$_ =~ /1|3/ Bedingung zum Zählen
Dankeschön - Für was steht # Anzahl?
Zitat von: smeagel am 07 Februar 2021, 19:36:29
Dankeschön - Für was steht # Anzahl?
Für die Funktion #.
Hier stehts erklärt:
https://fhem.de/commandref_DE.html#DOIF_aggregation
<function>:
# Anzahl der betroffenen Devices, der folgende Doppelpunkt kann weggelassen werden
Sprich, in meinem Fall wäre das 1 Device - Seh ich das richtig?
([#"HM_OU_LED16_REQ1304779:LED_STATUS$":"LED_STATUS$": $_ =~ /1|3/] > 0) (set HMIP_Display_UG on) DOELSE (set HMIP_Display_UG off) - Wenn ich das so einfüge, wird die Zeile grau.
Zitat von: smeagel am 07 Februar 2021, 19:42:26
<function>:
# Anzahl der betroffenen Devices, der folgende Doppelpunkt kann weggelassen werden
Sprich, in meinem Fall wäre das 1 Device - Seh ich das richtig?
([#"HM_OU_LED16_REQ1304779:LED_STATUS$":"LED_STATUS$": $_ =~ /1|3/] > 0) (set HMIP_Display_UG on) DOELSE (set HMIP_Display_UG off) - Wenn ich das so einfüge, wird die Zeile grau.
So ist es.
Und das die Zeile grau ist, ist normal?
Vieeeeeeelen Dank schonmal jetzt für Deine Geduld und Hilfe.
Zitat von: smeagel am 07 Februar 2021, 20:53:26
Und das die Zeile grau ist, ist normal?
Vieeeeeeelen Dank schonmal jetzt für Deine Geduld und Hilfe.
Ich weiß nicht, welche Zeile du meinst.
Diese:
DEF
([#"HM_OU_LED16_REQ1304779:LED_STATUS$":"LED_STATUS$": $_ =~ /1|3/] > 0) (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0) DOELSE (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1)
([#"HM_OU_LED16_REQ1304779:LED_STATUS$":"LED_STATUS$": $_ =~ /1|3/] > 0) (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0) DOELSE (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1)
Es geht zwar das Display an....aber nicht mehr aus.
Das Doif bleibt auf cmd1 stehen - wenn man ein "checkall internals" ausführt - springt er sofort auf cmd2 und das Display geht aus.
Aber eben nur wenn man checkall manuell ausführt?
Ich habe auch nur Ereignisse im Eventmonitor wenn ich checkall ausführe - ansonsten nicht.
So wie ich es sehe, tut das Doif nichts - das Display geht sowieso an soblad ich eine LED einschalte.
So scheint es zu funktionieren:
([HM_OU_LED16_REQ1304779:1.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:1.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:2.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:2.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:3.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:3.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:4.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:4.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:5.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:5.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:6.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:6.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:7.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:7.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:8.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:8.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:9.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:9.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:10.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:10.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:11.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:11.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:12.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:12.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:13.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:13.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:14.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:14.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:15.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:15.LED_STATUS] == 3 or
[HM_OU_LED16_REQ1304779:16.LED_STATUS] == 1 or [HM_OU_LED16_REQ1304779:16.LED_STATUS] == 3) (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 0)
DOELSE (set HM_OU_LED16_REQ1304779 datapoint 1.LED_SLEEP_MODE 1)
Ich weiß, die Lösung ist bestimmt Meilenweit weit weg von elegant - aber alle anderen Lösungen haben nicht funktioniert.
Vielen Dank für den Support und die Geduld.