Dein erster Time cron Ausdruck ist schlicht falsch, der kann so nicht funktionieren.
Der zweite und dritte Time cron Ausdruck sehen ok aus, sind aber auch unnötig kompliziert.
Code: Alles auswählen
Time cron "0 45 14 ? 10-12,1-3 SAT" // Um 14:45:00, samstags von Oktober bis März
Time cron "0 0 19 * * ?" Um 19:00:00, täglich
Time cron "0 45 23 * * ?" Um 23:45:00, täglich
Die einzelnen Stellen sind s m h T M W J, s=Sekunde, m=Minute, h=Stunde, T=Tag im Monat, M=Monat im Jahr, W=Wochentag, J=Jahr, wobei das Jahr optional ist, also nicht angegeben werden muss.
Da es sich doch um ordentliche Verbraucher handelt, wäre es sinnvoll, die beiden Geräte nacheinander einzuschalten, mit einigen Sekunden Abstand. Beim Ausschalten ist des eher egal, obwohl es acuh da zu Spannungsspitzen kommen kann.
Haben die Geräte keinen eingebauten Thermostaten? Das wäre - schon wegen der Betriebssicherheit - sehr wichtig.
Was passiert an den spielfreien Wochenenden?
Damit das Ganze mit exterenen Thermostaten funktioniert, brauchst Du halt ein paar Items, die die Ist- und Solltemperatur und dne Zustand halten. Weiterhin Brauchst Du nun ein Item, welches den Zustand hält, ob grundsätzlich geheizt werden soll. Ungefähr so:
Code: Alles auswählen
Switch Spieltag "Heizung [%s]" // kein Binding, kein Channel
Switch Heizen "Heizen [%s]" // kein Binding, kein Channel
Switch GF_Gartenhaus_Steckdose_2KW "2kW Heizung [%s]" {mqtt="..."}
Switch GF_Gartenhaus_Steckdose_500W "500W Heizung [%s]" {mqtt="..."}
Number TempSoll "Solltemperatur [%.1f °C]" <temperature> // kein Binding, kein Channel
Number TempIst "Isttemperatur [%.1f °C]" <temperature> ... // Verbindung zum Temperatursensor
Code: Alles auswählen
val Number nHysterese = 0.2
rule "Spieltag an"
when
Time cron "0 45 14 ? * SAT"
then
Spieltag.postUpdate(ON)
end
rule "Spieltag aus"
when
Time cron "0 0 19 * * ?"
then
Spieltag.postUpdate(OFF)
end
rule "Heizung"
when
Item TempIst changed or
Item TempSoll changed or
Item Spieltag changed
then
Heizen.postUpdate(OFF)
var Number ist = -100
var Number soll = -100
if(Spieltag.state == ON) {
if(!(TempIst.state instanceof Number))
logWarn("heizen","Isttemperatur Fehler!")
else
ist = TempIst.state as Number
if(!(TempSoll.state instanceof Number))
logWarn("heizen","Solltemperatur Fehler!")
else
soll = TempSoll.state as Number
if(ist > 0 && soll > 0 && ((GF_Gartenhaus_Steckdose_2KW.state != ON && ist < soll - nHysterese) || (GF_Gartenhaus_Steckdose_2KW.state == ON && ist < soll)))
Heizen.postUpdate(ON)
}
if(GF_Gartenhaus_Steckdose_2KW.state != Heizen.state) GF_Gartenhaus_Steckdose_2KW.sendCommand(Heizen.state)
Thread::sleep(1000)
if(GF_Gartenhaus_Steckdose_500W.state != Heizen.state) GF_Gartenhaus_Steckdose_500W.sendCommand(Heizen.state)
end
Mit den ersten beiden Rules wird festgelegt, ob überhaupt geheizt werden soll. Diese Information ist danach im Item Spieltag verfügbar.
In der dritten Rule wird zu Beginn das Item Heizen auf OFF gesetzt.
Anschließend prüft die Rule, ob Soll- und Isttemperatur gültige Werte enthalten.
Ist das nicht der Fall, gibt es eine entsprechende Warnmeldung im Log.
Enthalten beide eine gültige Temperatur, werden die beiden Werte verglichen.
Falls die Heizung gerade läuft, wird gegen die Solltemeperatur verglichen, ansonsten gegen die Solltemperatur minus Hysterese, um ständiges Schalten zu verhindern.
Ist die Solltemperatur (evtl. minus Hysterese) höher als die verglichene Isttemperatur, wird das Item Heizen auf ON gesetzt.
Zum Schluss werden die Heizkörper entsprechend geschaltet, wobei das Thread::sleep(1000) eine Sekunde Pause zwischen den beiden Schaltvorgängen einlegt.
Man kann natürlich die beiden Steckdosen immer schalten, also ohne den Zustand abzufragen, aber so werden nur dann Schalttelegramme gesendet, wenn dies wirklich notwendig ist.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet