Hallo Forumgemeinde,
ich habe jetzt viel gesucht, aber leider keine Antwort, bzw. Lösung für mein Problem gefunden.
Ich habe mehrere DOIFs für meine Rolladen, diese funktionieren auch zu 90% so wie sie sollen.
Was nicht funktioniert ist das Runterfahren am Wochenende.
Die Zeiten für das Runterfahren sind aktuell noch die gleichen am WE und Wochentagen, ich weiss dass es so keinen Sinn macht zu trennen, aber mir geht es erstmal darum alles ans Laufen zu bekommen, bevor ich an das Zeittuning rangehe.
Hier ist der List von dem DOIF:
Internals:
DEF (
([EG_Jalousie_Terasse_gr] !~ "auf" and [EG_Jalousie_Terasse_gr] !~ "off")
and
([{sunrise("REAL",0,"09:00","10:30")}|7] or ([?06:30-09:00|8] and [Helligkeitssensor_Aussen:brightness] > 60))
)
(set EG_Jalousie_Terasse_gr auf)
DOELSEIF
(
([EG_Jalousie_Terasse_gr] !~ "zu" and [EG_Jalousie_Terasse_gr] !~ "on" and [Fenster_Terasse_gr] eq "closed")
and
(([?18:00-22:30|7] or [?18:00-22:30|8]) and [Helligkeitssensor_Aussen:brightness] < 5)
)
(set EG_Jalousie_Terasse_gr zu)
DOELSEIF
(
([EG_Jalousie_Terasse_gr] !~ "zu" and [EG_Jalousie_Terasse_gr] !~ "on" and [Fenster_Terasse_gr] eq "tilted")
and
(([?18:00-22:30|7] or [?18:00-22:30|8]) and [Helligkeitssensor_Aussen:brightness] < 5)
)
(set EG_Jalousie_Terasse_gr 50)
NAME di.EG_Jalousie_Terasse_gr_Automatik
NR 602
NTFY_ORDER 50-di.EG_Jalousie_Terasse_gr_Automatik
STATE cmd_1
TYPE DOIF
Helper:
DBLOG:
cmd:
logdb:
TIME 1509948584.03511
VALUE 1
cmd_event:
logdb:
TIME 1509948584.03511
VALUE Helligkeitssensor_Aussen
cmd_nr:
logdb:
TIME 1509948584.03511
VALUE 1
state:
logdb:
TIME 1509948584.03511
VALUE cmd_1
READINGS:
2017-11-06 07:50:52 Device Helligkeitssensor_Aussen
2017-11-06 07:09:44 cmd 1
2017-11-06 07:09:44 cmd_event Helligkeitssensor_Aussen
2017-11-06 07:09:44 cmd_nr 1
2017-11-06 07:10:18 e_EG_Jalousie_Terasse_gr_STATE auf
2017-11-05 14:25:40 e_Fenster_Terasse_gr_STATE closed
2017-11-06 07:50:52 e_Helligkeitssensor_Aussen_brightness 1609.68
2017-11-06 07:09:44 state cmd_1
2017-11-05 16:56:29 timer_01_c01 06.11.2017 09:00:00|7
2017-11-05 16:56:29 timer_02_c01 06.11.2017 06:30:00|8
2017-11-05 16:56:29 timer_03_c01 06.11.2017 09:00:00|8
2017-11-05 22:30:00 timer_04_c02 06.11.2017 18:00:00|7
2017-11-05 22:30:00 timer_05_c02 06.11.2017 22:30:00|7
2017-11-05 22:30:00 timer_06_c02 06.11.2017 18:00:00|8
2017-11-05 22:30:00 timer_07_c02 06.11.2017 22:30:00|8
2017-11-05 22:30:00 timer_08_c03 06.11.2017 18:00:00|7
2017-11-05 22:30:00 timer_09_c03 06.11.2017 22:30:00|7
2017-11-05 22:30:00 timer_10_c03 06.11.2017 18:00:00|8
2017-11-05 22:30:00 timer_11_c03 06.11.2017 22:30:00|8
condition:
0 (InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "auf" and InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "off") and (DOIF_time_once($hash,0,$wday,"7") or (DOIF_time($hash,1,2,$wday,$hms,"8") and ReadingValDoIf($hash,'Helligkeitssensor_Aussen','brightness') > 60))
1 (InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "zu" and InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "on" and InternalDoIf($hash,'Fenster_Terasse_gr','STATE') eq "closed") and ((DOIF_time($hash,3,4,$wday,$hms,"7") or DOIF_time($hash,5,6,$wday,$hms,"8")) and ReadingValDoIf($hash,'Helligkeitssensor_Aussen','brightness') < 5)
2 (InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "zu" and InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "on" and InternalDoIf($hash,'Fenster_Terasse_gr','STATE') eq "tilted") and ((DOIF_time($hash,7,8,$wday,$hms,"7") or DOIF_time($hash,9,10,$wday,$hms,"8")) and ReadingValDoIf($hash,'Helligkeitssensor_Aussen','brightness') < 5)
days:
0 7
1 8
10 8
2 8
3 7
4 7
5 8
6 8
7 7
8 7
9 8
devices:
0 EG_Jalousie_Terasse_gr Helligkeitssensor_Aussen
1 EG_Jalousie_Terasse_gr Fenster_Terasse_gr Helligkeitssensor_Aussen
2 EG_Jalousie_Terasse_gr Fenster_Terasse_gr Helligkeitssensor_Aussen
all EG_Jalousie_Terasse_gr Helligkeitssensor_Aussen Fenster_Terasse_gr
do:
0:
0 set EG_Jalousie_Terasse_gr auf
1:
0 set EG_Jalousie_Terasse_gr zu
2:
0 set EG_Jalousie_Terasse_gr 50
3:
helper:
event brightness: 1609.68
globalinit 1
last_timer 11
sleeptimer -1
timerdev EG_Jalousie_Terasse_gr
timerevent rssi_at_myHmUART_WLAN: -44
triggerDev Helligkeitssensor_Aussen
timerevents:
rssi_at_myHmUART_WLAN: -44
timereventsState:
rssi_at_myHmUART_WLAN: -44
triggerEvents:
brightness: 1609.68
triggerEventsState:
brightness: 1609.68
internals:
0 EG_Jalousie_Terasse_gr:STATE
1 EG_Jalousie_Terasse_gr:STATE Fenster_Terasse_gr:STATE
2 EG_Jalousie_Terasse_gr:STATE Fenster_Terasse_gr:STATE
all EG_Jalousie_Terasse_gr:STATE Fenster_Terasse_gr:STATE
interval:
1 -1
10 9
2 1
3 -1
4 3
5 -1
6 5
7 -1
8 7
9 -1
itimer:
localtime:
0 1509955200
1 1509946200
10 1510003800
2 1509955200
3 1509987600
4 1510003800
5 1509987600
6 1510003800
7 1509987600
8 1510003800
9 1509987600
readings:
0 Helligkeitssensor_Aussen:brightness
1 Helligkeitssensor_Aussen:brightness
2 Helligkeitssensor_Aussen:brightness
all Helligkeitssensor_Aussen:brightness
realtime:
0 09:00:00
1 06:30:00
10 22:30:00
2 09:00:00
3 18:00:00
4 22:30:00
5 18:00:00
6 22:30:00
7 18:00:00
8 22:30:00
9 18:00:00
regexp:
0:
1:
2:
all:
state:
STATE:
time:
0 {sunrise("REAL",0,"09:00","10:30")}
1 06:30:00
10 22:30:00
2 09:00:00
3 18:00:00
4 22:30:00
5 18:00:00
6 22:30:00
7 18:00:00
8 22:30:00
9 18:00:00
timeCond:
0 0
1 0
10 2
2 0
3 1
4 1
5 1
6 1
7 2
8 2
9 2
timer:
0 0
1 0
10 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timers:
0 0
trigger:
triggertime:
1509955200:
localtime 1509955200
hash:
1509987600:
localtime 1509987600
hash:
1510003800:
localtime 1510003800
hash:
Attributes:
eventMap on:zu off:auf
group Jalousie_Automatik
icon helper_doif
room Wohnzimmer
sortby 8
Ich wäre euch für eure Hilfe sehr dankbar.
Gruß Alex
Da die Bedingungen für Wochenende und Werktag bislang ja praktisch identisch sind, könnte das Problem beim Status des DOIFs bzw. beim manuellen Schalten liegen.
Wenn Du die Rollos manuell bewegst, beeinflusst Du ja auch das DOIF, da dort der Status jeweils abgefragt wird. Wenn Du also beispielsweise morgens das Rollo manuell hoch fährst, bevor das DOIF das erledigen kann, bleibt es im Status des Vorabends. Wenn dann am nächsten Abend die Bedingungen für das Runterfahren wieder erreicht werden, ist es noch in diesem Status. Es findet also kein Statuswechsel statt und das DOIF tut nichts.
Der Unterschied zwischen Werktag und Wocheende wäre also, dass werktags das DOIF zum Zuge kommt, während Du am Wocheende morgens manuell öffnest, bevor das DOIF auslöst? - Nur eine Vermutung.
Ändern könntest Du das mit dem Attribut do always, was aber andere Nebenwirkungen haben kann.
Oder Du verschiebst die Abfrage, ob die Rollos überhaupt bewegt werden dürfen/müssen in den Ausführungsteil:
IF ([EG_Jalousie_Terasse_gr] !~ "auf" and [EG_Jalousie_Terasse_gr] !~ "off") (set EG_Jalousie_Terasse_gr auf)
Ungeteste und ohne Gewähr...
Als erstes vielen Dank für die schnelle Rückmeldung.
Auf den ersten Blick klingt das plausibel, nach nochmaligen durchlesen bin ich mir aber nicht mehr sicher.
Es ist tatsächlich so, dass am Wochenende meistens das DOIF nicht zum Zuge kommt. Aber warum sollte es dann nicht am nächsten Abend greifen?
Die Abfrage
([EG_Jalousie_Terasse_gr] !~ "auf" and [EG_Jalousie_Terasse_gr] !~ "off")
bzw. ([EG_Jalousie_Terasse_gr] !~ "zu" and [EG_Jalousie_Terasse_gr] !~ "on")
soll ja nur sicherstellen dass nicht unnötig angesteuert wird wenn die Rollos sowieso schon oben bzw. in dem Problemfall unten sind. Ich hätte erwartet dass dieser Zweig in dem Fall einfach ignoriert wird, oder verstehe ich die Statemashine dahinter falsch?
Ich bin mir auch ziemlich sicher dass in der Woche ich die Rollos auch händisch geöffnet habe und das DOIF am Abend hat da meines Wissens sauber funktioniert.
Ich werde es morgen noch mal testen.
Gruß
Alex
Ich hatte gerade eine ähnliches Thema.
Bei der Rolladengeschichte, die mir noch bevorsteht, könnte ich mir vorstellen, dass du dein DOIF während des Tages über ein at auf das richtige cmd1/2 setzt. Das gleiche kannst du auch in der Nacht machen.
Somit startet das DOIF immer im richtigen Status.
Scheinbar habe ich das DOIF noch nicht vollständig verstanden (muss ich mir in Ruhe nochmal durchlesen).
Werden die cmd States immer nur in der richtige Reihenfolge abgearbeitet und nicht nach dem Motto "führe das aus was gerade zutrifft"?
EDIT:
Habe den Ausschlaggebenden Satz in der Doku gefunden:
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.
Jetzt muss ich tatsächlich at's basteln um DOIF in die richtigen Bahnen zu lenken, oder hat jemand eine bessere Idee?
do always wurde ja schon genannt
oder ein
DOELSEIF [0:01] kein ausführungsteil nötig
Moin
Ich sehe eigentlich kein Problem! Ausser du faehrst die nach dem Runterfahren noch mal hoch, und erwartest, dass Sie wieder runterfahren. Du bist doch immer in einem definierten Zustand. Oder hast Du die Rollaeden noch irgendwo anders drin?
BTW: Was sind das fuer welche? Homematic oder etwas anderes?
Gruss Christoph
@nils_
Do always führt leider dazu dass die Rolladenaktoren ständig immer wieder angesteuert werden (solange die Bedingung wahr ist), was sicherlich nicht förderlich für die Lebensdauer der Aktoren ist.
Das mit dem DOELSEIF probiere ich mal aus, danke.
@Christoph
Das Problem ist eben, dass ich, wenn ich manuell morgens vor dem DoIf die Rolladen öffne, in dem Abend-Doif Zweig "hängen" bleibe und dieser wird im Normalfall nicht nochmal ausgeführt.
Die Aktoren sind Homematic.
Gruß
Alex
Mache es doch per at-Befehl.
Dann ist es völlig egal, ob Du die irgendwann schon hochgefahren hast, die werden zur eingestellten Zeit angesteuert, fertig.
Zitat von: Nighthawk am 06 November 2017, 16:49:37
@nils_
Do always führt leider dazu dass die Rolladenaktoren ständig immer wieder angesteuert werden (solange die Bedingung wahr ist), was sicherlich nicht förderlich für die Lebensdauer der Aktoren ist.
Das mit dem DOELSEIF probiere ich mal aus, danke.
Alex
Hast Du Dir das angesehen, was Nils Dir da vorschlaegt? Das bewirkt, dass Du um 0:01 Uhr in den Pfad rein kommst. Hilft Dir aber fuer den Abend nichts! Aber wenn Du es sinnvoll erweiterst, dann kommst Du da immer hin! (z.B.: OR [12:01])
Gruss Christoph
Hi Christoph,
das habe ich vor zu testen:
Zitat von: Nighthawk am 06 November 2017, 16:49:37
Das mit dem DOELSEIF probiere ich mal aus, danke.
Und das mit 0:01 Uhr bringt doch was, denn das doif wird dann (in meinem Fall) auf cmd4 gesetzt und das ist ja ungleich 2 oder 3.
So langsam habe ich den Part wohl verstanden.
Zitat von: Nighthawk am 06 November 2017, 13:20:56
soll ja nur sicherstellen dass nicht unnötig angesteuert wird wenn die Rollos sowieso schon oben bzw. in dem Problemfall unten sind. Ich hätte erwartet dass dieser Zweig in dem Fall einfach ignoriert wird, oder verstehe ich die Statemashine dahinter falsch?
Deshalb ja auch mein Vorschlag, die Abfrage, ob die Rollos nicht ohnehin schon in der gewünschten Position sind, per IF in den Ausführungsteil zu verlagern. Dann sind die Bedingungen für die state machine unabhängig vom Zustand des Rollos zum gewünschten Zeitpunkt immer wahr. Trotzdem wird nur geschaltet, wenn wirklich nötig.
Scheint mir in diesem Fall die einfachsten Lösung zu sein.
Das würde aber aus meiner Sicht das ganze Konstrunkt nur unnötig unübersichtlich machen.
Ich denke die einfachste Lösung ist mit dem DOELSEIF ([0:01]).
Ohne die Runden Klammern nimmt FHEM die Bedingung nicht an, es kommt die Meldung dass eine Klammer rechts fehlt.
Ich probiere trotzdem mal beide Varianten aus.
Danke für die hilfreichen Tips!
Zitat von: Nighthawk am 07 November 2017, 14:27:58
Ich denke die einfachste Lösung ist mit dem DOELSEIF ([0:01]).
Ohne die Runden Klammern nimmt FHEM die Bedingung nicht an, es kommt die Meldung dass eine Klammer rechts fehlt.
die runden Klammern fehlten bei mir. sorry!
müssen natürlich dahin. syntax siehe https://fhem.de/commandref_DE.html#DOIF
Kurze Rückmeldung, zumindest die Variante mit DOIF ([0:01]) hat schon mal funktioniert, daher habe ich das Thema als gelöst markiert.
Die zweite Variante mit der Abfrage im Ausführungsteil versuche ich zum Wochenende zu testen und Rückmeldung geben.
Danke nochmal an alle die unterstützt haben!
Hier ist schon mal das erste Problem mit der Abfrage im Ausführungsteil:
folgendes DOIF
([{sunrise("REAL",0,"09:00","10:30")}|7] or ([?06:30-09:00|8] and [Helligkeitssensor_Aussen:brightness] > 60))
(if ([EG_Jalousie_WC] !~ "auf" and [EG_Jalousie_WC] !~ "off") (set EG_Jalousie_WC auf))
DOELSEIF
(
[Fenster_Bad_unten] eq "open"
and
(([?18:00-22:30|7] or [?18:00-22:30|8]) and [Helligkeitssensor_Aussen:brightness] < 5 and [SensorBadezimmer_unten:humidity] < 62)
)
(if ([EG_Jalousie_WC] !~ "zu" and [EG_Jalousie_WC] !~ "on") (set EG_Jalousie_WC zu))
DOELSEIF
(
[Fenster_Bad_unten] eq "closed"
and
(([?18:00-22:30|7] or [?18:00-22:30|8]) and [Helligkeitssensor_Aussen:brightness] < 5 and [SensorBadezimmer_unten:humidity] < 62)
)
(if ([EG_Jalousie_WC] !~ "zu" and [EG_Jalousie_WC] !~ "on")set (EG_Jalousie_WC zu))
DOELSEIF
(
[Fenster_Bad_unten] eq "tilted"
and
(([?18:00-22:30|7] or [?18:00-22:30|8]) and [Helligkeitssensor_Aussen:brightness] < 5)
)
(if ([EG_Jalousie_WC] !~ "zu" and [EG_Jalousie_WC] !~ "on") (set EG_Jalousie_WC 50))
führt zu dieser Fehlermeldung:
if (auf !~ "zu" and auf !~ "on") (set EG_Jalousie_WC zu): Bareword "auf" not allowed while "strict subs" in use at (eval 32362) line 1. Bareword "auf" not allowed while "strict subs" in use at (eval 32362) line 1.
Der Unterschied zwischen IF und if ist Dir klar?
Bei if müssen die [Devices] nochmal in Anführungszeichen "[Device]", da DOIF die bereits ermittelten Werte "nach unten" übergibt (if selbst könnte mit [DEVICE] ohnehin nix anfangen). IF hingegen verwendet die gleiche Syntax wie DOIF (da gleicher Autor), die "sprechen sich ab" ;).
Ahhh, wieder was gelernt!
Danke.
Hier die abschließende Meldung:
Beide Varianten funktionieren, wobei die Variante mit DOIF ([0:01]) am einfachsten eingesteztz werden kann, die Variante mit der Abfrage im Ausführungsteil ist aber, denke ich, die Programmiertechnisch elegantere.
Damit Vielen Dank an alle Beteiligten!