Seite 1 von 2

Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 4. Jun 2020 21:35
von KarlNapf
Hallo zusammen,

nachdem ich mit eurer Hilfe im Winter erfolgreich die Steuerung meiner Pooltechnik realisiert habe, möchte ich nun die Rule um den Wert der Außentemperatur erweitern, da ich gemerkt habe, dass es ja keinen Sinn macht den Pool zu beheizen, wenn man so wie heute nur 13 Grad hat, da kämpft meine Wärmepumpe gegen Riesen an.

In die Rule soll also als Bedingung zur Wassertemperatur noch die erwartete Tagestemperatur mit rein, dass die Heizung auch nur einschaltet, wenn Openweathermap für den aktuellen Tag mindestens 20 Grad vorhersagt.

Ich hoffe ihr könnt mir hier weiter helfen.

Vielen Dank, Gruß

Code: Alles auswählen

rule "Heizung einschalten"
when
    Item Wassertemperatur changed
then
    if(Filterpumpe_Switch.state == ON) {
        var Number nTemp = 25
        if(Wassertemperatur.state instanceof Number)
            nTemp = (Wassertemperatur.state as Number).floatValue
        if(nTemp < 24) 
            Heizungspumpe_Switch.sendCommand(ON)
        if(nTemp > 24.1)
            Heizungspumpe_Switch.sendCommand(OFF)
    }
end

rule "Heizung ausschalten"
when
    Item Filterpumpe_Switch changed to OFF
then
    Heizungspumpe_Switch.sendCommand(OFF)
end

Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 5. Jun 2020 12:39
von udo1toni
Du musst halt die Temperatur einsammeln :)
Ich mache das über die 3-Stunden-Werte.

Code: Alles auswählen

Bridge openweathermap:weather-api:api "openweatherMap Api" @ "Wetter" [ 
    apikey="0123456789abcdef0123456789abcdef", 
    refreshInterval=10, 
    language="de" 
] {
    Thing  weather-and-forecast ct "Wetter meiner Stadt" @ "Wetter" [ forecastDays=0, forecastHours=24, step=3, location="50.000000000000000,9.000000000000000" ]
apikey und location musst Du natürlich selbst anpassen,
Die Channel muss man nicht extra anlegen, das macht openHAB selbst, sowie den Namen des Things.
Nun brauchst Du noch Items:

Code: Alles auswählen

Group gOWM
Number:Temperature Wetter_Fc_TempMax "Temp. max (fc) [%.1f °C]"
Switch PumpeEnable
Number:Temperature Wetter_Fc03Temp "Temperatur + 3h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours03#temperature"}
Number:Temperature Wetter_Fc06Temp "Temperatur + 6h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours06#temperature"}
Number:Temperature Wetter_Fc09Temp "Temperatur + 9h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours09#temperature"}
Number:Temperature Wetter_Fc12Temp "Temperatur +12h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours12#temperature"}
Number:Temperature Wetter_Fc15Temp "Temperatur +15h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours15#temperature"}
Number:Temperature Wetter_Fc18Temp "Temperatur +18h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours18#temperature"}
Number:Temperature Wetter_Fc21Temp "Temperatur +21h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours21#temperature"}
Number:Temperature Wetter_Fc24Temp "Temperatur +24h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours24#temperature"}
Nun noch eine Rule, die die vorhergesagten Temperaturen zusammenrechent:

Code: Alles auswählen

rule "update Maxtemp"
 when
	Time cron "0 55 6 * * ?"
 then
    var maxTemp = 0
    gOWM.members.filter[ i |
        i.name.contains("Temp") && i.name.contains("Fc") && (i.state instanceof Number)
    ].forEach [ j |
        if((j.state as Number).floatValue > maxTemp)
            maxTemp = (j.state as Number).floatValue
        logInfo("maxtemp", "{} ist {}, Maximum ist {}",j.name,j.state,maxTemp)
    ]
    Wetter_Fc_TempMax.postUpdate(maxTemp|°C)
    PumpeEnable.postUpdate(if(maxTemp > 20) ON else OFF)
