DOIF Weihnachtsbeleuchtung mit Anwesenheit

Begonnen von mfeske, 04 Dezember 2015, 20:15:40

Vorheriges Thema - Nächstes Thema

mfeske

Hallo zusammen,

ich versuche mich mal wieder an einen DOIF (scheint einfach zu mächtig für mich zu sein).
([{sunset(-3600)}] and [rr_location_tania] eq "home") (set Weihnachten_Tania on) DOELSEIF ([23:00]) (set Weihnachten_Tania off) DOELSEIF ([05:00] and [rr_location_tania] eq "home") (set Weihnachten_Tania on) DOELSEIF ([09:00]) (set Weihnachten_Tania off)

schaltet halt leider nicht wie es soll und bleibt im cmd4 :-( habe ich da ein attr vergessen ?

Internals:
   DEF        ([{sunset(-3600)}] and [rr_location_tania] eq "home") (set Weihnachten_Tania on) DOELSEIF ([23:00]) (set Weihnachten_Tania off) DOELSEIF ([05:00] and [rr_location_tania] eq "home") (set Weihnachten_Tania on) DOELSEIF ([09:00]) (set Weihnachten_Tania off)
   NAME       Weihnachten_Tania_doif
   NR         487
   NTFY_ORDER 50-Weihnachten_Tania_doif
   STATE      cmd_4
   TYPE       DOIF
   Readings:
     2015-12-04 20:14:51   Device          rr_location_tania
     2015-12-04 09:00:01   cmd_event       timer_4
     2015-12-04 09:00:01   cmd_nr          4
     2015-12-04 20:14:51   e_rr_location_tania_STATE home
     2015-12-04 09:00:01   state           cmd_4
     2015-12-04 15:35:35   timer_1_c1      05.12.2015 15:35:10
     2015-12-03 23:00:00   timer_2_c2      04.12.2015 23:00:00
     2015-12-04 05:00:00   timer_3_c3      05.12.2015 05:00:00
     2015-12-04 09:00:01   timer_4_c4      05.12.2015 09:00:00
   Condition:
     0          DOIF_time_once($hash,$hash->{timer}{0},$wday,"") and InternalDoIf('rr_location_tania','STATE','') eq "home"
     1          DOIF_time_once($hash,$hash->{timer}{1},$wday,"")
     2          DOIF_time_once($hash,$hash->{timer}{2},$wday,"") and InternalDoIf('rr_location_tania','STATE','') eq "home"
     3          DOIF_time_once($hash,$hash->{timer}{3},$wday,"")
   Days:
   Devices:
     0           rr_location_tania
     2           rr_location_tania
     all         rr_location_tania
   Do:
     0:
       0          set Weihnachten_Tania on
     1:
       0          set Weihnachten_Tania off
     2:
       0          set Weihnachten_Tania on
     3:
       0          set Weihnachten_Tania off
     4:
   Helper:
     globalinit 1
     last_timer 4
     sleeptimer -1
   Internals:
     0           rr_location_tania:STATE
     2           rr_location_tania:STATE
     all         rr_location_tania:STATE
   Itimer:
   Readings:
   Realtime:
     0          15:35:10
     1          23:00:00
     2          05:00:00
     3          09:00:00
   State:
   Time:
     0          {sunset(-3600)}
     1          23:00:00
     2          05:00:00
     3          09:00:00
   Timecond:
     0          0
     1          1
     2          2
     3          3
   Timer:
     0          0
     1          0
     2          0
     3          0
   Timerfunc:
   Timers:
     0           0
     1           1
     2           2
     3           3
   Trigger:
Attributes:
   room       Tania
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

l2r

hi,

ich hab dein DOIF mal ein bisschen "übersichtlicher" gestaltet:

(([{sunset(-3600)}] or [05:00]) and [rr_location_tania] eq "home") (set Weihnachten_Tania on)
DOELSEIF ([23:00] or [09:00]) (set Weihnachten_Tania off)


Sumit wird Weihnachten_Tania um 5h und eine Stunde von Sonenuntergang eingeschaltet, wenn Tanja zuhause ist. Ist sie zu diesem Zeitpunkt oder später nicht zuhause, dann bleibt das Device aus.

umd 23 bzw. 9 Uhr wird das Device wieder ausgeschaltet.

Ich vermute, dass du erreichen möchtest, dass die Beleuchtung angeschaltet wird, wenn Tanja zwischen 5 und 9 Uhr bzw. eine Stunde vor Sonnenuntergang und 23h zuhause ist?! Du fragst den Zustand nur zu einem Bestimmten Zeitpunkt und nicht zu einem Bereich ab.

Wenn ich richtig vermutet habe, dann muss dein DOIF so aussehen:
(([{sunset(-3600)}-22:59] or [05:00-8:59]) and [rr_location_tania] eq "home") (set Weihnachten_Tania on)
DOELSEIF ([23:00] or [09:00]) (set Weihnachten_Tania off)

Wissen ist Macht.
Ich weiß nix.
Macht nix.

mfeske

Hallo l2r,

vielen Dank, da hast Du mir mal wieder aus einer Denkpatsche geholfen. An die Möglichkeit der Zeitbereiche hatte ich nicht gedacht. Der Fall würde jetzt aber kein "weggehen" während der Einschaltzeit berücksichtigen, oder ?

Gruß
Micha
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

l2r

#3
Das erreichst durch ein weiteres or in der doelseif Bedingung:

Einfach or [rr_location_tania] ne "home" hinzufügen


Gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.

mfeske

Hallo Michael,

ne steht dann für nicht home ? Und der code wäre dann (([{sunset(-3600)}-22:59] or [05:00-8:59]) and [rr_location_tania] eq "home") (set Weihnachten_Tania on) DOELSEIF ([23:00] or [09:00]) or [rr_Tania_location] ne "hone" (set Weihnachten_Tania off)

Wenn Sie dann im Zeitfenster zurückkommt, geht ja das doif wieder von vorne los.

Gruß
Micha
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

l2r

Jo

Jetzt musst du die Klammer nicht nach [09:00] sondern nach der hinzugefügten Bedingung schließen und meine Schreibfehler anpassen hone -> home


Gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.

l2r

#6
Die erste Fall wird aber nur aufgerufen wenn in der Zwischenzeit cmd_2 ausgeführt wurde, da sich sonst für das doif nix ändert, sollte bei dir aber so passen.

Für andere Fälle kann man sonst das Attribut do auf always setzen, dann wird immer ausgelöst, wenn die Bedingung wahr ist, egal ob die gleiche Bedingungen davor wahr war oder nicht. Das erzeugt in deinem Fall aber viele ausklingen, da du ja einen Bereich verwendest
Wissen ist Macht.
Ich weiß nix.
Macht nix.

yogiflop

Hallo,

wenn ich darf, würde ich mich gerne mit einem ähnlichem Problem hier einklinken.

([{sunset("HORIZON=-1",0,"15:00","22:30")}] and [whg.jemand.dum] eq "on") (set ambiente.struc on) DOELSEIF ([{sunset("HORIZON=-1",10,"15:00","22:30")}] and ([handy.struc] eq "present" or isZuhause() == 1)) (set ambiente.struc on)

Zur Erklärung:
Es soll im ersten folgendes passieren: Wenn jemand nach Hause kommt, wird whg.jemand.dum auf on geschaltet, sollte das nach Sonnenuntergang zwischen 15:00 und 22:30 Uhr passieren, soll die ambiente.struc geschaltet werden.
im zweiten: wenn die handy.struc auf present steht, oder die Variable isZuhause auf 1 und dann der Sonnenuntergang eintritt, dann soll ambiente.struc geschaltet werden.

Ich bin mir eben nicht sicher, beim ersten Teil. Zumindest funktioniert er momentan nicht ;-)

