Ok, my air conditioner is working. It works, but it could work more elegantly and could be optimized. I did as I can. Optimization fixes welcome.
modbus.thing
Bridge modbus:tcp:Klima [ host="192.168.2.7", port=503, id=22, receiveTimeoutMillis="150", timeBetweenTransactionsMillis="50" ]
{
Bridge poller inputID22 [start=53, length=4, refresh=500, type="input" ]{
Thing data trybpracy [ readStart="53", readValueType="uint16" ]
Thing data stanpracy [ readStart="54", readValueType="uint16" ]
Thing data tempnast [ readStart="55", readValueType="uint16" ]
Thing data ustawienienawiewu [ readStart="56", readValueType="uint16" ]
}
Bridge poller winputID22 [start=1, length=4, refresh=500, type="holding" ]{
Thing data TrybKlim [writeType="holding", writeStart="1", writeValueType="int16" ]
Thing data OnOffKlim [writeType="holding", writeStart="2", writeValueType="int16" ]
Thing data UstTemp [writeType="holding", writeStart="3", writeValueType="int16" ]
Thing data NawKlim [writeType="holding", writeStart="4", writeValueType="int16" ]
}
}
air_conditioner.items
Number klimaOnOff "Stan pracy [MAP(klimaOnOff.map):%s]" {channel="modbus:data:Klima:inputID22:stanpracy:number"}
Number klimaTryb "Stan pracy [MAP(klimaTrybP.map):%s]" {channel="modbus:data:Klima:inputID22:trybpracy:number"}
Number klimaUstNaw "Ust. nawiewu [MAP(klimaUstNaw.map):%s]" {channel="modbus:data:Klima:inputID22:ustawienienawiewu:number"}
Number klimaTempNast {channel="modbus:data:Klima:inputID22:tempnast:number"}
Number klimaTempNastR "Temp. nastawoina [%.1f °C]"
Number OnOffKlimaW {channel="modbus:data:Klima:winputID22:OnOffKlim:number"}
Switch OnOffKlima "Stan pracy [%s]"
Number TrybKlimaW {channel="modbus:data:Klima:winputID22:TrybKlim:number"}
Number TrybKlima "Tryb pracy"
Number NawiKlimaW {channel="modbus:data:Klima:winputID22:NawKlim:number"}
Number NawiKlima "Ust. nawiewu"
Number TempKlimaW {channel="modbus:data:Klima:winputID22:UstTemp:number"}
Number TempKlimaWTym "Temperatura [%.1f °C]"
air_conditioner.sitemap
sitemap home label="My home"
{
Text label="Klimatyzacja" item=klimaOnOff icon="snow" valuecolor=[ On==2="green", Off==1="red" ] {
Frame label="Statusy" {
Text item=klimaOnOff valuecolor=[ On==2="green", Off==1="red" ]
Text item=klimaTryb valuecolor=[ Chlodzenie==2="blue", Grzanie==4="red" ]
Text item=klimaUstNaw
Text item=HollgTemp
Text item=klimaTempNastR
}
Frame label="Nastawy" {
Switch item=OnOffKlima
Selection item=TrybKlima mappings=[1="Auto", 2="Chłodzenie", 3="Osuszanie", 4="Grzanie", 5="Wentylacja"] valuecolor=[ Chlodzenie==2="blue", Grzanie==4="red" ]
Selection item=NawiKlima mappings=[1="Auto", 2="Cicha praca", 3="Niskie obroty", 4="Średnie obroty", 5="Wysokie obroty", 6="Średnie-niskie", 7="Średnie-wysokie"]
Setpoint item=TempKlimaWTym minValue=16 maxValue=25 step=0.5
}
}
klimaOnOff.map
0=Bez zmian
1=Off
2=On
klimaTrybP.map
0=Bez zmian
1=Auto
2=Chlodzenie
3=Osuszanie
4=Grzanie
5=Wentylacja
klimaUstNaw.map
0=Bez zmian
1=Auto
2=Cicha praca
3=Niskie obroty
4=Średnie obroty
5=Wysokie obroty
6=Średnie-niskie
7=Średnie-wysokie
Rules:
klimaNaw.rules
rule "Przycisk NawiewKlima"
when
Item NawiKlima changed
then
if(NawiKlima.state == 1) {
logInfo("klimaNaw.rules", "KlimaNaw 1")
NawiKlimaW.sendCommand(1)
} else if (NawiKlima.state == 2) {
logInfo("klimaNaw.rules", "KlimaNaw 2")
NawiKlimaW.sendCommand(2)
} else if (NawiKlima.state == 3) {
logInfo("klimaNaw.rules", "KlimaNaw 3")
NawiKlimaW.sendCommand(3)
} else if (NawiKlima.state == 4) {
logInfo("klimaNaw.rules", "KlimaNaw 4")
NawiKlimaW.sendCommand(4)
} else if (NawiKlima.state == 5) {
logInfo("klimaNaw.rules", "KlimaNaw 5")
NawiKlimaW.sendCommand(5)
} else if (NawiKlima.state == 6) {
logInfo("klimaNaw.rules", "KlimaNaw 6")
NawiKlimaW.sendCommand(6)
} else if (NawiKlima.state == 7) {
logInfo("klimaNaw.rules", "KlimaNaw 7")
NawiKlimaW.sendCommand(7)
}
end
rule "klimaUstNaw manual"
when
Item klimaUstNaw changed
then
if(klimaUstNaw.state == 1) {
NawiKlima.postUpdate(1)
} else if (klimaUstNaw.state == 2) {
NawiKlima.postUpdate(2)
} else if (klimaUstNaw.state == 3) {
NawiKlima.postUpdate(3)
} else if (klimaUstNaw.state == 4) {
NawiKlima.postUpdate(4)
} else if (klimaUstNaw.state == 5) {
NawiKlima.postUpdate(5)
} else if (klimaUstNaw.state == 6) {
NawiKlima.postUpdate(6)
} else if (klimaUstNaw.state == 7) {
NawiKlima.postUpdate(7)
}
end
klima.rules
rule "Temperatura Nastawiona"
when
Item klimaTempNast changed
or
Item TempKlimaW changed
or
Item TempKlimaWTym changed
then
var TNTemp = klimaTempNast.state as DecimalType / 4
postUpdate(klimaTempNastR, TNTemp)
end
rule "Klimatyzacja OnOff manual"
when
Item klimaOnOff changed
then
if(klimaOnOff.state == 2) {
logInfo("klima.rules", "Klima manual ON")
OnOffKlima.postUpdate(ON)
} else if (klimaOnOff.state == 1) {
logInfo("klima.rules", "Klima manual OFF")
OnOffKlima.postUpdate(OFF)
}
end
rule "Przycisk OnOff"
when
Item OnOffKlima changed
then
if(OnOffKlima.state == ON) {
logInfo("klima.rules", "KlimaTemp ON")
OnOffKlimaW.sendCommand(2)
} else if (OnOffKlima.state == OFF) {
logInfo("klima.rules", "KlimaTemp OFF")
OnOffKlimaW.sendCommand(1)
}
end
klimaTemp.rules
rule "Przycisk TrybKlima"
when
Item TempKlimaWTym changed
then
var TempKlimaWTym1 = TempKlimaWTym.state as DecimalType * 8 + 1
// var TempKlimaWTymNum = TempKlimaWTym1.state as Number
TempKlimaW.sendCommand(TempKlimaWTym1)
end
klimaTryb.rules
rule "Przycisk TrybKlima"
when
Item TrybKlima changed
then
if(TrybKlima.state == 1) {
logInfo("klimaTryb.rules", "KlimaTemp ON")
TrybKlimaW.sendCommand(1)
} else if (TrybKlima.state == 2) {
logInfo("klimaTryb.rules", "KlimaTemp OFF")
TrybKlimaW.sendCommand(2)
} else if (TrybKlima.state == 3) {
logInfo("klimaTryb.rules", "KlimaTemp OFF")
TrybKlimaW.sendCommand(3)
} else if (TrybKlima.state == 4) {
logInfo("klimaTryb.rules", "KlimaTemp OFF")
TrybKlimaW.sendCommand(4)
} else if (TrybKlima.state == 5) {
logInfo("klimaTryb.rules", "KlimaTemp OFF")
TrybKlimaW.sendCommand(5)
}
end
rule "TrybKlima manual"
when
Item klimaTryb changed
then
if(klimaTryb.state == 1) {
TrybKlima.postUpdate(1)
} else if (klimaTryb.state == 2) {
TrybKlima.postUpdate(2)
} else if (klimaTryb.state == 3) {
TrybKlima.postUpdate(3)
} else if (klimaTryb.state == 4) {
TrybKlima.postUpdate(4)
} else if (klimaTryb.state == 5) {
TrybKlima.postUpdate(5)
}
end