Hallo,
ich bin ein aufmerksamer Leser des Forums und habe auch schon viel nützliches für mein OpenHab gefunden. Mein neues Projekt gilt der Poolsteurung. Ich habe dazu eine Steuerung über einen ESP8266 (ESP Easy Mega) gebaut. Dort habe ich ein Relay. Ein Anschluss für die Poolfilter Pumpe und einen für die Solarpumpe sowie Temperaturfühler (DS18b20) verbunden. Einen Fühler für den Pool und einen für die Solar Anlage.
Ich möchte gerne das die Solarpumpe anläuft, wenn die Pooltemperatur weniger als 7C° der Solarfühler misst. Zwei Erweiterungen gibt es noch der Solarfühler muss mindestens 31C° haben und der Pool darf nicht mehr als 29C° haben. Diese Mindes und Maximalwerte setze ich über Set Points (Infos hier im Forum gefunden)
Dazu habe ich im OpenHAB Switche und Numbers Items angelegt.
Switche:
PowerPool : Relay für die Poolpumpe
PowerSolar: Relay für die Solarpumpe
Thermostate:
Number: „Thermostat_Pool_Thermostat_Pool“ das Thermostat für das Poolwasser
Number: „Thermostat_Solar_“ das Thermostat für den Solarkollektor
Ich bin soweit, dass die Steuerung mit der Differenz klappt.
if (TempPool < (TempSolar – Differenz))
Power_Solar.sendCommand(ON)
Wenn ich das aber wie unten beschreiben erweitere komme ich nicht weiter. Dann schaltet die Solarpumpe sich bei jedem Wechsel der Temperatur ein und aus. Woran kann das liegen? Ich komme einfach nicht weiter.
//------------------------------------------------------------------------
// Steuert die Solarpumpe.
//------------------------------------------------------------------------
rule "Solarheizung einschalten"
when
Item Thermostat_Solar_ changed or
Item Thermostat_Pool_Thermostat_Pool changed
then
if (Power_Solar.state == OFF) {
var Number TempPool = Thermostat_Pool_Termostat_Pool.state as Number
var Number TempSolar = Thermostat_Solar_.state as Number
var Number Differenz = Wassertemperatur_Soll_Differenz.state as Number
var Number PoolMax = Wassertemperatur_Max.state as Number
var Number SolarMin = Solar_Min.state as Number
if ((TempPool < (TempSolar - Differenz)) && (TempPool > PoolMax))
Power_Solar.sendCommand(ON)
}
end
rule "Solarheizung ausschalten"
when
Item Thermostat_Solar_ changed or
Item Thermostat_Pool_Thermostat_Pool changed
then
if (Power_Solar.state == ON) {
var Number TempPool = Thermostat_Pool_Termostat_Pool.state as Number
var Number TempSolar = Thermostat_Solar_.state as Number
var Number Differenz = Wassertemperatur_Soll_Differenz.state as Number
var Number PoolMax = Wassertemperatur_Max.state as Number
var Number SolarMin = Solar_Min.state as Number
if ((TempPool > (TempSolar - Differenz)) && (SolarMin > TempSolar))
Power_Solar.sendCommand(OFF)
}
end
LG
Marcus
Pool Solarsteuerung
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Re: Pool Solarsteuerung
Bitte stelle Code als Code ein, ist einfacher zu lesen, als Text, und Einrückungen machen es noch leichter lesbar
Ich habe jetzt nicht alles durchdacht, aber die Zeile
kommt mir falsch vor, müsste doch TempPool < PoolMax heissen, oder?
Ich habe jetzt nicht alles durchdacht, aber die Zeile
Code: Alles auswählen
if ((TempPool < (TempSolar - Differenz)) && (TempPool > PoolMax))
BYe
Harald
Harald
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Pool Solarsteuerung
Vor allem verstößt Du gegen ein ungeschriebenes Gesetz. 
Das wird leider nirgends explizit erwähnt, ist aber "eigentlich" logisch: Man sollte möglichst niemals Rules mit identischem Trigger verwenden. Es gibt Ausnahmen, wo sich das nicht vermeiden lässt, aber gerade im vorliegenden Falls gibt es ja nun gar keinen Grund, überhaupt zwei Rules zu verwenden.
Es gibt drei Voraussetzungen, die alle erfüllt sein müssen, damit die Pumpe anläuft. Das Gegenteil hiervon ist, dass eine der Bedingungen nicht erfüllt ist. Somit müssen zum Abschalten hier lauter Oder-Verknüpfungen verwendet werden. Oder man lässt es beim einfachen else, denn in diesen Zweig kommt die Rule nur, wenn das vorherige if-Statement nicht erfüllt ist.
Ich habe das alternative if-Statement aber mal stehen lassen, nur zur Anschauung.
Bei der Übernahme der Werte in Variablen (oder in diesem Fall Konstanten, völlig ausreichend, die Werte werden ja nicht geändert) ist es sinnvoll, direkt eine Wandlung nach float vorzunehmen.
Beim Schalten in einen definierten Zustand geht es darum, den Schalter in einen Zustand zu bringen, falls der Schalter von diesem Zustand abweicht, nicht, dass der Schalter einen bestimmten anderen Zustand hat. Konkret kann ein Schalter nicht nur den Zustand ON und OFF annehmen, sondern (mindestens) auch den Zustand NULL.

