Hauptmenü

DOIF auch ohne Bedingung

Begonnen von T3mplate, 05 Januar 2018, 11:13:51

Vorheriges Thema - Nächstes Thema

T3mplate

Hallo,

DOIF nutze ich mittlerweile für so ziemlich jede Automatisierung und bin damit sehr zufrieden.
Um so wenig Devices wie möglich zu haben, kombiniere ich meist mehrere Sachen in einem DOIF.

Konkret ersetze ich damit zum Beispiel einen dummy um einen Zustand anzuzeigen, möchte damit aber gleichzeitig auch schalten können (devstateicon).

Internals:
   DEF        ([HUEGroup3] eq "true" or [ZW_Kueche_Modul] eq "setOn") (setreading $SELF any_on on) DOELSEIF
([HUEGroup3] eq "false" or [ZW_Kueche_Modul] eq "setOff") (setreading $SELF any_on off) DOELSEIF
([passiertnicht]) (set ZW_Kueche_Modul setOff) DOELSEIF
([passiertnicht]) (set HUEGroup3 false) (set ZW_Kueche_Modul setOff)
   NAME       Kueche_Lampen
   NR         649
   NTFY_ORDER 50-Kueche_Lampen
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-01-05 08:33:30   Device          ZW_Kueche_Modul
     2018-01-05 08:33:30   any_on          off
     2018-01-05 08:33:30   cmd             2
     2018-01-05 08:33:30   cmd_event       ZW_Kueche_Modul
     2018-01-05 08:33:30   cmd_nr          2
     2018-01-05 07:59:40   e_HUEGroup3_STATE false
     2018-01-05 08:33:30   e_ZW_Kueche_Modul_STATE setOff
     2018-01-05 08:33:30   state           cmd_2
   condition:
     0          InternalDoIf($hash,'HUEGroup3','STATE') eq "true" or InternalDoIf($hash,'ZW_Kueche_Modul','STATE') eq "setOn"
     1          InternalDoIf($hash,'HUEGroup3','STATE') eq "false" or InternalDoIf($hash,'ZW_Kueche_Modul','STATE') eq "setOff"
     2          InternalDoIf($hash,'passiertnicht','STATE')
     3          InternalDoIf($hash,'passiertnicht','STATE')
   devices:
     0           HUEGroup3 ZW_Kueche_Modul
     1           HUEGroup3 ZW_Kueche_Modul
     2           passiertnicht
     3           passiertnicht
     all         HUEGroup3 ZW_Kueche_Modul passiertnicht
   do:
     0:
       0          setreading Kueche_Lampen any_on on
     1:
       0          setreading Kueche_Lampen any_on off
     2:
       0          set ZW_Kueche_Modul setOff
     3:
       0          set HUEGroup3 false
       1          set ZW_Kueche_Modul setOff
     4:
   helper:
     event      setOff,reportedState: setOff
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   ZW_Kueche_Modul
     timerevent setOff,reportedState: setOff
     triggerDev ZW_Kueche_Modul
     timerevents:
       setOff
       reportedState: setOff
     timereventsState:
       state: setOff
       reportedState: setOff
     triggerEvents:
       setOff
       reportedState: setOff
     triggerEventsState:
       state: setOff
       reportedState: setOff
   internals:
     0           HUEGroup3:STATE ZW_Kueche_Modul:STATE
     1           HUEGroup3:STATE ZW_Kueche_Modul:STATE
     2           passiertnicht:STATE
     3           passiertnicht:STATE
     all         HUEGroup3:STATE ZW_Kueche_Modul:STATE passiertnicht:STATE
   itimer:
   readings:
   regexp:
     0:
     1:
     all:
   state:
     STATE:
   trigger:
Attributes:
   devStateIcon cmd_1:on:cmd_4 cmd_2:off:cmd_3 cmd_3:on:cmd_4 cmd_4:off:cmd_3
   group      Licht
   room       Wohnzimmer-BG

Cond 0 und 1 dienen der Darstellung ob mindestens eine Lampe an ist oder beide aus.
Jetzt möchte ich über devStateIcon alle Lampen ausschalten - falls an - und alle anschalten - falls aus.

Dafür habe ich ein cmd3 und cmd4 eingeführt, welches man nur über devStateIcon erreichen kann/ soll.
Das habe ich über die Bedingung ([passiertnicht]) gelöst, damit diese nicht anders ausgelöst werden können.

Gibt es dafür nicht auch eine bessere (Standard-)Lösung?

Damian

#1
Ich würde so etwas über uiTable lösen und das DOIF nur für eine Statusdarstellung nutzen

z.B.

define di DOIF ([HUEGroup3] eq "true" or [ZW_Kueche_Modul] eq "setOn")
attr di cmdState on|off

attr di uiTable WID ([ZW_Kueche_Modul],"iconSwitch,setOff,icon_für_on\@DarkOrange,setOn,icon_für_off") |
WID ([HUEGroup3],"iconSwitch,setOff,icon_für_on\@DarkOrange,setOn,icon_für_off")


icon_für_off und icon_für_on muss man durch einen gewünschten icon-Namen ersetzen.

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

T3mplate

gleich mal die neue Lösung vermarkten ;)
Schaue ich mir dann gleich mal an.

Per

Zitat von: T3mplate am 05 Januar 2018, 11:13:51
Hallo,Das habe ich über die Bedingung ([passiertnicht]) gelöst, damit diese nicht anders ausgelöst werden können.

Gibt es dafür nicht auch eine bessere (Standard-)Lösung?
Naja, ich habe als Bedingung
(0)
stehen.

Bei deiner Lösung (unabhängig davon, wie die Bedingung geschrieben wird) musst du noch auf die Selftriggerung achten. Noch besser wäre stattdessen ein
set $SELF cmd_x

Damian

#4
Zitat von: T3mplate am 05 Januar 2018, 13:43:39
gleich mal die neue Lösung vermarkten ;)
Schaue ich mir dann gleich mal an.
Du kannst es noch weiter treiben und DOIF zum Nichtstun degradieren.  Den Status, wie auch die Schaltbefehle kannst du elegant in einer Icon-Zeile unterbringen. z. B.

define di DOIF (1)

attr di DOIF_Readings H_ZW_state: ([HUEGroup3] eq "true" or [ZW_Kueche_Modul] eq "setOn" ? "on" : "off")

attr di uiTable WID([$SELF:H_ZW_state], "iconLabel,off,icon_für_off,on,icon_für_on") |
WID ([ZW_Kueche_Modul],"iconSwitch,setOff,icon_für_on\@DarkOrange,setOn,icon_für_off") |
WID ([HUEGroup3],"iconSwitch,setOff,icon_für_on\@DarkOrange,setOn,icon_für_off")
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

T3mplate

#5
Zitat von: Damian am 05 Januar 2018, 16:55:23
Du kannst es noch weiter treiben und DOIF zum Nichtstun degradieren.  Den Status, wie auch die Schaltbefehle kannst du elegant in einer Icon-Zeile unterbringen. z. B.

define di DOIF (1)

attr di DOIF_Readings H_ZW_state: ([HUEGroup3] eq "true" or [ZW_Kueche_Modul] eq "setOn" ? "on" : "off")

attr di uiTable WID([$SELF:H_ZW_state], "iconLabel,off,icon_für_off,on,icon_für_on") |
WID ([ZW_Kueche_Modul],"iconSwitch,setOff,icon_für_on\@DarkOrange,setOn,icon_für_off") |
WID ([HUEGroup3],"iconSwitch,setOff,icon_für_on\@DarkOrange,setOn,icon_für_off")


So.
nachdem ich uiTable ewig nicht gefunden habe (FHEM war aktuell, musste aber neu gestartet werden), habe ich es endlich zum ersten Mal getestet.
Ich kann mir mehrere Sachen damit vorstellen, aber in diesem Zusammenhang ist das für mich keine Lösung.

Ich möchte (siehe Anhang) ein Symbol welches beide Devices vereint und auch nur diesen Button zum klicken. Meine Lösung funktioniert ja. Ich hätte nur gehofft, dass es eine andere Lösung als meinen ,,Hack" gibt.

T3mplate

Zitat von: Per am 05 Januar 2018, 13:52:01
Naja, ich habe als Bedingung
(0)
stehen.
Ok. Ich bin also nicht der Einzige der dafür eine Lösung sucht.

Zitat von: Per am 05 Januar 2018, 13:52:01
Bei deiner Lösung (unabhängig davon, wie die Bedingung geschrieben wird) musst du noch auf die Selftriggerung achten. Noch besser wäre stattdessen ein
set $SELF cmd_x
An welcher Stelle meinst du das?
Ich kann noch nicht ganz folgen.

juemuc

Hallo,

warum definierst Du nicht eine "structure". Mit diesem Device kannst Du dann alle Lampen Ein- oder Ausschalten.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).