FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: rretsiem am 29 Januar 2016, 09:33:06

Titel: [gelöst] DOIF: elseif obwohl erste Bedingung wahr
Beitrag von: rretsiem am 29 Januar 2016, 09:33:06
Hi,

Um etwas Strom zu sparen (man versucht ja alles) möchte ich meine Sonos Player tagsüber wenn sie nicht benötigt werden abschalten.
Dazu habe ich folgendes DOIF für das Bad gebastelt:


([04:15-08:45|8] or [17:30-23:30|8] and [rgr_Residents:presence] eq "present")
## Lediglich einschalten wenn jemand zu Hause zwischen 04:15 und 08:45
## und zwischen 17:30 und 23:30
(set BAD.Strom.Sonos:FILTER=STATE!=on on)
DOELSEIF ([07:00-23:00|7] and [rgr_Residents:presence] eq "present")
## Am Wochenende einschalten wenn jemand zu Hause
(set BAD.Strom.Sonos:FILTER=STATE!=on on)
DOELSEIF  ([BAD.Bademodus] eq "on")
## Bademodus, gesteuert über dummy
(set BAD.Strom.Sonos:FILTER=STATE!=on on)
DOELSE
(set Sonos_Bad:FILTER=transportState=PLAYING stop,
         set BAD.Strom.Sonos:FILTER=STATE!=off off)


Heute (Freitag) früh war die Steckdose auch ON, aber um Punkt 7 Uhr ist sie abgeschaltet worden. Das deutet ja darauf hin das die erste Bedingung, obwohl wahr, ignoriert wurde und er in der zweiten Bedingung ein FALSCH bemerkt hat und somit in den DOELSE gesprungen ist.
Kann mir das mal jemand erklären weshalb DOIF hier so reagiert und einen Tipp geben wie ich das besser lösen kann?

Danke!
Titel: Antw:DOIF: elseif obwohl erste Bedingung wahr
Beitrag von: Otto123 am 29 Januar 2016, 09:46:41
Ich weiß keine direkte Antwort auf deine Frage, aber:
Warum überhaupt das DOELSIF? Deine Schaltaktion ist doch gleich, mach einfach:
Bedingung1 oder Bedingung2 oder Bedingung3 dann (schalte ein) DOELSE (schalte aus)

Gruß Otto
Titel: Antw:DOIF: elseif obwohl erste Bedingung wahr
Beitrag von: Ellert am 29 Januar 2016, 10:50:39
Zitatweshalb DOIF hier so reagiert
Es ist so programmiert, s. http://fhem.de/commandref_DE.html#DOIF , Absatz vor dem Beispiel.
ZitatTipp geben
Das hat Otto123 bereits beantwortet.

Titel: Antw:DOIF: elseif obwohl erste Bedingung wahr
Beitrag von: turo am 29 Januar 2016, 11:16:37
Aha - ich denke, das wird mir jetzt klar: 07:00 ist keine Triggerzeit für die erste Bedingung, daher wird um 07:00 nur die zweite Bedingung ausgewertet und die ist nun mal falsch. (Da könnte man sich nur wundern, warum DOIF für 07:00 überhaupt einen Trigger setzt, wenn es kein Samstag ist.)

Aber die Logik haut noch nicht hin: "and" bindet stärker als "or". Da braucht es Klammern.

Ich greife dann mal Otto123 auf und schlage vor:

(([04:15-08:45|8] or [17:30-23:30|8] or [07:00-23:00|7]) and [rgr_Residents:presence] eq "present")
## Lediglich einschalten wenn jemand zu Hause zwischen 04:15 und 08:45
## und zwischen 17:30 und 23:30 und
        ## am Wochenende einschalten wenn jemand zu Hause
(set BAD.Strom.Sonos:FILTER=STATE!=on on)
DOELSEIF  ([BAD.Bademodus] eq "on")
## Bademodus, gesteuert über dummy
(set BAD.Strom.Sonos:FILTER=STATE!=on on)
DOELSE
(set Sonos_Bad:FILTER=transportState=PLAYING stop,
         set BAD.Strom.Sonos:FILTER=STATE!=off off)
Titel: Antw:DOIF: elseif obwohl erste Bedingung wahr
Beitrag von: rretsiem am 29 Januar 2016, 12:01:40
Hi,

Danke für die Tipps, ich habe das jetzt so gelöst wie von Otto und turo vorgeschlagen. Meist reicht ja ein anderer Blickwinkel um das zu lösen.

Titel: Antw:[gelöst] DOIF: elseif obwohl erste Bedingung wahr
Beitrag von: Ellert am 29 Januar 2016, 12:06:54
Zitatwarum DOIF für 07:00 überhaupt einen Trigger

[07:00|7] ist nur eine andere schreibweise für [07:00] and $we , der Timer selbst ist nicht Wochentag behaftet.

Ich würde auch ([BAD.Bademodus] eq "on") mit in die 1. Bedingung einbauen. Denn sonst könnte am WE zwischen 8:45 und 17:30 bei [BAD.Bademodus] eq "on" und einer Statuserneuerung von [rgr_Residents:presence] das Sonos_Bad ausgehen, also
(([04:15-08:45|8] or [17:30-23:30|8] or [07:00-23:00|7]) and [rgr_Residents:presence] eq "present" or [BAD.Bademodus] eq "on")
Titel: Antw:DOIF: elseif obwohl erste Bedingung wahr
Beitrag von: Per am 29 Januar 2016, 12:42:15
Zitat von: Otto123 am 29 Januar 2016, 09:46:41Warum überhaupt das DOELSIF? Deine Schaltaktion ist doch gleich
Hier nicht zu sehen, aber wenn "wait" oder "cmdState" verwendet wird, kann es sinnvoll sein.