Heizkörpersteuerung abhängig von Anwesenheit mit DOIFs

Begonnen von Tomatenjoghurt, 06 Januar 2017, 22:29:03

Vorheriges Thema - Nächstes Thema

Tomatenjoghurt

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!

Ellert

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