Seite 1 von 2

Regel für temperaturgesteuerte Schaltung

Verfasst: 6. Mär 2020 17:05
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.

Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 6. Mär 2020 17:40
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.

Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 6. Mär 2020 17:54
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


Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 6. Mär 2020 18:31
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:

Regel für temperaturgesteuerte Schaltung

Verfasst: 6. Mär 2020 18:53
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}


Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 6. Mär 2020 18:57
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

Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 6. Mär 2020 22:54
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?

Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 7. Mär 2020 01:26
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 ;)

Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 7. Mär 2020 05:59
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.

Re: Regel für temperaturgesteuerte Schaltung

Verfasst: 7. Mär 2020 08:43
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.