end
Die Rule läuft einmal am Tag und errechnet die erwartete Maximaltemperatur. Ist die Temperatur über 20°C, wird das ungebundene Item PumpeEnable auf ON gesetzt, ansonsten auf OFF. Zusätzlich wird die errechnete Maximaltemperatur auch noch in einem weiteren Item gespeichert.
Die Rule läuft in ähnlicher Form bei mir, allerdings nutze ich die Information für die automatische Beschattung. Ich habe in der Gruppe gOWM (Gruppe OpenweatherMap) noch andere Items drin. Es ist möglich (müsste man halt probieren) dass die Gruppe ebenfalls das Maximum errechnen kann, dann bräuchte es die Rule nicht. (Group:Number:Temperature:MAX gOWM) Ich bin mir aber nicht sicher, ob das so funktioniert, wegen des UoM. Außerdem möchte man ja die Berechnung zu einem bestimmten Zeitpunkt vornehmen.

In Deiner Rule kannst Du nun vor dem Einschalten prüfen, ob das Item PumpeEnable ON oder OFF ist und entsprechend schalten oder nicht schalten.

Auf das Setzen des Enable Items kann man natürlich verzichten, wenn man stattdessen in der Rule auf das Überschreiten des Grenzwertes testet.

Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 5. Jun 2020 16:32
von KarlNapf
Danke Udo,
Das werde ich so mal testen und mich dann wieder melden. Mal sehen, ob ich es ans Laufen bekomme.

Gesendet von meinem ANE-LX1 mit Tapatalk


Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 6. Jun 2020 19:43
von KarlNapf
udo1toni hat geschrieben: 5. Jun 2020 12:39 Du musst halt die Temperatur einsammeln :)
Ich mache das über die 3-Stunden-Werte.

Code: Alles auswählen

Bridge openweathermap:weather-api:api "openweatherMap Api" @ "Wetter" [ 
    apikey="0123456789abcdef0123456789abcdef", 
    refreshInterval=10, 
    language="de" 
] {
    Thing  weather-and-forecast ct "Wetter meiner Stadt" @ "Wetter" [ forecastDays=0, forecastHours=24, step=3, location="50.000000000000000,9.000000000000000" ]
apikey und location musst Du natürlich selbst anpassen,
Die Channel muss man nicht extra anlegen, das macht openHAB selbst, sowie den Namen des Things.
Nun brauchst Du noch Items:

Code: Alles auswählen

Group gOWM
Number:Temperature Wetter_Fc_TempMax "Temp. max (fc) [%.1f °C]"
Switch PumpeEnable
Number:Temperature Wetter_Fc03Temp "Temperatur + 3h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours03#temperature"}
Number:Temperature Wetter_Fc06Temp "Temperatur + 6h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours06#temperature"}
Number:Temperature Wetter_Fc09Temp "Temperatur + 9h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours09#temperature"}
Number:Temperature Wetter_Fc12Temp "Temperatur +12h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours12#temperature"}
Number:Temperature Wetter_Fc15Temp "Temperatur +15h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours15#temperature"}
Number:Temperature Wetter_Fc18Temp "Temperatur +18h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours18#temperature"}
Number:Temperature Wetter_Fc21Temp "Temperatur +21h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours21#temperature"}
Number:Temperature Wetter_Fc24Temp "Temperatur +24h" (gOWM)  {channel="openweathermap:weather-and-forecast:api:ct:forecastHours24#temperature"}
Nun noch eine Rule, die die vorhergesagten Temperaturen zusammenrechent:

Code: Alles auswählen

rule "update Maxtemp"
 when
	Time cron "0 55 6 * * ?"
 then
    maxTemp = 0
    gOWM.members.filter[ i |
        i.name.contains("Temp") && i.name.contains("Fc") && (i.state instanceof Number)
    ].forEach [ j |
        if((j.state as Number).floatValue > maxTemp)
            maxTemp = (j.state as Number).floatValue
        logInfo("maxtemp", "{} ist {}, Maximum ist {}",j.name,j.state,maxTemp)
    ]
    Wetter_Fc_TempMax.postUpdate(maxTemp|°C)
    PumpeEnable.postUpdate(if(maxTemp > 20) ON else OFF)
