DOIF & HM_OU_LED16 (Mehrere Readings)

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

Vorheriges Thema - Nächstes Thema

smeagel

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

Damian

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

smeagel

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

Damian

*. ist falsch auch die korrekte Angaben .* ist beim DOIF überflüssig:

[HM_OU_LED16_REQ1304779:"_STATUS$",""]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

smeagel

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

Damian

ohne Klammer auf am Anfang kann es auch nicht funktionieren
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

smeagel

Sorry, mein Fehler.

Vielen Dank schonmal für Deine Hilfe

smeagel

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

Damian

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

smeagel

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

smeagel

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.

Damian

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

smeagel

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.

Damian

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

smeagel

Die Zeile sieht gut aus...bringt leider einen Erroer:
condition c01: Can't find string terminator "'" anywhere before EOF, line 1.