Das wird leider nirgends explizit erwähnt, ist aber "eigentlich" logisch: Man sollte möglichst niemals Rules mit identischem Trigger verwenden. Es gibt Ausnahmen, wo sich das nicht vermeiden lässt, aber gerade im vorliegenden Falls gibt es ja nun gar keinen Grund, überhaupt zwei Rules zu verwenden.
Code: Alles auswählen
//------------------------------------------------------------------------
// Steuert die Solarpumpe.
//------------------------------------------------------------------------
rule "Solarheizung schalten"
when
Item Thermostat_Solar_ changed or
Item Thermostat_Pool_Thermostat_Pool changed
then
val Number TempPool = (Thermostat_Pool_Termostat_Pool.state as Number).floatValue // Pooltemperatur
val Number TempSolar = (Thermostat_Solar_.state as Number).floatValue // Solartemperatur
val Number Differenz = (Wassertemperatur_Soll_Differenz.state as Number).floatValue // Minimaldifferenz
val Number PoolMax = (Wassertemperatur_Max.state as Number).floatValue // Maximaltemperatur Pool
val Number SolarMin = (Solar_Min.state as Number).floatValue // Minimaltemperatur Solar
if(TempSolar - TempPool > Differenz && TempPool < PoolMax && TempSolar > SolarMin) { // Differenz überschritten und Grenzwerte eingehalten
if (Power_Solar.state != ON) // Falls Pumpe nicht an
Power_Solar.sendCommand(ON) // Schalte Pumpe an
} else { // if(TempSolar - TempPool < Differenz || TempSolar < SolarMin || TempPool > PoolMax) // Differenz unterschritten oder Grenzwerte nicht eingehalten
if (Power_Solar.state != OFF) // Falls Pumpe nicht aus
Power_Solar.sendCommand(OFF) // Schalte Pumpe aus
}
end
Ich habe das alternative if-Statement aber mal stehen lassen, nur zur Anschauung.
Bei der Übernahme der Werte in Variablen (oder in diesem Fall Konstanten, völlig ausreichend, die Werte werden ja nicht geändert) ist es sinnvoll, direkt eine Wandlung nach float vorzunehmen.
Beim Schalten in einen definierten Zustand geht es darum, den Schalter in einen Zustand zu bringen, falls der Schalter von diesem Zustand abweicht, nicht, dass der Schalter einen bestimmten anderen Zustand hat. Konkret kann ein Schalter nicht nur den Zustand ON und OFF annehmen, sondern (mindestens) auch den Zustand NULL.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 5
- Registriert: 8. Jul 2020 15:41
Re: Pool Solarsteuerung
Super vielen Danke das war es. Das mit den Träger ist, wenn ich drüber nachdenke auch logisch. So ist das Script auch viel kleiner.