end
Die Rule läuft einmal am Tag und errechnet die erwartete Maximaltemperatur. Ist die Temperatur über 20°C, wird das ungebundene Item PumpeEnable auf ON gesetzt, ansonsten auf OFF. Zusätzlich wird die errechnete Maximaltemperatur auch noch in einem weiteren Item gespeichert.
Die Rule läuft in ähnlicher Form bei mir, allerdings nutze ich die Information für die automatische Beschattung. Ich habe in der Gruppe gOWM (Gruppe OpenweatherMap) noch andere Items drin. Es ist möglich (müsste man halt probieren) dass die Gruppe ebenfalls das Maximum errechnen kann, dann bräuchte es die Rule nicht. (Group:Number:Temperature:MAX gOWM) Ich bin mir aber nicht sicher, ob das so funktioniert, wegen des UoM. Außerdem möchte man ja die Berechnung zu einem bestimmten Zeitpunkt vornehmen.

In Deiner Rule kannst Du nun vor dem Einschalten prüfen, ob das Item PumpeEnable ON oder OFF ist und entsprechend schalten oder nicht schalten.

Auf das Setzen des Enable Items kann man natürlich verzichten, wenn man stattdessen in der Rule auf das Überschreiten des Grenzwertes testet.
Hallo Udo,

habe das jetzt so in meine rule eingebaut, beim ersten Versuch kam noch ein Fehler:

Code: Alles auswählen

2020-06-06 19:27:51.815 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'poolsteuerung2020.rules' has errors, therefore ignoring it: [59,42]: no viable alternative at input '°C'
daraufhin habe ich das °C bei

Code: Alles auswählen

    Wetter_Fc_TempMax.postUpdate(maxTemp)
entfernt und der Fehler war weg. Ich hoffe das war richtig so. Meine fertige Rule sieht nun wie folgt aus:

Code: Alles auswählen

rule "Filteranlage morgens automatisch einschalten"
when
    Time cron "0 0 8 ? * MON-FRI" or
    Time cron "0 0 7 ? * SAT-SUN"
then
    Filterpumpe_Switch.sendCommand(ON)
end

rule "Filteranlage morgens automatisch ausschalten"
when
    Time cron "0 0 11 ? * MON-FRI" or
    Time cron "0 0 10 ? * SAT-SUN"
then
    Filterpumpe_Switch.sendCommand(OFF)
end

rule "Filteranlage nachmittags automatisch einschalten"
when
    Time cron "0 0 14 ? * MON-FRI" or
    Time cron "0 30 13 ? * SAT-SUN"
then
    Filterpumpe_Switch.sendCommand(ON)
end

rule "Filteranlage nachmittags automatisch ausschalten"
when
    Time cron "0 0 20 ? * MON-FRI" or
    Time cron "0 30 19 ? * SAT-SUN"
then
    Filterpumpe_Switch.sendCommand(OFF)
end

rule "UV-Filter automatisch einschalten"
when
   Item Filterpumpe_Switch changed to ON
then
    UVFilter.sendCommand(ON)
end

rule "UV-Filter automatisch ausschalten"
when
   Item Filterpumpe_Switch changed to OFF
then
    UVFilter.sendCommand(OFF)
end

rule "update Maxtemp"
 when
	Time cron "0 55 6 * * ?"
 then
    maxTemp = 0
    gOWM.members.filter[ i |
        i.name.contains("Temp") && i.name.contains("Fc") && (i.state instanceof Number)
    ].forEach [ j |
        if((j.state as Number).floatValue > maxTemp)
            maxTemp = (j.state as Number).floatValue
        logInfo("maxtemp", "{} ist {}, Maximum ist {}",j.name,j.state,maxTemp)
    ]
    Wetter_Fc_TempMax.postUpdate(maxTemp)
    PumpeEnable.postUpdate(if(maxTemp > 20) ON else OFF)
end

rule "Heizung einschalten"
when
    Item Wassertemperatur changed
then
    if(Filterpumpe_Switch.state == ON)
	if(PumpeEnable.state == ON) {
        var Number nTemp = 25
        if(Wassertemperatur.state instanceof Number)
            nTemp = (Wassertemperatur.state as Number).floatValue
        if(nTemp < 24) 
            Heizungspumpe_Switch.sendCommand(ON)
        if(nTemp > 24.1)
            Heizungspumpe_Switch.sendCommand(OFF)
    }
end

rule "Heizung ausschalten"
when
    Item Filterpumpe_Switch changed to OFF
then
    Heizungspumpe_Switch.sendCommand(OFF)
end

