Hallo Leute,
In meinem Auto habe ich eine elektrische Standheizung (von der Fa. DEFA) verbaut, da ich mal paar Jahre in Finnland lebte. Nun möchte ich gerne temperaturabhängig die Heizung einschalten. Dazu verwende ich einen OSRAM Lightify Plug. Ich verlasse immer zur selben Zeit das Haus, nämlich um 6:30. Die Heizung soll bei Temperaturen von < +5°C circa 30 Minuten vorheizen, bei < 0°C 45 Minuten, ... und bei < -10°C eine Stunde.
Mit at Befehlen frage ich zu den möglichen Einschaltzeiten die Temperatur ab, zum Beispiel hier für 0°C um 5:45:
defmod AUTO.HZ.on0 at *05:45:00 { if(!($we) && ReadingsVal("Aussen.Temp","temperature",0) < 0) { \
fhem ("set SW.AUTO on") } }
Nun habe ich insgesamt vier solcher at-Anweisungen, mit je verschiedenen Zeiten und Temperaturen. Elegant finde ich das nicht. Hat eventuell jemand eine Idee wie man das schöner machen kann? Am liebsten wäre mir eine Stützpunktkennlinie, welche ich vorgeben kann und dann entsprechend eine Einschaltzeit berechnet wird. Jemand eine Idee?
edit:
Lösung siehe Antwort 13 (https://forum.fhem.de/index.php/topic,80321.msg726811.html#msg726811)
Alle vier Varianten in ein doif.
Mit dem Handy online, daher kurz gefasst...
Ich möchte gerne eine Kennlinie, wenn sowas einfach gehen würde. Habe mir gerade das Modul powermap angeschaut, aber das wird wohl schwer mit Uhrzeiten und Temperaturen
Zitat von: MrJackBlack am 29 November 2017, 21:58:56
Ich möchte gerne eine Kennlinie, wenn sowas einfach gehen würde. Habe mir gerade das Modul powermap angeschaut, aber das wird wohl schwer mit Uhrzeiten und Temperaturen
https://fhem.de/commandref_DE.html#THRESHOLD
Dort gibt es ein Beispiel für eine Heizkennlinie.
Das klingt ganz gut. Danke für den Tipp. Ich werde heute Abend schauen ob ich damit etwas hin bekomme :)
Moin,
hast Du Deine Lösung schon fertig?
Interessiert mich auch, bin auch DEFA-Fahrer ;)
Wie Frank schon schrieb, würde ich ein DOIF nehmen, oder 4 einzelne Schaltzeitpunkte.
liebe Grüße
rené
Wie zufrieden seit Ihr mit der DEFA-Lösung?
Danke, -MN
Wie wäre es mit:
DOIF ([([05:30]+[$SELF:verzoegerung,0])]) (set heizung on)
DOELSEIF ([06:30]) (set heizung off)
DOELSEIF ([05:29]) (setreading $SELF verzoegerung {(int([Aussensensor:temperature]*3+30)*60)})
Um 05:29 Uhr wird die Verzögerung des Einschaltens abhängig von der aktuellen Temperatur berechnet. Funktioniert zwischen -10 und 10 Grad.
Lässt sich natürlich beliebig auf Wochentage, anderen Temperaturbereich, Aktivierungsmodus, andere Kennlinie usw. erweitern.
Edit: Vorzeichen korrigiert.
@tunichgut:
Aktuell arbeite ich noch mit 5 at-Befehlen und schalte zu den oben genannten Zeiten die Heizung ein.
@Morgennebel:
Ich finde es klasse, wobei es halt nur Zuhause funktioniert und nicht wenn man woanders parkt (es sei denn es ist ein 230V-Stecker in der Nähe). Einzig das Verlegen der Anschlusskabel in meinem A6 war schwierig, da man einfach nirgends richtig ran kommt.
@Damian:
Muss das Reading "verzoegerung" ins DOIF?
defmod Garage_doif_Standheizung DOIF ([([$SELF:Abfahrt]-[01:00])] and [?Sens_Wetterstation_tr:temperature] < -5) (set Garage_ak_Standheizung_Sw on)\
DOELSEIF\
([([$SELF:Abfahrt]-[00:45])] and [?Sens_Wetterstation_tr:temperature] < 0) (set Garage_ak_Standheizung_Sw on)\
DOELSEIF\
([([$SELF:Abfahrt]-[00:30])] and [?Sens_Wetterstation_tr:temperature] < 5) (set Garage_ak_Standheizung_Sw on)\
DOELSEIF\
([[$SELF:Abfahrt]]) (set Garage_ak_Standheizung_Sw off)
attr Garage_doif_Standheizung group sonstige
attr Garage_doif_Standheizung readingList Abfahrt
attr Garage_doif_Standheizung room Garagen,__Befehle
attr Garage_doif_Standheizung setList Abfahrt
attr Garage_doif_Standheizung state [$SELF:Abfahrt]
so hab ich das...
Mit 'set Garage_doif_Standheizung Abfahrt 6:20' die Abfahrtzeit einstellen und gut...
hab zwar keine DEFA, aber nen Heizlüfter auf der Hutablage stehen... ;D
Zitat von: MrJackBlack am 06 Dezember 2017, 11:31:31
Muss das Reading "verzoegerung" ins DOIF?
Das Reading wird automatisch durch setreading erstellt . Man braucht bei dieser Lösung keine weiteren Definition bzw. Dummys.
Zitat von: Damian am 06 Dezember 2017, 12:51:26
Das Reading wird automatisch durch setreading erstellt . Man braucht bei dieser Lösung keine weiteren Definition bzw. Dummys.
Also die Idee ist schon mal klasse. Vielen Dank. Wenn ich dein DOIF erstelle und an meine Umbegung anpassen, kommt foglender Fehler:
timer_01_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
edit: hier noch mal der angepasste Code
defmod TEST.DOIF DOIF ([([05:30]+[$SELF:verzoegerung,0])]) (set SW.AUTO on) DOELSEIF ([06:30]) (set SW.AUTO off) DOELSEIF ([05:29]) (setreading $SELF verzoegerung {(int([Aussen.Temp:temperature]*3+30)*60)})
attr TEST.DOIF room 02_Garten
setstate TEST.DOIF initialized
setstate TEST.DOIF 2017-12-06 12:54:05 cmd 0
setstate TEST.DOIF 2017-12-06 12:54:05 state initialized
setstate TEST.DOIF 2017-12-06 12:54:05 timer_01_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
setstate TEST.DOIF 2017-12-06 12:54:05 timer_02_c02 07.12.2017 06:30:00
setstate TEST.DOIF 2017-12-06 12:54:05 timer_03_c03 07.12.2017 05:29:00
edit2:
habe mir deine Rechnung der verzoegerung in ein UserReading gepackt. Mit einer aktuellen Aussentemperatur von 1,7°C ergibt die Rechnung einen Wert von 2106s. Kann man den diesen einfach so auf eine Uhrzeit addieren?
Zitat von: MrJackBlack am 06 Dezember 2017, 12:56:34
Also die Idee ist schon mal klasse. Vielen Dank. Wenn ich dein DOIF erstelle und an meine Umbegung anpassen, kommt foglender Fehler:
timer_01_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
edit: hier noch mal der angepasste Code
defmod TEST.DOIF DOIF ([([05:30]+[$SELF:verzoegerung,0])]) (set SW.AUTO on) DOELSEIF ([06:30]) (set SW.AUTO off) DOELSEIF ([05:29]) (setreading $SELF verzoegerung {(int([Aussen.Temp:temperature]*3+30)*60)})
attr TEST.DOIF room 02_Garten
setstate TEST.DOIF initialized
setstate TEST.DOIF 2017-12-06 12:54:05 cmd 0
setstate TEST.DOIF 2017-12-06 12:54:05 state initialized
setstate TEST.DOIF 2017-12-06 12:54:05 timer_01_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
setstate TEST.DOIF 2017-12-06 12:54:05 timer_02_c02 07.12.2017 06:30:00
setstate TEST.DOIF 2017-12-06 12:54:05 timer_03_c03 07.12.2017 05:29:00
edit2:
habe mir deine Rechnung der verzoegerung in ein UserReading gepackt. Mit einer aktuellen Aussentemperatur von 1,7°C ergibt die Rechnung einen Wert von 2106s. Kann man den diesen einfach so auf eine Uhrzeit addieren?
Die Fehlermeldung wird um 05:29 Uhr verschwinden, weil dann verzoegerung gesetzt wird (scheinbar greift an dieser Stelle die Vorbelegung mit 0 nicht richtig)
Im DOIF kannst du mit Zeiten rechnen
http://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Zitat von: Damian am 06 Dezember 2017, 13:14:22
Die Fehlermeldung wird um 05:29 Uhr verschwinden, weil dann verzoegerung gesetzt wird (scheinbar greift an dieser Stelle die Vorbelegung mit 0 nicht richtig)
Im DOIF kannst du mit Zeiten rechnen
http://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Du hast natürlich vollkommen recht, um 5:29 wird das reading verzoegerung erst gesetzt! Bis dahin existiert es gar nicht.
Meine Lösung sieht jetzt so aus:
defmod AUTO.HZ.on DOIF ([(([$SELF:Abfahrt,"06:30"])-[$SELF:verzoegerung,0])] and [Aussen.Temp:temperature] < 5) (set AUTO.HZ on)
DOELSEIF ([[$SELF:Abfahrt,"06:30"]]) (set AUTO.HZ off)
DOELSEIF ([([$SELF:Abfahrt]-[01:31])]) (setreading $SELF verzoegerung {((abs(int([Aussen.Temp:temperature])-5)*4+30)*60)})
Somit kann man jetzt einfach mit
setreading AUTO.HZ.on Abfahrt xx:xx die Abfahrtszeit angeben und den Rest erledigt FHEM!
Für die Berechnung der Heizzeit habe ich mir die folgenden Stützpunkte überlegt:
+5°C | 30min
-10°C | 90min--> daher die Formel
(abs(int([Aussen.Temp:temperature])-5)*4+30)*60)--> die maximale Heizzeit ist bei mir 90min. Möchte jemand diese erhöhen, so muss er bei
DOELSEIF ([([$SELF:Abfahrt]-[01:31])]) eine entsprechend grössere Zeit subtrahieren, welche grösser ist als die maximale Heizzeit.
Ebenfalls wird die Heizung nur geschalten wenn es <5°C ist.