Ja, ein und aus.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Heizungssteuerung
Einklappen
X
-
Jetzt habe ich schon den nächsten Hänger:
Wie erstelle ich für jedes Zimmer ein Setpoint-Item um die Solltemperatur für die einzelnen Räume zu bestimmen, sodass ich diese Sollwerte über eine Regel abfragen und entsprechend reagieren kann, wenn die Ist-Temperatur unter dem Sollwert liegt?
Die IST-Temperaturen bekomme ich ja bereits von meinem Thermostat. Die SOLL-Temperaturen will ich über ein entsprechendes Setpoint Item für jeden Raum extra einstellen können.
Geht das, dass die von mir eingestellten Werte abgespeichert und bei einem Neustart von OpenHAB wieder eingelesen werden?
Gruß Jan
Kommentar
-
Hi,
Zitat von Jan0815 Beitrag anzeigenGeht das, dass die von mir eingestellten Werte abgespeichert und bei einem Neustart von OpenHAB wieder eingelesen werden?
* erstelle eine Gruppe "Sollwerte"
* füge der Gruppe jedes Sollwert-Item zu
* erstelle rrd4j.persist
* füge dort den Eintrag "Sollwerte : strategy = everyChange, restoreOnStartup" in die Kategorie "Items" ein
Gruß,
Thomas E.-E.Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)
Kommentar
-
Ok, das habe ich jetzt alles umgesetzt. Alles scheint nun soweit zu funktionieren. Wenn mir jetzt noch jemand sagt, wie ich die beiden Werte richtig vergleiche, sollte alles so funktionieren, wie ich es mir vorgestellt habe:
Code:rule "Heizung Küche" when Item Temperature_GEG_Kitchen changed then if (Temperature_GEG_Kitchen<Sollwerte_Kitchen){ sendCommand(Heating_GEG_Kitchen, ON) } if (Temperature_GEG_Kitchen>Sollwerte_Kitchen){ sendCommand(Heating_GEG_Kitchen, OFF) }
Kommentar
-
Ohne Anspruch auf Richtigkeit probiert es mal damit:
Code:var Number Ist var Number Soll if (Temperature_GEG_Kitchen.state instanceof DecimalType && Sollwerte_Kitchen.state instanceof DecimalType) { Ist = Temperature_GEG_Kitchen.state as DecimalType Soll = Sollwerte_Kitchen.state as DecimalType if (Ist < Soll) { .... } else if (Ist > Soll) { ... } }
Kommentar
-
Gut, das habe ich gemacht. Bei Temperature_GEG_Kitchen.state funktioniert das auch, aber bei Sollwerte_Kitchen.state meckert der Designer immer noch rum und bringt die Meldung: Incompatible types. Expected java.lang.Number but was org.openhab.core.types.State
Das entsprechende Objekt ist in der Items datei folgendermaßen angelegt:
Code:Number Sollwerte_Kitchen "Solltemperatur Küche [%.1f °C]" <temperature> (Sollwerte, GEG_Kitchen)
Code:Setpoint item=Sollwerte_Kitchen minValue=16 maxValue=28 step=1.0
Code:rule "Heizung Küche" when Item Temperature_GEG_Kitchen changed then if (Temperature_GEG_Kitchen.state < Sollwerte_Kitchen.state){ sendCommand(Heating_GEG_Kitchen, ON) } if (Temperature_GEG_Kitchen.state > Sollwerte_Kitchen.state){ sendCommand(Heating_GEG_Kitchen, OFF) } end
Kommentar
-
Nur der Vollständigkeit halber. Hier nun die Zusammenfassung meiner Heizungslösung:
Rule:
Code:rule "Heizung Küche" when Item Temperature_GEG_Kitchen changed then var Number Ist var Number Soll if (Temperature_GEG_Kitchen.state instanceof DecimalType && Sollwerte_Kitchen.state instanceof DecimalType) { Ist = Temperature_GEG_Kitchen.state as DecimalType Soll = Sollwerte_Kitchen.state as DecimalType if (Ist < Soll) { sendCommand(Heating_GEG_Kitchen, ON) } else if (Ist > Soll) { sendCommand(Heating_GEG_Kitchen, OFF) } } end
Code:... /*Ist-Werte abfragen*/ Number Temperature_GEG_Kitchen "Küche [%.1f °C]" <temperature> (Temperature, GEG_Kitchen, Weather_Chart) { knx="1/2/3" } /*Heizung ein bzw. ausschalten*/ Switch Heating_GEG_Kitchen "Heizung Küche" <heating> (GEG_Kitchen, Heating) { knx="1/2/4"} /*Sollwerte einstellen*/ Number Sollwerte_Kitchen "Solltemperatur Küche [%.1f °C]" <temperature> (Sollwerte, GEG_Kitchen)
Code:... /*Hier wird das entsprechende Item angezeigt, mit dem die Sollwerte angepasst werden können. */ Text label="Heizung und Temperaturen" icon="chart"{ Group item=Sollwerte label="Sollwerte" icon="settings"{ Setpoint item=Sollwerte_Kitchen minValue=16 maxValue=28 step=1.0 } ....
Gruß Jan
Kommentar
-
Ich würde beim Ein- und ausschalten noch eine kleine Hysterese einbauen, als z.B. if (Ist < Soll-0.5)...
Sonst schaltet das Ventil ständig, wenn die Temperatur um den Sollwert herum leicht schwankt. Hängt aber auch davon ab, wie träge das ganze System regiert.
Alternativ wäre eine zeitliche Komponente denkbar, also z.B. erst dann heizen, wenn die Temperatur für 5min unterschritten wurde. Oder eine Kombination aus beidem.
Regelungstechnik kann beliebig kompliziert werden
Kommentar
-
Weil es so gut zum Thema passt - und die eigentliche Anfrage inzwischen gelöst ist, möchte ich den "openHAB-Heizungsoptimierung" folgende Regel nicht vorhalten:
Code:rule "Sonnennutzung" when Item Sun_Azimut changed then if (Present.state == OFF) { if (Sun_Azimut.state >= 155 && Sun_Azimut.state <= 156) { var Heizabweichung = TSWohnen.state - T_Wohnen.state if (Heizabweichung > 1 || T_Wohnen.state < 21) { sendCommand(J_Ess_S, UP) sendCommand(J_LH_O, UP) sendCommand(J_LH_U, UP) sendCommand(J_Woh_S, UP) } } end
T_Wohnen ist die Wohnraum-Ist-Temperatur
J_* sind Rollläden
Present ist die Anwesenheit (OFF=Weg)
Sun_Azimut ist die Sonnenposition horizontal (nicht Höhe)
Wenn also keiner da ist und die Sonne in den (für mein Haus) günstigen Bereich einfährt, wird berechnet, ob Bedarf besteht und falls ja, die passenden Rolls hochgefahren.
In der Übergangszeit (...habe das Gefühl da sind wir immernoch - bei 12°C draußen) hat das einiges gebracht - die Heizung hat die letzten Wochen bis auf ein paar schäbige Ausnahmen - nur WW gemacht
Kommentar
-
Hi,
Zitat von kuschelganxta Beitrag anzeigenmöchte ich den "openHAB-Heizungsoptimierung" folgende Regel nicht vorhalten:
Danke und Gruß,
Thomas E.-E.Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)
Kommentar
-
Vielleicht kann mir nochmal jemand unter die Arme greifen, ich finde den Fehler nicht.
Als ich diese Regel eingebaut habe, hat soweit alles funktioniert. Da es die ganze Zeit warm war, hatte ich bei mir den Schalter Sommerbetrieb auf on, so dass die Heizung nicht angesprungen ist. Jetzt habe ich den Schalter auf off gestellt, OpenHAB schaltet aber trotzdem nicht auf Heizen.
Hier der entsprechende Code aus der Rules-Datei:
Code://Heizungssteuerung rule "Heizung KG Küche" when Item Temperature_GKG_Kitchen changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist10 var Number Soll10 if (Temperature_GKG_Kitchen.state instanceof DecimalType && Sollwerte_GKG_Kitchen.state instanceof DecimalType) { Ist10 = Temperature_GKG_Kitchen.state as DecimalType Soll10 = Sollwerte_GKG_Kitchen.state as DecimalType if (Ist10 < Soll10) { sendCommand(Heating_GKG_Kitchen, ON) } else if (Ist10 > Soll10) { sendCommand(Heating_GKG_Kitchen, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist10 var Number Soll10 if (Temperature_GKG_Kitchen.state instanceof DecimalType && Sollwerte_GKG_Kitchen_Urlaub.state instanceof DecimalType) { Ist10 = Temperature_GKG_Kitchen.state as DecimalType Soll10 = Sollwerte_GKG_Kitchen_Urlaub.state as DecimalType if (Ist10 < Soll10) { sendCommand(Heating_GKG_Kitchen, ON) } else if (Ist10 > Soll10) { sendCommand(Heating_GKG_Kitchen, OFF) } } } end rule "Heizung KG Bad" when Item Temperature_GKG_Bath changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist11 var Number Soll11 if (Temperature_GKG_Bath.state instanceof DecimalType && Sollwerte_GKG_Bath.state instanceof DecimalType) { Ist11 = Temperature_GKG_Bath.state as DecimalType Soll11 = Sollwerte_GKG_Bath.state as DecimalType if (Ist11 < Soll11) { sendCommand(Heating_GKG_Bath, ON) } else if (Ist11 > Soll11) { sendCommand(Heating_GKG_Bath, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist11 var Number Soll11 if (Temperature_GKG_Bath.state instanceof DecimalType && Sollwerte_GKG_Bath_Urlaub.state instanceof DecimalType) { Ist11 = Temperature_GKG_Bath.state as DecimalType Soll11 = Sollwerte_GKG_Bath_Urlaub.state as DecimalType if (Ist11 < Soll11) { sendCommand(Heating_GKG_Bath, ON) } else if (Ist11 > Soll11) { sendCommand(Heating_GKG_Bath, OFF) } } } end rule "Heizung KG Wohn-/Schlafzimmer" when Item Temperature_GKG_Living changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist12 var Number Soll12 if (Temperature_GKG_Living.state instanceof DecimalType && Sollwerte_GKG_Living.state instanceof DecimalType) { Ist12 = Temperature_GKG_Living.state as DecimalType Soll12 = Sollwerte_GKG_Living.state as DecimalType if (Ist12 < Soll12) { sendCommand(Heating_GKG_Living, ON) } else if (Ist12 > Soll12) { sendCommand(Heating_GKG_Living, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist12 var Number Soll12 if (Temperature_GKG_Living.state instanceof DecimalType && Sollwerte_GKG_Living_Urlaub.state instanceof DecimalType) { Ist12 = Temperature_GKG_Living.state as DecimalType Soll12 = Sollwerte_GKG_Living_Urlaub.state as DecimalType if (Ist12 < Soll12) { sendCommand(Heating_GKG_Living, ON) } else if (Ist12 > Soll12) { sendCommand(Heating_GKG_Living, OFF) } } } end rule "Heizung Küche" when Item Temperature_GEG_Kitchen changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist13 var Number Soll13 if (Temperature_GEG_Kitchen.state instanceof DecimalType && Sollwerte_Kitchen.state instanceof DecimalType) { Ist13 = Temperature_GEG_Kitchen.state as DecimalType Soll13 = Sollwerte_Kitchen.state as DecimalType if (Ist13 < Soll13) { sendCommand(Heating_GEG_Kitchen, ON) } else if (Ist13 > Soll13) { sendCommand(Heating_GEG_Kitchen, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist13 var Number Soll13 if (Temperature_GEG_Kitchen.state instanceof DecimalType && Sollwerte_Kitchen_Urlaub.state instanceof DecimalType) { Ist13 = Temperature_GEG_Kitchen.state as DecimalType Soll13 = Sollwerte_Kitchen_Urlaub.state as DecimalType if (Ist13 < Soll13) { sendCommand(Heating_GEG_Kitchen, ON) } else if (Ist13 > Soll13) { sendCommand(Heating_GEG_Kitchen, OFF) } } } end rule "Heizung Wohn- und Esszimmer" when Item Temperature_GEG_Living changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist2 var Number Soll2 if (Temperature_GEG_Living.state instanceof DecimalType && Sollwerte_Living.state instanceof DecimalType) { Ist2 = Temperature_GEG_Living.state as DecimalType Soll2 = Sollwerte_Living.state as DecimalType if (Ist2 < Soll2) { sendCommand(Heating_GEG_Living, ON) } else if (Ist2 > Soll2) { sendCommand(Heating_GEG_Living, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist2 var Number Soll2 if (Temperature_GEG_Living.state instanceof DecimalType && Sollwerte_Living_Urlaub.state instanceof DecimalType) { Ist2 = Temperature_GEG_Living.state as DecimalType Soll2 = Sollwerte_Living_Urlaub.state as DecimalType if (Ist2 < Soll2) { sendCommand(Heating_GEG_Living, ON) } else if (Ist2 > Soll2) { sendCommand(Heating_GEG_Living, OFF) } } } end rule "Heizung Bad" when Item Temperature_G1OG_Bath changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist3 var Number Soll3 if (Temperature_G1OG_Bath.state instanceof DecimalType && Sollwerte_Bath.state instanceof DecimalType) { Ist3 = Temperature_G1OG_Bath.state as DecimalType Soll3 = Sollwerte_Bath.state as DecimalType if (Ist3 < Soll3) { sendCommand(Heating_G1OG_Bath, ON) } else if (Ist3 > Soll3) { sendCommand(Heating_G1OG_Bath, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist3 var Number Soll3 if (Temperature_G1OG_Bath.state instanceof DecimalType && Sollwerte_Bath_Urlaub.state instanceof DecimalType) { Ist3 = Temperature_G1OG_Bath.state as DecimalType Soll3 = Sollwerte_Bath_Urlaub.state as DecimalType if (Ist3 < Soll3) { sendCommand(Heating_G1OG_Bath, ON) } else if (Ist3 > Soll3) { sendCommand(Heating_G1OG_Bath, OFF) } } } end rule "Heizung Lucas" when Item Temperature_G1OG_Child changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist4 var Number Soll4 if (Temperature_G1OG_Child.state instanceof DecimalType && Sollwerte_Child.state instanceof DecimalType) { Ist4 = Temperature_G1OG_Child.state as DecimalType Soll4 = Sollwerte_Child.state as DecimalType if (Ist4 < Soll4) { sendCommand(Heating_G1OG_Child, ON) } else if (Ist4 > Soll4) { sendCommand(Heating_G1OG_Child, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist4 var Number Soll4 if (Temperature_G1OG_Child.state instanceof DecimalType && Sollwerte_Child_Urlaub.state instanceof DecimalType) { Ist4 = Temperature_G1OG_Child.state as DecimalType Soll4 = Sollwerte_Child_Urlaub.state as DecimalType if (Ist4 < Soll4) { sendCommand(Heating_G1OG_Child, ON) } else if (Ist4 > Soll4) { sendCommand(Heating_G1OG_Child, OFF) } } } end rule "Heizung 1.OG Flur" when Item Temperature_G1OG_Corridor changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist5 var Number Soll5 if (Temperature_G1OG_Corridor.state instanceof DecimalType && Sollwerte_Corridor.state instanceof DecimalType) { Ist5 = Temperature_G1OG_Corridor.state as DecimalType Soll5 = Sollwerte_Corridor.state as DecimalType if (Ist5 < Soll5) { sendCommand(Heating_G1OG_Corridor, ON) } else if (Ist5 > Soll5) { sendCommand(Heating_G1OG_Corridor, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist5 var Number Soll5 if (Temperature_G1OG_Corridor.state instanceof DecimalType && Sollwerte_Corridor_Urlaub.state instanceof DecimalType) { Ist5 = Temperature_G1OG_Corridor.state as DecimalType Soll5 = Sollwerte_Corridor_Urlaub.state as DecimalType if (Ist5 < Soll5) { sendCommand(Heating_G1OG_Corridor, ON) } else if (Ist5 > Soll5) { sendCommand(Heating_G1OG_Corridor, OFF) } } } end rule "Heizung Elternschlafzimmer" when Item Temperature_G1OG_Parents changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist6 var Number Soll6 if (Temperature_G1OG_Parents.state instanceof DecimalType && Sollwerte_Parents.state instanceof DecimalType) { Ist6 = Temperature_G1OG_Parents.state as DecimalType Soll6 = Sollwerte_Parents.state as DecimalType if (Ist6 < Soll6) { sendCommand(Heating_G1OG_Parents, ON) } else if (Ist6 > Soll6) { sendCommand(Heating_G1OG_Parents, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist6 var Number Soll6 if (Temperature_G1OG_Parents.state instanceof DecimalType && Sollwerte_Parents_Urlaub.state instanceof DecimalType) { Ist6 = Temperature_G1OG_Parents.state as DecimalType Soll6 = Sollwerte_Parents_Urlaub.state as DecimalType if (Ist6 < Soll6) { sendCommand(Heating_G1OG_Parents, ON) } else if (Ist6 > Soll6) { sendCommand(Heating_G1OG_Parents, OFF) } } } end rule "Heizung 2.Kinderzimmer" when Item Temperature_G1OG_Zimmer changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist7 var Number Soll7 if (Temperature_G1OG_Zimmer.state instanceof DecimalType && Sollwerte_Kinderzimmer.state instanceof DecimalType) { Ist7 = Temperature_G1OG_Zimmer.state as DecimalType Soll7 = Sollwerte_Kinderzimmer.state as DecimalType if (Ist7 < Soll7) { sendCommand(Heating_G1OG_Zimmer, ON) } else if (Ist7 > Soll7) { sendCommand(Heating_G1OG_Zimmer, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist7 var Number Soll7 if (Temperature_G1OG_Zimmer.state instanceof DecimalType && Sollwerte_Kinderzimmer_Urlaub.state instanceof DecimalType) { Ist7 = Temperature_G1OG_Zimmer.state as DecimalType Soll7 = Sollwerte_Kinderzimmer_Urlaub.state as DecimalType if (Ist7 < Soll7) { sendCommand(Heating_G1OG_Zimmer, ON) } else if (Ist7 > Soll7) { sendCommand(Heating_G1OG_Zimmer, OFF) } } } end rule "Heizung Büro" when Item Temperature_GDG_Buero changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist8 var Number Soll8 if (Temperature_GDG_Buero.state instanceof DecimalType && Sollwerte_Buero.state instanceof DecimalType) { Ist8 = Temperature_GDG_Buero.state as DecimalType Soll8 = Sollwerte_Buero.state as DecimalType if (Ist8 < Soll8) { sendCommand(Heating_GDG_Buero, ON) } else if (Ist8 > Soll8) { sendCommand(Heating_GDG_Buero, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist8 var Number Soll8 if (Temperature_GDG_Buero.state instanceof DecimalType && Sollwerte_Buero_Urlaub.state instanceof DecimalType) { Ist8 = Temperature_GDG_Buero.state as DecimalType Soll8 = Sollwerte_Buero_Urlaub.state as DecimalType if (Ist8 < Soll8) { sendCommand(Heating_GDG_Buero, ON) } else if (Ist8 > Soll8) { sendCommand(Heating_GDG_Buero, OFF) } } } end rule "Heizung Zimmer" when Item Temperature_GDG_Zimmer changed then if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==OFF){ var Number Ist9 var Number Soll9 if (Temperature_GDG_Zimmer.state instanceof DecimalType && Sollwerte_Zimmer.state instanceof DecimalType) { Ist9 = Temperature_GDG_Zimmer.state as DecimalType Soll9 = Sollwerte_Zimmer.state as DecimalType if (Ist9 < Soll9) { sendCommand(Heizung_GDG_Zimmer, ON) } else if (Ist9 > Soll9) { sendCommand(Heizung_GDG_Zimmer, OFF) } } } else if (Shutter_ALLG_Heizung_Sommerbetrieb.state==OFF && Urlaubsreise.state==ON){ var Number Ist9 var Number Soll9 if (Temperature_GDG_Zimmer.state instanceof DecimalType && Sollwerte_Zimmer_Urlaub.state instanceof DecimalType) { Ist9 = Temperature_GDG_Zimmer.state as DecimalType Soll9 = Sollwerte_Zimmer_Urlaub.state as DecimalType if (Ist9 < Soll9) { sendCommand(Heizung_GDG_Zimmer, ON) } else if (Ist9 > Soll9) { sendCommand(Heizung_GDG_Zimmer, OFF) } } } end
Kommentar
Kommentar