Hauptmenü

Kann DOIF so etwas?

Begonnen von Kharim, 19 April 2018, 15:16:40

Vorheriges Thema - Nächstes Thema

Kharim

Hallo Zusammen,

ich glaube, ich habe hier ein Verständnisproblem, oder den falschen Ansatz.
Ich versuche das Ganze bisher nur theoretisch zu entwerfen, um DOIF an sich zu verstehen...

Was will ich?
Badheizung steht standard auf 19°C
Nun soll zum Zeitpunkt X die Temperatur auf 5°C reduziert werden.
Spätestens nach Zeit X+n soll die Temperatur wieder auf 19°C  erhöht werden.
Außer: Wenn innerhalb dieses Zeitraums, die Luftfeuchte über 75% und das Fenster geschlossen wurde, soll sofort auf 19°C gestellt werden.
Zwischenzeitliches Fenster öffnen und schließen (Feuchte < 75) soll ignoriert werden.

Ich habe also zwei völlig unterschiedliche Bedingungen zu prüfen.
Soweit ich es richtig verstanden habe, kann man innerhalb von DOIF + DOELSEIF nur Bedingungen der gleichen Devices/Auslöser prüfen?
Entsprechend benötige ich zwei DOIFs?

Entwurf/Idee, nur schematisch:

define test DOIF ([WeckZeit]-[WeckZeit]+1:00)
(set Temp 5;
set test2 enable;)
DOELSE
(set Temp 19;
set test2 disable;)


define test2 DOIF ( [Luftfeuchte] > 75 AND [Fenster:"zu"])
(set Temp 19;
set test initialize;
set test2 initialize;
set test2 disable)



Die test2 benötigt dabei vermutlich noch ein attr checkall?

Würde dies soweit funktionieren?
Kann man das doch in einer DOIF zusammen fassen?
Wie würdet ihr den Sachverhalt realisieren?

Danke,
Kharim
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

rabehd

ZitatSoweit ich es richtig verstanden habe, kann man innerhalb von DOIF + DOELSEIF nur Bedingungen der gleichen Devices/Auslöser prüfen?
Auch funktionierende Lösungen kann man hinterfragen.

Kharim

Heißt das würde auch funktionieren?


define test DOIF ([WeckZeit]-[WeckZeit]+1:00)
(set Temp 5)
DOELSEIF ( [Luftfeuchte] > 75 AND [Fenster:"zu"])
(set Temp 19)
DOELSE
(set Temp 19)


Wenn ich nicht irre, sind doch DOIF Bedingung und DOELSEIF Bedingung gleich berechtigt?
Sprich der DOELSEIF Zweig kann auch wahr werden, wenn der DOIF Zweig nicht zutrifft.
Darüber hinaus speichert die DOIF doch ihren Zustand - nach Eintreffen der Bedingung aus DOIF kann die DOELSEIF gar nicht mehr "wahr" werden / ausgeführt werden.
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

Ellert

Zitat von: Kharim am 19 April 2018, 16:06:55
Heißt das würde auch funktionieren?


define test DOIF ([WeckZeit]-[WeckZeit]+1:00)
(set Temp 5)
DOELSEIF ( [Luftfeuchte] > 75 AND [Fenster:"zu"])
(set Temp 19)
DOELSE
(set Temp 19)


Wenn ich nicht irre, sind doch DOIF Bedingung und DOELSEIF Bedingung gleich berechtigt?
Sprich der DOELSEIF Zweig kann auch wahr werden, wenn der DOIF Zweig nicht zutrifft.
Darüber hinaus speichert die DOIF doch ihren Zustand - nach Eintreffen der Bedingung aus DOIF kann die DOELSEIF gar nicht mehr "wahr" werden / ausgeführt werden.
Zweig 1 und 2 können unabhängig voneinander wahr werden. Wer zuletzt wahr wurde, bestimmt den Status.

Beispiel:
Gegeben seien 2 Operanden A und B

In diesem DOIF sind die Zweige von einander unabhängig:
A=x
DOELSEIF B=y

In diesem DOIF kann Zweig 1 nur wahr werden, wenn Zweig 2 falsch ist und umgekehrt
A=x and B!=y
DOELSEIF B=y and A!=x

Kharim

Ah, also war mein erster Gedanke gar nicht so falsch.
Man sollte immer Bedingungen mit gleichen Werten haben.

Also im Sinne von:


define test DOIF ([WeckZeit]-[WeckZeit]+1:00 AND [Luftfeuchte] > 75 AND [Fenster:"zu"])
(set Temp 19)
DOELSEIF ([WeckZeit])
        (set Temp 5)
DOELSEIF ([WeckZeit]+1:00)
         (set Temp 19)

attr checkall


Damit können die Zweige unabhängig voneinander wahr werden.
Nur innerhalb des Zeitraums greift Luftfeuchte/Fenster-Reaktion, aber zu Beginn und Ende des Zeitraums wird auch reagiert?

korrekt?
Ich glaube, dies werde ich mal versuchen einzubauen.

Grüße,
Kharim
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

nils_

Zitat von: Kharim am 20 April 2018, 09:14:54
Man sollte immer Bedingungen mit gleichen Werten haben.
nein, die annahme ist immer noch falsch.

anderes Beispiel (Syntax definitiv nicht korrekt so!!!)

DOIF ([Temperatur] > 23)(set Lampe off)
DOELSEIF ([Wetter] eq "schön")(set Heizung off)
DOELSEIF ([23:00])(set TV off)

die bedingungen haben offentsichtlich nichts miteinander zu tun, und trotzdem kann ich so ein DOIF erstellen.
sinnvoll ist das natürlich nicht...


und falls du wie in deinem eingangspost beschrieben mehrere dinge auf einmal schalten willst, dann musst du diese befehle mit Komma trennen.
siehe https://fhem.de/commandref_DE.html#DOIF_Angaben_im_Ausfuehrungsteil
viele Wege in FHEM es gibt!

Kharim

Zitat von: nils_ am 20 April 2018, 09:24:08
nein, die annahme ist immer noch falsch.

anderes Beispiel (Syntax definitiv nicht korrekt so!!!)

DOIF ([Temperatur] > 23)(set Lampe off)
DOELSEIF ([Wetter] eq "schön")(set Heizung off)
DOELSEIF ([23:00])(set TV off)

die bedingungen haben offentsichtlich nichts miteinander zu tun, und trotzdem kann ich so ein DOIF erstellen.
sinnvoll ist das natürlich nicht...

Ich sag ja, Verständnisproblem  :-[
Gut ok. Ich kann also aus technischer Sicht unabhängige Bedingungen einsetzen....
Dein Beispiel währe vermutlich in verschiedenen DOIFs besser aufgehoben?

Wenn ich nun - wie in meinem Beispiel - aber eine Situation habe, in der ich eine Bedingung A in Verbindung mit verschiedenen anderen Bedingungen prüfe, muss Bedingung A schon in allen Zweigen vorhanden sein?!
Sonst würden die anderen Zweige (unter Umständen) unabhängig von A wahr werden.
Oder nicht?
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

nils_

Zitat von: Kharim am 20 April 2018, 09:36:43
Gut ok. Ich kann also aus technischer Sicht unabhängige Bedingungen einsetzen....
Dein Beispiel währe vermutlich in verschiedenen DOIFs besser aufgehoben?
ja. deswegen hab ich ja geschrieben, das es so nicht sinnvoll ist.

Zitat von: Kharim am 20 April 2018, 09:36:43
Wenn ich nun - wie in meinem Beispiel - aber eine Situation habe, in der ich eine Bedingung A in Verbindung mit verschiedenen anderen Bedingungen prüfe, muss Bedingung A schon in allen Zweigen vorhanden sein?!
wenn A für alle Bedingungen in allen zweigen wichtig ist zur Entscheidung, dann musst du A natürlich in allen zweigen abfragen (ob es triggern muss oder nicht wäre auch noch zu überlegen!)

Zitat von: Kharim am 20 April 2018, 09:36:43
Sonst würden die anderen Zweige (unter Umständen) unabhängig von A wahr werden.
das wäre logisch.
viele Wege in FHEM es gibt!

Ellert

Zitat von: Kharim am 20 April 2018, 09:14:54
Ich glaube, dies werde ich mal versuchen einzubauen.
Dann aber auf die richtige Schreibung der Operatoren achten.

Kharim

Vielen Dank erst einmal für die tolle Unterstützung :-)
Ich glaube, jetzt habe ich ein Gefühl/Verständnis dafür.

Die nun implementierte Variante sieht wie folgt aus:

DOIF ([[WeckZeit]-([WeckZeit]+[1:00])] and [BadFeuchte] ne "OK" and [KontaktBad:"closed"])
({my $temp = ReadingsVal("ThermostatBad", "ecoTemperature", 0);
fhem("set ThermostatBad desiredTemperature manual $temp");})
DOELSEIF ([[WeckZeit]])
(set ThermostatBad desiredTemperature manual 5)
DOELSEIF ([([WeckZeit]+[1:00])])
({my $temp = ReadingsVal("ThermostatBad", "ecoTemperature", 0);
fhem("set ThermostatBad desiredTemperature manual $temp");})


+attr checkall all

Bin gespannt, ob die Bedingungen so passen :-)

Zwei kleine Anschlussfragen hätte ich noch:
- Ich schreib ja in den Anweisungen zwei mal in {} Perl Code.....geht anders/eleganter?
   (im reinen FHEM gibt es ja meines Wissens keine Variablen......)
- Der Code im CMD 1 und 3 ist gleich.....kann man in einer der beiden CMDs die andere ausführen?

Danke,
Kharim
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

Per

Zitat von: Kharim am 20 April 2018, 15:14:18
- Ich schreib ja in den Anweisungen zwei mal in {} Perl Code.....geht anders/eleganter?
   (im reinen FHEM gibt es ja meines Wissens keine Variablen......)
Du brauchst keine Variablen.
set ThermostatBad desiredTemperature manual [ThermostatBad:ecoTemperature]

Allerdings könntest du Userreadings, Dummys oder bei DOIF DOIFReadings nutzen. Hier aber überflüssig.

Zitat von: Kharim am 20 April 2018, 15:14:18
- Der Code im CMD 1 und 3 ist gleich.....kann man in einer der beiden CMDs die andere ausführen?
Da gibt es verschiedene Wege: Perl-Sub, set myDOIF cmd_3, Zusammenfassen der Bedingungen. Kommt auf die Begleitumstände an, ob eine Variante davon evtl. nicht sinnvoll ist.

Otto123

Hi Kharim,

meines Erachtens ist Bedingung 1
([[WeckZeit]-([WeckZeit]+[1:00])] and [BadFeuchte] ne "OK" and [KontaktBad:"closed"])
und Bedingung 3
([([WeckZeit]+[1:00])])
kombinierbar
([[WeckZeit]-([WeckZeit]+[1:00])] and [BadFeuchte] ne "OK" and [KontaktBad:"closed"] or [([WeckZeit]+[1:00])])

Ich bin mir in beiden Fällen nicht sicher was er mit dem doppelten Trigger [([WeckZeit]+[1:00])] eigentlich macht.

Zusammen mit dem Ausführungsteil von Per wird es viel kürzer und übersichtlicher.  :D

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

Per

Ausgehend vom Startpost mein Vorschlag:

([WeckZeit]) (set ThermostatBad desiredTemperature manual 5)(set $SELF cmd_2)
([$SELF:cmd] == 1.1 and [KontaktBad:"closed"] and [Luftfeuchte] > 75) (set ThermostatBad desiredTemperature manual [ThermostatBad:ecoTemperature])

attr XXXX wait 0,3600:0

Da sich die Namen der Devices im Laufe des Threades geändert haben, sollte der TO diese selbständig den echten Gegebenheiten anpassen ;).

Kharim

Hallo Zusammen,

aktuell läuft nun - seit einigen Tagen erfolgreich - folgende DOIF:

([([WeckZeit]-[0:15])] and WeckerModTest() eq "true" and [Zentralheizung] eq "An" and [ThermostatBad:mode] eq "manual")
(set ThermostatBad desiredTemperature manual 5)
DOELSEIF ([[WeckZeit]-([WeckZeit]+[1:00])] and [FeuchteBadWert] > 75)
(setreading $SELF Feuchte hoch)
DOELSEIF ([[WeckZeit]-([WeckZeit]+[1:00])] and [?$SELF:Feuchte] eq "hoch" and [KontaktBad:"closed"] and WeckerModTest() eq "true" and [Zentralheizung] eq "An" and [ThermostatBad:mode] eq "manual")
(set dif_HeizungDusche cmd_4)
DOELSEIF ([([WeckZeit]+[1:00])])
(set ModusBad Manuell, setreading $SELF Feuchte niedrig)


Die Logik für mein Verständnis:
- WeckZeit ist ein Dummy, der den Zeitpunkt(Uhrzeit) meines Lichtweckers enthält.
- WeckerModTest() ist eine Funktion, welche "true" oder false" (als String) zurück gibt und aktuell (nur) den Wochentagabgleich erledigt. (WeckerMode ist da zb Mo-Fr oder Sa-So oder oder oder.....)
- Dummy Zentralheizung AN beschreibt (Außentemeraturabhängig) ob die Wohnung an sich beheizt wird. Bei AUS stehen generell alle Heizungen auf 5 Grad
- Thermostat mode manuel besagt, dass kein Wochenprogramm am Thermostat aktiv ist (in welches nicht eingegriffen werden sollte)

CMD1: 15 Minuten vor Wecker (und wenn dieser klingeln wird, und Zentralheizung an und Thermostat nicht im Autoprogramm befindlich), wird die Temperatur auf 5 Grad abgesenkt

CMD2: Wenn im Zeitraum von Weckzeit bis Weickzeit+1Stunde....also im Zeitbereicht einer Stunde ab Weckzeit die Luftfeuchte über 75 (%)  steigt, wird dies im eigenen Reading vermerkt

CMD3: Wenn im Zeitraum von Weckzeit bis Weickzeit+1Stunde....also im Zeitbereicht einer Stunde ab Weckzeit das Event des schließenden Fensters auftritt und die Luftfeuchte zuvor! auf 75 gestiegen war, wird CMD4 ausgeführt.

CMD4: Nach Ablauf oben angesprochenem Zeitbereich bis Weckzeit+1Stunde wird der Modus des Thermostats auf manuell gesetzt* und die Feuchte zurück auf niedrig

*Es handelt sich hierbei um ein Dummy/Notify, welche wiederum das Thermostat überprüft und zb die Eco Temperatur wieder setzt, wenn sie noch nicht gesetzt ist.

Ich merke gerade selbst, dass noch ein kleiner Denkfehler vorhanden ist.
Auch CMD2 und CMD4 benötigen den Test(Bedingung) von Weckermodetest, Zentralheizung und Modus,
da auch hier sonst bei nicht "klingeln" des Weckers ins eventuell laufende Wochenprogramm eingegriffen wird.

Soweit eigentlich schlüssig?


Die Version von Per dürfte nicht funktionieren.
Denn ein wait wartet doch definitiv bis zum Ende?
Es soll aber auch innerhalb der Stunde Zeitbereicht sofort auf das Event des schließenden Fensters reagiert werden. Aber spätestens nach dem Zeitbereich, sollte das Fenster nicht melden.

Zum Post von Otto:
Das heißt also du verknüpfst die Bedingungen der beiden gleichen CMDs per OR komplett und hast damit nur einen Zweig.
....Hätte den Vorteil, dass der, in meinem Fall CMD4, Zweig nicht zwei mal ausgeführt werden.

Grüße,
Kharim
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

Per

Zitat von: Kharim am 02 Mai 2018, 19:22:18Die Version von Per dürfte nicht funktionieren.
Denn ein wait wartet doch definitiv bis zum Ende?
Wait