Witam !
Próbuję porównać dwie temperatury w OH 2.3, a właściwie chodzi mi o obliczenie ich różnicy w zadanym czasie.
Chodzi o zmianę temperatury w kominku w ciągu ostatnich dwóch minut - czy jest to tendencja wzrostowa, czy spadkowa i na tej podstawie OH miałby załączać pompę do podłogówki - mam kominek z płaszczem wodnym i wymiennikiem ciepła, dlatego taki układ jest możliwy.
rule "praca pompy do podłogówki"
when
Item Boiler_Room_Temperature_Fireplace changed // received update- lepiej ?
var Delta_Temp_Fireplace = (Boiler_Room_Temperature_Fireplace.state as Number - Boiler_Room_Temperature_Fireplace.historicState(now.minusMinutes(1)).state as Number)
then
if (Delta_Temp_Fireplace as Number > .2) {
Boiler_Room_Floor_Heating_Pump.sendCommand(ON)
}
else {
Boiler_Room_Floor_Heating_Pump.sendCommand(OFF)
}
end
Otrzymuję błędy:
[WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'pompa do podłogówki.rules' has errors, therefore ignoring it: [6,2]: missing 'then' at 'var'
[7,2]: no viable alternative at input 'then'
[8,40]: no viable alternative at input '.'
[8,42]: mismatched input ')' expecting 'end'
Może dlatego, że próbowałem to zrobić koszytając ze zmiennej w skrypcie jako var, ale może trzy zmienne byłoby lepiej ?
var Now_Temp_Fireplace = Boiler_Room_Temperature_Fireplace.state
var Old_Temp_Fireplace = Boiler_Room_Temperature_Fireplace.historicState(now.minusMinutes(1)).state
var Delta_Temp_Fireplace = Now_Temp_Fireplace - Old_Temp_Fireplace
Może jako odrębny .item tylko na taką okoliczność ? Ktoś, coś ...
Cześć może spróbuj w taki sposób.
Item Boiler_Room_Temperature_Fireplace musi być uwzględniony w pliku presistance
.rrd4j
Items {
Boiler_Room_Temperature_Fireplace : strategy = everyChange, everyMinute, restoreOnStartup
}
.items
Number Boiler_Room_Temperature_Fireplace "Temperatura Boiler [%.1f °C]"
String Boiler_ternd
.sitemap
Text item=Boiler_Room_Temperature_Fireplace
Text item=Boiler_ternd label="previous temp [%s]"
.rules
rule "praca pompy do podłogówki"
when
Item Boiler_Room_Temperature_Fireplace received update
then
if (Boiler_Room_Temperature_Fireplace.state > Boiler_Room_Temperature_Fireplace.previousState.state) {
Boiler_ternd.postUpdate("rosnąca")
//tutaj dodaj to co ma zrobić gdy temp wzrasta np. "Boiler_Room_Floor_Heating_Pump.sendCommand(ON)"
}
else if (Boiler_Room_Temperature_Fireplace.state = Boiler_Room_Temperature_Fireplace.previousState.state) {
Boiler_ternd.postUpdate("stała")
//tutaj dodaj to co ma zrobić gdy temp jest stała
}
else if (Boiler_Room_Temperature_Fireplace.state < Boiler_Room_Temperature_Fireplace.previousState.state) {
Boiler_ternd.postUpdate("malejąca")
//tutaj dodaj to co ma zrobić gdy temp spada np. "Boiler_Room_Floor_Heating_Pump.sendCommand(OFF)"
}
end
Poprawiłem błędy (chyba 🙄 ) daj znać czy działa.
Hejka !
To też jakieś rozwiązanie 😀 Myślałem, żeby móc określić tempo przyrostu lub spadku temperatury, ale może rzeczywiście sam fakt wzrostu lub spadku będzie już wystarczającą wskazówką jakie podjąć działania.
Dzięki - przetestuję po powrocie do domu.
Można użyć Time cron "0 0/2 * * * ?" zamiast Item Boiler_Room_Temperature_Fireplace received update. Masz odczyt co dwie minuty.
rule "praca pompy do podłogówki"
when
Time cron "0 0/2 * * * ?"
then
if (Boiler_Room_Temperature_Fireplace.state > Boiler_Room_Temperature_Fireplace.previousState.state) {
Boiler_ternd.postUpdate("rosnąca")
//tutaj dodaj to co ma zrobić gdy temp wzrasta np. "Boiler_Room_Floor_Heating_Pump.sendCommand(ON)"
}
else if (Boiler_Room_Temperature_Fireplace.state = Boiler_Room_Temperature_Fireplace.previousState.state) {
Boiler_ternd.postUpdate("stała")
//tutaj dodaj to co ma zrobić gdy temp jest stała
}
else if (Boiler_Room_Temperature_Fireplace.state < Boiler_Room_Temperature_Fireplace.previousState.state) {
Boiler_ternd.postUpdate("malejąca")
//tutaj dodaj to co ma zrobić gdy temp spada np. "Boiler_Room_Floor_Heating_Pump.sendCommand(OFF)"
}
end
Kolego przepraszam 😣 , sprawdziłem kod na "żywym organizmie" i nie działa jak powinien. Postaram się poszukać rozwiązania tymczasem, może ktoś z bardziej zaawansowanych tubylców pomoże.
Ok, poprzednie kody możemy uznać za niebyłe 😉 . W pliku items oczywiście dla Boiler_Room_Temperature_Fireplace -podajesz swój channel bądź mqtt.
.items
Number Boiler_Room_Temperature_Fireplace "Temperatura Boiler [%.1f °C]" {channel="mqtt:topic:46c38da5:Boiler_Room"}
String Boiler_ternd
Number Boiler_prevtemp
.sitemap
sitemap boiler label="boiler" {
Frame {
Text item=Boiler_Room_Temperature_Fireplace
Text item=Boiler_prevtemp label="previous temp [%s]"
Text item=Boiler_ternd label="trend [%s]"
}
}
.rules
rule "update Boiler_prevtemp"
when
Time cron "0 0/2 * * * ?"
then {
Boiler_prevtemp.postUpdate((Boiler_Room_Temperature_Fireplace.state as DecimalType))
if (Boiler_Room_Temperature_Fireplace.state > Boiler_prevtemp.state) {
Boiler_ternd.postUpdate("rosnąca")
//tutaj dodaj to co ma zrobić gdy temp wzrasta np. "Boiler_Room_Floor_Heating_Pump.sendCommand(ON)"
}
elseif (Boiler_Room_Temperature_Fireplace.state ==Boiler_prevtemp.state) {
Boiler_ternd.postUpdate("stała")
//tutaj dodaj to co ma zrobić gdy temp stała
}
elseif (Boiler_Room_Temperature_Fireplace.state <Boiler_prevtemp.state) {
Boiler_ternd.postUpdate("malejąca")
//tutaj dodaj to co ma zrobić gdy temp spada np. "Boiler_Room_Floor_Heating_Pump.sendCommand(OFF)"
}
}
end
Próbowałem napisać skrypt, ale jeszcze altualny poziom nie pozwala 😀
rule "praca pompy do podłogówki"
when
Item Boiler_Room_Temperature_Fireplace changed // received update- lepiej ?
var Delta_Temp_Fireplace = (Boiler_Room_Temperature_Fireplace.state as Number - Boiler_Room_Temperature_Fireplace.historicState(now.minusMinutes(1)).state as Number)
then
if (Delta_Temp_Fireplace as Number > .2) {
Boiler_Room_Floor_Heating_Pump.sendCommand(ON)
}
else {
Boiler_Room_Floor_Heating_Pump.sendCommand(OFF)
}
end
Otrzymuję błędy:
[WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'pompa do podłogówki.rules' has errors, therefore ignoring it: [6,2]: missing 'then' at 'var'
[7,2]: no viable alternative at input 'then'
[8,40]: no viable alternative at input '.'
[8,42]: mismatched input ')' expecting 'end'
Sorry odgrzeje trochę, zamiast var użyj val używam tego do wietrzenia łazienek gdy wilgotność w ciągu minuty wzrośnie wygląda to tak:
rule "Włączanie wietrzenia gdy wilgotność ^"
when
ItemMQTTThing_Humidity_num changed
then
val y1 =MQTTThing_Humidity_num.historicState(now.minusMinutes(1)).state as Number
val y2 = MQTTThing_Humidity_num.state as Number
val slope = y2 - y1
if(slope > 3) {
logInfo("SENSOR", "łazienka poddasze wilgotność")
vReku.sendCommand(4)
}
end