Hauptmenü

Syntaxfehler at..if..else

Begonnen von chq, 08 Juni 2018, 07:36:17

Vorheriges Thema - Nächstes Thema

chq

Hallo,

ein per Wlan-Steckdose geschaltetes Licht soll nur dann täglich zwischen 19 und 6 Uhr leuchten, wenn meine Frau auch daheim ist.
Wenn Sie beispielsweise erst um 20 Uhr heimkommt, soll sich das Licht halt um 20 Uhr erst einschalten.
Wenn Sie beispielsweise schon um 5 Uhr das Haus verlässt, soll sich das Licht halt um 5 Uhr schon ausschalten.

Folgender Code ist ein erster Ansatz meinerseits. Ich verstehe nicht, warum es zu Syntaxfehlern kommt.

define babylampeLeuchtet at *19:00:00 { if (trackingFrau("presence") eq "present") && (($hour >= 19 || $hour < 6))) { fhem("set ogBabylampe on") } else { fhem("set ogBabylampe off") } }

syntax error at (eval 3398) line 1, near ") &&"
syntax error at (eval 3398) line 1, near "} }"


trackingFrau ist ein PRESENCE-Device. Funktioniert.
ogBabylampe ist eine Wlan-Steckdose (ESPEasy). Funktioniert.

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Frank_Huber

ich empfehle das in ein DOIF zu packen.
Was Du vorhast wird mit at so nicht gehen.

chq

#2
Ok, super!

Das hier funktioniert bereits:

([08:17-08:18]) (set ogBabylicht on) DOELSE (set ogBabylicht off)

Das hier leider (noch) nicht:

([08:17-08:18] and [trackingFrau:presence] eq present) (set ogBabylicht on) DOELSE (set ogBabylicht off)

Im angelegten Device steht unten Probably associated with: trackingFrau present PRESENCE

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Frank_Huber


CoolTux

Ich würde mir das ganze noch einmal genauer überlegen. Wenn Du alles zu festen Zeiten machst ist das nicht Zielführend. Versuche mit Events zu arbeiten.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

nils_

Zitat von: Frank_Huber am 08 Juni 2018, 07:39:17
ich empfehle das in ein DOIF zu packen.
Was Du vorhast wird mit at so nicht gehen.

DOIF ist die eine Variante (scheint ja auch zu laufen bei dir)

ansonsten hättet du ein "notify" nehmen können. (um auf die änderung von presence zu reagieren!)
viele Wege in FHEM es gibt!

Wernieman

Insofern war der Grundgedanke falsch:
Das System muß entscheiden, wenn jemand kommt. Also nicht zu einer festen Uhrzeit.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

nils_

Zitat von: Wernieman am 08 Juni 2018, 09:37:35
Insofern war der Grundgedanke falsch:
Das System muß entscheiden, wenn jemand kommt. Also nicht zu einer festen Uhrzeit.

das ist oft der Gedankenfehler der gemacht wird finde ich.
fhem arbeitet eventbasiert und reagiert auf trigger. ( -> notify )
oft wird aber gedacht, wenn etwas in einem zeitraum abgefragt/geprüftn/ausgeführt werden soll, das dies mit einem at zu lösen ist. und damit hätten wir dann zustands-polling. geht auch, ist aber nicht schön :)


aber es hat alles seine daseins-berechtigung, deswegen jeder so wie er will _und_ wie er es versteht :)
viele Wege in FHEM es gibt!

CoolTux

Der Threadersteller muss hier in zwei Richtungen denken was seine Frau und das Licht an geht.

Einmal muß er auf das nach Hause kommen reagieren und abfragen ob es schon spät genug für Licht ist (isDay) und einmal muss er einen Event abfangen der entweder einen relativen Bezug zu isDay hat (Twilight) oder der intervall mäßig immer kommt und dann in einem Notify in einer Abfrage isDay endet.

Ich selbst reagiere auf Twilight:azimuth
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

Hi,

ich habe sowas ähnliches auch, ich stelle das mal allgemein dar:
define KommtGeht DOIF ([Person:"present"] and [?Zeitraum])(schalte an) DOELSEIF ([Person:"absent"] and [?Zeitraum])(schalte aus)
attr KommtGeht do always


Person Zeitraum und der Schaltvorgang muss natürlich ersetzt werden. [Person:"present"] triggert auf den event "present". Der Zeitraum wird nur abgefragt und kann natürlich mit Sonnenaufgang oder Sonnenuntergang belegt werden werden. Beispiele findet man in der Doku.

Man kann den Zeitraum auch triggern lassen, dann passiert etwas von wenn man da oder abwesend ist. Aber das entsprach nicht der ursprünglichen Aufgabenstellung.

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

chq

#10
Danke für die vielen Infos.. muss ich jetzt erstmal alles "auswerten".  :P

Gruß Chris

Edit: Ähm, ich hab mir dieses Flussdiagramm nun mehrmals angeschaut, verstehe es jedoch noch immer nicht:

https://wiki.fhem.de/wiki/Datei:DOIF_Aufbau_Ablauf_nSVG.png

Was ist denn mit der Frage "Passt ein Auslöser der Bedingung 1 zum Ereignis?" gemeint? Ist ein Ereignis ein Auslöser?
So einfach wie möglich, so kompliziert wie nötig

Wernieman

DAS ist auch DOIF ... es kann viel, mir persönlich zu viel ... weshalb es zu DOIF von mir keine Hilfe geben wird. (Sorry)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

pc1246

Zitat von: Otto123 am 08 Juni 2018, 12:02:10
Hi,

ich habe sowas ähnliches auch, ich stelle das mal allgemein dar:
define KommtGeht DOIF ([Person:"present"] and [?Zeitraum])(schalte an) DOELSEIF ([Person:"absent"] and [?Zeitraum])(schalte aus)
attr KommtGeht do always


Person Zeitraum und der Schaltvorgang muss natürlich ersetzt werden. [Person:"present"] triggert auf den event "present". Der Zeitraum wird nur abgefragt und kann natürlich mit Sonnenaufgang oder Sonnenuntergang belegt werden werden. Beispiele findet man in der Doku.

Man kann den Zeitraum auch triggern lassen, dann passiert etwas von wenn man da oder abwesend ist. Aber das entsprach nicht der ursprünglichen Aufgabenstellung.

Gruß Otto
Moin
Also ich sehe das anders, beim DOELSEIF sollte es schon durch die Zeit geschaltet werden, und dann auch als "or"! Sonst brennt die Lampe unter Umstaenden sehr lange!
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

Otto123

Hallo Christoph,

in der ursprünglichen Textaufgabe steht es aber anders drin. Da soll die Lampe nachts nicht von allein ausgehen.

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

chq

#14
Die Lampe soll (if "Frau daheim") von 19 Uhr abends bis morgens 6 Uhr brennen.

Gruß Chris

Edit: Das hier funktioniert (zumindest bei permanenter Anwesenheit der Weiblichkeit) jetzt zunächst einmal, womit die Aufgabe für mich jedoch noch nicht gelöst ist:

([19:00-06:00] and [trackingFrau:presence] eq "present") (set ogBabylicht on) DOELSE (set ogBabylicht off)
So einfach wie möglich, so kompliziert wie nötig