Hallo liebe DOIF-Experten,
ich möchte mich zuerst für das tolle und vorallem mächtige DOIF-Werkzeug bedanken...das eröffnet wirklich ungeahnte Möglichkeiten.
Jedoch habe ich irgendwie beim Programmieren meiner Thermostate einen Knoten im Hirn...ich würde gern meine Thermostate
a) in Abhängigkeit des Wochentags/der Uhrzeit und
b) in Abhängigkeit der Anwesenheit
steuern. Dazu habe ich einen Dummy "Anwesend", der die Werte "1" (anwesend) oder "0" (nicht anwesend) annehmen kann. Dieser wird aktuell über einen Klick auf das Synmbol im Floorplan gesteuert, was auch ganz gut funktioniert.
Evtl ersteinmal das List meines exemplarischen DOIF aus dem Badezimmer...
Internals:
DEF ## Nachtabsenkung
([Anwesend] eq "1" and ([22:30|01234] or [23:45|56]))
(set Bad.Heizung desiredTemperature 17.0)
## Morgens und Abends aufheizen
DOELSEIF ([Anwesend] eq "1" and ([05:45|12345] or [08:30] or [20:00]))
(set Bad.Heizung desiredTemperature 22.0)
## Tagsüber normal
DOELSEIF ([Anwesend] eq "1" and ([06:45|12345] or [09:30|12345] or [10:00|06]))
(set Bad.Heizung desiredTemperature 20.0)
## nicht Anwesend
DOELSEIF ([Anwesend] eq "0")
(set Bad.Heizung desiredTemperature 16.0)
NAME di_bad
NR 28
NTFY_ORDER 50-di_bad
STATE initialized
TYPE DOIF
Readings:
2017-01-06 21:31:56 cmd 0
2017-01-06 21:31:56 state initialized
2017-01-06 21:31:56 timer_01_c01 06.01.2017 22:30:00|01234
2017-01-06 21:31:56 timer_02_c01 06.01.2017 23:45:00|56
2017-01-06 21:31:56 timer_03_c02 07.01.2017 05:45:00|12345
2017-01-06 21:31:56 timer_04_c02 07.01.2017 08:30:00
2017-01-06 21:31:56 timer_05_c02 07.01.2017 20:00:00
2017-01-06 21:31:56 timer_06_c03 07.01.2017 06:45:00|12345
2017-01-06 21:31:56 timer_07_c03 07.01.2017 09:30:00|12345
2017-01-06 21:31:56 timer_08_c03 07.01.2017 10:00:00|06
Condition:
0 InternalDoIf($hash,'Anwesend','STATE') eq "1" and (DOIF_time_once($hash,0,$wday,"01234") or DOIF_time_once($hash,1,$wday,"56"))
1 InternalDoIf($hash,'Anwesend','STATE') eq "1" and (DOIF_time_once($hash,2,$wday,"12345") or DOIF_time_once($hash,3,$wday) or DOIF_time_once($hash,4,$wday))
2 InternalDoIf($hash,'Anwesend','STATE') eq "1" and (DOIF_time_once($hash,5,$wday,"12345") or DOIF_time_once($hash,6,$wday,"12345") or DOIF_time_once($hash,7,$wday,"06"))
3 InternalDoIf($hash,'Anwesend','STATE') eq "0"
Days:
0 01234
1 56
2 12345
5 12345
6 12345
7 06
Devices:
0 Anwesend
1 Anwesend
2 Anwesend
3 Anwesend
all Anwesend
Do:
0:
0 set Bad.Heizung desiredTemperature 17.0
1:
0 set Bad.Heizung desiredTemperature 22.0
2:
0 set Bad.Heizung desiredTemperature 20.0
3:
0 set Bad.Heizung desiredTemperature 16.0
Helper:
globalinit 1
last_timer 8
sleeptimer -1
Internals:
0 Anwesend:STATE
1 Anwesend:STATE
2 Anwesend:STATE
3 Anwesend:STATE
all Anwesend:STATE
Itimer:
Localtime:
0 1483738200
1 1483742700
2 1483764300
3 1483774200
4 1483815600
5 1483767900
6 1483777800
7 1483779600
Realtime:
0 22:30:00
1 23:45:00
2 05:45:00
3 08:30:00
4 20:00:00
5 06:45:00
6 09:30:00
7 10:00:00
Regexp:
All:
State:
Time:
0 22:30:00
1 23:45:00
2 05:45:00
3 08:30:00
4 20:00:00
5 06:45:00
6 09:30:00
7 10:00:00
Timecond:
0 0
1 0
2 1
3 1
4 1
5 2
6 2
7 2
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timers:
0 0 1
1 2 3 4
2 5 6 7
Triggertime:
1483738200:
localtime 1483738200
Hash:
1483742700:
localtime 1483742700
Hash:
1483764300:
localtime 1483764300
Hash:
1483767900:
localtime 1483767900
Hash:
1483774200:
localtime 1483774200
Hash:
1483777800:
localtime 1483777800
Hash:
1483779600:
localtime 1483779600
Hash:
1483815600:
localtime 1483815600
Hash:
Attributes:
group Heizung
room Bad
Was soll das Coding tun?
-> 1: Nachtabsenkung, Wochentags ab 22:30 Uhr und Freitags bzw. Samstags ab 23:45 Uhr kann die Temperatur auf 17°C runter, weil keiner mehr das Badezimmer benutzt
-> 2: Wochentags um 5:45 Uhr soll das Badezimmer auf 22°C geheizt werden, damit es beim Aufstehen wohlig warm ist - um 8:30 Uhr steht meine Freundin auf, also gleiches Prozedere, nur dass hier nicht auf den Wochentag eingeschränkt wird und es am Wochenende auch um 8:30 Uhr losgehen kann. Um 20:00 Uhr soll auch jeden Tag nochmals geheizt werden.
-> 3: Tagsüber zu den nicht vorher spezifierten Zeiträumen soll die Temperatur auf 20°C gehalten werden
Das gilt allerdings nur, wenn jemand anwesend ist.
Ist niemand da (Dienstreise, übers Wochenende verreist, etc.) soll die Temperatur unabhängig von allem Oberen auf 16°C gehalten werden.
Das funktioniert soweit auch schon ganz gut. Die Thermostate regeln sich automatisch, wenn jemand anwesend ist. Wenn der Anwesenheits-Status auf "0" gesetzt wird, werden alle Thermostate auf 16°C heruntergefahren - super!
Jedoch wenn ich den Status wieder auf "1" setze, passiert bis zum nächsten definierten Zeitpunkt gar nichts. Das klingt für mich soweit logisch - es wurde ja kein definierter Zeitpunkt erreicht, deshalb wird auch nichts getriggert. Blöd ist eben dann nur, dass die Wohnung kalt bleibt, wenn man nicht die Temperatur selbst hochsetzt.
Meine Frage nun....wie bekomme ich das am Geschicktesten gelöst? Ich hätte gerne, dass beim Wechsel auf "Anwesend" geprüft wird, welche Temperatur gerade zur Uhrzeit eingeschaltet sein müsste ("Ist es nach 10:00 Uhr? Setze 20°C. Ist es nach 20:00 Uhr? Setze 22°C."). Müsste ich dafür ein separates DOIF bauen?
Das Thermostat solte insgesamt möglichst immer manuell bedienbar bleiben und erst (wie jetzt auch) beim nächsten geplanten Wechsel wieder die Temperatur anpassen. Ich hatte überlegt mit definierten Zeiträumen zu arbeiten, wie z.B.
## Tagsüber normal
DOELSEIF ([Anwesend] eq "1" and ([06:45-08:29]|12345] or [09:30-19:59|12345] or [10:00-19:59|06]))
(set Bad.Heizung desiredTemperature 20.0)
Aber das würde doch bedeuten, dass fhem eine evtl. manuell eingestellte Temperatur immer mit dem Wert aus dem DOIF überschreibt, oder? Habt ihr eine bessere Idee? Ich hatte bereits gegooglet aber nichts wirklich brauchbares gefunden...
Bereits vielen Dank im Vorraus und viele Grüße!
Ohne alles genau angesehen zu haben, hast Du grundsätzlich die Möglichkeit einen Filter in den Set-Befehl einzubauen. Der Filter bewirkt dann, dass die neue Plantemperatur nur gesetzt wird, wenn die desiredTemperature auf der vorherigen Plantemperatur steht.
set Bad.Heizung:FILTER=desiredTemperature=22.0 desiredTemperature 20.0