[Gelöst] Ein Schalter - mehrere Funktionen

Begonnen von Rudibarani, 13 Dezember 2018, 16:51:05

Vorheriges Thema - Nächstes Thema

Rudibarani

Liebe FHEM-Profis,
ich habe mir überlegt, dass ich gerne mit dem Lichtschalter für unser Bad abhängig von der Tageszeit entweder die volle Beleuchtung oder das Nachtlicht einschalten würde. Dazu soll es einen Mechanismus geben, dass wenn man innerhalb von 2 Sekunden nochmal schaltet, die jeweils andere Funktion geschaltet wird. Abgebildet habe ich das mit Schaltern in FHEM so:

Licht an: DOIF (Update: Semikolons durch Kommata ersetzt)
([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] ne "on")(set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Nachtlicht_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] eq "on")(set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] ne "on")(set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] eq "on")(set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Nachtlicht_Schalter on)


LICHT aus: Notify
Licht_Badezimmer_DayNight_Schalter:off set licht_Badezimmer off
licht_Badezimmer ist eine Struktur, die alle Lampen im Bad ausschaltet.

Der "Inverter" ist ein Dummy mit aktivierten set extensions der vorübergehend speichern soll, ob es in den letzten zwei Sekunden einen Schaltvorgang gab.

Aus meiner Sicht sollte es eigentlich so funktionieren - tut es aber nicht. Wenn ich den Lichtschalter aktiviere, tut sich in FHEM nichts.
Setze ich den Inverter einmal manuell auf "on", kann ich plötzlich zwischen beiden Lampen hin und her schalten, solange ich unter den 2 Sekunden bleibe. Läuft einmal der on-for-timer ab, kann ich mit dem Lichtschalter wieder nichts mehr schalten... Kann mir von Euch bitte jemand meinen Fehler erklären und helfen, das ans laufen zu bekommen?

Vielen Dank!

Otto123

Hi,

bei einem list vom DOIF könnte man eventuell Fehler sehen.

Einer fällt mir auf: In DOIF ist das Komma der Trenner für Befehle und nicht das Semikolon!

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

Rudibarani

Hallo Otto,

vielen Dank für das schnelle Feedback. Den Komma-Fehler habe ich korrigiert - der hat das Problem aber leider nicht gelöst...
Wie mache ich denn ein "list vom DOIF"?

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

Rudibarani

Danke, Otto - hatte ich auch gerade gefunden. Sorry.

Hier ist die Ausgabe:
Internals:
   DEF        ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] ne "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Nachtlicht_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] eq "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] ne "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] eq "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Nachtlicht_Schalter on)
   MODEL      FHEM
   NAME       doif_Licht_Badezimmer_DayNight_Schalter_on
   NR         247
   NTFY_ORDER 50-doif_Licht_Badezimmer_DayNight_Schalter_on
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-12-13 17:19:04   cmd             0
     2018-12-13 17:19:04   mode            enabled
     2018-12-13 17:19:04   state           initialized
     2018-12-13 17:19:04   timer_01_c01    13.12.2018 23:00:00
     2018-12-13 17:19:04   timer_02_c01    14.12.2018 04:59:00
     2018-12-13 17:19:04   timer_03_c02    13.12.2018 23:00:00
     2018-12-13 17:19:04   timer_04_c02    14.12.2018 04:59:00
     2018-12-13 17:19:04   timer_05_c03    14.12.2018 05:00:00
     2018-12-13 17:19:04   timer_06_c03    13.12.2018 22:59:00
     2018-12-13 17:19:04   timer_07_c04    14.12.2018 05:00:00
     2018-12-13 17:19:04   timer_08_c04    13.12.2018 22:59:00
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') ne "on"
     1          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,2,3,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') eq "on"
     2          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,4,5,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') ne "on"
     3          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,6,7,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') eq "on"
   days:
   devices:
     0           Licht_Badezimmer_DayNight_Schalter
     1           Licht_Badezimmer_DayNight_Schalter
     2           Licht_Badezimmer_DayNight_Schalter
     3           Licht_Badezimmer_DayNight_Schalter
     all         Licht_Badezimmer_DayNight_Schalter
   do:
     0:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Nachtlicht_Schalter on
     1:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Schalter on
     2:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Schalter on
     3:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Nachtlicht_Schalter on
     4:
   helper:
     globalinit 1
     last_timer 8
     sleeptimer -1
   internals:
     0           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     1           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     2           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     3           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     all         Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
     6          -1
     7          6
   intervalfunc:
   itimer:
   localtime:
     0          1544738400
     1          1544759940
     2          1544738400
     3          1544759940
     4          1544760000
     5          1544738340
     6          1544760000
     7          1544738340
   realtime:
     0          23:00:00
     1          04:59:00
     2          23:00:00
     3          04:59:00
     4          05:00:00
     5          22:59:00
     6          05:00:00
     7          22:59:00
   time:
     0          23:00:00
     1          04:59:00
     2          23:00:00
     3          04:59:00
     4          5:00
     5          22:59:00
     6          5:00
     7          22:59:00
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
     6          3
     7          3
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   triggertime:
     1544738340:
       localtime  1544738340
       hash:
     1544738400:
       localtime  1544738400
       hash:
     1544759940:
       localtime  1544759940
       hash:
     1544760000:
       localtime  1544760000
       hash:
   uiState:
   uiTable:
Attributes:
   room       System

bartman121

Immer dieses DOIF...

Sequenz wäre sicher das einfachste für diesen Anwendungsfall gewesen.

Grüße

Gesendet von meinem ONEPLUS A5010 mit Tapatalk


Otto123

#6
Du musst Dir das anschauen in dem Zustand der nicht funktioniert.
Im Zustand nach dem Abspeichern (initialized) sieht man nix.


Am Besten mach Dir eine Tabelle mit allen on und off und schau Dir die Logikzustände an, ich denke da sieht man ev. den Fehler...
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

Rudibarani

So schaut es aus, wenn es nicht funktioniert:
Internals:
   DEF        ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] ne "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Nachtlicht_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] eq "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] ne "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59] and [?Licht_Badezimmer_DayNight_Schalter_Inverter] eq "on")
(set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Nachtlicht_Schalter on)
   MODEL      FHEM
   NAME       doif_Licht_Badezimmer_DayNight_Schalter_on
   NR         247
   NTFY_ORDER 50-doif_Licht_Badezimmer_DayNight_Schalter_on
   STATE      cmd_4
   TYPE       DOIF
   READINGS:
     2018-12-13 17:37:02   Device          Licht_Badezimmer_DayNight_Schalter
     2018-12-13 17:37:01   cmd             4
     2018-12-13 17:37:01   cmd_event       Licht_Badezimmer_DayNight_Schalter
     2018-12-13 17:37:01   cmd_nr          4
     2018-12-13 17:37:02   e_Licht_Badezimmer_DayNight_Schalter_STATE off
     2018-12-13 17:19:04   mode            enabled
     2018-12-13 17:37:01   state           cmd_4
     2018-12-13 17:19:04   timer_01_c01    13.12.2018 23:00:00
     2018-12-13 17:19:04   timer_02_c01    14.12.2018 04:59:00
     2018-12-13 17:19:04   timer_03_c02    13.12.2018 23:00:00
     2018-12-13 17:19:04   timer_04_c02    14.12.2018 04:59:00
     2018-12-13 17:19:04   timer_05_c03    14.12.2018 05:00:00
     2018-12-13 17:19:04   timer_06_c03    13.12.2018 22:59:00
     2018-12-13 17:19:04   timer_07_c04    14.12.2018 05:00:00
     2018-12-13 17:19:04   timer_08_c04    13.12.2018 22:59:00
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') ne "on"
     1          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,2,3,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') eq "on"
     2          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,4,5,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') ne "on"
     3          ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter','STATE') eq "on" and ::DOIF_time($hash,6,7,$wday,$hms) and ::InternalDoIf($hash,'Licht_Badezimmer_DayNight_Schalter_Inverter','STATE') eq "on"
   days:
   devices:
     0           Licht_Badezimmer_DayNight_Schalter
     1           Licht_Badezimmer_DayNight_Schalter
     2           Licht_Badezimmer_DayNight_Schalter
     3           Licht_Badezimmer_DayNight_Schalter
     all         Licht_Badezimmer_DayNight_Schalter
   do:
     0:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Nachtlicht_Schalter on
     1:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Schalter on
     2:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter on-for-timer 2, set Licht_Badezimmer_Schalter on
     3:
       0          set Licht_Badezimmer_DayNight_Schalter_Inverter off, set Licht_Badezimmer_Nachtlicht_Schalter on
     4:
   helper:
     event      off
     globalinit 1
     last_timer 8
     sleeptimer -1
     timerdev   Licht_Badezimmer_DayNight_Schalter
     timerevent on
     triggerDev Licht_Badezimmer_DayNight_Schalter
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: Licht_Badezimmer_DayNight_Schalter
       state: cmd_4
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       off
     triggerEventsState:
       state: off
   internals:
     0           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     1           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     2           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     3           Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
     all         Licht_Badezimmer_DayNight_Schalter:STATE Licht_Badezimmer_DayNight_Schalter_Inverter:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
     6          -1
     7          6
   intervalfunc:
   itimer:
   localtime:
     0          1544738400
     1          1544759940
     2          1544738400
     3          1544759940
     4          1544760000
     5          1544738340
     6          1544760000
     7          1544738340
   readings:
   realtime:
     0          23:00:00
     1          04:59:00
     2          23:00:00
     3          04:59:00
     4          05:00:00
     5          22:59:00
     6          05:00:00
     7          22:59:00
   time:
     0          23:00:00
     1          04:59:00
     2          23:00:00
     3          04:59:00
     4          5:00
     5          22:59:00
     6          5:00
     7          22:59:00
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
     6          3
     7          3
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   trigger:
   triggertime:
     1544738340:
       localtime  1544738340
       hash:
     1544738400:
       localtime  1544738400
       hash:
     1544759940:
       localtime  1544759940
       hash:
     1544760000:
       localtime  1544760000
       hash:
   uiState:
   uiTable:
Attributes:
   room       System

Otto123

Der Event hat getriggert:
e_Licht_Badezimmer_DayNight_Schalter_STATE off

Für den Fall hast Du doch keine Bedingung - oder?
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

Rudibarani

Für "off" hatte ich ein separates Notify (anfangs waren "on" und "off" als Notify gestartet).
Muss ich "off" im DOIF mit abbilden?

Rudibarani

Ich habe nun das separate notify für "off" aufgegeben und mit in die DOIF-Abfrage einbezogen - und schon klappt es. Ich verstehe zwar nicht, warum das jetzt den Unterschied macht, bin aber froh, dass es nun wie gewünscht funktioniert  ;D

Danke, Otto, für den entscheidenden Hinweis!

([Licht_Badezimmer_DayNight_Schalter] eq "off")(set licht_Badezimmer off)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59] and [?Licht_Badezimmer_DayNight_Inverter] eq "on")
(set Licht_Badezimmer_DayNight_Inverter off, set Licht_Badezimmer_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?23:00-04:59])
(set Licht_Badezimmer_DayNight_Inverter on-for-timer 2, set Licht_Badezimmer_Nachtlicht_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59] and [?Licht_Badezimmer_DayNight_Inverter] eq "on")
(set Licht_Badezimmer_DayNight_Inverter off, set Licht_Badezimmer_Nachtlicht_Schalter on)
DOELSEIF ([Licht_Badezimmer_DayNight_Schalter] eq "on" and [?5:00-22:59])
(set Licht_Badezimmer_DayNight_Inverter on-for-timer 2, set Licht_Badezimmer_Schalter on)

Otto123

Naja das ist für Dich vielleicht die Erkenntnis - und ein gern gemachter Fehler.
Man muss immer alle möglichen Fälle berücksichtigen und man darf nichts dem Zufall überlassen.  ;)

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

Rudibarani

Zitat von: bartman121 am 13 Dezember 2018, 17:30:13
Sequenz wäre sicher das einfachste für diesen Anwendungsfall gewesen.

Danke für den Tipp. Den FHEM Befehl kannte ich noch gar nicht. Ich habe mit das gerade mal im CommandRef angesehen. Wie hättest Du denn meine Schaltung damit umgesetzte? Wenn ich das richtig verstanden habe, hätte ich die Sequenz so anlegen müssen, dass sie triggert, wenn zweimal geschaltet wurde - und dann über einen Partial Trigger das normale Schalt-Event für das Einschalten des Lichts. Richtig? Wäre es dann nicht so, dass der Normalfall (=Nur 1x schalten) immer erst dann ausgeführt werden kann, wenn die Zeit abgelaufen ist und klar wird, dass es nur ein Partial Trigger war? Oder habe ich das doch falsch verstanden...?