gruß Marc
CubieTruck mit FHEM 5.7
433MHz, 868MHz HMLan
div. Baumarktsteckdosen, 3x HM
div. MiLight's

l2r

wenn ich das beim ersten überfliegen richtig sehe, dann hast du ein ähnliches Problem, wie oben im Thread...

Du fragst einen bestimmten Zeitpunkt ab und keinen Zeitraum.

die Sunset-Funktion gibt nach meinem Verständnis einen sunset-Zeitpunkt aus, sofern dieser zwischen 15 und 22:30 liegt. somit hast du einen Zeitpunkt

Versuch mal
[{sunset("HORIZON=-1",0,"15:00","22:30")}-22:30]

somit gehst du von deinem Zeitpunkt des Sonnenuntergangs, der zwischen 15 und 22:30 liegt, bis 22:30 .

Ich hoffe das war verständlich.

P.S.: wenn du den Code {sunset("HORIZON=-1",0,"15:00","22:30")} oben in die Command-Zeile eingibst, dann erhälst du ja auch nur einen Zeitangabe und keinen Bereich
Wissen ist Macht.
Ich weiß nix.
Macht nix.

yogiflop

Zitat von: l2r am 08 Dezember 2015, 18:10:30
wenn ich das beim ersten überfliegen richtig sehe, dann hast du ein ähnliches Problem, wie oben im Thread...

Du fragst einen bestimmten Zeitpunkt ab und keinen Zeitraum.

die Sunset-Funktion gibt nach meinem Verständnis einen sunset-Zeitpunkt aus, sofern dieser zwischen 15 und 22:30 liegt. somit hast du einen Zeitpunkt

Versuch mal
[{sunset("HORIZON=-1",0,"15:00","22:30")}-22:30]
somit gehst du von deinem Zeitpunkt des Sonnenuntergangs, der zwischen 15 und 22:30 liegt, bis 22:30 .
Ich hoffe das war verständlich.
P.S.: wenn du den Code {sunset("HORIZON=-1",0,"15:00","22:30")} oben in die Command-Zeile eingibst, dann erhälst du ja auch nur einen Zeitangabe und keinen Bereich


Jepp, klingt logisch und ist im nachhinein betrachtet auch klar .....

Beim testen, habe ich dann direkt ein anderes Problem noch erkannt und zwar, das es einen unterschied zwischen Internals State und Readings State gibt. Lag bei mir daran, das bei dem dummy noch ein eventMap mit /on:da/off:weg/ definiert war und ich ja "on" abgefragt habe vom Reading, aber auf das "da" gehen musste.

Aber ich danke dir trotzdem für den Denkanstoss.

gruß Marc
CubieTruck mit FHEM 5.7
433MHz, 868MHz HMLan
div. Baumarktsteckdosen, 3x HM
div. MiLight's

mfeske

Hallo Michael,

hab es erstmal verkürzt auf:
(([{sunset(-3600)}-22:59] or [05:00-8:59]) and [rr_location_tania] eq "home") (set Weihnachten_Tania on) DOELSEIF ([23:00] or [09:00]) (set Weihnachten_Tania off) komm nicht hin mit dem or [rr_Tania_location] ne "home" wo ich jetzt die Klammer auf / zu machen muss.

Gruß
Micha
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

Wuppi68

(
(
[lw12.tv] eq "on"
or [hm.dim.1] != "off"
or [hm.dim.2.sw] != "off"
)
and [Bewohner] eq "home"
)
(set hm.steckdose.1 on)
DOELSE
(set hm.steckdose.1 off)


Snippet aus dem DEF Teil des DOIFs

das ist meine Weihnachtsbeleuchtung, sobald Licht an ist UND ich zu Hause bin geht die Steckdose an :-)
FHEM unter Proxmox als VM

l2r

#12
hi,

wenn ich jetzt nicht auf die schnelle was durcheinander werfe, dann müsste das bei dir so aussehen:

(([{sunset(-3600)}-22:59] or [05:00-8:59]) and [rr_location_tania] eq "home") (set Weihnachten_Tania on)
DOELSEIF ([23:00] or [09:00] or [rr_Tania_location] ne "home") (set Weihnachten_Tania off)


P.S.: ich hab mir angewöhnt jedes neue DOELSEIF zumindest in eine neue Zeile zu schreiben. Das erhöht die Lesbarkeit ungemein  ;)

Gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.

l2r

und wo wir grade bei Erleichterungen sind, ist mir folgender Thread aufgefallen:

http://forum.fhem.de/index.php?topic=45373.0
Wissen ist Macht.
Ich weiß nix.
Macht nix.