Regel für temperaturgesteuerte Schaltung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

KarlNapf
Beiträge: 20
Registriert: 29. Feb 2020 10:48
Answers: 0

Regel für temperaturgesteuerte Schaltung

Beitrag von KarlNapf »

Hallo zusammen,

ich habe jetzt eine Regel erstellt, aber es scheint mir irgendwo noch ein Fehler zu sein, da sie nicht funktioniert. Ich hoffe ihr könnt mir helfen.

Code: Alles auswählen

rule "Filteranlage automatisch einschalten"
        when
                Time cron "0 0 8 ? * MON-FRI"   or
                Time cron "0 0 7 ? * SAT-SUN"

        then
                 {
                        Filterpumpe.sendCommand(ON)
                }
end

rule "Heizung einschalten"
		when
				Item Wassertemperatur changed	and
				Filterpumpe.state == (ON)
								
		then		
				if (Wassertemperatur.state < 27) {
				Heizungspumpe.sendCommand (ON)}
				
				if (Wassertemperatur.state > 27) {
                Heizungsspumpe.sendCommand(OFF)
                }

rule "Filteranlage automatisch ausschalten"
        when
                Time cron "0 0 18 ? * MON-FRI"   or
                Time cron "0 0 17 ? * SAT-SUN"

        then
                 {
                        Filterpumpe.sendCommand(OFF)
                }
end

rule "Heizung ausschalten"
        when
                Item Filterpumpe changed to OFF
        then
                Heizungspumpe.sendCommand(OFF)
end
Ich hoffe, ich bin nicht komplett auf dem Holzweg.

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von violine21 »

Du musst in der rule "Heizung einschalten" Filterpumpe.state == (ON) in den then-Zweig verlegen:

Code: Alles auswählen

rule "Heizung einschalten"
		when
			Item Wassertemperatur changed								
		then		
			if(Filterpumpe.state == (ON)) {
			
			//der Rest der Rule
			
			}		
Die rule verarbeitet das UND im when-Zweig nicht.

KarlNapf
Beiträge: 20
Registriert: 29. Feb 2020 10:48
Answers: 0

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von KarlNapf »

violine21 hat geschrieben:Du musst in der rule "Heizung einschalten" Filterpumpe.state == (ON) in den then-Zweig verlegen:

Code: Alles auswählen

rule "Heizung einschalten"
		when
			Item Wassertemperatur changed								
		then		
			if(Filterpumpe.state == (ON)) {
			
			//der Rest der Rule
			
			}		
Die rule verarbeitet das UND im when-Zweig nicht.
Alles klar, danke dir für die Info. Der Rest sollte aber soweit passen, oder? Ich probiere es mal und gebe Rückmeldung.

Gesendet von meinem ANE-LX1 mit Tapatalk


KarlNapf
Beiträge: 20
Registriert: 29. Feb 2020 10:48
Answers: 0

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von KarlNapf »

Hier jetzt nochmal die überarbeitete rule. Sie wird zwar im Log ohne Fehler geladen, aber es passiert nichts. Wo könnte der Fehler liegen, damit ich meine Suche etwas eingrenzen kann. Ich muss dazu sagen, dass ich das zum ersten Mal mache. Kann es an meinen Things oder Items oder den jeweiligen Bezeichnungen liegen? Oder muss ich noch was installieren??

Code: Alles auswählen

rule "Filteranlage automatisch einschalten"
        when
                Time cron "0 0 8 ? * MON-FRI"   or
                Time cron "0 0 7 ? * SAT-SUN"

        then
                 {
                        Filterpumpe.sendCommand(ON)
                }
end

rule "Heizung einschalten"
		when
				Item Wassertemperatur changed
								
		then	
				if(Filterpumpe.state == (ON))	{
				if (Wassertemperatur.state < 27) 
				Heizungspumpe.sendCommand (ON)
				
				if (Wassertemperatur.state > 27)
                Heizungsspumpe.sendCommand(OFF)
                }
end

rule "Filteranlage automatisch ausschalten"
        when
                Time cron "0 0 18 ? * MON-FRI"   or
                Time cron "0 0 17 ? * SAT-SUN"

        then
                 {
                        Filterpumpe.sendCommand(OFF)
                }
end

rule "Heizung ausschalten"
        when
                Item Filterpumpe changed to OFF
        then
                Heizungspumpe.sendCommand(OFF)
end

Danke für eure Hilfe.
Im Anhang noch ein Screenshot meiner CONTROL:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Regel für temperaturgesteuerte Schaltung

Beitrag von KellerK1nd »

Mit den Temperaturwerten ist das so eine Sache, ich glaube du musst den Wert von der Einheit befreien, wenn ich das richtig verstanden habe. Udo kann dir das genau erklären, bzw. hat er das schon oft. Probier mal das:

Code: Alles auswählen

