Różnica temperatur:...
 
Powiadomienia
Wyczyść wszystko

Różnica temperatur: teraz i 2 minuty temu - skrypt

7 Wpisów
3 Użytkownicy
0 Reactions
2,070 Wyświetleń
(@_aro_)
Wpisów: 20
Praktykant
Autor tematu
 

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.

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'

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

 

 
Dodane : 17/02/2019 3:23 pm
(@g_adrian)
Wpisów: 34
Praktykant
 

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.

 
Dodane : 19/02/2019 1:17 pm
(@_aro_)
Wpisów: 20
Praktykant
Autor tematu
 

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.

 
Dodane : 19/02/2019 1:48 pm
(@g_adrian)
Wpisów: 34
Praktykant
 

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
 
Dodane : 19/02/2019 1:59 pm
(@g_adrian)
Wpisów: 34
Praktykant
 

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.

 
Dodane : 20/02/2019 11:42 am
(@g_adrian)
Wpisów: 34
Praktykant
 

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
 
Dodane : 20/02/2019 1:06 pm
(@alien)
Wpisów: 98
Pomocny
 
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

 

 

 
Dodane : 18/07/2019 6:33 pm
Udostępnij: