Probleme mit Klammersetzung und DOIF-Verständnis

Begonnen von romarira, 14 Juni 2019, 08:46:43

Vorheriges Thema - Nächstes Thema

romarira

Hallo,

ich habe ein wirkliches Verständnisproblem mit der Klammersetzung bei DOIF und dem Verständnis, wann DOIF etwas macht und wann nicht.

Obwohl ich mich durch Commandref, Wiki und viele Forumsbeiträge durchgearbeitet habe, erschließt sich mir das Thema nicht.

An einem konkreten Beispiel möchte ich es verdeutlichen. Ich möchte eine Lampe schalten und zwar morgens und abends. Nach Möglichkeit möchte ich auch nur ein DOIF verwenden.

Parameter morgens:
- Angehen um 5:15 Uhr
- nur montags bis freitags
- nur dann wenn rgr_Bewohner = "zuhause"
- abschalten um sr_indoor

define Kaminlicht_Morgen DOIF([05:15]|8 and [?rr_Marion] eq "zuhause") (set Kaminlicht on)
define Kaminlicht_Morgen_AUS DOIF([[my_TL1:sr_indoor]]|8 and [?Kaminlicht:state] eq "ON" ) (set Kaminlicht off)


Das habe ich versucht wie folgt zu lösen. Klappt aber nicht zuverlässig und heute morgen wurde z.B. nicht ausgeschaltet.

Parameter abends:
- Angehen 40 Minuten vor  Sonnenuntergang innerhalb (ss_indoor)
- nur dann wenn rgr_Bewohner = "zuhause"
- Funktion auch nur bis 22:00 Uhr ausführen

define WZ_Daemmerung DOIF ([([my_TL1:ss_indoor]-2400)-[22:00]] and [?rgr_Bewohner] eq "zuhause") (set Kaminlicht on)

Bei meinen Tests bekomme ich abhängig von den eckigen Klammern immer wieder Fehlfunktionen. Bei rgr_Bewohner ohne Fragezeichen geht auf einmal die Lampe an, obwohl die Zeit noch gar nicht erreicht ist.
Ich verstehe das einfach nicht. Vor allem machen mir die Klammern (eckig (einfach oder doppelt), rund) und der Unterschied zu einem "normalen" if ... then zu schaffen.

Kann mir das jemand vielleicht in einfachen Worten erklären?
Intel NUC, FHEM VMe auf debian Proxmox-Server, Sonoff S20/Basic/POW, Shelly 1 & 2.5
Homematic IP-HK-Thermostate, Wandthermostat, FTK
FHT80b-HK-Thermostate und FTK
Raspberrymatic auf separater VM
Unifi/Ubiquiti-Wlan-Netzwerk, DHCP-Server über Firtzbox

Otto123

#1
Hi,

die eckige Klammer liefert beim DOIF und beim set magic den Inhalt des Readings (was in der Klammer steht). Oder sie enthält im DOIF eine Zeit oder Zeitraum.
Die runde Klammer klammert Operationen: normalerweise erst Punktrechnen dann Strichrechnen, durch die Klammer kann man die Reihenfolge ändern: erst den Inhalt der Klammer auflösen.
Die doppelte eckige Klammer liefert beim DOIF den Inhalt des Readings als Zeit.
Das Fragezeichen verhindert den Trigger bei Wertänderung. Das DOIF muss anderweitig getriggert werden, dann wird dieser Wert aber abgefragt und ausgewertet.

Ich denke dieser Ausdruck ist falsch: [([my_TL1:ss_indoor]-2400)-[22:00]] aber da bin ich nicht sicher.
https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Vielleicht so? [([my_TL1:ss_indoor]-[00:40])-22:00]

Deine Wochentagsangabe ist meiner Meinung nach falsch: [05:15]|8 -> [05:15|8]
https://commandref.fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung

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

pc1246

Moin
Ich wuerde das auch mit einem DOIF machen, sonst verlierst du da ganz schnell den Ueberblick!
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

romarira

ZitatIch wuerde das auch mit einem DOIF machen, sonst verlierst du da ganz schnell den Ueberblick!

Das möchte ich ja auch gerne, habe aber halt die Klammerprobleme und das Verständnisproblem zu DOIF vs. if .. then.
Intel NUC, FHEM VMe auf debian Proxmox-Server, Sonoff S20/Basic/POW, Shelly 1 & 2.5
Homematic IP-HK-Thermostate, Wandthermostat, FTK
FHT80b-HK-Thermostate und FTK
Raspberrymatic auf separater VM
Unifi/Ubiquiti-Wlan-Netzwerk, DHCP-Server über Firtzbox

Otto123

Der Unterschied zu if ... then ist eigentlich keiner bzw. nur die Schreibweise:
if (wahr) then (schalte) else (mach was anderes) -> DOIF (wahr)(schalte)DOELSE(mach was anderes)