if((Wassertemperatur.state as Number).floatValue() >27){Aktion starten}

if((Wassertemperatur.state as Number).floatValue() <27){Aktion starten}

Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von violine21 »

Schaltet denn die Filterpumpe Ein?
Filterpumpe, Heizungspumpe sind Switch-Items und die Wassertemperatur vom Typ Number?
Dann versuch die Heizungs-Rule mal so:

Code: Alles auswählen

rule "Heizung einschalten"
		when
		    Item Wassertemperatur changed								
		then	
		    if(Filterpumpe.state == ON)	{
				if (27 >= Wassertemperatur.state as Number) 
				    Heizungsspumpe.sendCommand(ON)
				
				if (Wassertemperatur.state as Number > 27)
                    		    Heizungsspumpe.sendCommand(OFF)
                }
end
Hat die Wassertemperatur noch eine Einheit (es sieht zumindest nicht danach aus), dann muss es so heissen:

Code: Alles auswählen

(Wassertemperatur.state as Number).floatValue

KarlNapf
Beiträge: 20
Registriert: 29. Feb 2020 10:48
Answers: 0

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von KarlNapf »

Hab nach der Anpassung jetzt eine Fehlermeldung im Log, aber zumindest tut sich jetzt was:

Code: Alles auswählen

[ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Filteranlage automatisch ausschalten': The name 'Filterpumpe' cannot be resolved to an item or type; line 33, column 25, length 11
Anbei meine Items der beiden Schalter. Muss ich die Items Filterpumpe und Heizungspumpe umbenennen?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von udo1toni »

Ein paar Tippfehler sind da wohl drin...

Code: Alles auswählen

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

rule "Filteranlage automatisch ausschalten"
when
    Time cron "0 0 18 ? * MON-FRI" or
    Time cron "0 0 17 ? * SAT-SUN"
then
    Filterpumpe.sendCommand(OFF)
end

rule "Heizung einschalten"
when
    Item Wassertemperatur changed
then
    if(Filterpumpe.state == ON) {
        var Number nTemp = 28
        if(Wassertemperatur.state instanceof Number)
            nTemp = Wassertemperatur.state as Number
        if(nTemp < 27) 
            Heizungspumpe.sendCommand(ON)
        if(nTemp > 27.1)
            Heizungspumpe.sendCommand(OFF)
    }
end

rule "Heizung ausschalten"
when
    Item Filterpumpe changed to OFF
then
    Heizungspumpe.sendCommand(OFF)
end
Nach Deinem Screenshot handelt es sich bei Wassertemperatur um ein ganz normales Number Item ohne Einheiten. Also sollte das schon direkt funktionieren, allerdings solltest Du sicherstellen, dass der Fühler überhaupt eine Zahl zurückliefert. Falls das nicht der Fall ist, wird eine Temperatur über der Abschaltgrenze angenommen, sollte hier ein anderes Verhalten erwünscht sein, müsste der Wert bei der Definition der Variablen nTemp angepasst werden.
Weiterhin solltest Du eine (wenn auch minimale) Hysterese einbauen, also nicht auf kleiner 27 und größer 27 testen, denn auch 26.999 ist kleienr als 27 und 27.001 ist größer als 27. Du möchtest sicher verhindern, dass Deine Pumpe ständig an- und ausschaltet.

Ansonsten sollte man Rules vernünftig formatieren. Im Forum sollte man keine Tabs verwenden, sondern ausschließlich mit Leerzeichen arbeiten. Falls Du VSCode einsetzt, kannst Du den Editor so einstellen, dass er automatisch beim Drücken der Tab-Taste bis zum nächsten Tabulator mit Leerzeichen auffüllt, ansonsten solltest Du vor dem Posten des Codes die Tabs durch entsprechende Leerzeichen ersetzen lassen. Der Code wirkt dann gleich viel aufgeräumter ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von violine21 »

KarlNapf hat geschrieben: 6. Mär 2020 22:54 Anbei meine Items der beiden Schalter. Muss ich die Items Filterpumpe und Heizungspumpe umbenennen?
Was sind das denn für Aktoren?
Zumindest die Bezeichnungen xxx_Switch würde ich ändern. Lass das _Switch weg, das ist doppelt gemoppelt, die Item-Type-Bezeichnung enthält
bereits die Definition.
Dann klappts auch mit den Rules.

KarlNapf
Beiträge: 20
Registriert: 29. Feb 2020 10:48
Answers: 0

Re: Regel für temperaturgesteuerte Schaltung

Beitrag von KarlNapf »

udo1toni hat geschrieben: 7. Mär 2020 01:26 Ein paar Tippfehler sind da wohl drin...

Code: Alles auswählen

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

rule "Filteranlage automatisch ausschalten"
when
    Time cron "0 0 18 ? * MON-FRI" or
    Time cron "0 0 17 ? * SAT-SUN"
then
    Filterpumpe.sendCommand(OFF)
end

rule "Heizung einschalten"
when
    Item Wassertemperatur changed
then
    if(Filterpumpe.state == ON) {
        var Number nTemp = 28
        if(Wassertemperatur.state instanceof Number)
            nTemp = Wassertemperatur.state as Number
        if(nTemp < 27) 
            Heizungspumpe.sendCommand(ON)
        if(nTemp > 27.1)
            Heizungspumpe.sendCommand(OFF)
    }
end

rule "Heizung ausschalten"
when
    Item Filterpumpe changed to OFF
then
    Heizungspumpe.sendCommand(OFF)
end
Nach Deinem Screenshot handelt es sich bei Wassertemperatur um ein ganz normales Number Item ohne Einheiten. Also sollte das schon direkt funktionieren, allerdings solltest Du sicherstellen, dass der Fühler überhaupt eine Zahl zurückliefert. Falls das nicht der Fall ist, wird eine Temperatur über der Abschaltgrenze angenommen, sollte hier ein anderes Verhalten erwünscht sein, müsste der Wert bei der Definition der Variablen nTemp angepasst werden.
Weiterhin solltest Du eine (wenn auch minimale) Hysterese einbauen, also nicht auf kleiner 27 und größer 27 testen, denn auch 26.999 ist kleienr als 27 und 27.001 ist größer als 27. Du möchtest sicher verhindern, dass Deine Pumpe ständig an- und ausschaltet.

Ansonsten sollte man Rules vernünftig formatieren. Im Forum sollte man keine Tabs verwenden, sondern ausschließlich mit Leerzeichen arbeiten. Falls Du VSCode einsetzt, kannst Du den Editor so einstellen, dass er automatisch beim Drücken der Tab-Taste bis zum nächsten Tabulator mit Leerzeichen auffüllt, ansonsten solltest Du vor dem Posten des Codes die Tabs durch entsprechende Leerzeichen ersetzen lassen. Der Code wirkt dann gleich viel aufgeräumter ;)
Hallo Udo, vielen Dank für die Hilfe. Filterpumpe hat heute morgen ordentlich gestartet. Allerdings stimmt bei der Temperatursteuerung noch irgendwas nicht.

