Hauptmenü

doif schaltet nicht (gelöst)

Begonnen von walter56, 01 Juni 2017, 11:44:21

Vorheriges Thema - Nächstes Thema

walter56

Hallo zusammen :)

Ich habe nach fast 2 Jahren mich mal an DOIF gewagt, um meine Automation zu vervollständigen, leider bekomme ich es nicht hin und hänge seit 4-5 Wochen an diesem Problem. Auch das nachlesen und viele Testen hat nicht zum Erfolg geführt. :( Ich will bei einsetzender Dämmerung in der Zeit von 16:30 bis- 22:40 am Wochenende  meinen TV Simulator bis 23:45 einschalten. Immer wieder mit einer etwas Zufall beim einschalten. Ich hatte das attr wait auch schon weggelassen ohne Erfolg. Auch das entfernen von |7 brachte keinen Erfolg.


#####################################
##   Steuerung TV Simulator        ##
#####################################
# 7 entspricht ($we)  8 entspricht Wochentag (!$we)
define doif_TV_Simulator_we DOIF ([{sunset("HORIZON=-3.0",0,"16:30","22:40")}|7]) (set DECT_TV_Simulator on-till 23:45)
attr doif_TV_Simulator_we wait rand(200)



Diesen Code möchte ich immer wieder für andere Geräte verwenden (Hausnummerbeleuchtung, Gartenbeleuchtung usw.)
Ich habe auch mit den Klammern schon viel "gespielt" ??? denke aber so müssten sie stimmen!

Vielleicht kann mir einer von Euch auf die Sprünge helfen, ich bin ratlos!  :-[

Vielen Dank schon mal!
Gruß Walter

Lösung:
attr doif_TV_Simulator_we do always
Raspberry Pi mit HMLAN & EnOcean: Eltako FUD14, FB dect: DECT 200,HomeMatic: HM-LC-Bl1PBU-FM, HM-SWI-3-FM,HM-CC-RT-DN, HM-Sen-MDIR-O,HM-WDS10-TH-O, HM-WDS40-TH-I
Abfragen: Solarlog, Telefon, Internet Radio, TTS und abfrage verschiedenen Interenseiten HTTPMO

l2r

#1
sieht erstmal gut aus.

DOIF bleibt nach erfolgreicher ausführung im Zustand cmd_1 stehen. Auch wenn die Bedingung zum zweiten Mal wahr wird. Damit der Zweig auch beim Zweiten mal wahr werden ausgeführt wird, muss das attribut do always gesetzt werden.

attr doif_TV_Simulator_we do always

dass du mit |7 dich nur aufs Wochenende und Feiertage beziehst ist dir bewusst?

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

Per

Zitat von: walter56 am 01 Juni 2017, 11:44:21nicht zum Erfolg geführt
Wie soll denn der "Erfolg" aussehen? Und was ist das aktuelle Ergebnis?

walter56

#3
Hallo Michael und hallo Per :)

Vielen Dank schon mal für die schnelle Antworten hier meine Antwort:

I2r: Ich werde das gleich mal einbauen und dann kann ich morgen berichten! :D  Das mit |7 ist mir bewusst es gibt auch eine |8 Anweisung. Die wollte ich aber nicht auch noch posten, da es am Problem nichts ändert. Aber danke für den Hinweis! :)

Michael: Ich will später mal zwischen 16 Uhr und 20 Uhr die den TV Simulator einschalten, aber nicht im Sommer wenn es bis 22 Uhr hell ist. Zur Zeit wird gar nichts geschaltet. Es passiert einfach nichts. :(

Die angegebenen Zeiten habe ich so gesetzt, dass auf jeden Fall geschaltet werden soll ;), Sinn machen diese Zeiten nicht wirklich ::). Deutlicher wird es bei der Hausnummer-Beleuchtung. Im Winter soll schon früh die Beleuchtung eingeschaltet werden, es wird ja früh dunkel. Im Sommer ist es aber um 21Uhr noch hell da braucht man es gar nicht. Ausgeschaltet soll die Hausnummer-Beleuchtung immer, wenn ich keinen Besuch mehr empfangen möchte. Dies ist ein weiteres Beispiel für diese Anweisung.

Gruß Walter    :)
Raspberry Pi mit HMLAN & EnOcean: Eltako FUD14, FB dect: DECT 200,HomeMatic: HM-LC-Bl1PBU-FM, HM-SWI-3-FM,HM-CC-RT-DN, HM-Sen-MDIR-O,HM-WDS10-TH-O, HM-WDS40-TH-I
Abfragen: Solarlog, Telefon, Internet Radio, TTS und abfrage verschiedenen Interenseiten HTTPMO

l2r

wenn du das nach Helligkeit regeln möchtest, dann wäre das twilight-modul vllt auch was für dich...

Off-Topic:

