doif - Definition mehrere Bedingungen und einem Toggle

Begonnen von Fabiango, 03 Januar 2022, 16:48:51

Vorheriges Thema - Nächstes Thema

Fabiango

Hallo zusammen,

ich habe einen FS20 Taster der ein Toggle auslöst bzw. schaltet.
Nun möchte ich dazu einen doif anlegen das bei 2 Bedingungen etwas schaltet.
Eine erste Version des doif habe ich zwar, aber wenn ich die zu schalteten Geräte von Hand schalte gibt es Störungen bzw. ein Blinken da der FS20 Taster immer in den benötigten state hat.

Sprich der Taster im doif darf nur reagieren wenn eine Schaltung kurz davor ausgeführt wurde bzw. er den State ändert / aktualisiert.
Wie lässt sich das realisieren?

([duTasterTC06] eq "toggle" and [weihAllesAus] eq "Aus") (set weihAllesAus on)
DOELSEIF
([duTasterTC06] eq "toggle" and [weihAllesAus] eq "Ein") (set weihAllesAus off)



Hier das List vom Taster:

Internals:
   BTN        d5
   CUL_0_MSGCNT 5
   CUL_0_RAWMSG 810b04xx0101a00119cbd50012
   CUL_0_RSSI -81
   CUL_0_TIME 2022-01-02 07:38:15
   DEF        19cb d5
   FUUID      61215aae-f33f-c1dd-a045-e07500d32559900f
   IODev      CUL_0
   LASTInputDev CUL_0
   MSGCNT     5
   NAME       duTasterTC06
   NR         140
   STATE      Aktivieren
   TYPE       FS20
   XMIT       19cb
   CODE:
     1          19cb d5
   READINGS:
     2021-12-30 16:52:34   IODev           CUL_0
     2022-01-02 07:38:15   state           toggle
Attributes:
   IODev      CUL_0
   alias      Taster TC-06 <br> (Weihnachten Ein/Aus)
   devStateIcon Aktivieren:ios-set_on
   eventMap   toggle:Aktivieren
   group      Taster 8-fach im Flur
   model      fs20tc6
   room       Events
   sortby     06
   webCmd     Aktivieren



und von dem doif:

Internals:
   DEF        ([duTasterTC06] eq "toggle" and [weihAllesAus] eq "Aus") (set weihAllesAus on)
DOELSEIF
([duTasterTC06] eq "toggle" and [weihAllesAus] eq "Ein") (set weihAllesAus off)
   FUUID      61c9de61-f33f-c1dd-787a-730e12b6388df926
   MODEL      FHEM
   NAME       di_FunktionTC06
   NOTIFYDEV  duTasterTC06,global,weihAllesAus
   NR         310
   NTFY_ORDER 50-di_FunktionTC06
   STATE      initialized
   TYPE       DOIF
   VERSION    25386 2021-12-28 22:19:25
   READINGS:
     2022-01-03 09:18:22   Device          weihAllesAus
     2021-12-31 22:03:46   cmd             0
     2022-01-02 07:38:15   e_duTasterTC06_STATE Aktivieren
     2022-01-03 09:18:22   e_weihAllesAus_STATE Aus
     2021-12-31 22:03:46   mode            enabled
     2021-12-31 22:03:46   state           initialized
   Regex:
     accu:
     collect:
     cond:
       duTasterTC06:
         0:
           &STATE     ^duTasterTC06$
         1:
           &STATE     ^duTasterTC06$
       weihAllesAus:
         0:
           &STATE     ^weihAllesAus$
         1:
           &STATE     ^weihAllesAus$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'duTasterTC06','STATE') eq "toggle" and ::InternalDoIf($hash,'weihAllesAus','STATE') eq "Aus"
     1          ::InternalDoIf($hash,'duTasterTC06','STATE') eq "toggle" and ::InternalDoIf($hash,'weihAllesAus','STATE') eq "Ein"
   do:
     0:
       0          set weihAllesAus on
     1:
       0          set weihAllesAus off
     2:
   helper:
     DEVFILTER  ^global$|^duTasterTC06$|^weihAllesAus$
     NOTIFYDEV  global|duTasterTC06|weihAllesAus
     event      Aus
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev weihAllesAus
     triggerEvents:
       Aus
     triggerEventsState:
       state: off
   internals:
     all         duTasterTC06:STATE weihAllesAus:STATE
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:



und noch von der Steckdose

Internals:
   BTN        af
   DEF        19cb af
   FUUID      612155aa-f33f-c1dd-93b2-325a1930724d4668
   IODev      CUL_0
   NAME       weihAllesAus
   NR         69
   STATE      Aus
   TYPE       FS20
   XMIT       19cb
   CODE:
     1          19cb af
   READINGS:
     2021-12-30 16:52:34   IODev           CUL_0
     2022-01-03 09:18:22   state           off
Attributes:
   IODev      CUL_0
   alexaName  Weihnachten
   devStateIcon Ein:black_FS20.on Aus:black_FS20.off
   eventMap   on:Ein
off:Aus
   genericDeviceType light
   model      fs20st
   room       Weihnachten
   sortby     01