Code: Alles auswählen

2020-03-07 07:38:14.660 [vent.ItemStateChangedEvent] - Wassertemperatur changed from 22.0 °C to 22.5 °C

2020-03-07 07:38:14.676 [ome.event.ItemCommandEvent] - Item 'Heizungspumpe_Switch' received command ON

2020-03-07 07:38:14.701 [nt.ItemStatePredictedEvent] - Heizungspumpe_Switch predicted to become ON

2020-03-07 07:38:24.680 [vent.ItemStateChangedEvent] - Wassertemperatur changed from 22.5 °C to 26.0 °C

2020-03-07 07:38:24.697 [ome.event.ItemCommandEvent] - Item 'Heizungspumpe_Switch' received command ON

2020-03-07 07:38:24.724 [nt.ItemStatePredictedEvent] - Heizungspumpe_Switch predicted to become ON

2020-03-07 07:38:34.699 [vent.ItemStateChangedEvent] - Wassertemperatur changed from 26.0 °C to 29.0 °C

2020-03-07 07:38:34.716 [ome.event.ItemCommandEvent] - Item 'Heizungspumpe_Switch' received command ON

2020-03-07 07:38:34.751 [nt.ItemStatePredictedEvent] - Heizungspumpe_Switch predicted to become ON

2020-03-07 07:38:44.721 [vent.ItemStateChangedEvent] - Wassertemperatur changed from 29.0 °C to 30.5 °C

2020-03-07 07:38:44.739 [ome.event.ItemCommandEvent] - Item 'Heizungspumpe_Switch' received command ON

2020-03-07 07:38:44.760 [nt.ItemStatePredictedEvent] - Heizungspumpe_Switch predicted to become ON

2020-03-07 07:38:54.737 [vent.ItemStateChangedEvent] - Wassertemperatur changed from 30.5 °C to 31.5 °C

2020-03-07 07:38:54.753 [ome.event.ItemCommandEvent] - Item 'Heizungspumpe_Switch' received command ON

2020-03-07 07:38:54.779 [nt.ItemStatePredictedEvent] - Heizungspumpe_Switch predicted to become ON

2020-03-07 07:39:04.750 [vent.ItemStateChangedEvent] - Wassertemperatur changed from 31.5 °C to 25.5 °C

2020-03-07 07:39:04.769 [ome.event.ItemCommandEvent] - Item 'Heizungspumpe_Switch' received command ON

2020-03-07 07:39:04.795 [nt.ItemStatePredictedEvent] - Heizungspumpe_Switch predicted to become ON
Irgendwie übergeht er die Grenze von 27 Grad. und sendet ein dauerhaftes ON.

Antworten