ich habe einen LED-Stripe hinter meinen Fernseher geklebt und so ein einfarbiges Ambilight realisiert. Das soll natürlich nur an gehen, wenn der Fernseher an ist und draußen anfängt zu dämmern.

hier mal der Code von dem DOIF:
([Twilight:light]< 3  and [TV_Wohnzimmer] eq "on") (set HUEDevice3 rgb FFE252 : pct 100 : transitiontime 150)
DOELSEIF ([Twilight:light]== 3  and [TV_Wohnzimmer] eq "on") (set HUEDevice3 rgb FFE252 : pct 80 : transitiontime 150)
DOELSEIF ([Twilight:light]== 4  and [TV_Wohnzimmer] eq "on") (set HUEDevice3 rgb FFDEC3 : pct 50 : transitiontime 150)
DOELSEIF ([Twilight:light]== 5  and [TV_Wohnzimmer] eq "on") (set HUEDevice3 rgb FFDEC3 : pct 30 : transitiontime 150)
DOELSEIF ([TV_Wohnzimmer] ne "on" or [Twilight:light]> 5) (set HUEDevice3 off 15)



je dunkler es wird (twilight wird geringer), desto heller wird der LED-Stripe ...
das nur als Anregung.

-Off-Topic aus-

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

walter56

Hallo Michael :)

Vielen Dank Michael das war die Lösung!  :)

attr doif_TV_Simulator_we[b] do always[/b]

Aber eine Bitte hätte ich noch: Was macht dieses Attribut "do always" ich verstehe die Funktion nicht ganz!  ???
Gruß Walter

PS. Michael die Idee mit den den LED-Stripe finde ich auch gut. Ich wollte aber auch einen Zeitbereich haben in dem die Helligkeit ausgewertet werden soll. Nochmals Danke für deinen Einsatz. :)
Raspberry Pi mit HMLAN & EnOcean: Eltako FUD14, FB dect: DECT 200,HomeMatic: HM-LC-Bl1PBU-FM, HM-SWI-3-FM,HM-CC-RT-DN, HM-Sen-MDIR-O,HM-WDS10-TH-O, HM-WDS40-TH-I
Abfragen: Solarlog, Telefon, Internet Radio, TTS und abfrage verschiedenen Interenseiten HTTPMO

l2r

#6
doif arbeitet grundsätzlich so:

Falls Bedingung 1 wahr wird, dann führe den Befehl zu Bedingung 1 aus und bleibe im Status cmd_1 solange bis eine andere Bedingung wahr wird. Wird dann Bedingung 1 nicht mehr wahr aber auch keine andere wahr, dann bleibt doif trotzdem in cmd_1 stehen.

Wird Bedingung 1 dann ein zweites Mal war, dann wird nichts ausgelöst, da der Status ja noch cmd_1 ist und eine erneute ausführung des gleichen Befehls nicht vorgesehen ist. Dafür benötigst du das attribut do always, dann wird bei erneutem wahr werden von Bedingung1 die Befehle zu 1 auch ausgeführt.

Hast du eine weiter Bedingung DOELSEIF oder DOELSE, die wahr werden kann und DOIF in der zwischenzeit in cmd_2 gesprungen ist, dann wird bei wahr werden von Bedigung1  Befehl 1 auch wieder ausgeführt.


Dazu aus der Commandref (die ist übrigens bei DOIF sehr sehr gut gepflegt und enthält auch viele Beispiele  https://fhem.de/commandref_DE.html#DOIF):


Syntax:

define <name> DOIF (<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)

Die Angaben werden immer von links nach rechts abgearbeitet. Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.

Das DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Zustandswechsel stattgefunden hat. Dieses Verhalten ist sinnvoll, um zu verhindern, dass zyklisch sendende Sensoren (Temperatur, Feuchtigkeit, Helligkeit, usw.) zu ständiger Wiederholung des selben Befehls oder Befehlsabfolge führen.



Also:

DOIF (Bedingung1) (Befehl1) -> wird nur 1mal ausgeführt.

DOIF (Bedingung1) (Befehl1) 
DOELSEIF (Bedingung2) (Befehl2) -> Befehl1 und 2 werden nur ausgeführt wenn die jeweilige Bedingung wahr ist und das DOIF vorher im jeweils anderen Zustand war.

DOIF (Bedingung1) (Befehl1)
attr do always                         -> Befehl1 wird jedes mal ausgeführt wenn Bedingung 1 wahr ist

DOIF (Bedingung1) (Befehl1) 
DOELSE ()                              -> entspricht bei attr do always, da sobald Bedingung1 nicht mehr wahr ist in DOELSE gewechselt wird. Da der Befehlsteil auch leer sein kann, ist das Ergebnis das gleiche.

Ich hoffe ich habe ein bisschen Licht ins Dunkel gebracht.

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