DOIF & HM_OU_LED16 (Mehrere Readings)

Begonnen von smeagel, 06 Februar 2021, 06:06:17

Vorheriges Thema - Nächstes Thema

smeagel

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.

Damian

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

smeagel

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?

Damian

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

smeagel

Das ich nicht weiß wie ich es umsetzen soll... weil mir leider das Verständnis felht  :'(

Damian

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

smeagel

Dankeschön - Für was steht # Anzahl?

Damian

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

smeagel

#23
<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.

Damian

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

smeagel

Und das die Zeile grau ist, ist normal?

Vieeeeeeelen Dank schonmal jetzt für Deine Geduld und Hilfe.

Damian

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

smeagel

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)

smeagel

#28
([#"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.

smeagel

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.