(Bedingung ist wahr?)(Dann mach das)DOELSEIF(weitere Bedingung ist wahr?)(mach auch was)DOELSE(alles nicht wahr -> mach was anderes)

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

Ellert

Zitat von: Otto123 am 14 Juni 2019, 14:49:10
Der Unterschied zu if ... then ist eigentlich keiner bzw. nur die Schreibweise:
if (wahr) then (schalte) else (mach was anderes) -> DOIF (wahr)(schalte)DOELSE(mach was anderes)

(Bedingung ist wahr?)(Dann mach das)DOELSEIF(weitere Bedingung ist wahr?)(mach auch was)DOELSE(alles nicht wahr -> mach was anderes)

Gruß Otto
So einfach ist das und ich habe immer versucht die deutschsprachige Befehlsreferenz zu verstehen ;)

amenomade

Zitat von: Otto123 am 14 Juni 2019, 14:49:10
if (wahr) then (schalte) else (mach was anderes)
In welcher Sprache schreibt man ein if so? ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

romarira

Hallo, ich greife eure Antworten noch einmal auf und zwar hierzu:

ZitatDer Unterschied zu if ... then ist eigentlich keiner bzw. nur die Schreibweise:

Ich habe an mehreren Stellen etwas gelesen, dass DOIF sich nur um Zustandsänderungen kümmert, z.b. hier: https://forum.fhem.de/index.php?topic=54254.0

ZitatDOIF arbeitet, sofern nicht anders eingestellt, mit Zustandsänderungen. Wenn also nach 22 Uhr das DOIF pufferpumpe im cmd1 steht dann wird er morgens auch nicht schalten da der zustand cmd1 ja schon geschalten ist.

Was hat es denn mit diesen Zustandsänderungen auf sich?
Bei einem if ... then wird nach meinem Verständnis geprüft ob die Voraussetzungen vorliegen. Wenn ja, wird der Befehl ausgeführt.
Was ist dabei bei DOIF anders und wie kann ich damit in der Praxis umgehen?
Intel NUC, FHEM VMe auf debian Proxmox-Server, Sonoff S20/Basic/POW, Shelly 1 & 2.5
Homematic IP-HK-Thermostate, Wandthermostat, FTK
FHT80b-HK-Thermostate und FTK
Raspberrymatic auf separater VM
Unifi/Ubiquiti-Wlan-Netzwerk, DHCP-Server über Firtzbox

Ellert

#8
Dann musst Du doch  die deutschsprachige Befehlsreferenz zu Rate ziehen, insbesondere die Einleitung bis zum Inhaltsverzeichnis und parallel dazu den Einsteigerleitfaden.

Otto123

#9
Hi,
Der "Hauptunterschied" aus der Sicht eines herkömmlichen "Programmierers":
Ein if then wird von einem Programm aufgerufen, d.h. der Programmierer bestimmt an welcher Stelle in seinem Programm das if then Konstrukt aufgerufen wird.
Ein DOIF wird von FHEM bei einem Event im System aufgerufen.
Wenn die Trigger Bedingungen für das DOIF stimmen (Siehe Doku) wird es abgearbeitet.

Der Unterschied ist eigentlich keiner :)

Zustandsänderung: Die Bedingung ist ([dummy] > 5) ,
wenn sich der Zustand des dummy ändert (z.B. von 3 auf 4), wird die Bedingung geprüft. Sie ist dann allerdings nicht wahr. Ändert sich der dummy von 4 auf 5 wird sie wahrwird sie noch nicht wahr ;). Ändert sich der dummy von 5 nach 6 wird sie nicht bleibt sie wahr - und bleibt es bei jeder Erhöhung des dummy.
Edit: Sorry, ich musste den Unsinn mehrfach korrigieren.

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

Ellert

Zitatvon 5 nach 6 wird sie nicht wahr
Ist es nicht so, dass sie wahr bleibt?

Otto123

wo Du Recht hast :)
klar es war ja größer als und nicht gleich  ::)
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

Ellert

#12
Zitat von: Otto123 am 22 Juni 2019, 00:57:17
wo Du Recht hast :)
klar es war ja größer als und nicht gleich  ::)
Dein Text ist auch richtig, wenn man 'nicht' auf 'wird' bezieht und nicht auf 'wahr'.

von 5 nach 6 wird sie nicht wahr, weil sie schon war ist ;)

rischbiter123

Moin,
und, man möge mich korrigieren, auch erst dann, denn 5 ist nicht größer 5.

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

Otto123

Moin,
sicher? ;D
5 > 5 ?

Naja Hauptsache romarira versteht die Funktionsweise.

Und hier wird wieder das Gute am Forum gezeigt! Alle schauen drüber und können meinen Unsinn korrigieren.
Deswegen: Fragen immer im Forum stellen und nicht aus falscher Scham per PM :)

Schönes Wochenende
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