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
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
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
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 ;)
Hallo Otto,
was bedeutet den das Fragezeichen beim Codeteil ?weihAllesAus
Braucht es das beim ersten Teil beim Taster nicht auch?
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.
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.
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?
Mach mal ein list von der Steckdose nachdem Du sie von FHEM geschaltet hast.
Wie schaltest Du die Steckdose sonst, also wenn DOIF funktioniert?
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
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.
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?
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 Nichtaus
sendenfü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.
Ja nochmal nachgedacht und habs verstanden ;D
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?
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
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.
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
do always ist ein Attribute des DOIF ::)
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 :)
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.
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
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