Vielen Dank für eure Hilfe.
Gruss, Fabian

Otto123

Hallo Fabian,

list weihAllesAus ?

Ich denke in dem Device baust Du ein Schleife
Schau Dir FILTER an, damit ist das eventuell (einfacher) zu lösen.


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Fabiango

auch mit einem Filter besteht das gleiche Probleme, da ich nicht einfach nach dem State abfragen darf sondern bei einer Flanke wenn das das State sich wechselt.

Hier noch das List von der Steckdose wie gewünscht.

Internals:
   BTN        af
   DEF        19cb af
   FUUID      612155aa-f33f-c1dd-93b2-325a1930724d4668
   IODev      CUL_0
   NAME       weihAllesAus
   NR         69
   STATE      Aus
   TYPE       FS20
   XMIT       19cb
   CODE:
     1          19cb af
   READINGS:
     2021-12-30 16:52:34   IODev           CUL_0
     2022-01-03 09:18:22   state           off
Attributes:
   IODev      CUL_0
   alexaName  Weihnachten
   devStateIcon Ein:black_FS20.on Aus:black_FS20.off
   eventMap   on:Ein
off:Aus
   genericDeviceType light
   model      fs20st
   room       Weihnachten
   sortby     01

Otto123

was Du willst ist [duTasterTC06:"toggle"] - also beim Event toggle schalten.

eventmap ist die hohe Schule sag ich Dir. Das führt eigentlch fast immer zur Verwirrung und Problemen. Aber egal: ein set on im ersten Zweig wird en zweiten Zweig triggern und umgekehrt  ::)

Versuch:
([duTasterTC06:"toggle"] and [?weihAllesAus] eq "Aus") (set weihAllesAus:FILTER=state!=on on)
DOELSEIF
([duTasterTC06:"toggle"] and [?weihAllesAus] eq "Ein") (set weihAllesAus:FILTER=state!=off off)


Aber wahrscheinlich habe ich es nicht verstanden: Deine Aufgabe und DOIF ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Fabiango

Hallo Otto,

was bedeutet den das Fragezeichen beim Codeteil ?weihAllesAus

Braucht es das beim ersten Teil beim Taster nicht auch?

Pfriemler

#5
In Ottos letztem Vorschlag gibt es den Trigger in zwei Zweigen, zum Zuge kommt nur der, bei dem alle Bedingungen stimmen. Das Fragezeichen prüft den Status des FS20-devices nur, ein Event allda führt dann nicht zu einer Triggerung des DOIF - genau was beabsichtigt ist.
Kann so im Moment nicht ganz funktionieren, weil eventMap im FS20-device (also der Steckdose) nicht vollständig ist.

Eine Alternative dazu wäre, das DOIF nur einzweigig zu realisieren und im Ausführungsteil eine IF-Abfrage der weihAllesAus zu realisieren und dann entsprechend auszuführen.

Warum heißt das Ding eigentlich weihAllesAus, wenn damit auch eingeschaltet wird?

Von eventMap habe ich mich auch verabschiedet weitgehend und bevorzuge stattdessen passende Icons, während hinter den Kulissen konstant "englisch" benutzt wird.

Nachtrag:
btw: FS20 ist Einbahnstraße. Lokal geschaltete Aktoren melden ihren Status nicht zurück an FHEM. Wird wie bei diesem Konstrukt geschaltet, kann es sein, dass FHEM den korrekten Status nicht kennt und dann nicht schaltet. Heißt: Wurde ein aus FHEM ausgeschalteter Aktor lokal eingeschaltet, geht FHEM weiterhin davon aus, dass er aus ist, und wird mit dem FILTER im Ausführungsteil keinen Ausschaltbefehl senden. Den Filter halte ich daher für entbehrlich. Sinnvoll sind diese Konstrukte eher, wenn man per Wildcard ganze Rudel von Aktoren gleichziehen will und so die Anzahl der zu sendenen Befehle reduzieren kann auf die nötigen (falls sich einige Aktoren bereits im gewünschten Zustand befinden). Dazu muss aber der Status eben in FHEM sicher bekannt sein.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Otto123

#6
Die Erklärung zu solchen Feinheiten findest Du in der commandref oder mit help DOIF - leicht zu vestehen ist DOIF nicht :)
Dein Taster soll ja der Trigger sein, da soll der Event "toggle" auslösen. Bei einem Eventtrigger macht ein Fragezeichen keinen Sinn bzw. wäre es falsch.
Der weihAllesAus darf mMn nicht triggern, das wird genau durch das Fragezeichen verhindert. Damit wird der Wert nur abgefragt.

Heisst im Umkehrschluss: Wenn Du in meinem Konstrukt weihAllesAus umschaltest passiert im DOIF nichts. In deinem Konstrukt wird das DOIF dadurch getriggert und abgearbeitet.

@Pfriemler "im FS20-device (also der Steckdose) nicht vollständig ist." es ist vollständig nur - optisch anspruchsvoll  ;D - weil zweizeilig. Ich staune das es funktioniert.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Fabiango

