FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Fabiango am 03 Januar 2022, 16:48:51

Titel: doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Fabiango am 03 Januar 2022, 16:48:51
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
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 03 Januar 2022, 19:41:25
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
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Fabiango am 03 Januar 2022, 20:07:02
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
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 03 Januar 2022, 20:18:15
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 ;)
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Fabiango am 03 Januar 2022, 20:42:56
Hallo Otto,

was bedeutet den das Fragezeichen beim Codeteil ?weihAllesAus

Braucht es das beim ersten Teil beim Taster nicht auch?
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Pfriemler am 03 Januar 2022, 21:27:55
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.
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 03 Januar 2022, 21:34:36
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.
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Fabiango am 03 Januar 2022, 22:24:42
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?
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 04 Januar 2022, 11:23:07
Mach mal ein list von der Steckdose nachdem Du sie von FHEM geschaltet hast.
Wie schaltest Du die Steckdose sonst, also wenn DOIF funktioniert?
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Fabiango am 04 Januar 2022, 13:24:55
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
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Pfriemler am 04 Januar 2022, 13:37:56
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.


Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 04 Januar 2022, 13:39:40
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?
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Pfriemler am 04 Januar 2022, 13:48:55
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.
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 04 Januar 2022, 14:00:12
Ja nochmal nachgedacht und habs verstanden  ;D
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Fabiango am 04 Januar 2022, 15:36:31
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?
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Pfriemler am 04 Januar 2022, 15:45:24
Ich denke so. Versuch macht kluch.
Wie ich schon schrieb: Als Attribut beim DOIF einsetzen. Dafür gibt es direkt Auswahllisten in der Detail-Seite im unteren Bereich
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Damian am 04 Januar 2022, 16:08:01
ZitatEinzige Ausnahme: Hat das DOIF nur einen Trigger und Ausführungszweig, wird automatisch "do always" intern benutzt.

Das ist nicht korrekt. Wenn es nur einen Ausführungszweig gibt, dann wird auch nicht wiederholt, allerdings wird intern DOELSE-Fall gesetzt, für den Fall, dass die Bedingung nicht wahr wird, wird in cmd_2 gewechselt, danach ist wieder cmd_1 möglich.

Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Fabiango am 04 Januar 2022, 16:29:39
Hallo zusammen,

mithile der Definition von Otto und dem Hinweis zum Attribut von Pfriemler geht es nun wie gewünscht ohne den Status toggle bei der Steckdose zu bekommen. Vielen DANK an euch beiden.

Falls es noch jemanden weiterhelfen sollte hier das fertige DOIF

Internals:
   CFGFN     
   DEF        ([duTasterTC06:"Aktivieren"] and [?weihAllesAus] eq "Aus") (set weihAllesAus:FILTER=state!=on on)
DOELSEIF
([duTasterTC06:"Aktivieren"] and [?weihAllesAus] eq "Ein") (set weihAllesAus:FILTER=state!=off off)
   FUUID      61d46615-f33f-c1dd-3625-8750740502364eb8
   MODEL      FHEM
   NAME       di_FunktionTC06
   NOTIFYDEV  duTasterTC06,global
   NR         2428
   NTFY_ORDER 50-di_FunktionTC06
   STATE      cmd_2
   TYPE       DOIF
   VERSION    25386 2021-12-28 22:19:25
   READINGS:
     2022-01-04 16:27:07   Device          duTasterTC06
     2022-01-04 16:27:07   cmd             2
     2022-01-04 16:27:07   cmd_event       duTasterTC06
     2022-01-04 16:27:07   cmd_nr          2
     2022-01-04 16:27:07   e_duTasterTC06_events Aktivieren
     2022-01-04 16:22:12   mode            enabled
     2022-01-04 16:27:07   state           cmd_2
   Regex:
     accu:
     collect:
     cond:
       duTasterTC06:
         0:
           &STATE     ^duTasterTC06$
         1:
           &STATE     ^duTasterTC06$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('duTasterTC06',$hash,'Aktivieren',1) and ::InternalDoIf($hash,'weihAllesAus','STATE') eq "Aus"
     1          ::EventDoIf('duTasterTC06',$hash,'Aktivieren',1) and ::InternalDoIf($hash,'weihAllesAus','STATE') eq "Ein"
   do:
     0:
       0          set weihAllesAus:FILTER=state!=on on
     1:
       0          set weihAllesAus:FILTER=state!=off off
     2:
   helper:
     DEVFILTER  ^global$|^duTasterTC06$
     NOTIFYDEV  global|duTasterTC06
     event      Aktivieren
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   duTasterTC06
     timerevent Aktivieren
     triggerDev duTasterTC06
     timerevents:
       Aktivieren
     timereventsState:
       state: toggle
     triggerEvents:
       Aktivieren
     triggerEventsState:
       state: toggle
   hmccu:
   internals:
     all         weihAllesAus:STATE
   readings:
   trigger:
     all         duTasterTC06
   uiState:
   uiTable:
Attributes:
   do         always
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 04 Januar 2022, 16:41:42
do always ist ein Attribute des DOIF  ::)
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Damian am 04 Januar 2022, 17:05:14
Zitat von: Otto123 am 04 Januar 2022, 16:41:42
do always ist ein Attribute des DOIF  ::)

wo denn sonst   ::)

Wer sich nicht mit do always rumschlagen will, der kann hier https://wiki.fhem.de/wiki/DOIF/Perl-Modus#F.C3.BCr_Umsteiger_vom_DOIF-FHEM-Modus nachlesen, was er tun kann. Dafür muss man aber anderen Kenntnisse mitbringen. Das Leben ist halt kein Zuckerschlecken :)
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Pfriemler am 04 Januar 2022, 18:00:52
Zitat von: Damian am 04 Januar 2022, 16:08:01
wenn es nur einen Ausführungszweig gibt, dann wird auch nicht wiederholt, allerdings wird intern DOELSE-Fall gesetzt, ...
Ach SO war das. Danke für die Hinweis, habe es oben korrigiert damit es nicht falsch irgendwo herumsteht.
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Otto123 am 04 Januar 2022, 18:06:10
Zitat von: Damian am 04 Januar 2022, 17:05:14
wo denn sonst   ::)
Ich bin in die Falle getappt: Habe einfach auf antworten gedrückt und nicht gesehen, dass da schon noch ein paar Antworten waren  :-[ sorry
Titel: Antw:doif - Definition mehrere Bedingungen und einem Toggle
Beitrag von: Pfriemler am 04 Januar 2022, 18:16:00
Zitat von: Otto123 am 04 Januar 2022, 18:06:10
Ich bin in die Falle getappt: Habe einfach auf antworten gedrückt und nicht gesehen, dass da schon noch ein paar Antworten waren  :-[ sorry
Hmmm... passiert mir auch gelegentlich, wenn ich auf den letzten Post der Seite antworten will und übersehe, dass es noch Folgeseiten gibt ...  ;D