rule "Poolbeleuchtung automatisch einschalten"
when
    Time cron "0 0 21 ? * MON-SUN"
then
    Poolbeleuchtung.sendCommand(ON)
end

rule "Poolbeleuchtung automatisch ausschalten"
when
    Time cron "0 0 5 ? * MON-SUN"
then
    Poolbeleuchtung.sendCommand(OFF)
end
Ich weiß, ist alles in eine Rule reingepackt, ich fand es aber für mich als blutigen Anfänger am übersichtlichsten. :-) Sollte es allerdings von deiner Seite noch einen Verbesserungsvorschlag geben, bin ich dir natürlich mega dankbar.
Ich beobachte das ganze Prozedere jetzt mal morgen früh und bin mega gespannt, ob das so klappt.

Vielen Dank an dieser Stelle Udo, ohne deinen mega Support würde ich wohl noch immer die ganze Anlage jeden Tag von Hand ein und ausschalten. :lol:

Gruß KarlNapf

Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 7. Jun 2020 07:40
von KarlNapf
Guten Morgen Udo,

Um 6:55 hätte die rule ja eigentlich die Temperatur zusammen rechnen müssen, hat aber leider nicht geklappt. Es war folgende Fehlermeldung im Log:

Code: Alles auswählen

2020-06-07 06:55:00.024 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'update Maxtemp': An error occurred during the script execution: Couldn't invoke 'assignValueTo' for feature JvmVoid: (eProxyURI: poolsteuerung2020.rules#|::0.2.6.2.0.0::0::/1)
Gesendet von meinem ANE-LX1 mit Tapatalk


Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 7. Jun 2020 09:20
von udo1toni
Ja, da fehlt das Schlüsselwort var...

Code: Alles auswählen

rule "update Maxtemp"
 when
	Time cron "0 55 6 * * ?"
 then
    var maxTemp = 0 // --- hier fehlte das Schlüsselwort var
    gOWM.members.filter[ i |
        i.name.contains("Temp") && i.name.contains("Fc") && (i.state instanceof Number)
    ].forEach [ j |
        if((j.state as Number).floatValue > maxTemp)
            maxTemp = (j.state as Number).floatValue
        logInfo("maxtemp", "{} ist {}, Maximum ist {}",j.name,j.state,maxTemp)
    ]
    Wetter_Fc_TempMax.postUpdate(maxTemp)
    PumpeEnable.postUpdate(if(maxTemp > 20) ON else OFF)
end
Was das °C angeht: Hast Du Wetter_Fc_TempMax als Number:Temperature angelegt?

Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 7. Jun 2020 09:37
von KarlNapf
Ja, ist unter Items so angelegt.

Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 15. Jun 2020 13:14
von Heavy-Dee
Ich habe die von Udo1Toni gepostete Rule für die Ermittlung der max-temp umgesetzt und soweit funktioniert das auch.

Bei dem Versuch die tägl. Durchschnittstemperatur zu ermitteln, bin ich auf die Group-Funktionen SUM/AVG/MAX ect. gestolpert.

Code: Alles auswählen

    Group:Number:MAX grpTemp_Fc0_max
    Group:Number:MAX grpTemp_Fc1_max
    Group:Number:MAX grpTemp_Fc2_max
Ich lasse mir diese täglich über eine rule in ein item übertragen.
Die bisher gelieferten Werte sind identisch.

Bevor ich nun alles mit diesen Funktionen realisiere, wollte ich fragen ... ob es einen gravierenden Fehler bei dieser Methode gibt.

Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 15. Jun 2020 16:07
von udo1toni
Na ja, das Problem ist halt, dass nur eine Funktion über die Gruppe zur Verfügung steht. Ich meine auch, dass es unter Umständen ein Problem mit NULL Werten gibt, aber nagle mich nicht darauf fest...

Gesendet von meinem SM-G973F mit Tapatalk


Re: Steuerung der Poolheizung um Außentemperatur erweitern

Verfasst: 16. Jun 2020 07:39
von Tokamak
Müsste die Maximal-Temperatur des Daily Forecast

Code: Alles auswählen

channel="openweathermap:weather-and-forecast:api:ct:forecastToday#max-temperature"
nicht bereits den gewünschten Wert ohne Berechnungen liefern?

Wie gut sind die Werte aus eurer Erfahrung eigentlich?