Das Gerät heißt weihAllesAus da es früher nur zum ausschalten gedacht war.
Neue Geräte setze ich Hoemmatic IP ein mit Rückmeldekontakt, werde aber laufende Geräte deswegen nicht extra ersetzen.


@Otto:
Erstmal danke für deinen Code der prinzipiell fast Störungsfrei läuft.
Zumindest ist das blinken dadurch weg und man kann mit der einen Taste nun hin und her schalten.

Das doif wechselt schön zwischen cmd1 und cmd2
Schalte ich jedoch die Steckdose über fhem normal ein oder aus funktioniert danach die Schaltung über das doif nicht mehr.  Was könnte das sein?

Otto123

Mach mal ein list von der Steckdose nachdem Du sie von FHEM geschaltet hast.
Wie schaltest Du die Steckdose sonst, also wenn DOIF funktioniert?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Fabiango

Die Steckdose wird sonst direkt geschalten und FHEM bekommt das mit und zeigt auch den neuen State an.
Das bringt dann aber das DOIF durcheinander.

Die Taste ist nur zusätzlich gedacht und daher mit toggle da eine einzelne Taste.


Hier das List wenn manuell geschalten:

Internals:
   BTN        af
   DEF        19cb af
   FUUID      612155aa-f33f-c1dd-93b2-325a1930724d4668
   IODev      CUL_0
   NAME       weihAllesAus
   NR         69
   STATE      Ein
   TYPE       FS20
   XMIT       19cb
   CODE:
     1          19cb af
   READINGS:
     2022-01-04 08:59:45   IODev           CUL_0
     2022-01-04 13:25:12   state           on
   hmccu:
Attributes:
   IODev      CUL_0
   alexaName  Weihnachten
   alias      Weihnachten - Alles
   devStateIcon Ein:black_FS20.on Aus:black_FS20.off toggle:black_FS20.toggle
   eventMap   on:Ein
off:Aus
   genericDeviceType light
   model      fs20st
   room       Weihnachten
   sortby     01

Pfriemler

Das DOIF sollte aber so oder so funktionieren, wenn Du die Steckdose aus FHEM einmal komplett umschaltest (also bspw. EIN-AUS oder AUS-EIN).

Das DOIF pendelt bei alleiniger Nutzung brav zwischen cmd1 und cmd2. Wird die Steckdose nur einmal anderweitig umgeschaltet, ist der zuletzt benutzte Zweig noch gültig und das zugehörige Kommando wird nicht ausgeführt.
Dagegen sollte "attr ... do always" helfen.


"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Otto123

Ich weiß nicht wie das durcheinanderkommen soll?
Kanst jetzt ein list vom DOIF machen wenn es nicht funktioniert?

Der Schalter hat im state on und im STATE Ein wenn jetzt Dein toggle trigger ist der erste Zweig falsch und der zweite Zweig wird wahr
([duTasterTC06:"toggle"] and [?weihAllesAus] eq "Ein") (set weihAllesAus:FILTER=state!=off off)

Aber wie gesagt, kann sein ich habe DOIF nicht verstanden. und Pfriemler hat sicher Recht  :'(
BTW der FS20 selbst kann doch selbst toggle?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Pfriemler

#12
Zitat von: Otto123 am 04 Januar 2022, 13:39:40
Aber wie gesagt, kann sein ich habe DOIF nicht verstanden. und Pfriemler hat sicher Recht  :'(
Ach Otto  ;) ...

Nicht für Dich, sondern allgemein als Ergänzung:
([duTasterTC06:"toggle"] and [?weihAllesAus] eq "Aus") (set weihAllesAus:FILTER=state!=on on)
Hier führt bspw. ein ankommendes Toggle bei "Aus" dazu, dass eingeschaltet wird. Punkt
Wird jetzt manuell anderweitig ausgeschaltet, führt der folgende toggle-Trigger dazu, dass wieder dieser Zweig zutrifft. Da sich der Status der DOIFs aber nicht ändert, wird das Kommando nicht ausgeführt, das ist das Default-Verhalten eines mehrteiligen DOIF. Ist aber erst mal wenig intuitiv... Nun gut.
Bei "do always" aber doch. Einzige Ausnahme: Hat das DOIF nur einen Trigger und Ausführungszweig, wird automatisch "do always" intern benutzt.
Das Nichtaussendenführen der Anweisungen bei wiederholten Triggern hat in den meisten Situationen als Statemachine durchaus seine Vorteile.
Ein notify hat ja nur einen Triggerzweig. Dafür erkläre mal einem Newbie, warum der mit Leerzeichen abgesetzte Punkt am Ende bei einem watchdog so wichtig ist ...


Zitat
BTW der FS20 selbst kann doch selbst toggle?
Yep. Aber dann ist der Status des Aktors "toggle" und FHEM weiß nicht mehr wie er steht. Daher ist der Umweg über die Übersetzung in einen expliziten on/off die bessere Wahl.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Fabiango

Hallo Pfriemler,
hallo Otto,

heisst für mich dass das "DOIF" korrekt ist und ich nur noch das "do always" an korrekter Stelle setzen muss.
Ist das so?

@Pfriemler:
Kannst du mir noch sagen wo ich das genau einfügen muss?