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:
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.