diff --git a/README.md b/README.md index 85b9bf3341be10e6acd7daafaac00db47cb37b67..2a595f6437caff38172f089d3559462b706bea80 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ -# Documentation -See our [wiki](https://github.com/HestiaPi/hestia-touch-openhab/wiki). +# HestiaPi Touch + + + +[](https://github.com/HestiaPi/hestia-touch-openhab/blob/master/LICENSE) +[](https://community.hestiapi.com/) + +HestiaPi Touch is a completely open source smart thermostat for your home. With it, you can monitor your home’s temperature, relative humidity, and atmospheric pressure. You can also control your heating, ventilation, air conditioning, hot water, and more from anywhere you have an Internet connection. + +You can do all this securely and with confidence your private data stays private. + +HestiaPi Touch is compatible with many devices and home automation systems and can serve as a central point of control that ties them all together in your home. + +# Useful links + +* [Main website](https://hestiapi.com/) +* [Documentation & Getting Started Guides](https://github.com/HestiaPi/hestia-touch-openhab/wiki) +* [Community forum](https://community.hestiapi.com/) +* [Code (this repo)](https://github.com/HestiaPi/hestia-touch-openhab) +* [Electronics](https://github.com/HestiaPi/hestia-touch-pcb-dev) +* [3D Case](https://github.com/HestiaPi/hestia-touch-case) + +# Support us + +HestiaPi is and will always be open source and open hardware. + +Please consider supporting us through our [crowdfunding campaign](https://www.crowdsupply.com/makeopenstuff/hestiapi-touch). diff --git a/etc/openhab2/icons/classic/readme.txt b/etc/openhab2/icons/classic/readme.txt index c6b36b1bfc09efe9b59024354df406bf956c80c4..7fc793f568550fc48f98e4c7f161b92c349ce0ce 100644 --- a/etc/openhab2/icons/classic/readme.txt +++ b/etc/openhab2/icons/classic/readme.txt @@ -3,4 +3,4 @@ Icons can be provided as png (32x32) or preferably as svg files. ClassicUI and BasicUI can be configured to accept svg (default) or png icons. Check out the openHAB documentation for more details: -http://docs.openhab.org/configuration/icons.html +https://www.openhab.org/docs/configuration/items.html#icons diff --git a/etc/openhab2/items/default.items b/etc/openhab2/items/default.items old mode 100644 new mode 100755 index 21cddceba5015b6ddd1a342fdff5b15cb53651d9..4cac954165ca8597da7d469a94888fa7fd2d74cb --- a/etc/openhab2/items/default.items +++ b/etc/openhab2/items/default.items @@ -2,66 +2,122 @@ Group charts Group chart_temp Group chart_humi Group chart_press +Group settings -Switch HotWaterPin12 "Hot Water" { gpio="pin:12", mqtt=">[mosquitto:hestia/local/cmnd/hotwaterstate/POWER:command:*:default],<[mosquitto:hestia/local/hotwaterstate:state:MAP(binary.map)]" } -Switch HeatingPin23 "Heating" { gpio="pin:23", mqtt=">[mosquitto:hestia/local/heatingstate:command:ON:1],>[mosquitto:hestia/local/heatingstate:command:OFF:0],<[mosquitto:hestia/local/heatingstate:state:MAP(binary.map)]" } -Switch HumidityPin18 "Humidity" { gpio="pin:18", mqtt=">[mosquitto:hestia/local/cmnd/humiditystate/POWER:command:*:default]" } +/** +//US +Switch HeatingPin23 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin23:switch" } +Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } +Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } +Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } +/**/ +Switch HeatingPin "Heating" +Switch Heating2Pin "Heating2" +Switch CoolingPin "Cooling" +Switch FanPin "Fan" +Switch HotWaterPin "Hot Water" +Switch HumidityPin "Humidity" -String MyTemp "Temperature" <temperature> { channel="exec:command:gettemp:output" } -Number MyTempProxy "Temperature [%.1f °C]" <temperature> { mqtt=">[mosquitto:hestia/local/temperature:state:*:default]" } +Switch Pin12 { gpio="pin:12" } +Switch Pin16 { gpio="pin:16" } +Switch Pin18 { gpio="pin:18" } +Switch Pin23 { gpio="pin:23" } + +Switch HeatingPinTopic { channel="mqtt:topic:HeatingPin:switch" } +Switch Heating2PinTopic { channel="mqtt:topic:Heating2Pin:switch" } +Switch CoolingPinTopic { channel="mqtt:topic:CoolingPin:switch" } +Switch FanPinTopic { channel="mqtt:topic:FanPin:switch" } +Switch HotWaterPinTopic { channel="mqtt:topic:HotWaterPin:switch" } +Switch HumidityPinTopic { channel="mqtt:topic:HumidityPin:switch" } + +String MyTemp "Temperature" <temperature> { channel="exec:command:gettemp:output"} +Number MyTempProxy "Proxy Temperature [%.1f °-]" <temperature> //{ channel="mqtt:topic:MyTempProxy:temperature" } +Number MyTempProxyC "Temperature [%.1f °C]" <temperature> //{ channel="mqtt:topic:MyTempProxy:temperature" } +Number MyTempProxyF "Temperature [%.0f °F]" <temperature> //{ channel="mqtt:topic:MyTempProxy:temperature" } String MyHumi "Humidity" <humidity> { channel="exec:command:gethumi:output" } -Number MyHumiProxy "Humidity [%.0f %%]" <humidity> { mqtt=">[mosquitto:hestia/local/humidity:state:*:default]" } +Number MyHumiProxy "Humidity [%.0f %%]" <humidity> //{ channel="mqtt:topic:MyHumiProxy:humidity" } String MyPressure "Pressure" <pressure> { channel="exec:command:getpress:output" } -Number MyPressureProxy "Pressure [%.2f hPa]" { mqtt=">[mosquitto:hestia/local/pressure:state:*:default]" } +Number MyPressureProxy "Pressure [%.2f hPa]" <pressure> //{ channel="mqtt:topic:MyPressureProxy:pressure" } -Number TempSetpoint "Temperature Setpoint[%.1f °C]" { mqtt=">[mosquitto:hestia/local/tempsetpoint:state:*:default],<[mosquitto:hestia/local/settempsetpoint:state:default]"} +Number TempSetpoint "Proxy Temperature Setpoint[%.1f °-]" //{ channel="mqtt:topic:TempSetpoint:temperature" } +Number TempSetpointC "Temperature Setpoint[%.1f °C]" //{ channel="mqtt:topic:TempSetpoint:temperature" } +Number TempSetpointF "Temperature Setpoint[%.0f °F]" //{ channel="mqtt:topic:TempSetpoint:temperature" } Number TempSetpointChart "Heating Setpoint" (charts, chart_temp) -Switch IncTargetTemp "IncTargetTemp" -Switch DecTargetTemp "DecTargetTemp" +//Switch IncTargetTemp "IncTargetTemp" //todo: was for HABpanel - should be deleted +//Switch DecTargetTemp "DecTargetTemp" //todo: was for HABpanel - should be deleted Number TargetTemp Number PreviousTempReading "Temperature" <temperature> (charts, chart_temp) -Number HumiSetpoint "Humidity Setpoint[%.0f %%]" { mqtt=">[mosquitto:hestia/local/humisetpoint:state:*:default]" } +Number HumiSetpoint "Humidity Setpoint[%.0f %%]"// { channel="mqtt:topic:HumiSetpoint:humidity" } Number HumiSetpointChart "Humidity Setpoint" (charts, chart_humi) -Switch IncTargetHumi "IncTargetHumi" -Switch DecTargetHumi "DecTargetHumi" +//Switch IncTargetHumi "IncTargetHumi" //todo: was for HABpanel - should be deleted +//Switch DecTargetHumi "DecTargetHumi" //todo: was for HABpanel - should be deleted Number TargetHumi Number PreviousHumiReading "Humidity" <humidity> (charts, chart_humi) Number PreviousPressureReading "Pressure" <pressure> (chart_press) Number HeatingBoostTime "Heating Boost Time [%.0f min]" -Switch HeatingBoostTimeDec "HeatingBoostTimeDec" -Switch HeatingBoostTimeInc "HeatingBoostTimeInc" +//Switch HeatingBoostTimeDec "HeatingBoostTimeDec" //todo: was for HABpanel - should be deleted +//Switch HeatingBoostTimeInc "HeatingBoostTimeInc" //todo: was for HABpanel - should be deleted Number HotWaterBoostTime "Hot Water Boost Time [%.0f min]" -Switch HotWaterBoostTimeDec "HotWaterBoostTimeDec" -Switch HotWaterBoostTimeInc "HotWaterBoostTimeInc" +//Switch HotWaterBoostTimeDec "HotWaterBoostTimeDec" //todo: was for HABpanel - should be deleted +//Switch HotWaterBoostTimeInc "HotWaterBoostTimeInc" //todo: was for HABpanel - should be deleted Number HumiBoostTime "Humidity Boost Time [%.0f min]" -Switch HumiBoostTimeDec "HumiBoostTimeDec" -Switch HumiBoostTimeInc "HumiBoostTimeInc" - +//Switch HumiBoostTimeDec "HumiBoostTimeDec" //todo: was for HABpanel - should be deleted +//Switch HumiBoostTimeInc "HumiBoostTimeInc" //todo: was for HABpanel - should be deleted +Number CoolingBoostTime "Cooling Boost Time [%.0f min]" +//Switch CoolingBoostTimeDec "CoolingBoostTimeDec" //todo: was for HABpanel - should be deleted +//Switch CoolingBoostTimeInc "CoolingBoostTimeInc" //todo: was for HABpanel - should be deleted String HeatingMode "Heating Mode" String HotWaterMode "Hot Water Mode" String HumiMode "Humidity Mode" +String CoolingMode "Cooling Mode" +String FanMode "Fan Mode []" <fan> { channel="mqtt:topic:FanMode:string" } Switch MainSwitch "MainSwitch" -String HumiTopic "Humidity Topic" { mqtt="<[mosquitto:hestia/local/stat/humiditystate/POWER:state:default]" } - -// To choose a proper chart period in a sitemap -// mappings=[0="Day", 1="Week", 2="Month", 3="Year"] +String HumiTopic "Humidity Topic" { channel="mqtt:topic:HumiTopic:string" } Number chart_period "Period" -//Switch Raspi16 "Xmas Tree" { gpio="pin:16", mqtt=">[mosquitto:hestia/local/xmasstate/cmnd/POWER:command:*:default],<[mosquitto:hestia/local/xmasstate/POWER:state:default]" } - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // SETTINGS START /////////////////////////////////////////////////////////////////////////////////////////////// -String Network_WAN_IP "WAN IP address [%s]" <network> (Network) { http="<[http://icanhazip.com:600000:REGEX((.*?))]" } -String Network_WLAN_IP { channel="exec:command:getwlanip:output" } -String Network_WLAN_MAC { channel="exec:command:getwlanmac:output" } -String Network_SSID { channel="exec:command:getssid:output" } -String Network_WLAN_INFO { channel="exec:command:getwifiinfo:output" } -String System_CPU_TEMP { channel="exec:command:getcputemperature:output" } -String System_Used_Space { channel="exec:command:getuseddiskspace:output" } -String System_TZ { channel="exec:command:gettz:output" } +String SettingsPage <settings> +String InfoPage <pie> +String Network_WAN_IP "Public IP [%s]" <zoom> (Network) { http="<[http://icanhazip.com:600000:REGEX((.*?))]" } +String Network_WLAN_IP "Local IP [%s]" <house> (Network) { channel="exec:command:getwlanip:output" } +String Network_WLAN_MAC "WiFi MAC Address [%s]" <network> (Network) { channel="exec:command:getwlanmac:output" } +String Network_SSID "WiFi SSID [%s]" <network> (Network) { channel="exec:command:getssid:output" } +String Network_WLAN_INFO "WiFi Signal [%s dBm]" <line> (Network) { channel="exec:command:getwifiinfo:output" } +String System_CPU_TEMP "CPU Temp [%s °C]" <temperature> { channel="exec:command:getcputemperature:output" } +String System_CPU_LOAD "CPU Load [%s %%]" <line> { channel="exec:command:getcpuload:output" } +String System_CPU_UPTIME "Uptime [%s]" <status> { channel="exec:command:getuptime:output" } +String System_Used_Space "Used Disk [%s]" <pie> { channel="exec:command:getuseddiskspace:output" } + +String System_TZ "Timezone [%s]" <time> { channel="exec:command:gettz:output" } +String System_TZ_Set "Timezone [%s]" <time> + +String TempUnit "Temperature Unit []" <temperature> { channel="exec:command:gettempunit:output" } + +String RebootButton "Reboot" <switch> +String ShutdownButton "Shutdown" <switch> +Switch RebootCommand "Reboot" { channel="exec:command:rebootcommand:run" } +Switch ShutdownCommand "Shutdown" { channel="exec:command:shutdowncommand:run" } + +String BackupButton "Backup [%s]" <switch> +Switch BackupCommand "Backup" { channel="exec:command:backupcommand:run" } +Switch BackupTimestampCommand { channel="exec:command:getbackuptimestampcommand:output" } + +String RestoreButton "Restore [%s]" <switch> +Switch RestoreCommand "Restore" { channel="exec:command:restorecommand:run" } + +Number Heating2Time "Delay [%.0f min]" <clock> +Number Heating2Delta "Threshold [%.1f °C]" <temperature> +Number Heating2InitialTemp "Heating2InitialTemp [%.1f ]" + +String SystemType "System Type []" <pump> { channel="exec:command:getsystemtype:output" } +String HumidityMode "Humidity Mode []" <water> { channel="exec:command:gethumiditymode:output" } +String Season "Season []" <calendar> { channel="exec:command:getseason:output" } +String US_Summer + // SETTINGS END ///////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/etc/openhab2/items/readme.txt b/etc/openhab2/items/readme.txt index a295bb477225c7f47f5631f65b7a8c0370219ab0..b2145103e87378ed615814e2307c265c89ff52d1 100644 --- a/etc/openhab2/items/readme.txt +++ b/etc/openhab2/items/readme.txt @@ -2,4 +2,4 @@ Your item definitions go here. All items files have to have the ".items" file extension and must follow a special syntax. Check out the openHAB documentation for more details: -http://docs.openhab.org/configuration/items.html +https://www.openhab.org/docs/configuration/items.html diff --git a/etc/openhab2/persistence/readme.txt b/etc/openhab2/persistence/readme.txt index 58933aa38ae831178472b656a553f505a6b76578..b1df35bf30fd30c2a492dfbf9a2697995532ad7d 100644 --- a/etc/openhab2/persistence/readme.txt +++ b/etc/openhab2/persistence/readme.txt @@ -2,4 +2,4 @@ Your persistence configuration goes here. All persistence files have to have the ".persist" file extension and must follow a special syntax. Check out the openHAB documentation for more details: -http://docs.openhab.org/features/persistence.html +https://www.openhab.org/docs/configuration/persistence.html diff --git a/etc/openhab2/rules/default.rules b/etc/openhab2/rules/default.rules index 2877ab8a30aeceafed909545d701213a64d6b99d..a2359c5662172d4c5a0d78972adfab87275bdd0a 100755 --- a/etc/openhab2/rules/default.rules +++ b/etc/openhab2/rules/default.rules @@ -1,10 +1,17 @@ -import org.openhab.model.script.actions.Timer +import org.openhab.model.script.actions.Timer; var Timer HeatingBoostTimer = null var Timer HeatingBoostRemTime = null var Number HeatingBoostTimeInitial = 10 var Number HeatingBoostTimeInitialUI = 10 var String HeatingPreviousMode = "OFF" +var Timer Heating2Timer = null + +var Timer CoolingBoostTimer = null +var Timer CoolingBoostRemTime = null +var Number CoolingBoostTimeInitial = 10 +var Number CoolingBoostTimeInitialUI = 10 +var String CoolingPreviousMode = "OFF" var Timer HotWaterBoostTimer = null var Timer HotWaterBoostRemTime = null @@ -23,51 +30,530 @@ rule "Initialisation" when System started then - MainSwitch.sendCommand("OFF") - HeatingMode.sendCommand("OFF") - HotWaterMode.sendCommand("OFF") - HumiMode.sendCommand("OFF") - HumiTopic.sendCommand("OFF") - /**CELSIUS*/ if(TempSetpoint.state == NULL) postUpdate(TempSetpoint, 18) - /**CELSIUS*/ if(TempSetpoint.state > 40) postUpdate(TempSetpoint, 18) - //FAHRENHEIT if(TempSetpoint.state == NULL) postUpdate(TempSetpoint, 70) - //FAHRENHEIT if(TempSetpoint.state < 32) postUpdate(TempSetpoint, 70) - if(HumiSetpoint.state == NULL) postUpdate(HumiSetpoint, 50) - if(HeatingBoostTime.state == NULL) postUpdate(HeatingBoostTime, 10) - if(HotWaterBoostTime.state == NULL) postUpdate(HotWaterBoostTime, 10) - if(HumiBoostTime.state == NULL) postUpdate(HumiBoostTime, 10) + MainSwitch.sendCommand("OFF"); + HeatingMode.sendCommand("OFF"); + CoolingMode.sendCommand("OFF"); + FanMode.sendCommand("OFF"); + HotWaterMode.sendCommand("OFF"); + HumiMode.sendCommand("OFF"); + HumiTopic.sendCommand("0"); + if (TempUnit.state == "C") { + if((TempSetpoint.state == NULL) || (TempSetpoint.state == UNDEF)) postUpdate(TempSetpoint, 18); + if((TempSetpointC.state == NULL) || (TempSetpointC.state == UNDEF)) postUpdate(TempSetpointC, 18); + if(TempSetpoint.state > 40) postUpdate(TempSetpoint, 18); + if(TempSetpointC.state > 40) postUpdate(TempSetpointC, 18); + } else { + if((TempSetpoint.state == NULL) || (TempSetpoint.state == UNDEF)) postUpdate(TempSetpoint, 70); + if((TempSetpointF.state == NULL) || (TempSetpointF.state == UNDEF)) postUpdate(TempSetpointF, 70); + if(TempSetpoint.state < 32) postUpdate(TempSetpoint, 70); + if(TempSetpointF.state < 32) postUpdate(TempSetpointF, 70); + } + if((HeatingBoostTime.state == NULL) || (HeatingBoostTime.state == UNDEF)) HeatingBoostTime.sendCommand(10); + if((CoolingBoostTime.state == NULL) || (CoolingBoostTime.state == UNDEF)) CoolingBoostTime.sendCommand(10); + if((HumiSetpoint.state == NULL) || (HumiSetpoint.state == UNDEF)) HumiSetpoint.sendCommand(50); + if((HotWaterBoostTime.state == NULL) || (HotWaterBoostTime.state == UNDEF)) HotWaterBoostTime.sendCommand(10); + if((HumiBoostTime.state == NULL) || (HumiBoostTime.state == UNDEF)) HumiBoostTime.sendCommand(10); TempSetpointChart.sendCommand(0); HumiSetpointChart.sendCommand(0); - PreviousTempReading.sendCommand(0); - PreviousHumiReading.sendCommand(0); + postUpdate(PreviousTempReading, 0); + postUpdate(PreviousHumiReading, 0); + Heating2Time.sendCommand(0); + Heating2Delta.sendCommand(0); chart_period.sendCommand(0); + TempUnit.postUpdate(executeCommandLine("/home/pi/scripts/gettempunit.sh",60000)); + US_Summer.sendCommand("OFF"); + SystemType.postUpdate(executeCommandLine("/home/pi/scripts/getsystemtype.sh",60000)); + HumidityMode.postUpdate(executeCommandLine("/home/pi/scripts/gethumiditymode.sh",60000)); + Season.postUpdate(executeCommandLine("/home/pi/scripts/getseason.sh",60000)); +end + +rule "TempSetpoint Proxy Set" +when + Item TempSetpointF changed or + Item TempSetpointC changed +then + if (TempUnit.state == "C") { + postUpdate(TempSetpoint, (TempSetpointC.state as DecimalType)) + } else { + postUpdate(TempSetpoint, (TempSetpointF.state as DecimalType)) + } +end + +rule "TempSetpoint Proxy Get" +when + Item TempSetpoint changed +then + if (TempUnit.state == "C") { + postUpdate(TempSetpointC, (TempSetpoint.state as DecimalType)) + } else { + postUpdate(TempSetpointF, (TempSetpoint.state as DecimalType)) + } +end + +rule "MyTempProxy Proxy Set" +when + Item MyTempProxyF changed or + Item MyTempProxyC changed +then + if (TempUnit.state == "C") { + MyTempProxy.sendCommand(MyTempProxyC.state as DecimalType) + } else { + MyTempProxy.sendCommand(MyTempProxyF.state as DecimalType) + } +end + +rule "MyTempProxy Proxy Get" +when + Item MyTempProxy changed +then + if (TempUnit.state == "C") { + MyTempProxyC.sendCommand(MyTempProxy.state as DecimalType) + } else { + MyTempProxyF.sendCommand(MyTempProxy.state as DecimalType) + } +end + +rule "HeatingPin changed" +when + Item HeatingPin changed +then + switch(HeatingPin.state) { + case ON: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin12.sendCommand(ON) + HeatingPinTopic.sendCommand(ON) + logInfo("Default","HeatingPin set to ON.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin23.sendCommand(ON) + HeatingPinTopic.sendCommand(ON) + logInfo("Default","HeatingPin set to ON.") + } + } + case OFF: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin12.sendCommand(OFF) + HeatingPinTopic.sendCommand(OFF) + logInfo("Default","HeatingPin set to OFF.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin23.sendCommand(OFF) + HeatingPinTopic.sendCommand(OFF) + logInfo("Default","HeatingPin set to OFF.") + } + } + } +end + +rule "Heating2Pin changed" +when + Item Heating2Pin changed +then + switch(Heating2Pin.state) { + case ON: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin16.sendCommand(ON) + Heating2PinTopic.sendCommand(ON) + logInfo("Default","Heating2Pin set to ON.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin16.sendCommand(ON) + Heating2PinTopic.sendCommand(ON) + logInfo("Default","Heating2Pin set to ON.") + } + } + case OFF: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin16.sendCommand(OFF) + Heating2PinTopic.sendCommand(OFF) + logInfo("Default","Heating2Pin set to OFF.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin16.sendCommand(OFF) + Heating2PinTopic.sendCommand(OFF) + logInfo("Default","Heating2Pin set to OFF.") + } + } + } +end + +rule "CoolingPin changed" +when + Item CoolingPin changed +then + switch(CoolingPin.state) { + case ON: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin23.sendCommand(ON) + CoolingPinTopic.sendCommand(ON) + logInfo("Default","CoolingPin set to ON.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(ON) + CoolingPinTopic.sendCommand(ON) + logInfo("Default","CoolingPin set to ON.") + } + } + case OFF: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin23.sendCommand(OFF) + CoolingPinTopic.sendCommand(OFF) + logInfo("Default","CoolingPin set to OFF.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(OFF) + CoolingPinTopic.sendCommand(OFF) + logInfo("Default","CoolingPin set to OFF.") + } + } + } +end + +rule "FanPin changed" +when + Item FanPin changed +then + switch(FanPin.state) { + case ON: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin18.sendCommand(ON) + FanPinTopic.sendCommand(ON) + logInfo("Default","FanPin set to ON.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(ON) + FanPinTopic.sendCommand(ON) + logInfo("Default","FanPin set to ON.") + } + } + case OFF: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + Pin18.sendCommand(OFF) + FanPinTopic.sendCommand(OFF) + logInfo("Default","FanPin set to OFF.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(OFF) + FanPinTopic.sendCommand(OFF) + logInfo("Default","FanPin set to OFF.") + } + } + } +end + +rule "HotWaterPin changed" +when + Item HotWaterPin changed +then + switch(HotWaterPin.state) { + case ON: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(ON) + HotWaterPinTopic.sendCommand(ON) + logInfo("Default","HotWaterPin set to ON.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin12.sendCommand(ON) + HotWaterPinTopic.sendCommand(ON) + logInfo("Default","HotWaterPin set to ON.") + } + } + case OFF: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(OFF) + HotWaterPinTopic.sendCommand(OFF) + logInfo("Default","HotWaterPin set to OFF.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin12.sendCommand(OFF) + HotWaterPinTopic.sendCommand(OFF) + logInfo("Default","HotWaterPin set to OFF.") + } + } + } end +rule "HumidityPin changed" +when + Item HumidityPin changed +then + switch(HumidityPin.state) { + case ON: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(ON) + HumidityPinTopic.sendCommand(ON) + logInfo("Default","HumidityPin set to ON.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin18.sendCommand(ON) + HumidityPinTopic.sendCommand(ON) + logInfo("Default","HumidityPin set to ON.") + } + } + case OFF: { + if (SystemType.state == "US") { + /** + //US + Switch HeatingPin12 "Heating" { gpio="pin:12", channel="mqtt:topic:HeatingPin12:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch CoolingPin23 "Cooling" { gpio="pin:23", channel="mqtt:topic:CoolingPin23:switch" } + Switch FanPin18 "Fan" { gpio="pin:18", channel="mqtt:topic:FanPin18:switch" } + /**/ + + // Invalid scenario for this SystemType + //Pinxx.sendCommand(OFF) + HumidityPinTopic.sendCommand(OFF) + logInfo("Default","HumidityPin set to OFF.") + } else { + /** + //EU + Switch HeatingPin23 "Heating" { gpio="pin:23", channel="mqtt:topic:HeatingPin23:switch" } + Switch Heating2Pin16 "Heating2" { gpio="pin:16", channel="mqtt:topic:Heating2Pin16:switch" } + Switch HotWaterPin12 "Hot Water" { gpio="pin:12", channel="mqtt:topic:HotWaterPin12:switch" } + Switch HumidityPin18 "Humidity" { gpio="pin:18", channel="mqtt:topic:HumidityPin18:switch" } + /**/ + + Pin18.sendCommand(OFF) + HumidityPinTopic.sendCommand(OFF) + logInfo("Default","HumidityPin set to OFF.") + } + } + } +end + + rule "convertproxy" when Item MyTemp changed or Item MyHumi changed or Item MyPressure changed then - MyTempProxy.postUpdate(Double::parseDouble(MyTemp.state.toString)) - MyHumiProxy.postUpdate(Double::parseDouble(MyHumi.state.toString)) - MyPressureProxy.postUpdate(Double::parseDouble(MyPressure.state.toString)) - /**CELSIUS*/ if ((Double::parseDouble(MyTemp.state.toString) < (Double::parseDouble(PreviousTempReading.state.toString)) - 0.2) || (Double::parseDouble(MyTemp.state.toString) > (Double::parseDouble(PreviousTempReading.state.toString)) + 0.2)) { + //Additional initialisation checks + if(PreviousTempReading.state == NULL) postUpdate(PreviousTempReading, 0) + if(PreviousHumiReading.state == NULL) postUpdate(PreviousHumiReading, 0) + if(TempUnit.state == NULL) TempUnit.postUpdate(executeCommandLine("/home/pi/scripts/gettempunit.sh",60000)) + if(SystemType.state == NULL) SystemType.postUpdate(executeCommandLine("/home/pi/scripts/getsystemtype.sh",60000)) + if(HumidityMode.state == NULL) HumidityMode.postUpdate(executeCommandLine("/home/pi/scripts/gethumiditymode.sh",60000)) + if(Season.state == NULL) Season.postUpdate(executeCommandLine("/home/pi/scripts/getseason.sh",60000)) + + if (TempUnit.state == "C") { + if((TempSetpoint.state == NULL) || (TempSetpoint.state == UNDEF)) TempSetpoint.sendCommand(18.0) + //if((TempSetpointC.state == NULL) || (TempSetpointC.state == UNDEF)) postUpdate(TempSetpointC, 18.0) + } else { + if((TempSetpoint.state == NULL) || (TempSetpoint.state == UNDEF)) TempSetpoint.sendCommand(70) + //if((TempSetpointF.state == NULL) || (TempSetpointF.state == UNDEF)) postUpdate(TempSetpointF, 70) + } + + if((HumiSetpoint.state == NULL) || (HumiSetpoint.state == UNDEF)) HumiSetpoint.postUpdate(50.0) + if((HeatingBoostTime.state == NULL) || (HeatingBoostTime.state == UNDEF)) HeatingBoostTime.postUpdate(10.0) + if((HotWaterBoostTime.state == NULL) || (HotWaterBoostTime.state == UNDEF)) HotWaterBoostTime.postUpdate(10.0) + if((HumiBoostTime.state == NULL) || (HumiBoostTime.state == UNDEF)) HumiBoostTime.postUpdate(10.0) + if((Heating2Time.state == NULL) || (Heating2Time.state == UNDEF)) Heating2Time.postUpdate(0) + if((Heating2Delta.state == NULL) || (Heating2Delta.state == UNDEF)) Heating2Delta.postUpdate(0) + + MyTempProxy.sendCommand(Double::parseDouble(MyTemp.state.toString)) + MyHumiProxy.sendCommand(Double::parseDouble(MyHumi.state.toString)) + MyPressureProxy.sendCommand(Double::parseDouble(MyPressure.state.toString)) + + if (TempUnit.state == "C") { + if ((Double::parseDouble(MyTemp.state.toString) < (Double::parseDouble(PreviousTempReading.state.toString)) - 0.2) || (Double::parseDouble(MyTemp.state.toString) > (Double::parseDouble(PreviousTempReading.state.toString)) + 0.2)) { + PreviousTempReading.postUpdate(Double::parseDouble(MyTemp.state.toString)) + } + } else { PreviousTempReading.postUpdate(Double::parseDouble(MyTemp.state.toString)) - /**CELSIUS*/ } + } + if ((Double::parseDouble(MyHumi.state.toString) < (Double::parseDouble(PreviousHumiReading.state.toString)) - 3) || (Double::parseDouble(MyHumi.state.toString) > (Double::parseDouble(PreviousHumiReading.state.toString)) + 3)) { PreviousHumiReading.postUpdate(Double::parseDouble(MyHumi.state.toString)) } PreviousPressureReading.postUpdate(Double::parseDouble(MyPressure.state.toString)) end + +/* OBSOLETE from HABPanel */ +/* rule "SetTempSetpointInc" when Item IncTargetTemp changed then var Number setpoint = TempSetpoint.state as DecimalType - /**CELSIUS*/ setpoint = setpoint + 0.5 - //FAHRENHEIT setpoint = setpoint + 1 + if (TempUnit.state == "C") { + setpoint = setpoint + 0.5 + } else { + setpoint = setpoint + 1 + } TempSetpoint.sendCommand(setpoint) //postUpdate(TempSetpoint, setpoint) TempSetpointChart.sendCommand(setpoint) end @@ -77,27 +563,74 @@ rule "SetTempSetpointDec" Item DecTargetTemp changed then var Number setpoint = TempSetpoint.state as DecimalType - /**CELSIUS*/ setpoint = setpoint - 0.5 - //FAHRENHEIT setpoint = setpoint - 1 + if (TempUnit.state == "C") { + setpoint = setpoint - 0.5 + } else { + setpoint = setpoint - 1 + } TempSetpoint.sendCommand(setpoint) //postUpdate(TempSetpoint, setpoint) TempSetpointChart.sendCommand(setpoint) end +/**/ rule "checkcurrtemp" when Item TempSetpoint changed or Item PreviousTempReading changed then - if (MyTempProxy.state > TempSetpoint.state){ - HeatingPin23.sendCommand(OFF) - TempSetpointChart.sendCommand(0) - } else if ((MyTempProxy.state < TempSetpoint.state) && - ((HeatingMode.state=="ON") || (HeatingMode.state=="Boost"))) { - HeatingPin23.sendCommand(ON) - TempSetpointChart.sendCommand(TempSetpoint.state as DecimalType) + if ((Season.state == "SUMMER")) { + //Summer + if (MyTempProxy.state < TempSetpoint.state){ + CoolingPin.sendCommand(OFF) + TempSetpointChart.sendCommand(0) + } else if ((MyTempProxy.state > TempSetpoint.state) && + ((CoolingMode.state=="ON") || (CoolingMode.state=="Boost"))) { + CoolingPin.sendCommand(ON) + TempSetpointChart.sendCommand(TempSetpoint.state as DecimalType) + } + } else { + //Winter + if (MyTempProxy.state > TempSetpoint.state){ + HeatingPin.sendCommand(OFF) + Heating2Pin.sendCommand(OFF) + //Heating2InitialTemp.sendCommand(0) + if (Heating2Timer !== null) { + Heating2Timer.cancel + Heating2Timer = null // reset the timer + } + TempSetpointChart.sendCommand(0) + } else if ((MyTempProxy.state < TempSetpoint.state) && + ((HeatingMode.state=="ON") || (HeatingMode.state=="Boost"))) { + HeatingPin.sendCommand(ON) + + /***** SECOND STAGE HEATING START *****/ + //Only if Heating2InitialTemp is 0 update it + //logInfo("Default","Heating2InitialTemp was found set to " + (Double::parseDouble(Heating2InitialTemp.state.toString))) + //if((Double::parseDouble(Heating2InitialTemp.state.toString)) == 0) { + //Heating2InitialTemp.postUpdate(Double::parseDouble(MyTempProxy.state.toString)) + //logInfo("Default","Heating2InitialTemp was 0 and is now set to " + (Double::parseDouble(Heating2InitialTemp.state.toString))) + + logInfo("Default","Starting Heating2Timer timer to " + (Heating2Time.state as DecimalType).intValue + " minutes.") + Heating2Timer = createTimer(now.plusMinutes((Heating2Time.state as DecimalType).intValue)) [| + if (((Double::parseDouble(MyTempProxy.state.toString)) + (Double::parseDouble(Heating2Delta.state.toString))) < ((Double::parseDouble(TempSetpoint.state.toString)))) { + //If it is still cold enough start 2nd stage + Heating2Pin.sendCommand(ON) + } + ] + //} + if (((Double::parseDouble(MyTempProxy.state.toString)) + (Double::parseDouble(Heating2Delta.state.toString))) >= ((Double::parseDouble(TempSetpoint.state.toString)))) { + //2nd stage is not needed + Heating2Pin.sendCommand(OFF) + } + /***** SECOND STAGE HEATING END *****/ + + TempSetpointChart.sendCommand(TempSetpoint.state as DecimalType) + } } end +/* OBSOLETE from HABPanel */ +/* rule "SetHumiSetpointInc" when Item IncTargetHumi changed @@ -117,18 +650,19 @@ then HumiSetpoint.sendCommand(setpoint) HumiSetpointChart.sendCommand(setpoint) end +/**/ rule "checkcurrhumi" when Item HumiSetpoint changed or Item PreviousHumiReading changed then - if (MyHumiProxy.state < HumiSetpoint.state){ - HumidityPin18.sendCommand(OFF) + if (((HumidityMode.state == "Dehumidify") && (MyHumiProxy.state < HumiSetpoint.state)) || ((HumidityMode.state == "Humidify") && (MyHumiProxy.state > HumiSetpoint.state))){ + HumidityPin.sendCommand(OFF) HumiSetpointChart.sendCommand(0) - } else if ((MyHumiProxy.state > HumiSetpoint.state) && + } else if ((((HumidityMode.state == "Dehumidify") && (MyHumiProxy.state > HumiSetpoint.state)) || ((HumidityMode.state == "Humidify") && (MyHumiProxy.state < HumiSetpoint.state))) && ((HumiMode.state=="ON") || (HumiMode.state=="Boost"))) { - HumidityPin18.sendCommand(ON) + HumidityPin.sendCommand(ON) HumiSetpointChart.sendCommand(HumiSetpoint.state as DecimalType) } end @@ -137,22 +671,57 @@ rule "Heating Mode" when Item HeatingMode changed then + if(HeatingBoostTime.state == NULL) postUpdate(HeatingBoostTime, 10) switch(HeatingMode.state) { case "ON": { if (MyTempProxy.state < TempSetpoint.state) { - HeatingPin23.sendCommand(ON) + HeatingPin.sendCommand(ON) + + /***** SECOND STAGE HEATING START *****/ + //Only if Heating2InitialTemp is 0 update it + //logInfo("Default","Heating2InitialTemp was found set to " + (Double::parseDouble(Heating2InitialTemp.state.toString))) + //if((Double::parseDouble(Heating2InitialTemp.state.toString)) == 0) { + //Heating2InitialTemp.postUpdate(Double::parseDouble(MyTempProxy.state.toString)) + //logInfo("Default","Heating2InitialTemp was 0 and is now set to " + (Double::parseDouble(Heating2InitialTemp.state.toString))) + + logInfo("Default","Starting Heating2Timer timer to " + (Heating2Time.state as DecimalType).intValue + " minutes.") + Heating2Timer = createTimer(now.plusMinutes((Heating2Time.state as DecimalType).intValue)) [| + if (((Double::parseDouble(MyTempProxy.state.toString)) + (Double::parseDouble(Heating2Delta.state.toString))) < ((Double::parseDouble(TempSetpoint.state.toString)))) { + //If it is still cold enough start 2nd stage + Heating2Pin.sendCommand(ON) + } + ] + //} + if (((Double::parseDouble(MyTempProxy.state.toString)) + (Double::parseDouble(Heating2Delta.state.toString))) >= ((Double::parseDouble(TempSetpoint.state.toString)))) { + //2nd stage is not needed + Heating2Pin.sendCommand(OFF) + } + /***** SECOND STAGE HEATING END *****/ + TempSetpointChart.sendCommand(TempSetpoint.state as DecimalType) } MainSwitch.sendCommand("ON") HeatingPreviousMode="ON" } case "OFF": { - HeatingPin23.sendCommand(OFF) + HeatingPin.sendCommand(OFF) + Heating2Pin.sendCommand(OFF) + //Heating2InitialTemp.sendCommand(0) + if (Heating2Timer !== null) { + Heating2Timer.cancel + Heating2Timer = null // reset the timer + } TempSetpointChart.sendCommand(0) HeatingPreviousMode="OFF" } case "Schedule": { - HeatingPin23.sendCommand(OFF) + HeatingPin.sendCommand(OFF) + Heating2Pin.sendCommand(OFF) + //Heating2InitialTemp.sendCommand(0) + if (Heating2Timer !== null) { + Heating2Timer.cancel + Heating2Timer = null // reset the timer + } TempSetpointChart.sendCommand(0) MainSwitch.sendCommand("ON") HeatingPreviousMode="Schedule" @@ -164,22 +733,68 @@ then } end +rule "Cooling Mode" +when + Item CoolingMode changed +then + switch(CoolingMode.state) { + case "ON": { + CoolingPin.sendCommand(ON) + TempSetpointChart.sendCommand(TempSetpoint.state as DecimalType) + + MainSwitch.sendCommand("ON") + CoolingPreviousMode="ON" + } + case "OFF": { + CoolingPin.sendCommand(OFF) + TempSetpointChart.sendCommand(0) + CoolingPreviousMode="OFF" + } + case "Boost": { + MainSwitch.sendCommand("ON") + // See below more... + } + } +end + +rule "Fan Mode" +when + Item FanMode changed +then + switch(FanMode.state) { + case "ON": { + FanPin.sendCommand(ON) + MainSwitch.sendCommand("ON") + HeatingPreviousMode="ON" + } + case "OFF": { + FanPin.sendCommand(OFF) + HeatingPreviousMode="OFF" + } + case "AUTO": { + MainSwitch.sendCommand("ON") + // See below more... + } + } +end + rule "Hot Water Mode" when Item HotWaterMode changed then + if(HotWaterBoostTime.state == NULL) postUpdate(HotWaterBoostTime, 10) switch(HotWaterMode.state) { case "ON": { - HotWaterPin12.sendCommand(ON) + HotWaterPin.sendCommand(ON) MainSwitch.sendCommand("ON") HotWaterPreviousMode="ON" } case "OFF": { - HotWaterPin12.sendCommand(OFF) + HotWaterPin.sendCommand(OFF) HotWaterPreviousMode="OFF" } case "Schedule": { - HotWaterPin12.sendCommand(OFF) + HotWaterPin.sendCommand(OFF) MainSwitch.sendCommand("ON") HotWaterPreviousMode="Schedule" } @@ -194,22 +809,23 @@ rule "Humidity Mode" when Item HumiMode changed then + if(HumiBoostTime.state == NULL) postUpdate(HumiBoostTime, 10) switch(HumiMode.state) { case "ON": { - if (MyHumiProxy.state > HumiSetpoint.state) { - HumidityPin18.sendCommand(ON) + if (((HumidityMode.state == "Dehumidify") && (MyHumiProxy.state > HumiSetpoint.state)) || ((HumidityMode.state == "Humidify") && (MyHumiProxy.state < HumiSetpoint.state))) { + HumidityPin.sendCommand(ON) HumiSetpointChart.sendCommand(HumiSetpoint.state as DecimalType) } MainSwitch.sendCommand("ON") HumiPreviousMode="ON" } case "OFF": { - HumidityPin18.sendCommand(OFF) + HumidityPin.sendCommand(OFF) HumiSetpointChart.sendCommand(0) HumiPreviousMode="OFF" } case "Schedule": { - HumidityPin18.sendCommand(OFF) + HumidityPin.sendCommand(OFF) HumiSetpointChart.sendCommand(0) MainSwitch.sendCommand("ON") HumiPreviousMode="Schedule" @@ -221,19 +837,19 @@ then } end -rule "HumidityPin18 changed" +rule "HumidityPin changed" when - Item HumidityPin18 changed + Item HumidityPin changed then - switch(HumidityPin18.state) { + switch(HumidityPin.state) { case ON: { - HumiTopic.sendCommand("ON") + HumiTopic.sendCommand("1") } case OFF: { HumiTopicTimer = createTimer(now.plusSeconds(5), [| HumiTopicTimer = null ]) - HumiTopic.sendCommand("OFF") + HumiTopic.sendCommand("0") } } end @@ -243,20 +859,21 @@ when Item HumiTopic changed then switch(HumiTopic.state) { + case "1", case "ON": { if (HumiMode.state != "Boost") { HumiMode.sendCommand("ON") } - - if (MyHumiProxy.state < HumiSetpoint.state) { + if (((HumidityMode.state == "Dehumidify") && (MyHumiProxy.state < HumiSetpoint.state)) || ((HumidityMode.state == "Humidify") && (MyHumiProxy.state > HumiSetpoint.state))) { HumiTopicTimer = createTimer(now.plusSeconds(5), [| HumiTopicTimer = null ]) - HumidityPin18.sendCommand(OFF) + HumidityPin.sendCommand(OFF) } } + case "0", case "OFF": { - if (HumiTopicTimer == null) { + if (HumiTopicTimer === null) { HumiMode.sendCommand("OFF") } } @@ -279,7 +896,6 @@ then HeatingPreviousMode="Schedule" HeatingMode.sendCommand("OFF") } else if (HeatingMode.state == "Boost") { - //This should never execute HeatingPreviousMode="Boost" HeatingMode.sendCommand("OFF") } @@ -291,7 +907,6 @@ then HotWaterPreviousMode="Schedule" HotWaterMode.sendCommand("OFF") } else if (HotWaterMode.state == "Boost") { - //This should never execute HotWaterPreviousMode="Boost" HotWaterMode.sendCommand("OFF") } @@ -303,10 +918,31 @@ then HumiPreviousMode="Schedule" HumiMode.sendCommand("OFF") } else if (HumiMode.state == "Boost") { - //This should never execute HumiPreviousMode="Boost" HumiMode.sendCommand("OFF") } + + if (CoolingMode.state == "ON") { + CoolingPreviousMode = "ON" + CoolingMode.sendCommand("OFF") + } else if (CoolingMode.state == "Schedule") { + CoolingPreviousMode="Schedule" + CoolingMode.sendCommand("OFF") + } else if (CoolingMode.state == "Boost") { + CoolingPreviousMode="Boost" + CoolingMode.sendCommand("OFF") + } + + if (FanMode.state == "ON") { + FanPreviousMode = "ON" + FanMode.sendCommand("OFF") + } else if (FanMode.state == "Schedule") { + FanPreviousMode="Schedule" + FanMode.sendCommand("OFF") + } else if (FanMode.state == "Boost") { + FanPreviousMode="Boost" + FanMode.sendCommand("OFF") + } } } end @@ -317,10 +953,10 @@ when then HeatingBoostTimeInitial = (HeatingBoostTime.state as DecimalType).intValue if (HeatingMode.state == "Boost") { - if (HeatingBoostTimer != null) { + if (HeatingBoostTimer !== null) { HeatingBoostTimer.reschedule(now.plusMinutes((HeatingBoostTimeInitial).intValue)) } - if (HeatingBoostRemTime != null) { + if (HeatingBoostRemTime !== null) { HeatingBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -330,11 +966,12 @@ rule "Boost Heating" when Item HeatingMode changed to Boost then - if (HeatingBoostTimer != null) { + if((HeatingBoostTime.state == NULL) || (HeatingBoostTime.state == UNDEF)) HeatingBoostTime.sendCommand(10) + if (HeatingBoostTimer !== null) { HeatingBoostTimer.cancel HeatingBoostTimer = null // reset the timer } - if (HeatingBoostRemTime != null) { + if (HeatingBoostRemTime !== null) { HeatingBoostRemTime.cancel HeatingBoostRemTime = null // reset the timer } @@ -342,13 +979,41 @@ then HeatingBoostTimeInitial = (HeatingBoostTime.state as DecimalType).intValue; HeatingBoostTimeInitialUI = HeatingBoostTimeInitial // sendNotification("your-myopenhab-account@email.com", "Heating started for " + HeatingBoostTimeInitial + " minutes") - + if (MyTempProxy.state > TempSetpoint.state){ - HeatingPin23.sendCommand(OFF) + HeatingPin.sendCommand(OFF) + Heating2Pin.sendCommand(OFF) + //Heating2InitialTemp.sendCommand(0) + if (Heating2Timer !== null) { + Heating2Timer.cancel + Heating2Timer = null // reset the timer + } TempSetpointChart.sendCommand(0) } else if (MyTempProxy.state < TempSetpoint.state) { - HeatingPin23.sendCommand(ON) + HeatingPin.sendCommand(ON) + + /***** SECOND STAGE HEATING START *****/ + //Only if Heating2InitialTemp is 0 update it + //logInfo("Default","Heating2InitialTemp was found set to " + (Double::parseDouble(Heating2InitialTemp.state.toString))) + //if((Double::parseDouble(Heating2InitialTemp.state.toString)) == 0) { + //Heating2InitialTemp.postUpdate(Double::parseDouble(MyTempProxy.state.toString)) + //logInfo("Default","Heating2InitialTemp was 0 and is now set to " + (Double::parseDouble(Heating2InitialTemp.state.toString))) + + logInfo("Default","Starting Heating2Timer timer to " + (Heating2Time.state as DecimalType).intValue + " minutes.") + Heating2Timer = createTimer(now.plusMinutes((Heating2Time.state as DecimalType).intValue)) [| + if (((Double::parseDouble(MyTempProxy.state.toString)) + (Double::parseDouble(Heating2Delta.state.toString))) < ((Double::parseDouble(TempSetpoint.state.toString)))) { + //If it is still cold enough start 2nd stage + Heating2Pin.sendCommand(ON) + } + ] + //} + if (((Double::parseDouble(MyTempProxy.state.toString)) + (Double::parseDouble(Heating2Delta.state.toString))) >= ((Double::parseDouble(TempSetpoint.state.toString)))) { + //2nd stage is not needed + Heating2Pin.sendCommand(OFF) + } + /***** SECOND STAGE HEATING END *****/ + TempSetpointChart.sendCommand(TempSetpoint.state as DecimalType) } @@ -359,7 +1024,7 @@ then logInfo("Default","Setting heating timer to " + (HeatingBoostTime.state as DecimalType).intValue) HeatingBoostTimer = createTimer(now.plusMinutes(HeatingBoostTimeInitial)) [| - if (HeatingBoostRemTime != null) { + if (HeatingBoostRemTime !== null) { HeatingBoostRemTime.cancel HeatingBoostRemTime = null // reset the timer } @@ -381,29 +1046,98 @@ then HeatingBoostTime.sendCommand(HeatingBoostTimeInitialUI) logInfo("Timer", "Clearing Heating timers...") - if (HeatingBoostTimer != null) { + if (HeatingBoostTimer !== null) { HeatingBoostTimer.cancel() HeatingBoostTimer = null logInfo("Timer", "HeatingBoostTimer cleared") } - if (HeatingBoostRemTime != null) { + if (HeatingBoostRemTime !== null) { HeatingBoostRemTime.cancel() HeatingBoostRemTime = null logInfo("Timer", "HeatingBoostRemTime cleared") } end +rule "Boost Cooling" +when + Item CoolingMode changed to Boost +then + if((CoolingBoostTime.state == NULL) || (CoolingBoostTime.state == UNDEF)) CoolingBoostTime.sendCommand(10) + if (CoolingBoostTimer !== null) { + CoolingBoostTimer.cancel + CoolingBoostTimer = null // reset the timer + } + if (CoolingBoostRemTime !== null) { + CoolingBoostRemTime.cancel + CoolingBoostRemTime = null // reset the timer + } + + CoolingBoostTimeInitial = (CoolingBoostTime.state as DecimalType).intValue; + CoolingBoostTimeInitialUI = CoolingBoostTimeInitial +// sendNotification("your-myopenhab-account@email.com", "Cooling started for " + CoolingBoostTimeInitial + " minutes") + + + if (MyTempProxy.state < TempSetpoint.state){ + CoolingPin.sendCommand(OFF) + TempSetpointChart.sendCommand(0) + } else if (MyTempProxy.state > TempSetpoint.state) { + CoolingPin.sendCommand(ON) + TempSetpointChart.sendCommand(TempSetpoint.state as DecimalType) + } + + CoolingBoostRemTime = createTimer(now.plusMinutes(1)) [| + CoolingBoostTime.sendCommand((CoolingBoostTime.state as DecimalType).intValue -1) + CoolingBoostRemTime.reschedule(now.plusMinutes(1)) + ] + + logInfo("Default","Setting cooling timer to " + (CoolingBoostTime.state as DecimalType).intValue) + CoolingBoostTimer = createTimer(now.plusMinutes(CoolingBoostTimeInitial)) [| + if (CoolingBoostRemTime !== null) { + CoolingBoostRemTime.cancel + CoolingBoostRemTime = null // reset the timer + } + CoolingMode.sendCommand(CoolingPreviousMode) + CoolingBoostTimer = null // reset the timer + ] + +end + +rule "Boost Cooling Ended" +when + Item CoolingMode changed from Boost +then + logInfo("Default","Cooling Boost finished") +// sendNotification("your-myopenhab-account@email.com", "Your house should be warm now ("+MyTempProxy.state+")") + if (((CoolingBoostTime.state as DecimalType).intValue < 10) || (CoolingBoostTimeInitial < 10)) { + CoolingBoostTimeInitial = 10 + } + CoolingBoostTime.sendCommand(CoolingBoostTimeInitialUI) + + logInfo("Timer", "Clearing Cooling timers...") + if (CoolingBoostTimer !== null) { + CoolingBoostTimer.cancel() + CoolingBoostTimer = null + logInfo("Timer", "CoolingBoostTimer cleared") + } + + if (CoolingBoostRemTime !== null) { + CoolingBoostRemTime.cancel() + CoolingBoostRemTime = null + logInfo("Timer", "CoolingBoostRemTime cleared") + } +end + rule "HotWaterBoostTime changed" when Item HotWaterBoostTime changed then HotWaterBoostTimeInitial = (HotWaterBoostTime.state as DecimalType).intValue if (HotWaterMode.state == "Boost") { - if (HotWaterBoostTimer != null) { + if (HotWaterBoostTimer !== null) { HotWaterBoostTimer.reschedule(now.plusMinutes((HotWaterBoostTimeInitial).intValue)) } - if (HotWaterBoostRemTime != null) { + if (HotWaterBoostRemTime !== null) { HotWaterBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -413,18 +1147,19 @@ rule "Boost Hot Water" when Item HotWaterMode changed to Boost then - if (HotWaterBoostTimer != null) { + if((HotWaterBoostTime.state == NULL) || (HotWaterBoostTime.state == UNDEF)) HotWaterBoostTime.sendCommand(10) + if (HotWaterBoostTimer !== null) { HotWaterBoostTimer.cancel HotWaterBoostTimer = null // reset the timer } - if (HotWaterBoostRemTime != null) { + if (HotWaterBoostRemTime !== null) { HotWaterBoostRemTime.cancel HotWaterBoostRemTime = null // reset the timer } HotWaterBoostTimeInitial = (HotWaterBoostTime.state as DecimalType).intValue; HotWaterBoostTimeInitialUI = HotWaterBoostTimeInitial - HotWaterPin12.sendCommand(ON) + HotWaterPin.sendCommand(ON) // sendNotification("your-myopenhab-account@email.com", "Hot water started for " + HotWaterBoostTimeInitial + " minutes") @@ -435,7 +1170,7 @@ then logInfo("Default","Setting hot water timer to " + HotWaterBoostTimeInitial) HotWaterBoostTimer = createTimer(now.plusMinutes(HotWaterBoostTimeInitial)) [| - if (HotWaterBoostRemTime != null) { + if (HotWaterBoostRemTime !== null) { HotWaterBoostRemTime.cancel HotWaterBoostRemTime = null // reset the timer } @@ -457,13 +1192,13 @@ then HotWaterBoostTime.sendCommand(HotWaterBoostTimeInitialUI) logInfo("Timer", "Clearing Hot Water timers...") - if (HotWaterBoostTimer != null) { + if (HotWaterBoostTimer !== null) { HotWaterBoostTimer.cancel() HotWaterBoostTimer = null logInfo("Timer", "HotWaterBoostTimer cleared") } - if (HotWaterBoostRemTime != null) { + if (HotWaterBoostRemTime !== null) { HotWaterBoostRemTime.cancel() HotWaterBoostRemTime = null logInfo("Timer", "HotWaterBoostRemTime cleared") @@ -476,10 +1211,10 @@ when then HumiBoostTimeInitial = (HumiBoostTime.state as DecimalType).intValue if (HumiMode.state == "Boost") { - if (HumiBoostTimer != null) { + if (HumiBoostTimer !== null) { HumiBoostTimer.reschedule(now.plusMinutes((HumiBoostTimeInitial).intValue)) } - if (HumiBoostRemTime != null) { + if (HumiBoostRemTime !== null) { HumiBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -489,11 +1224,12 @@ rule "Boost Humidity" when Item HumiMode changed to Boost then - if (HumiBoostTimer != null) { + if((HumiBoostTime.state == NULL) || (HumiBoostTime.state == UNDEF)) HumiBoostTime.sendCommand(10) + if (HumiBoostTimer !== null) { HumiBoostTimer.cancel HumiBoostTimer = null // reset the timer } - if (HumiBoostRemTime != null) { + if (HumiBoostRemTime !== null) { HumiBoostRemTime.cancel HumiBoostRemTime = null // reset the timer } @@ -501,11 +1237,11 @@ then HumiBoostTimeInitial = (HumiBoostTime.state as DecimalType).intValue; HumiBoostTimeInitialUI = HumiBoostTimeInitial - if (MyHumiProxy.state < HumiSetpoint.state){ - HumidityPin18.sendCommand(OFF) + if (((HumidityMode.state == "Dehumidify") && (MyHumiProxy.state < HumiSetpoint.state)) || ((HumidityMode.state == "Humidify") && (MyHumiProxy.state > HumiSetpoint.state))) { + HumidityPin.sendCommand(OFF) HumiSetpointChart.sendCommand(0) - } else if (MyHumiProxy.state > HumiSetpoint.state) { - HumidityPin18.sendCommand(ON) + } else if (((HumidityMode.state == "Dehumidify") && (MyHumiProxy.state > HumiSetpoint.state)) || ((HumidityMode.state == "Humidify") && (MyHumiProxy.state < HumiSetpoint.state))) { + HumidityPin.sendCommand(ON) HumiSetpointChart.sendCommand(HumiSetpoint.state as DecimalType) } @@ -516,7 +1252,7 @@ then logInfo("Default","Setting humidity timer to " + HumiBoostTimeInitial) HumiBoostTimer = createTimer(now.plusMinutes(HumiBoostTimeInitial)) [| - if (HumiBoostRemTime != null) { + if (HumiBoostRemTime !== null) { HumiBoostRemTime.cancel HumiBoostRemTime = null // reset the timer } @@ -538,13 +1274,13 @@ then HumiBoostTime.sendCommand(HumiBoostTimeInitialUI) logInfo("Timer", "Clearing Humidity timers...") - if (HumiBoostTimer != null) { + if (HumiBoostTimer !== null) { HumiBoostTimer.cancel() HumiBoostTimer = null logInfo("Timer", "HumiBoostTimer cleared") } - if (HumiBoostRemTime != null) { + if (HumiBoostRemTime !== null) { HumiBoostRemTime.cancel() HumiBoostRemTime = null logInfo("Timer", "HumiBoostRemTime cleared") @@ -566,12 +1302,12 @@ then HeatingBoostTime.postUpdate(10) } HeatingBoostTimeInitialUI = HeatingBoostTimeInitial - + if (HeatingMode.state == "Boost") { - if (HeatingBoostTimer != null) { + if (HeatingBoostTimer !== null) { HeatingBoostTimer.reschedule(now.plusMinutes((HeatingBoostTimeInitial).intValue)) } - if (HeatingBoostRemTime != null) { + if (HeatingBoostRemTime !== null) { HeatingBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -591,12 +1327,12 @@ then HeatingBoostTime.postUpdate(((HeatingBoostTime.state as DecimalType).intValue) + 10) } HeatingBoostTimeInitialUI = HeatingBoostTimeInitial - + if (HeatingMode.state == "Boost") { - if (HeatingBoostTimer != null) { + if (HeatingBoostTimer !== null) { HeatingBoostTimer.reschedule(now.plusMinutes((HeatingBoostTimeInitial).intValue)) } - if (HeatingBoostRemTime != null) { + if (HeatingBoostRemTime !== null) { HeatingBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -621,10 +1357,10 @@ then HotWaterBoostTimeInitialUI = HotWaterBoostTimeInitial if (HotWaterMode.state == "Boost") { - if (HotWaterBoostTimer != null) { + if (HotWaterBoostTimer !== null) { HotWaterBoostTimer.reschedule(now.plusMinutes((HotWaterBoostTimeInitial).intValue)) } - if (HotWaterBoostRemTime != null) { + if (HotWaterBoostRemTime !== null) { HotWaterBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -644,12 +1380,12 @@ then HotWaterBoostTime.postUpdate(((HotWaterBoostTime.state as DecimalType).intValue) + 10) } HotWaterBoostTimeInitialUI = HotWaterBoostTimeInitial - + if (HotWaterMode.state == "Boost") { - if (HotWaterBoostTimer != null) { + if (HotWaterBoostTimer !== null) { HotWaterBoostTimer.reschedule(now.plusMinutes((HotWaterBoostTimeInitial).intValue)) } - if (HotWaterBoostRemTime != null) { + if (HotWaterBoostRemTime !== null) { HotWaterBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -674,10 +1410,10 @@ then HumiBoostTimeInitialUI = HumiBoostTimeInitial if (HumiMode.state == "Boost") { - if (HumiBoostTimer != null) { + if (HumiBoostTimer !== null) { HumiBoostTimer.reschedule(now.plusMinutes((HumiBoostTimeInitial).intValue)) } - if (HumiBoostRemTime != null) { + if (HumiBoostRemTime !== null) { HumiBoostRemTime.reschedule(now.plusMinutes(1)) } } @@ -699,13 +1435,229 @@ then HumiBoostTimeInitialUI = HumiBoostTimeInitial if (HumiMode.state == "Boost") { - if (HumiBoostTimer != null) { + if (HumiBoostTimer !== null) { HumiBoostTimer.reschedule(now.plusMinutes((HumiBoostTimeInitial).intValue)) } - if (HumiBoostRemTime != null) { + if (HumiBoostRemTime !== null) { HumiBoostRemTime.reschedule(now.plusMinutes(1)) } } } end + +rule "FanControl" +when + Item HeatingPin changed or + Item CoolingPin changed or + Item FanMode changed +then + if (SystemType.state == "US") { + if (FanMode.state == "AUTO") { + if ((HeatingPin.state == ON) || (CoolingPin.state == ON)) { + FanPin.sendCommand(ON) + } + else { + FanPin.sendCommand(OFF) + } + } else if (FanMode.state == "ON") { + FanPin.sendCommand(ON) + } else { //FanMode.state == "OFF" + FanPin.sendCommand(OFF) + } + } else { + FanPin.sendCommand(OFF) //Fan should not be used in EU mode + } +end + +rule "TempUnitChanged" +when + Item TempUnit changed +then + MainSwitch.sendCommand("OFF"); + HeatingMode.sendCommand("OFF"); + CoolingMode.sendCommand("OFF"); + FanMode.sendCommand("OFF"); + HotWaterMode.sendCommand("OFF"); + HumiMode.sendCommand("OFF"); + if (TempUnit.state == "F") { + logInfo("Default","F Selected") + //C2F.sendCommand("ON") + var String results = executeCommandLine("/home/pi/scripts/C2F.sh",1000) + results = results + "" // hide validation issue + results = "" + //postUpdate(TempSetpoint, 70) + TempSetpoint.sendCommand(70) + } else { + logInfo("Default","C Selected") + //F2C.sendCommand("ON") + var String results = executeCommandLine("/home/pi/scripts/F2C.sh",1000) + results = results + "" // hide validation issue + results = "" + //postUpdate(TempSetpoint, 18) + TempSetpoint.sendCommand(18) + } +end + +rule "HumidityModeChanged" +when + Item HumidityMode changed +then + HumiMode.sendCommand("OFF"); + HumiSetpoint.sendCommand(50); + HumiBoostTime.sendCommand(10); +end + +rule "SystemTypeChanged" +when + Item SystemType changed +then + MainSwitch.sendCommand("OFF"); + HeatingMode.sendCommand("OFF"); + CoolingMode.sendCommand("OFF"); + FanMode.sendCommand("OFF"); + HotWaterMode.sendCommand("OFF"); + HumiMode.sendCommand("OFF"); + + HeatingBoostTime.sendCommand(10); + CoolingBoostTime.sendCommand(10); + HumiSetpoint.sendCommand(50); + HotWaterBoostTime.sendCommand(10); + HumiBoostTime.sendCommand(10); + + if (TempUnit.state == "F") { + //postUpdate(TempSetpoint, 70) + TempSetpoint.sendCommand(70) + } else { + //postUpdate(TempSetpoint, 18) + TempSetpoint.sendCommand(18) + } + + if (SystemType.state == "US") { + var String results = executeCommandLine("sudo sed -i 's/EU/US/g' /home/pi/scripts/systemtype",1000) + results = results + "" // hide validation issue + results = "" + logInfo("Default","HVAC enabled") + } else { + var String results = executeCommandLine("sudo sed -i 's/US/EU/g' /home/pi/scripts/systemtype",1000) + results = results + "" // hide validation issue + results = "" + logInfo("Default","Generic enabled") + } +end + +rule "SeasonChanged" +when + Item Season changed +then + MainSwitch.sendCommand("OFF"); + HeatingMode.sendCommand("OFF"); + CoolingMode.sendCommand("OFF"); + FanMode.sendCommand("OFF"); + HotWaterMode.sendCommand("OFF"); + HumiMode.sendCommand("OFF"); + + HeatingBoostTime.sendCommand(10); + CoolingBoostTime.sendCommand(10); + HumiSetpoint.sendCommand(50); + HotWaterBoostTime.sendCommand(10); + HumiBoostTime.sendCommand(10); + + if (Season.state == "WINTER") { + var String results = executeCommandLine("sudo sed -i 's/SUMMER/WINTER/g' /home/pi/scripts/season",1000) + results = results + "" // hide validation issue + results = "" + logInfo("Default","Winter mode enabled") + } else { + var String results = executeCommandLine("sudo sed -i 's/WINTER/SUMMER/g' /home/pi/scripts/season",1000) + results = results + "" // hide validation issue + results = "" + logInfo("Default","Summer mode enabled") + } +end + +rule "US_SummerSet" +when + Item Season changed or + Item SystemType changed +then + // Cooling feature requires 'AND' logic for visibility setting and is not supported by OH, yet + if ((Season.state == "SUMMER") && (SystemType.state == "US")) { + US_Summer.sendCommand("ON") + } + else { + US_Summer.sendCommand("OFF") + } +end + +rule "Timezone Set" +when + Item System_TZ_Set changed +then + var String results = executeCommandLine("sudo /home/pi/scripts/settz.sh " + System_TZ_Set.state.toString,5000) + results = results + "" // hide validation issue + results = "" + System_TZ.postUpdate(executeCommandLine("/home/pi/scripts/gettz.sh",5000)) +end + +rule "RebootButtonChanged" +when + Item RebootButton received command ON +then + logInfo("Default","RebootButton Selected") + RebootButton.postUpdate("OFF") + RebootCommand.sendCommand("ON") +end + +rule "ShutdownButtonChanged" +when + Item ShutdownButton received command ON +then + logInfo("Default","ShutdownButton Selected") + ShutdownButton.postUpdate("OFF") + ShutdownCommand.sendCommand("ON") +end + +rule "BackupButtonChanged" +when + Item BackupButton received command ON +then + logInfo("Default","BackupButton Selected") + BackupButton.postUpdate("Backing up...") + RestoreButton.postUpdate("") + BackupCommand.sendCommand("ON") +end + +rule "BackupCommandChanged" +when + Item BackupCommand changed from ON to OFF +then + logInfo("Default","Backup complete!") + BackupButton.postUpdate("Backup complete!") + RestoreButton.postUpdate(executeCommandLine("/home/pi/scripts/getbackuptimestamp.sh",10000)); + createTimer(now.plusSeconds(10)) [| + BackupButton.postUpdate("") + ] +end + +rule "RestoreButtonChanged" +when + Item RestoreButton received command ON +then + logInfo("Default","RestoreButton Selected") + RestoreButton.postUpdate("Restoring & restarting twice...") + RestoreCommand.sendCommand("ON") +end + +rule "Monitor WAN IP" +when + Item Network_WAN_IP changed +then + // perform any action needed + val currentState = Network_WAN_IP.state + if (currentState == "-") { + logError("MonitorWANIP", "Unable to get WAN IP") + } else { + logInfo("MonitorWANIP", "WAN IP changed to: " + currentState) + } +end diff --git a/etc/openhab2/rules/readme.txt b/etc/openhab2/rules/readme.txt index 7430651d2069d9ae4636ac2d4457d7b54eb3a5bc..f7952e13f2fdfb8e139ef475a75a2d9e90254177 100644 --- a/etc/openhab2/rules/readme.txt +++ b/etc/openhab2/rules/readme.txt @@ -2,4 +2,4 @@ Your rules go here. All rule files have to have the ".rules" file extension and must follow a special syntax. Check out the openHAB documentation for more details: -http://docs.openhab.org/features/automation/ruledsl.html +https://www.openhab.org/docs/configuration/rules-dsl.html diff --git a/etc/openhab2/scripts/readme.txt b/etc/openhab2/scripts/readme.txt index 2fa6a61a2c1ee876d61891b0468caba788f39d7d..0faff68d9fef83fab0e2ceedd7d6e9812dacc0c4 100644 --- a/etc/openhab2/scripts/readme.txt +++ b/etc/openhab2/scripts/readme.txt @@ -2,4 +2,4 @@ Your scripts go here. All script files have to have the ".script" file extension and must follow a special syntax. Check out the openHAB documentation for more details: -http://docs.openhab.org/features/automation/ruledsl.html#scripts +https://www.openhab.org/docs/configuration/rules-dsl.html#scripts diff --git a/etc/openhab2/services/readme.txt b/etc/openhab2/services/readme.txt index b457e83535f8e79c0ef012f6cfbb9af09e4575ce..62ba811934c2446d9cc8ae1b87c0417e3512b958 100644 --- a/etc/openhab2/services/readme.txt +++ b/etc/openhab2/services/readme.txt @@ -3,4 +3,4 @@ All configuration files have to have the ".cfg" file extension. Service configuration files are automatically created as soon as you install an add-on that can be configured. Check out the openHAB documentation for more details: -http://docs.openhab.org/configuration/services.html +https://www.openhab.org/docs/configuration/services.html diff --git a/etc/openhab2/sitemaps/default.sitemap b/etc/openhab2/sitemaps/default.sitemap index 546b5c2d268c912ad756301394cb71c566315d85..06321f2daaae8e160b01ba39164f823303cbc295 100755 --- a/etc/openhab2/sitemaps/default.sitemap +++ b/etc/openhab2/sitemaps/default.sitemap @@ -1,47 +1,452 @@ sitemap default label="Main Menu" { - Frame label="Heating" { + Frame label="Heating" visibility=[Season=="WINTER"] { Switch item=HeatingMode mappings=[ "ON"="ON", "OFF"="OFF"/*, "Schedule"="SCHEDULE"*/, "Boost"="BOOST"] - Text item=MyTempProxy + Text item=MyTempProxyC visibility=[TempUnit=="C"] + Text item=MyTempProxyF visibility=[TempUnit=="F"] Setpoint item=HeatingBoostTime minValue=10 maxValue=1440 step=10 icon="clock" - /**CELSIUS*/ Setpoint item=TempSetpoint minValue=0 maxValue=40 step=0.5 icon="temperature" - //FAHRENHEIT Setpoint item=TempSetpoint minValue=32 maxValue=86 step=1 icon="temperature" + Setpoint item=TempSetpointC minValue=0 maxValue=40 step=0.5 icon="temperature" visibility=[TempUnit=="C"] + Setpoint item=TempSetpointF minValue=32 maxValue=100 step=1 icon="temperature" visibility=[TempUnit=="F"] } - Frame label="Hot Water" { + Frame label="Cooling" visibility=[US_Summer==ON] { + Switch item=CoolingMode mappings=[ "ON"="ON", "OFF"="OFF"/*, "Schedule"="SCHEDULE"*/, "Boost"="BOOST"] + Text item=MyTempProxyC visibility=[TempUnit=="C"] + Text item=MyTempProxyF visibility=[TempUnit=="F"] + Setpoint item=CoolingBoostTime minValue=10 maxValue=1440 step=10 icon="clock" + Setpoint item=TempSetpointC minValue=0 maxValue=40 step=0.5 icon="temperature" visibility=[TempUnit=="C"] + Setpoint item=TempSetpointF minValue=32 maxValue=86 step=1 icon="temperature" visibility=[TempUnit=="F"] + } + + Frame label="Fan" visibility=[SystemType=="US"] { + Switch item=FanMode mappings=[ "ON"="ON", "OFF"="OFF", "AUTO"="AUTO"] + } + + Frame label="Hot Water" visibility=[SystemType=="EU"] { Switch item=HotWaterMode mappings=[ "ON"="ON", "OFF"="OFF"/*, "Schedule"="SCHEDULE"*/, "Boost"="BOOST"] Setpoint item=HotWaterBoostTime minValue=10 maxValue=120 step=10 icon="clock" } - Frame label="Humidity" { + Frame label="Humidity" visibility=[SystemType=="EU"] { Switch item=HumiMode mappings=[ "ON"="ON", "OFF"="OFF"/*, "Schedule"="SCHEDULE"*/, "Boost"="BOOST"] Text item=MyHumiProxy Setpoint item=HumiBoostTime minValue=10 maxValue=120 step=10 icon="clock" Setpoint item=HumiSetpoint minValue=0 maxValue=100 step=5 icon="humidity" } -// Frame label="Air Pressure" { -// Text item=MyPressureProxy icon="pressure" -// } - - Frame label="History" { - Group item=charts label="Charts" icon="chart" { + Frame label="Configuration" { + Text item=SettingsPage label="Settings" { Frame { - Switch item=chart_period label="Period" mappings=[0="Day", 1="Week", 2="Month", 3="Year"] - Chart item=chart_temp period=D refresh=120000 visibility=[chart_period==0, chart_period=="Uninitialized"] - Chart item=chart_temp period=W refresh=120000 visibility=[chart_period==1] - Chart item=chart_temp period=M refresh=120000 visibility=[chart_period==2] - Chart item=chart_temp period=Y refresh=120000 visibility=[chart_period==3] - - Chart item=chart_humi period=D refresh=120000 visibility=[chart_period==0, chart_period=="Uninitialized"] - Chart item=chart_humi period=W refresh=120000 visibility=[chart_period==1] - Chart item=chart_humi period=M refresh=120000 visibility=[chart_period==2] - Chart item=chart_humi period=Y refresh=120000 visibility=[chart_period==3] - -// Chart item=chart_press period=D refresh=120000 visibility=[chart_period==0, chart_period=="Uninitialized"] -// Chart item=chart_press period=W refresh=120000 visibility=[chart_period==1] -// Chart item=chart_press period=M refresh=120000 visibility=[chart_period==2] -// Chart item=chart_press period=Y refresh=120000 visibility=[chart_period==3] + Group item=settings label="Maintenance" icon="switch" { + Frame { + Switch item=BackupButton mappings=["ON"="Backup"] + Switch item=RestoreButton mappings=["ON"="Restore"] + Switch item=RebootButton mappings=["ON"="Reboot"] + Switch item=ShutdownButton mappings=["ON"="Shutdown"] + } + } + Group item=settings label="2nd Stage Heating" icon="heating" { + Frame { + Setpoint item=Heating2Delta minValue=0 maxValue=20 step=1 icon="temperature" + Setpoint item=Heating2Time minValue=0 maxValue=120 step=1 icon="clock" + } + } + Switch item=TempUnit mappings=["F"="°F", "C"="°C"] + Switch item=HumidityMode mappings=["Dehumidify"="Dehumidify", "Humidify"="Humidify"] + Switch item=SystemType mappings=["US"="HVAC", "EU"="Generic"] + Switch item=Season mappings=["WINTER"="WINTER", "SUMMER"="SUMMER"] + Selection item=System_TZ_Set mappings=[ // THIS IS UNAVOIDABLY UGLY - START SCROLLING NOW + "Africa/Abidjan"="Africa/Abidjan +00:00", + "Africa/Accra"="Africa/Accra +00:00", + "Africa/Algiers"="Africa/Algiers +01:00", + "Africa/Bissau"="Africa/Bissau +00:00", + "Africa/Cairo"="Africa/Cairo +02:00", + "Africa/Casablanca"="Africa/Casablanca +01:00", + "Africa/Ceuta"="Africa/Ceuta +01:00", + "Africa/El_Aaiun"="Africa/El_Aaiun +00:00", + "Africa/Johannesburg"="Africa/Johannesburg +02:00", + "Africa/Juba"="Africa/Juba +03:00", + "Africa/Khartoum"="Africa/Khartoum +02:00", + "Africa/Lagos"="Africa/Lagos +01:00", + "Africa/Maputo"="Africa/Maputo +02:00", + "Africa/Monrovia"="Africa/Monrovia +00:00", + "Africa/Nairobi"="Africa/Nairobi +03:00", + "Africa/Ndjamena"="Africa/Ndjamena +01:00", + "Africa/Tripoli"="Africa/Tripoli +02:00", + "Africa/Tunis"="Africa/Tunis +01:00", + "Africa/Windhoek"="Africa/Windhoek +02:00", + "America/Adak"="America/Adak −10:00", + "America/Anchorage"="America/Anchorage −09:00", + "America/Araguaina"="America/Araguaina −03:00", + "America/Argentina/Buenos_Aires"="America/Argentina/Buenos_Aires −03:00", + "America/Argentina/Catamarca"="America/Argentina/Catamarca −03:00", + "America/Argentina/Cordoba"="America/Argentina/Cordoba −03:00", + "America/Argentina/Jujuy"="America/Argentina/Jujuy −03:00", + "America/Argentina/La_Rioja"="America/Argentina/La_Rioja −03:00", + "America/Argentina/Mendoza"="America/Argentina/Mendoza −03:00", + "America/Argentina/Rio_Gallegos"="America/Argentina/Rio_Gallegos −03:00", + "America/Argentina/Salta"="America/Argentina/Salta −03:00", + "America/Argentina/San_Juan"="America/Argentina/San_Juan −03:00", + "America/Argentina/San_Luis"="America/Argentina/San_Luis −03:00", + "America/Argentina/Tucuman"="America/Argentina/Tucuman −03:00", + "America/Argentina/Ushuaia"="America/Argentina/Ushuaia −03:00", + "America/Asuncion"="America/Asuncion −04:00", + "America/Atikokan"="America/Atikokan −05:00", + "America/Bahia"="America/Bahia −03:00", + "America/Bahia_Banderas"="America/Bahia_Banderas −06:00", + "America/Barbados"="America/Barbados −04:00", + "America/Belem"="America/Belem −03:00", + "America/Belize"="America/Belize −06:00", + "America/Blanc-Sablon"="America/Blanc-Sablon −04:00", + "America/Boa_Vista"="America/Boa_Vista −04:00", + "America/Bogota"="America/Bogota −05:00", + "America/Boise"="America/Boise −07:00", + "America/Cambridge_Bay"="America/Cambridge_Bay −07:00", + "America/Campo_Grande"="America/Campo_Grande −04:00", + "America/Cancun"="America/Cancun −05:00", + "America/Caracas"="America/Caracas −04:00", + "America/Cayenne"="America/Cayenne −03:00", + "America/Chicago"="America/Chicago −06:00", + "America/Chihuahua"="America/Chihuahua −07:00", + "America/Costa_Rica"="America/Costa_Rica −06:00", + "America/Creston"="America/Creston −07:00", + "America/Cuiaba"="America/Cuiaba −04:00", + "America/Curacao"="America/Curacao −04:00", + "America/Danmarkshavn"="America/Danmarkshavn +00:00", + "America/Dawson"="America/Dawson −08:00", + "America/Dawson_Creek"="America/Dawson_Creek −07:00", + "America/Denver"="America/Denver −07:00", + "America/Detroit"="America/Detroit −05:00", + "America/Edmonton"="America/Edmonton −07:00", + "America/Eirunepe"="America/Eirunepe −05:00", + "America/El_Salvador"="America/El_Salvador −06:00", + "America/Fort_Nelson"="America/Fort_Nelson −07:00", + "America/Fortaleza"="America/Fortaleza −03:00", + "America/Glace_Bay"="America/Glace_Bay −04:00", + "America/Godthab"="America/Godthab −03:00", + "America/Goose_Bay"="America/Goose_Bay −04:00", + "America/Grand_Turk"="America/Grand_Turk −05:00", + "America/Guatemala"="America/Guatemala −06:00", + "America/Guayaquil"="America/Guayaquil −05:00", + "America/Guyana"="America/Guyana −04:00", + "America/Halifax"="America/Halifax −04:00", + "America/Havana"="America/Havana −05:00", + "America/Hermosillo"="America/Hermosillo −07:00", + "America/Indiana/Indianapolis"="America/Indiana/Indianapolis −05:00", + "America/Indiana/Knox"="America/Indiana/Knox −06:00", + "America/Indiana/Marengo"="America/Indiana/Marengo −05:00", + "America/Indiana/Petersburg"="America/Indiana/Petersburg −05:00", + "America/Indiana/Tell_City"="America/Indiana/Tell_City −06:00", + "America/Indiana/Vevay"="America/Indiana/Vevay −05:00", + "America/Indiana/Vincennes"="America/Indiana/Vincennes −05:00", + "America/Indiana/Winamac"="America/Indiana/Winamac −05:00", + "America/Inuvik"="America/Inuvik −07:00", + "America/Iqaluit"="America/Iqaluit −05:00", + "America/Jamaica"="America/Jamaica −05:00", + "America/Juneau"="America/Juneau −09:00", + "America/Kentucky/Louisville"="America/Kentucky/Louisville −05:00", + "America/Kentucky/Monticello"="America/Kentucky/Monticello −05:00", + "America/La_Paz"="America/La_Paz −04:00", + "America/Lima"="America/Lima −05:00", + "America/Los_Angeles"="America/Los_Angeles −08:00", + "America/Maceio"="America/Maceio −03:00", + "America/Managua"="America/Managua −06:00", + "America/Manaus"="America/Manaus −04:00", + "America/Martinique"="America/Martinique −04:00", + "America/Matamoros"="America/Matamoros −06:00", + "America/Mazatlan"="America/Mazatlan −07:00", + "America/Menominee"="America/Menominee −06:00", + "America/Merida"="America/Merida −06:00", + "America/Metlakatla"="America/Metlakatla −09:00", + "America/Mexico_City"="America/Mexico_City −06:00", + "America/Miquelon"="America/Miquelon −03:00", + "America/Moncton"="America/Moncton −04:00", + "America/Monterrey"="America/Monterrey −06:00", + "America/Montevideo"="America/Montevideo −03:00", + "America/Nassau"="America/Nassau −05:00", + "America/New_York"="America/New_York −05:00", + "America/Nipigon"="America/Nipigon −05:00", + "America/Nome"="America/Nome −09:00", + "America/Noronha"="America/Noronha −02:00", + "America/North_Dakota/Beulah"="America/North_Dakota/Beulah −06:00", + "America/North_Dakota/Center"="America/North_Dakota/Center −06:00", + "America/North_Dakota/New_Salem"="America/North_Dakota/New_Salem −06:00", + "America/Ojinaga"="America/Ojinaga −07:00", + "America/Panama"="America/Panama −05:00", + "America/Pangnirtung"="America/Pangnirtung −05:00", + "America/Paramaribo"="America/Paramaribo −03:00", + "America/Phoenix"="America/Phoenix −07:00", + "America/Port_of_Spain"="America/Port_of_Spain −04:00", + "America/Port-au-Prince"="America/Port-au-Prince −05:00", + "America/Porto_Velho"="America/Porto_Velho −04:00", + "America/Puerto_Rico"="America/Puerto_Rico −04:00", + "America/Punta_Arenas"="America/Punta_Arenas −03:00", + "America/Rainy_River"="America/Rainy_River −06:00", + "America/Rankin_Inlet"="America/Rankin_Inlet −06:00", + "America/Recife"="America/Recife −03:00", + "America/Regina"="America/Regina −06:00", + "America/Resolute"="America/Resolute −06:00", + "America/Rio_Branco"="America/Rio_Branco −05:00", + "America/Santarem"="America/Santarem −03:00", + "America/Santiago"="America/Santiago −04:00", + "America/Santo_Domingo"="America/Santo_Domingo −04:00", + "America/Sao_Paulo"="America/Sao_Paulo −03:00", + "America/Scoresbysund"="America/Scoresbysund −01:00", + "America/Sitka"="America/Sitka −09:00", + "America/St_Johns"="America/St_Johns −03:30", + "America/Swift_Current"="America/Swift_Current −06:00", + "America/Tegucigalpa"="America/Tegucigalpa −06:00", + "America/Thule"="America/Thule −04:00", + "America/Thunder_Bay"="America/Thunder_Bay −05:00", + "America/Tijuana"="America/Tijuana −08:00", + "America/Toronto"="America/Toronto −05:00", + "America/Vancouver"="America/Vancouver −08:00", + "America/Whitehorse"="America/Whitehorse −08:00", + "America/Winnipeg"="America/Winnipeg −06:00", + "America/Yakutat"="America/Yakutat −09:00", + "America/Yellowknife"="America/Yellowknife −07:00", + "Antarctica/Casey"="Antarctica/Casey +11:00", + "Antarctica/Davis"="Antarctica/Davis +07:00", + "Antarctica/DumontDUrville"="Antarctica/DumontDUrville +10:00", + "Antarctica/Macquarie"="Antarctica/Macquarie +11:00", + "Antarctica/Mawson"="Antarctica/Mawson +05:00", + "Antarctica/Palmer"="Antarctica/Palmer −03:00", + "Antarctica/Rothera"="Antarctica/Rothera −03:00", + "Antarctica/Syowa"="Antarctica/Syowa +03:00", + "Antarctica/Troll"="Antarctica/Troll +00:00", + "Antarctica/Vostok"="Antarctica/Vostok +06:00", + "Asia/Almaty"="Asia/Almaty +06:00", + "Asia/Amman"="Asia/Amman +02:00", + "Asia/Anadyr"="Asia/Anadyr +12:00", + "Asia/Aqtau"="Asia/Aqtau +05:00", + "Asia/Aqtobe"="Asia/Aqtobe +05:00", + "Asia/Ashgabat"="Asia/Ashgabat +05:00", + "Asia/Atyrau"="Asia/Atyrau +05:00", + "Asia/Baghdad"="Asia/Baghdad +03:00", + "Asia/Baku"="Asia/Baku +04:00", + "Asia/Bangkok"="Asia/Bangkok +07:00", + "Asia/Barnaul"="Asia/Barnaul +07:00", + "Asia/Beirut"="Asia/Beirut +02:00", + "Asia/Bishkek"="Asia/Bishkek +06:00", + "Asia/Brunei"="Asia/Brunei +08:00", + "Asia/Chita"="Asia/Chita +09:00", + "Asia/Choibalsan"="Asia/Choibalsan +08:00", + "Asia/Colombo"="Asia/Colombo +05:30", + "Asia/Damascus"="Asia/Damascus +02:00", + "Asia/Dhaka"="Asia/Dhaka +06:00", + "Asia/Dili"="Asia/Dili +09:00", + "Asia/Dubai"="Asia/Dubai +04:00", + "Asia/Dushanbe"="Asia/Dushanbe +05:00", + "Asia/Famagusta"="Asia/Famagusta +02:00", + "Asia/Gaza"="Asia/Gaza +02:00", + "Asia/Hebron"="Asia/Hebron +02:00", + "Asia/Ho_Chi_Minh"="Asia/Ho_Chi_Minh +07:00", + "Asia/Hong_Kong"="Asia/Hong_Kong +08:00", + "Asia/Hovd"="Asia/Hovd +07:00", + "Asia/Irkutsk"="Asia/Irkutsk +08:00", + "Asia/Jakarta"="Asia/Jakarta +07:00", + "Asia/Jayapura"="Asia/Jayapura +09:00", + "Asia/Jerusalem"="Asia/Jerusalem +02:00", + "Asia/Kabul"="Asia/Kabul +04:30", + "Asia/Kamchatka"="Asia/Kamchatka +12:00", + "Asia/Karachi"="Asia/Karachi +05:00", + "Asia/Kathmandu"="Asia/Kathmandu +05:45", + "Asia/Khandyga"="Asia/Khandyga +09:00", + "Asia/Kolkata"="Asia/Kolkata +05:30", + "Asia/Krasnoyarsk"="Asia/Krasnoyarsk +07:00", + "Asia/Kuala_Lumpur"="Asia/Kuala_Lumpur +08:00", + "Asia/Kuching"="Asia/Kuching +08:00", + "Asia/Macau"="Asia/Macau +08:00", + "Asia/Magadan"="Asia/Magadan +11:00", + "Asia/Makassar"="Asia/Makassar +08:00", + "Asia/Manila"="Asia/Manila +08:00", + "Asia/Nicosia"="Asia/Nicosia +02:00", + "Asia/Novokuznetsk"="Asia/Novokuznetsk +07:00", + "Asia/Novosibirsk"="Asia/Novosibirsk +07:00", + "Asia/Omsk"="Asia/Omsk +06:00", + "Asia/Oral"="Asia/Oral +05:00", + "Asia/Pontianak"="Asia/Pontianak +07:00", + "Asia/Pyongyang"="Asia/Pyongyang +09:00", + "Asia/Qatar"="Asia/Qatar +03:00", + "Asia/Qyzylorda"="Asia/Qyzylorda +05:00", + "Asia/Riyadh"="Asia/Riyadh +03:00", + "Asia/Sakhalin"="Asia/Sakhalin +11:00", + "Asia/Samarkand"="Asia/Samarkand +05:00", + "Asia/Seoul"="Asia/Seoul +09:00", + "Asia/Shanghai"="Asia/Shanghai +08:00", + "Asia/Singapore"="Asia/Singapore +08:00", + "Asia/Srednekolymsk"="Asia/Srednekolymsk +11:00", + "Asia/Taipei"="Asia/Taipei +08:00", + "Asia/Tashkent"="Asia/Tashkent +05:00", + "Asia/Tbilisi"="Asia/Tbilisi +04:00", + "Asia/Tehran"="Asia/Tehran +03:30", + "Asia/Thimphu"="Asia/Thimphu +06:00", + "Asia/Tokyo"="Asia/Tokyo +09:00", + "Asia/Tomsk"="Asia/Tomsk +07:00", + "Asia/Ulaanbaatar"="Asia/Ulaanbaatar +08:00", + "Asia/Urumqi"="Asia/Urumqi +06:00", + "Asia/Ust-Nera"="Asia/Ust-Nera +10:00", + "Asia/Vladivostok"="Asia/Vladivostok +10:00", + "Asia/Yakutsk"="Asia/Yakutsk +09:00", + "Asia/Yangon"="Asia/Yangon +06:30", + "Asia/Yekaterinburg"="Asia/Yekaterinburg +05:00", + "Asia/Yerevan"="Asia/Yerevan +04:00", + "Atlantic/Azores"="Atlantic/Azores −01:00", + "Atlantic/Bermuda"="Atlantic/Bermuda −04:00", + "Atlantic/Canary"="Atlantic/Canary +00:00", + "Atlantic/Cape_Verde"="Atlantic/Cape_Verde −01:00", + "Atlantic/Faroe"="Atlantic/Faroe +00:00", + "Atlantic/Madeira"="Atlantic/Madeira +00:00", + "Atlantic/Reykjavik"="Atlantic/Reykjavik +00:00", + "Atlantic/South_Georgia"="Atlantic/South_Georgia −02:00", + "Atlantic/Stanley"="Atlantic/Stanley −03:00", + "Australia/Adelaide"="Australia/Adelaide +09:30", + "Australia/Brisbane"="Australia/Brisbane +10:00", + "Australia/Broken_Hill"="Australia/Broken_Hill +09:30", + "Australia/Currie"="Australia/Currie +10:00", + "Australia/Darwin"="Australia/Darwin +09:30", + "Australia/Eucla"="Australia/Eucla +08:45", + "Australia/Hobart"="Australia/Hobart +10:00", + "Australia/Lindeman"="Australia/Lindeman +10:00", + "Australia/Lord_Howe"="Australia/Lord_Howe +10:30", + "Australia/Melbourne"="Australia/Melbourne +10:00", + "Australia/Perth"="Australia/Perth +08:00", + "Australia/Sydney"="Australia/Sydney +10:00", + "Etc/GMT"="Etc/GMT +00:00", + "Etc/GMT-1"="Etc/GMT-1 +01:00", + "Etc/GMT-10"="Etc/GMT-10 +10:00", + "Etc/GMT-11"="Etc/GMT-11 +11:00", + "Etc/GMT-12"="Etc/GMT-12 +12:00", + "Etc/GMT-13"="Etc/GMT-13 +13:00", + "Etc/GMT-14"="Etc/GMT-14 +14:00", + "Etc/GMT-2"="Etc/GMT-2 +02:00", + "Etc/GMT-3"="Etc/GMT-3 +03:00", + "Etc/GMT-4"="Etc/GMT-4 +04:00", + "Etc/GMT-5"="Etc/GMT-5 +05:00", + "Etc/GMT-6"="Etc/GMT-6 +06:00", + "Etc/GMT-7"="Etc/GMT-7 +07:00", + "Etc/GMT-8"="Etc/GMT-8 +08:00", + "Etc/GMT-9"="Etc/GMT-9 +09:00", + "Etc/GMT+1"="Etc/GMT+1 −01:00", + "Etc/GMT+10"="Etc/GMT+10 −10:00", + "Etc/GMT+11"="Etc/GMT+11 −11:00", + "Etc/GMT+12"="Etc/GMT+12 −12:00", + "Etc/GMT+2"="Etc/GMT+2 −02:00", + "Etc/GMT+3"="Etc/GMT+3 −03:00", + "Etc/GMT+4"="Etc/GMT+4 −04:00", + "Etc/GMT+5"="Etc/GMT+5 −05:00", + "Etc/GMT+6"="Etc/GMT+6 −06:00", + "Etc/GMT+7"="Etc/GMT+7 −07:00", + "Etc/GMT+8"="Etc/GMT+8 −08:00", + "Etc/GMT+9"="Etc/GMT+9 −09:00", + "Etc/UTC"="Etc/UTC +00:00", + "Europe/Amsterdam"="Europe/Amsterdam +01:00", + "Europe/Andorra"="Europe/Andorra +01:00", + "Europe/Astrakhan"="Europe/Astrakhan +04:00", + "Europe/Athens"="Europe/Athens +02:00", + "Europe/Belgrade"="Europe/Belgrade +01:00", + "Europe/Berlin"="Europe/Berlin +01:00", + "Europe/Brussels"="Europe/Brussels +01:00", + "Europe/Bucharest"="Europe/Bucharest +02:00", + "Europe/Budapest"="Europe/Budapest +01:00", + "Europe/Chisinau"="Europe/Chisinau +02:00", + "Europe/Copenhagen"="Europe/Copenhagen +01:00", + "Europe/Dublin"="Europe/Dublin +00:00", + "Europe/Gibraltar"="Europe/Gibraltar +01:00", + "Europe/Helsinki"="Europe/Helsinki +02:00", + "Europe/Istanbul"="Europe/Istanbul +03:00", + "Europe/Kaliningrad"="Europe/Kaliningrad +02:00", + "Europe/Kiev"="Europe/Kiev +02:00", + "Europe/Kirov"="Europe/Kirov +03:00", + "Europe/Lisbon"="Europe/Lisbon +00:00", + "Europe/London"="Europe/London +00:00", + "Europe/Luxembourg"="Europe/Luxembourg +01:00", + "Europe/Madrid"="Europe/Madrid +01:00", + "Europe/Malta"="Europe/Malta +01:00", + "Europe/Minsk"="Europe/Minsk +03:00", + "Europe/Monaco"="Europe/Monaco +01:00", + "Europe/Moscow"="Europe/Moscow +03:00", + "Europe/Oslo"="Europe/Oslo +01:00", + "Europe/Paris"="Europe/Paris +01:00", + "Europe/Prague"="Europe/Prague +01:00", + "Europe/Riga"="Europe/Riga +02:00", + "Europe/Rome"="Europe/Rome +01:00", + "Europe/Samara"="Europe/Samara +04:00", + "Europe/Saratov"="Europe/Saratov +04:00", + "Europe/Simferopol"="Europe/Simferopol +03:00", + "Europe/Sofia"="Europe/Sofia +02:00", + "Europe/Stockholm"="Europe/Stockholm +01:00", + "Europe/Tallinn"="Europe/Tallinn +02:00", + "Europe/Tirane"="Europe/Tirane +01:00", + "Europe/Ulyanovsk"="Europe/Ulyanovsk +04:00", + "Europe/Uzhgorod"="Europe/Uzhgorod +02:00", + "Europe/Vienna"="Europe/Vienna +01:00", + "Europe/Vilnius"="Europe/Vilnius +02:00", + "Europe/Volgograd"="Europe/Volgograd +04:00", + "Europe/Warsaw"="Europe/Warsaw +02:00", + "Europe/Zaporozhye"="Europe/Zaporozhye +02:00", + "Europe/Zurich"="Europe/Zurich +01:00", + "Indian/Chagos"="Indian/Chagos +06:00", + "Indian/Christmas"="Indian/Christmas +07:00", + "Indian/Cocos"="Indian/Cocos +06:30", + "Indian/Kerguelen"="Indian/Kerguelen +05:00", + "Indian/Mahe"="Indian/Mahe +04:00", + "Indian/Maldives"="Indian/Maldives +05:00", + "Indian/Mauritius"="Indian/Mauritius +04:00", + "Indian/Reunion"="Indian/Reunion +04:00", + "Pacific/Apia"="Pacific/Apia +13:00", + "Pacific/Auckland"="Pacific/Auckland +12:00", + "Pacific/Bougainville"="Pacific/Bougainville +11:00", + "Pacific/Chatham"="Pacific/Chatham +12:45", + "Pacific/Chuuk"="Pacific/Chuuk +10:00", + "Pacific/Easter"="Pacific/Easter −06:00", + "Pacific/Efate"="Pacific/Efate +11:00", + "Pacific/Enderbury"="Pacific/Enderbury +13:00", + "Pacific/Fakaofo"="Pacific/Fakaofo +13:00", + "Pacific/Fiji"="Pacific/Fiji +12:00", + "Pacific/Funafuti"="Pacific/Funafuti +12:00", + "Pacific/Galapagos"="Pacific/Galapagos −06:00", + "Pacific/Gambier"="Pacific/Gambier −09:00", + "Pacific/Guadalcanal"="Pacific/Guadalcanal +11:00", + "Pacific/Guam"="Pacific/Guam +10:00", + "Pacific/Honolulu"="Pacific/Honolulu −10:00", + "Pacific/Kiritimati"="Pacific/Kiritimati +14:00", + "Pacific/Kosrae"="Pacific/Kosrae +11:00", + "Pacific/Kwajalein"="Pacific/Kwajalein +12:00", + "Pacific/Majuro"="Pacific/Majuro +12:00", + "Pacific/Marquesas"="Pacific/Marquesas −09:30", + "Pacific/Nauru"="Pacific/Nauru +12:00", + "Pacific/Niue"="Pacific/Niue −11:00", + "Pacific/Norfolk"="Pacific/Norfolk +11:00", + "Pacific/Noumea"="Pacific/Noumea +11:00", + "Pacific/Pago_Pago"="Pacific/Pago_Pago −11:00", + "Pacific/Palau"="Pacific/Palau +09:00", + "Pacific/Pitcairn"="Pacific/Pitcairn −08:00", + "Pacific/Pohnpei"="Pacific/Pohnpei +11:00", + "Pacific/Port_Moresby"="Pacific/Port_Moresby +10:00", + "Pacific/Rarotonga"="Pacific/Rarotonga −10:00", + "Pacific/Tahiti"="Pacific/Tahiti −10:00", + "Pacific/Tarawa"="Pacific/Tarawa +12:00", + "Pacific/Tongatapu"="Pacific/Tongatapu +13:00", + "Pacific/Wake"="Pacific/Wake +12:00", + "Pacific/Wallis"="Pacific/Wallis +12:00" + ] + } + } + Text item=InfoPage label="Info" { + Frame label="Network" { + Text item=Network_WAN_IP + Text item=Network_WLAN_IP + Text item=Network_SSID + Text item=Network_WLAN_INFO + Text item=Network_WLAN_MAC + } + Frame label="System" { + Text item=System_CPU_TEMP + Text item=System_CPU_LOAD + Text item=System_CPU_UPTIME + Text item=System_Used_Space + Text item=System_TZ } } } diff --git a/etc/openhab2/sitemaps/readme.txt b/etc/openhab2/sitemaps/readme.txt index 67b909da22f461e89386ec9c835a9cd44c1ed957..85c7a47b781307014dac28fee6233ddf3228cb4d 100644 --- a/etc/openhab2/sitemaps/readme.txt +++ b/etc/openhab2/sitemaps/readme.txt @@ -2,4 +2,4 @@ Your sitemap definitions go here. All sitemap files have to have the ".sitemap" file extension and must follow a special syntax. Check out the openHAB documentation for more details: -http://docs.openhab.org/features/sitemap.html +https://www.openhab.org/docs/configuration/sitemaps.html diff --git a/etc/openhab2/things/default.things b/etc/openhab2/things/default.things index da490dd10a195056508bb875265bbfac7ac1dd5c..e8afee5b6475b2548948661c2c443e2fedb3800b 100755 --- a/etc/openhab2/things/default.things +++ b/etc/openhab2/things/default.things @@ -17,4 +17,139 @@ Thing exec:command:getwifiinfo [ command="/home/pi/scripts/getwifiinfo.sh", inte Thing exec:command:getcputemperature [ command="/home/pi/scripts/getcputemperature.sh", interval=600, timeout=20 ] Thing exec:command:getuseddiskspace [ command="/home/pi/scripts/getuseddiskspace.sh", interval=600, timeout=20 ] +Thing exec:command:getuptime "Uptime" [command="/home/pi/scripts/getuptime.sh", interval=300, timeout=15, autorun=false] +Thing exec:command:getcpuload "CPU Load" [command="/home/pi/scripts/getcpuload.sh", interval=60, timeout=15, autorun=false] Thing exec:command:gettz [ command="/home/pi/scripts/gettz.sh", interval=600, timeout=20 ] + +Thing exec:command:gettempunit "gettempunit" [command="/home/pi/scripts/gettempunit.sh", interval=0, timeout=15, autorun=true] +Thing exec:command:gethumiditymode "gethumiditymode" [command="/home/pi/scripts/gethumiditymode.sh", interval=0, timeout=15, autorun=true] +Thing exec:command:getsystemtype "getsystemtype" [command="/home/pi/scripts/getsystemtype.sh", interval=0, timeout=15, autorun=true] +Thing exec:command:getseason "getseason" [command="/home/pi/scripts/getseason.sh", interval=0, timeout=15, autorun=true] + +Thing exec:command:rebootcommand "Reboot" [command="/home/pi/scripts/reboot.sh", interval=0, timeout=15, autorun=false] +Thing exec:command:shutdowncommand "Shutdown" [command="/home/pi/scripts/shutdown.sh", interval=0, timeout=15, autorun=false] +Thing exec:command:backupcommand "Backup" [command="/home/pi/scripts/backup.sh", interval=0, timeout=120, autorun=false] +Thing exec:command:getbackuptimestampcommand [command="/home/pi/scripts/getbackuptimestamp.sh", interval=0, timeout=150, autorun=false] +Thing exec:command:restorecommand "Restore" [command="/home/pi/scripts/restore.sh &", interval=0, timeout=120, autorun=false] + +Bridge mqtt:broker:mosquitto "Mosquitto MQTT Broker" [ host="localhost", secure=false, port=1883, clientID="mosquitto"] +{ + + Thing topic HeatingPin { + Channels: + Type switch : switch "HeatingPin Switch" [ + commandTopic="hestia/local/cmnd/heatingstate/POWER", + stateTopic="hestia/local/stat/heatingstate/power", + on="ON", + off="OFF" + ] + } + + Thing topic Heating2Pin { + Channels: + Type switch : switch "Heating2Pin Switch" [ + commandTopic="hestia/local/cmnd/heating2state/POWER", + stateTopic="hestia/local/stat/heating2state/power", + on="ON", + off="OFF" + ] + } + + Thing topic CoolingPin { + Channels: + Type switch : switch "CoolingPin Switch" [ + commandTopic="hestia/local/cmnd/coolingstate/POWER", + stateTopic="hestia/local/stat/coolingstate/power", + on="ON", + off="OFF" + ] + } + + Thing topic FanPin { + Channels: + Type switch : switch "FanPin Switch" [ + commandTopic="hestia/local/cmnd/fanstate/POWER", + stateTopic="hestia/local/stat/fanstate/power", + on="ON", + off="OFF" + ] + } + + Thing topic HumidityPin { + Channels: + Type switch : switch "HumidityPin Switch" [ + commandTopic="hestia/local/cmnd/humiditystate/POWER", + stateTopic="hestia/local/stat/humiditystate/power", + on="ON", + off="OFF" + ] + } + + // HumiTopic for syncing with incoming external button commands + Thing topic HumiTopic { + Channels: + Type string : string "HumiTopic" [ + commandTopic="hestia/local/cmnd/humiditystate/POWER", + stateTopic="hestia/local/stat/humiditystate/power" + ] + } + + Thing topic HotWaterPin { + Channels: + Type switch : switch "HotWaterPin Switch" [ + commandTopic="hestia/local/cmnd/hotwaterstate/POWER", + stateTopic="hestia/local/stat/hotwaterstate/power", + on="ON", + off="OFF" + ] + } + + // MyTempProxy + Thing topic MyTempProxy { + Channels: + Type number : temperature "MyTempProxy" [ + commandTopic="hestia/local/temperature" + ] + } + + // MyHumiProxy + Thing topic MyHumiProxy { + Channels: + Type number : humidity "MyHumiProxy" [ + commandTopic="hestia/local/humidity" + ] + } + + // MyPressureProxy + Thing topic MyPressureProxy { + Channels: + Type number : pressure "MyPressureProxy" [ + commandTopic="hestia/local/pressure" + ] + } + + // TempSetpoint +// Thing topic TempSetpoint { +// Channels: +// Type number : temperature "TempSetpoint" [ +// commandTopic="hestia/local/tempsetpoint", +// stateTopic="hestia/local/settempsetpoint" +// ] +// } + + // HumiSetpoint +// Thing topic HumiSetpoint { +// Channels: +// Type number : humidity "HumiSetpoint" [ +// commandTopic="hestia/local/humisetpoint" +// ] +// } + + Thing topic FanMode { + Channels: + Type string : string "FanMode" [ + commandTopic="hestia/local/cmnd/fanmode", + stateTopic="hestia/local/stat/fanmode" + ] + } +} diff --git a/etc/openhab2/things/readme.txt b/etc/openhab2/things/readme.txt index cab49147f76eeacbaabf8401474e1d2dcc3f1746..27b66899449ecea2b73e88e91cf81c53ec22a1c0 100644 --- a/etc/openhab2/things/readme.txt +++ b/etc/openhab2/things/readme.txt @@ -2,4 +2,4 @@ Your thing definitions go here. All thing files have to have the ".things" file extension and must follow a special syntax. Check out the openHAB documentation for more details: -http://docs.openhab.org/configuration/things.html +https://www.openhab.org/docs/configuration/things.html diff --git a/etc/openhab2/transform/readme.txt b/etc/openhab2/transform/readme.txt index 717dda95c9b4784edb56f2e6cf08ddb082e12ee0..6933c161081bbe499b5335d49fafe02caeee6e84 100644 --- a/etc/openhab2/transform/readme.txt +++ b/etc/openhab2/transform/readme.txt @@ -2,4 +2,4 @@ Transformations like map or jsonpath can utilize configuration files with data d These files have their specific file extensions and syntax definition. Check out the openHAB documentation for more details: -http://docs.openhab.org/addons/transformations.html +https://www.openhab.org/docs/configuration/transformations.html diff --git a/home/pi/scripts/C2F.sh b/home/pi/scripts/C2F.sh old mode 100644 new mode 100755 index 975548dd60313363e6f173ee22e2cd0487545b17..89e3d1c1fc4759a2e9833c61bf5c06431487ec9d --- a/home/pi/scripts/C2F.sh +++ b/home/pi/scripts/C2F.sh @@ -2,9 +2,11 @@ rm -f "/home/pi/scripts/bme280.py"; cp /home/pi/scripts/bme280F.py /home/pi/scripts/bme280.py; - -sed -i 's/\/\/FAHRENHEIT/\/**FAHRENHEIT*\//g' /etc/openhab2/sitemaps/default.sitemap; -sed -i 's/\/\*\*CELSIUS\*\//\/\/CELSIUS/g' /etc/openhab2/sitemaps/default.sitemap; -sed -i 's/\/\/FAHRENHEIT/\/**FAHRENHEIT*\//g' /etc/openhab2/rules/default.rules; -sed -i 's/\/\*\*CELSIUS\*\//\/\/CELSIUS/g' /etc/openhab2/rules/default.rules; -sed -i 's/1f °C/0f °F/g' /etc/openhab2/items/default.items; +#sed -i 's/\/\/FAHRENHEIT/\/**FAHRENHEIT*\//g' /etc/openhab2/sitemaps/default.sitemap; +#sed -i 's/\/\*\*CELSIUS\*\//\/\/CELSIUS/g' /etc/openhab2/sitemaps/default.sitemap; +#sed -i 's/\/\/FAHRENHEIT/\/**FAHRENHEIT*\//g' /etc/openhab2/rules/default.rules; +#sed -i 's/\/\*\*CELSIUS\*\//\/\/CELSIUS/g' /etc/openhab2/rules/default.rules; +#sed -i 's/1f °C/0f °F/g' /etc/openhab2/items/default.items; +touch /home/pi/scripts/tempunit; +echo F > /home/pi/scripts/tempunit; +exit; diff --git a/home/pi/scripts/F2C.sh b/home/pi/scripts/F2C.sh old mode 100644 new mode 100755 index 9a1e2ebfd25432c76faeb4c89f91d37d85ec9c07..36760fd08fc80429100eab7c0628cae94f02a1d3 --- a/home/pi/scripts/F2C.sh +++ b/home/pi/scripts/F2C.sh @@ -2,11 +2,11 @@ rm -f "/home/pi/scripts/bme280.py"; cp /home/pi/scripts/bme280C.py /home/pi/scripts/bme280.py; - -#rm -f "/etc/openhab2/sitemaps/default.sitemap"; -#cp /home/pi/scripts/defaultC.sitemap /etc/openhab2/sitemaps/default.sitemap; -sed -i 's/\/\/CELSIUS/\/**CELSIUS*\//g' /etc/openhab2/sitemaps/default.sitemap; -sed -i 's/\/\*\*FAHRENHEIT\*\//\/\/FAHRENHEIT/g' /etc/openhab2/sitemaps/default.sitemap; -sed -i 's/\/\/CELSIUS/\/**CELSIUS*\//g' /etc/openhab2/rules/default.rules; -sed -i 's/\/\*\*FAHRENHEIT\*\//\/\/FAHRENHEIT/g' /etc/openhab2/rules/default.rules; -sed -i 's/0f °F/1f °C/g' /etc/openhab2/items/default.items; +#sed -i 's/\/\/CELSIUS/\/**CELSIUS*\//g' /etc/openhab2/sitemaps/default.sitemap; +#sed -i 's/\/\*\*FAHRENHEIT\*\//\/\/FAHRENHEIT/g' /etc/openhab2/sitemaps/default.sitemap; +#sed -i 's/\/\/CELSIUS/\/**CELSIUS*\//g' /etc/openhab2/rules/default.rules; +#sed -i 's/\/\*\*FAHRENHEIT\*\//\/\/FAHRENHEIT/g' /etc/openhab2/rules/default.rules; +#sed -i 's/0f °F/1f °C/g' /etc/openhab2/items/default.items; +touch /home/pi/scripts/tempunit; +echo C > /home/pi/scripts/tempunit; +exit; diff --git a/home/pi/scripts/HVACDisable.sh b/home/pi/scripts/HVACDisable.sh deleted file mode 100644 index c7511a2388730c3c63288e20f1a20b72ca5eaaa4..0000000000000000000000000000000000000000 --- a/home/pi/scripts/HVACDisable.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -if [ ! -f /home/pi/scripts/default.hvac.sitemap ]; then - cp /etc/openhab2/sitemaps/default.sitemap /home/pi/scripts/default.hvac.sitemap; -fi -cp /home/pi/scripts/default.nohvac.sitemap /etc/openhab2/sitemaps/default.sitemap; - -if [ ! -f /home/pi/scripts/default.hvac.rules ]; then - cp /etc/openhab2/rules/default.rules /home/pi/scripts/default.hvac.rules; -fi -cp /home/pi/scripts/default.nohvac.rules /etc/openhab2/rules/default.rules; - -if [ ! -f /home/pi/scripts/default.hvac.items ]; then - cp /etc/openhab2/items/default.items /home/pi/scripts/default.hvac.items; -fi -cp /home/pi/scripts/default.nohvac.items /etc/openhab2/items/default.items; - -if [ ! -f /home/pi/scripts/habpanel.hvac.config ]; then - cp /var/lib/openhab2/config/org/openhab/habpanel.config /home/pi/scripts/habpanel.hvac.config; -fi -sudo cp /home/pi/scripts/habpanel.nohvac.config /var/lib/openhab2/config/org/openhab/habpanel.config - -cp /home/pi/scripts/bme280C.py /home/pi/scripts/bme280.py; -sudo reboot; diff --git a/home/pi/scripts/HVACEnable.sh b/home/pi/scripts/HVACEnable.sh deleted file mode 100644 index f5d0a3298fb0edea4a6ed26d2d6ee6857df436c7..0000000000000000000000000000000000000000 --- a/home/pi/scripts/HVACEnable.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -if [ ! -f /home/pi/scripts/default.nohvac.sitemap ]; then - cp /etc/openhab2/sitemaps/default.sitemap /home/pi/scripts/default.nohvac.sitemap; -fi -cp /home/pi/scripts/default.hvac.sitemap /etc/openhab2/sitemaps/default.sitemap; - -if [ ! -f /home/pi/scripts/default.nohvac.rules ]; then - cp /etc/openhab2/rules/default.rules /home/pi/scripts/default.nohvac.rules; -fi -cp /home/pi/scripts/default.hvac.rules /etc/openhab2/rules/default.rules; - -if [ ! -f /home/pi/scripts/default.nohvac.items ]; then - cp /etc/openhab2/items/default.items /home/pi/scripts/default.nohvac.items; -fi -cp /home/pi/scripts/default.hvac.items /etc/openhab2/items/default.items; - -if [ ! -f /home/pi/scripts/habpanel.nohvac.config ]; then - cp /var/lib/openhab2/config/org/openhab/habpanel.config /home/pi/scripts/habpanel.nohvac.config; -fi -sudo cp /home/pi/scripts/habpanel.hvac.config /var/lib/openhab2/config/org/openhab/habpanel.config - -cp /home/pi/scripts/bme280F.py /home/pi/scripts/bme280.py; -sudo reboot; diff --git a/home/pi/scripts/backup.sh b/home/pi/scripts/backup.sh new file mode 100755 index 0000000000000000000000000000000000000000..4a55aa2bbe3445b9578637e07c0a9647d7b38c98 --- /dev/null +++ b/home/pi/scripts/backup.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +sudo openhab-cli backup /home/pi/scripts/backup; +exit; diff --git a/home/pi/scripts/default.hvac.items b/home/pi/scripts/default.hvac.items deleted file mode 100644 index 469693278ef19c987b9e36bc78760a69f5509150..0000000000000000000000000000000000000000 --- a/home/pi/scripts/default.hvac.items +++ /dev/null @@ -1,52 +0,0 @@ -Group charts -Group chart_temp -Group chart_humi - -Switch HeatingPin "Heating" { gpio="pin:12", mqtt=">[mosquitto:hestia/local/heatingstate:command:ON:1],>[mosquitto:hestia/local/heatingstate:command:OFF:0],<[mosquitto:hestia/local/heatingstate:state:MAP(binary.map)]" } -Switch CoolingPin "Cooling" { gpio="pin:23", mqtt=">[mosquitto:hestia/local/coolingstate:command:ON:1],>[mosquitto:hestia/local/coolingstate:command:OFF:0],<[mosquitto:hestia/local/coolingstate:state:MAP(binary.map)]" } -Switch FanPin "Fan" { gpio="pin:18", mqtt=">[mosquitto:hestia/local/fanstate:command:ON:1],>[mosquitto:hestia/local/fanstate:command:OFF:0],<[mosquitto:hestia/local/fanstate:state:MAP(binary.map)]" } - -String MyTemp "Temperature" <temperature> { channel="exec:command:gettemp:output" } -Number MyTempProxy "Temperature [%.0f °F]" <temperature> { mqtt=">[mosquitto:hestia/local/temperature:state:*:default]" } - -String MyHumi "Humidity" <humidity> { channel="exec:command:gethumi:output" } -Number MyHumiProxy "Humidity [%.0f %%]" <humidity> { mqtt=">[mosquitto:hestia/local/humidity:state:*:default]" } - - -Number TempMaxSetpoint "Temperature Max Setpoint[%.0f °F]" { mqtt=">[mosquitto:hestia/local/tempmaxsetpoint:state:*:default],<[mosquitto:hestia/local/settempmaxsetpoint:state:default]"} -Number TempMaxSetpointChart "Temperature Max Setpoint" (charts, chart_temp) -Switch IncTargetTempMax "IncTargetTempMax" -Switch DecTargetTempMax "DecTargetTempMax" -Number TargetTempMax - -Number PreviousTempReading "Temperature" <temperature> (charts, chart_temp) - -Number TempMinSetpoint "Temperature Min Setpoint[%.0f °F]" { mqtt=">[mosquitto:hestia/local/tempminsetpoint:state:*:default],<[mosquitto:hestia/local/settempminsetpoint:state:default]"} -Number TempMinSetpointChart "Temperature Min Setpoint" (charts, chart_temp) -Switch IncTargetTempMin "IncTargetTempMin" -Switch DecTargetTempMin "DecTargetTempMin" -Number TargetTempMin - -Number PreviousHumiReading "Humidity" <humidity> (charts, chart_humi) - -String HeatingMode "Heating Mode" -String CoolingMode "Cooling Mode" -String FanMode "Fan Mode" -Switch MainSwitch "MainSwitch" - -// To choose a proper chart period in a sitemap -// mappings=[0="Day", 1="Week", 2="Month", 3="Year"] -Number chart_period "Period" - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SETTINGS START /////////////////////////////////////////////////////////////////////////////////////////////// -String Network_WAN_IP "WAN IP address [%s]" <network> (Network) { http="<[http://icanhazip.com:600000:REGEX((.*?))]" } -String Network_WLAN_IP { channel="exec:command:getwlanip:output" } -String Network_WLAN_MAC { channel="exec:command:getwlanmac:output" } -String Network_SSID { channel="exec:command:getssid:output" } -String Network_WLAN_INFO { channel="exec:command:getwifiinfo:output" } -String System_CPU_TEMP { channel="exec:command:getcputemperature:output" } -String System_Used_Space { channel="exec:command:getuseddiskspace:output" } -String System_TZ { channel="exec:command:gettz:output" } -// SETTINGS END ///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/home/pi/scripts/default.hvac.rules b/home/pi/scripts/default.hvac.rules deleted file mode 100644 index 14b153e37bf726c09a57ecf8b1b35d963feeb752..0000000000000000000000000000000000000000 --- a/home/pi/scripts/default.hvac.rules +++ /dev/null @@ -1,236 +0,0 @@ -import org.openhab.model.script.actions.Timer - -var String HeatingPreviousMode = "OFF" -var String CoolingPreviousMode = "OFF" -var String FanPreviousMode = "OFF" - -rule "Initialisation" -when - System started -then - MainSwitch.sendCommand("OFF") - HeatingMode.sendCommand("OFF") - CoolingMode.sendCommand("OFF") - FanMode.sendCommand("OFF") - //CELSIUS if(TempMinSetpoint.state == NULL) postUpdate(TempMinSetpoint, 16) - //CELSIUS if(TempMinSetpoint.state > 40) postUpdate(TempMinSetpoint, 16) - /**FAHRENHEIT*/ if(TempMinSetpoint.state == NULL) postUpdate(TempMinSetpoint, 68) - /**FAHRENHEIT*/ if(TempMinSetpoint.state < 32) postUpdate(TempMinSetpoint, 68) - - //CELSIUS if(TempMaxSetpoint.state == NULL) postUpdate(TempMaxSetpoint, 18) - //CELSIUS if(TempMaxSetpoint.state > 40) postUpdate(TempMaxSetpoint, 18) - /**FAHRENHEIT*/ if(TempMaxSetpoint.state == NULL) postUpdate(TempMaxSetpoint, 72) - /**FAHRENHEIT*/ if(TempMaxSetpoint.state < 32) postUpdate(TempMaxSetpoint, 72) - - TempMinSetpointChart.sendCommand(0); - TempMaxSetpointChart.sendCommand(0); - PreviousTempReading.sendCommand(0); - PreviousHumiReading.sendCommand(0); - chart_period.sendCommand(0); -end - -rule "convertproxy" -when - Item MyTemp changed or - Item MyHumi changed -then - MyTempProxy.postUpdate(Double::parseDouble(MyTemp.state.toString)) - MyHumiProxy.postUpdate(Double::parseDouble(MyHumi.state.toString)) - //CELSIUS if ((Double::parseDouble(MyTemp.state.toString) < (Double::parseDouble(PreviousTempReading.state.toString)) - 0.2) || (Double::parseDouble(MyTemp.state.toString) > (Double::parseDouble(PreviousTempReading.state.toString)) + 0.2)) { - PreviousTempReading.postUpdate(Double::parseDouble(MyTemp.state.toString)) - //CELSIUS } - if((Double::parseDouble(MyHumi.state.toString) < (Double::parseDouble(PreviousHumiReading.state.toString)) - 0.4) || (Double::parseDouble(MyHumi.state.toString) > (Double::parseDouble(PreviousHumiReading.state.toString)) + 0.4)) { - PreviousHumiReading.postUpdate(Double::parseDouble(MyHumi.state.toString)) - } -end - -rule "SetTempMinSetpointInc" -when - Item IncTargetTempMin changed -then - if (TempMinSetpoint.state < TempMaxSetpoint.state) { - var Number minSetpoint = TempMinSetpoint.state as DecimalType - //CELSIUS minSetpoint = minSetpoint + 0.5 - /**FAHRENHEIT*/ minSetpoint = minSetpoint + 1 - TempMinSetpoint.sendCommand(minSetpoint) //postUpdate(TempMinSetpoint, minSetpoint) - TempMinSetpointChart.sendCommand(minSetpoint) - } -end - -rule "SetTempMinSetpointDec" -when - Item DecTargetTempMin changed -then - var Number minSetpoint = TempMinSetpoint.state as DecimalType - //CELSIUS minSetpoint = minSetpoint - 0.5 - /**FAHRENHEIT*/ minSetpoint = minSetpoint - 1 - TempMinSetpoint.sendCommand(minSetpoint) //postUpdate(TempMinSetpoint, minSetpoint) - TempMinSetpointChart.sendCommand(minSetpoint) -end - -rule "SetTempMaxSetpointInc" -when - Item IncTargetTempMax changed -then - var Number maxSetpoint = TempMaxSetpoint.state as DecimalType - //CELSIUS maxSetpoint = maxSetpoint + 0.5 - /**FAHRENHEIT*/ maxSetpoint = maxSetpoint + 1 - TempMaxSetpoint.sendCommand(maxSetpoint) //postUpdate(TempMaxSetpoint, maxSetpoint) - TempMaxSetpointChart.sendCommand(maxSetpoint) -end - -rule "SetTempMaxSetpointDec" -when - Item DecTargetTempMax changed -then - if (TempMinSetpoint.state < TempMaxSetpoint.state) { - var Number maxSetpoint = TempMaxSetpoint.state as DecimalType - //CELSIUS maxSetpoint = maxSetpoint - 0.5 - /**FAHRENHEIT*/ maxSetpoint = maxSetpoint - 1 - TempMaxSetpoint.sendCommand(maxSetpoint) //postUpdate(TempMaxSetpoint, maxSetpoint) - TempMaxSetpointChart.sendCommand(maxSetpoint) - } -end - -rule "BlockSetpointOverlapUp" -when - Item TempMinSetpoint changed -then - if (TempMinSetpoint.state > TempMaxSetpoint.state) { - TempMaxSetpoint.sendCommand(TempMinSetpoint.state as DecimalType) - } -end - -rule "BlockSetpointOverlapDown" -when - Item TempMaxSetpoint changed -then - if (TempMinSetpoint.state > TempMaxSetpoint.state) { - TempMinSetpoint.sendCommand(TempMaxSetpoint.state as DecimalType) - } -end - -rule "checkcurrtemp" -when - Item TempMinSetpoint changed or - Item TempMaxSetpoint changed or - Item PreviousTempReading changed -then - if(MyTempProxy.state > TempMinSetpoint.state) { - HeatingPin.sendCommand(OFF) - TempMinSetpointChart.sendCommand(0) - } - else if((MyTempProxy.state < TempMinSetpoint.state) && (HeatingMode.state=="ON")) { - HeatingPin.sendCommand(ON) - FanPin.sendCommand(ON) - TempMinSetpointChart.sendCommand(TempMinSetpoint.state as DecimalType) - } - if(MyTempProxy.state < TempMaxSetpoint.state) { - CoolingPin.sendCommand(OFF) - TempMaxSetpointChart.sendCommand(0) - } - else if((MyTempProxy.state > TempMaxSetpoint.state) && (CoolingMode.state=="ON")) { - CoolingPin.sendCommand(ON) - FanPin.sendCommand(ON) - TempMaxSetpointChart.sendCommand(TempMaxSetpoint.state as DecimalType) - } - if((MyTempProxy.state > TempMinSetpoint.state) && (MyTempProxy.state < TempMaxSetpoint.state)) { - FanPin.sendCommand(OFF) - } -end - -/* -rule "checkcurrhumi" -when - Item HumiSetpoint changed or - Item PreviousHumiReading changed -then - if(MyHumiProxy.state < HumiSetpoint.state){ - HumidityPin18.sendCommand(OFF) - HumiSetpointChart.sendCommand(0) - } - else if((MyHumiProxy.state > HumiSetpoint.state) && ((HumiMode.state=="ON") || (HumiMode.state=="Boost"))) { - HumidityPin18.sendCommand(ON) - HumiSetpointChart.sendCommand(HumiSetpoint.state as DecimalType) - } -end -*/ - -rule "Heating Mode" -when - Item HeatingMode changed -then - switch(HeatingMode.state) { - case "ON": { - if(MyTempProxy.state < TempMinSetpoint.state) { - HeatingPin.sendCommand(ON) - FanPin.sendCommand(ON) - TempMinSetpointChart.sendCommand(TempMinSetpoint.state as DecimalType) - } - MainSwitch.sendCommand("ON") - CoolingMode.sendCommand("OFF") - HeatingPreviousMode="ON" - } - case "OFF": { - HeatingPin.sendCommand(OFF) - TempMinSetpointChart.sendCommand(0) - HeatingPreviousMode="OFF" - } - case "Schedule": { - HeatingPin.sendCommand(OFF) - TempMinSetpointChart.sendCommand(0) - MainSwitch.sendCommand("ON") - HeatingPreviousMode="Schedule" - } - } -end - -rule "Cooling Mode" -when - Item CoolingMode changed -then - switch(CoolingMode.state) { - case "ON": { - if(MyTempProxy.state > TempMaxSetpoint.state) { - CoolingPin.sendCommand(ON) - FanPin.sendCommand(ON) - TempMaxSetpointChart.sendCommand(TempMaxSetpoint.state as DecimalType) - } - MainSwitch.sendCommand("ON") - HeatingMode.sendCommand("OFF") - CoolingPreviousMode="ON" - } - case "OFF": { - CoolingPin.sendCommand(OFF) - TempMaxSetpointChart.sendCommand(0) - CoolingPreviousMode="OFF" - } - case "Schedule": { - CoolingPin.sendCommand(OFF) - TempMaxSetpointChart.sendCommand(0) - MainSwitch.sendCommand("ON") - CoolingPreviousMode="Schedule" - } - } -end - - -rule "MainSwitch" -when - Item MainSwitch changed -then - switch(MainSwitch.state) { - case ON:{ - // Do nothing - } - case OFF:{ - if (HeatingMode.state == "ON") { - HeatingPreviousMode = "ON" - HeatingMode.sendCommand("OFF") - } else if (HeatingMode.state == "Schedule") { - HeatingPreviousMode="Schedule" - HeatingMode.sendCommand("OFF") - } - } - } -end diff --git a/home/pi/scripts/default.hvac.sitemap b/home/pi/scripts/default.hvac.sitemap deleted file mode 100644 index 8268a8e391740c02a50c08d07d1d03a501c8afaf..0000000000000000000000000000000000000000 --- a/home/pi/scripts/default.hvac.sitemap +++ /dev/null @@ -1,29 +0,0 @@ -sitemap default label="Thermostat" { - Frame label="Temperature" { - Switch item=HeatingMode mappings=[ "ON"="ON", "OFF"="OFF"/*, "Schedule"="SCHEDULE"*/] - Switch item=CoolingMode mappings=[ "ON"="ON", "OFF"="OFF"/*, "Schedule"="SCHEDULE"*/] - Text item=MyHumiProxy - Text item=MyTempProxy - //Setpoint item=HeatingBoostTime minValue=10 maxValue=1440 step=10 icon="clock" - //CELSIUS Setpoint item=TempMaxSetpoint minValue=0 maxValue=40 step=0.5 icon="temperature" - /**FAHRENHEIT*/ Setpoint item=TempMaxSetpoint minValue=32 maxValue=90 step=1 icon="temperature" - //CELSIUS Setpoint item=TempMinSetpoint minValue=0 maxValue=40 step=0.5 icon="temperature" - /**FAHRENHEIT*/ Setpoint item=TempMinSetpoint minValue=32 maxValue=90 step=1 icon="temperature" - } - Frame label="History" { - Group item=charts label="Charts" icon="chart" { - Frame { - Switch item=chart_period label="Period" mappings=[0="Day", 1="Week", 2="Month", 3="Year"] - Chart item=chart_temp period=D refresh=120000 visibility=[chart_period==0, chart_period=="Uninitialized"] - Chart item=chart_temp period=W refresh=120000 visibility=[chart_period==1] - Chart item=chart_temp period=M refresh=120000 visibility=[chart_period==2] - Chart item=chart_temp period=Y refresh=120000 visibility=[chart_period==3] - - Chart item=chart_humi period=D refresh=120000 visibility=[chart_period==0, chart_period=="Uninitialized"] - Chart item=chart_humi period=W refresh=120000 visibility=[chart_period==1] - Chart item=chart_humi period=M refresh=120000 visibility=[chart_period==2] - Chart item=chart_humi period=Y refresh=120000 visibility=[chart_period==3] - } - } - } -} diff --git a/home/pi/scripts/getbackuptimestamp.sh b/home/pi/scripts/getbackuptimestamp.sh new file mode 100755 index 0000000000000000000000000000000000000000..02deaa87e75bb73afe5efe5a5595a83c504293f8 --- /dev/null +++ b/home/pi/scripts/getbackuptimestamp.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +date -r /home/pi/scripts/backup.zip; +exit; diff --git a/home/pi/scripts/getcpuload.sh b/home/pi/scripts/getcpuload.sh new file mode 100755 index 0000000000000000000000000000000000000000..68932cb0b6608e204491065e8889d5539c9bafc3 --- /dev/null +++ b/home/pi/scripts/getcpuload.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] diff --git a/home/pi/scripts/gethumiditymode.sh b/home/pi/scripts/gethumiditymode.sh new file mode 100755 index 0000000000000000000000000000000000000000..cfee908f3f1120f6af1b609d13b9878a189f46c8 --- /dev/null +++ b/home/pi/scripts/gethumiditymode.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cat /home/pi/scripts/humiditymode +exit; diff --git a/home/pi/scripts/getseason.sh b/home/pi/scripts/getseason.sh new file mode 100755 index 0000000000000000000000000000000000000000..787ff505ec0a8bf3ac7356cf275e044c0f23f3c2 --- /dev/null +++ b/home/pi/scripts/getseason.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cat /home/pi/scripts/season +exit; diff --git a/home/pi/scripts/getsystemtype.sh b/home/pi/scripts/getsystemtype.sh new file mode 100755 index 0000000000000000000000000000000000000000..a118f06972644ccfa62741ecf2c3838b65dadeba --- /dev/null +++ b/home/pi/scripts/getsystemtype.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cat /home/pi/scripts/systemtype +exit; diff --git a/home/pi/scripts/gettempunit.sh b/home/pi/scripts/gettempunit.sh new file mode 100755 index 0000000000000000000000000000000000000000..ce665ebca28dabb83e6ad981d97bbfb17ff49120 --- /dev/null +++ b/home/pi/scripts/gettempunit.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cat /home/pi/scripts/tempunit +exit; diff --git a/home/pi/scripts/getuptime.sh b/home/pi/scripts/getuptime.sh new file mode 100755 index 0000000000000000000000000000000000000000..96705ed603277fae5bba3f849afccf2352ba4e16 --- /dev/null +++ b/home/pi/scripts/getuptime.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +uptime -p diff --git a/home/pi/scripts/habpanel.hvac.config b/home/pi/scripts/habpanel.hvac.config deleted file mode 100644 index 5055cabba4298de1e54b6bbda02611697060ad60..0000000000000000000000000000000000000000 --- a/home/pi/scripts/habpanel.hvac.config +++ /dev/null @@ -1,2 +0,0 @@ -panelsRegistry="{\n\ \ \ \ \"Server\ Storage\":\ {\n\ \ \ \ \ \ \ \ \"updatedTime\":\ \"2018-05-18T13:10:02.106Z\",\n\ \ \ \ \ \ \ \ \"dashboards\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"id\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"widgets\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Public\ IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WAN_IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"WiFi\ MAC\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WLAN_MAC\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"SSID\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_SSID\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 6,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Signal\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WLAN_INFO\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"unit\":\ \"%\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"CPU\ Temp\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"System_CPU_TEMP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"unit\":\ \"°C\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Disk\ used\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"System_Used_Space\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Timezone\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"System_TZ\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 10,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 14,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"thermostat\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"WiFi\ IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WLAN_IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Min\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"TempMinSetpoint\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"-\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"DecTargetTempMin\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"+\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"IncTargetTempMin\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 16,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Max\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"TempMaxSetpoint\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 6,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"-\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"DecTargetTempMax\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"+\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"IncTargetTempMax\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 16,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 1,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"tile\":\ {},\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"columns\":\ 24\n\ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"id\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\ -\ Heating\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"widgets\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Heating\ Mode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HeatingMode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"switch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hidelabel\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hideonoff\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"heater\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Cooling\ Mode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"CoolingMode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"switch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hidelabel\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hideonoff\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"cold\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"freepik-gadgets\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"sound-mixer-top-view\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 11,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 20,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 15,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"MyTemp\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"80\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Humi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 3,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"MyHumiProxy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"unit\":\ \"%\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"tile\":\ {},\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"columns\":\ 24\n\ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \"menucolumns\":\ 4,\n\ \ \ \ \ \ \ \ \"settings\":\ {\n\ \ \ \ \ \ \ \ \ \ \ \ \"theme\":\ \"paleblue\",\n\ \ \ \ \ \ \ \ \ \ \ \ \"additional_stylesheet_url\":\ \"/static/hestiapi/hestiapi.css\"\n\ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \"customwidgets\":\ {}\n\ \ \ \ }\n}" -service.pid="org.openhab.habpanel" diff --git a/home/pi/scripts/habpanel.nohvac.config b/home/pi/scripts/habpanel.nohvac.config deleted file mode 100644 index 504105e4f4a178c66dc08fc74b0f110e3317b7df..0000000000000000000000000000000000000000 --- a/home/pi/scripts/habpanel.nohvac.config +++ /dev/null @@ -1,2 +0,0 @@ -panelsRegistry="{\n\ \ \ \ \"Server\ Storage\":\ {\n\ \ \ \ \ \ \ \ \"updatedTime\":\ \"2018-11-02T14:29:13.318Z\",\n\ \ \ \ \ \ \ \ \"dashboards\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"id\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"widgets\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Public\ IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WAN_IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"WiFi\ MAC\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WLAN_MAC\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"SSID\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_SSID\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 6,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Signal\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WLAN_INFO\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"unit\":\ \"%\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"CPU\ Temp\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"System_CPU_TEMP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"unit\":\ \"°C\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Disk\ used\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"System_Used_Space\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Timezone\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"System_TZ\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 10,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"thermostat\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"WiFi\ IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"Network_WLAN_IP\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Humidity\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"Humidity\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"drop\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HotWater\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"HestiaPi\ -\ Hot\ Water\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"freepik-household\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"tap\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"30\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Heating\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HeatingBoostTime\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"-\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HeatingBoostTimeDec\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"+\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HeatingBoostTimeInc\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 16,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Water\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 2,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HotWaterBoostTime\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 6,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"-\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HotWaterBoostTimeDec\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"+\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HotWaterBoostTimeInc\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 16,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 1,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 1,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"tile\":\ {},\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"columns\":\ 24\n\ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"id\":\ \"Humidity\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\ -\ Humidity\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"widgets\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 20,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 15,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"MyHumi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"80\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"unit\":\ \"%\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"thermostat\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 7,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"freepik-gadgets\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"sound-mixer-top-view\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HotWater\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"HestiaPi\ -\ Hot\ Water\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"freepik-household\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"tap\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"30\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 1,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"tile\":\ {},\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"columns\":\ 24\n\ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"id\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\ -\ Heating\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"widgets\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"MainSwitch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"MainSwitch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"switch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hidelabel\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hideonoff\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"power-button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Heating\ Mode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 3,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HeatingMode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"switch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hidelabel\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hideonoff\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"temperature\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 4\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 3,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"freepik-gadgets\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"sound-mixer-top-view\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 13\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 16,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 11,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"MyTemp\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"80\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"+\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 5,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"IncTargetTemp\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"30\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 16\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 5,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"TempSetpoint\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"35\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 5,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 16\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"-\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 5,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"DecTargetTemp\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"ON\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"30\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 10,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 16\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Boost\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 6,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HeatingMode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 7,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"Boost\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"25\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"tile\":\ {},\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"columns\":\ 24\n\ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"id\":\ \"HestiaPi\ -\ Hot\ Water\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\ -\ Hot\ Water\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"widgets\":\ [\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"MainSwitch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"MainSwitch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"switch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hidelabel\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hideonoff\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"power-button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Hot\ Water\ Mode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HotWaterMode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"switch\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hidelabel\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"hideonoff\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"freepik-household\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"tap\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 4\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Boost\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 12,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HotWaterMode\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"toggle\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command\":\ \"Boost\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"command_alt\":\ \"OFF\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"25\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 8\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 7,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"Settings\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"freepik-gadgets\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"sound-mixer-top-view\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 8,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"HestiaPi\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"thermostat\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"Humidity\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"button\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"action_type\":\ \"navigate\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"navigate_dashboard\":\ \"Humidity\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"iconset\":\ \"smarthome-set\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon\":\ \"drop\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_size\":\ \"32\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"icon_replacestext\":\ true,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 20\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"name\":\ \"\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeX\":\ 20,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"sizeY\":\ 11,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"item\":\ \"HotWaterBoostTime\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"type\":\ \"dummy\",\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"nolinebreak\":\ false,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 4,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"font_size\":\ \"55\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"row\":\ 1,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"col\":\ 0,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"tile\":\ {},\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"columns\":\ 24\n\ \ \ \ \ \ \ \ \ \ \ \ }\n\ \ \ \ \ \ \ \ ],\n\ \ \ \ \ \ \ \ \"menucolumns\":\ 4,\n\ \ \ \ \ \ \ \ \"settings\":\ {\n\ \ \ \ \ \ \ \ \ \ \ \ \"theme\":\ \"paleblue\",\n\ \ \ \ \ \ \ \ \ \ \ \ \"additional_stylesheet_url\":\ \"/static/hestiapi/hestiapi.css\"\n\ \ \ \ \ \ \ \ },\n\ \ \ \ \ \ \ \ \"customwidgets\":\ {}\n\ \ \ \ }\n}" -service.pid="org.openhab.habpanel" diff --git a/home/pi/scripts/humiditymode b/home/pi/scripts/humiditymode new file mode 100755 index 0000000000000000000000000000000000000000..ca7d8585d28ad67eeb9bba4fadd3b6b82f63b1e3 --- /dev/null +++ b/home/pi/scripts/humiditymode @@ -0,0 +1 @@ +Dehumidify diff --git a/home/pi/scripts/openhabloader.sh b/home/pi/scripts/openhabloader.sh index 703406d4f274894efe7aed8bcd553bd197d22863..24746ada2b47b76f2a8d58c06acfd0b98ec833c8 100755 --- a/home/pi/scripts/openhabloader.sh +++ b/home/pi/scripts/openhabloader.sh @@ -46,7 +46,7 @@ sed -i -e "s/wlanmac/$wlanmac/g" ./openhabloader.html pgrep chromium | xargs kill -9 #Kill all sessions in case something was hung - this will produce a restore prompt unfortunately sudo sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' /home/pi/.config/chromium/Default/Preferences sudo sed -i 's/"exit_type":"Crashed"/"exit_type":"None"/' /home/pi/.config/chromium/Default/Preferences -sudo -u pi /usr/bin/chromium-browser --disable-restore-session-state --disable-web-security --user-data-dir --noerordialogs --disable-session-crashed-bubble --disable-infobars --kiosk /home/pi/scripts/openhabloader.html & +#sudo -u pi /usr/bin/chromium-browser --disable-restore-session-state --disable-web-security --user-data-dir --noerordialogs --disable-session-crashed-bubble --disable-infobars --kiosk /home/pi/scripts/openhabloader.html & while : do @@ -58,7 +58,7 @@ else pgrep chromium | xargs kill -9 #Kill all sessions in case something was hung - this will produce a restore prompt unfortunately sudo sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' /home/pi/.config/chromium/Default/Preferences sudo sed -i 's/"exit_type":"Crashed"/"exit_type":"None"/' /home/pi/.config/chromium/Default/Preferences - sudo -u pi /usr/bin/chromium-browser --disable-restore-session-state --disable-web-security --user-data-dir --noerordialogs --disable-session-crashed-bubble --disable-infobars --kiosk /home/pi/scripts/openhabloader.html & +# sudo -u pi /usr/bin/chromium-browser --disable-restore-session-state --disable-web-security --user-data-dir --noerordialogs --disable-session-crashed-bubble --disable-infobars --kiosk /home/pi/scripts/openhabloader.html & break fi done diff --git a/home/pi/scripts/reboot.sh b/home/pi/scripts/reboot.sh new file mode 100755 index 0000000000000000000000000000000000000000..4acd3a203e57d99e3d16a7dc14b0d01df2ba72f3 --- /dev/null +++ b/home/pi/scripts/reboot.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +sudo reboot; +exit; diff --git a/home/pi/scripts/restore.sh b/home/pi/scripts/restore.sh new file mode 100755 index 0000000000000000000000000000000000000000..9598c5243997ebdcaa082b63f7d188be7f7c3055 --- /dev/null +++ b/home/pi/scripts/restore.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +FILE=/home/pi/scripts/backup.zip +if test -f "$FILE"; then + sudo rm /home/pi/backup.zip + sudo cp $FILE /home/pi/backup.zip + sudo reboot; +else + echo "1" +fi +exit; diff --git a/home/pi/scripts/season b/home/pi/scripts/season new file mode 100755 index 0000000000000000000000000000000000000000..1f0e1acc3d34d512912d8b0271dd8d649a689d4c --- /dev/null +++ b/home/pi/scripts/season @@ -0,0 +1 @@ +WINTER diff --git a/home/pi/scripts/settz.sh b/home/pi/scripts/settz.sh new file mode 100755 index 0000000000000000000000000000000000000000..adfc6caf91bf248c5fb37ed0b9471918f290a0c3 --- /dev/null +++ b/home/pi/scripts/settz.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +#touch /home/pi/scripts/tztest +#echo $1 > /home/pi/scripts/tztest +sudo rm /etc/localtime +sudo ln -s /usr/share/zoneinfo/$1 /etc/localtime +sudo rm /etc/timezone +exit; diff --git a/home/pi/scripts/shutdown.sh b/home/pi/scripts/shutdown.sh new file mode 100755 index 0000000000000000000000000000000000000000..096ec202aca88b6180d7c052ca782807552e48cb --- /dev/null +++ b/home/pi/scripts/shutdown.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +sudo shutdown -h now; +exit; diff --git a/home/pi/scripts/systemtype b/home/pi/scripts/systemtype new file mode 100755 index 0000000000000000000000000000000000000000..6640b4141ebb895e98020ef6ffb56a6b75a37652 --- /dev/null +++ b/home/pi/scripts/systemtype @@ -0,0 +1 @@ +EU diff --git a/home/pi/scripts/tempunit b/home/pi/scripts/tempunit new file mode 100755 index 0000000000000000000000000000000000000000..3cc58df83752123644fef39faab2393af643b1d2 --- /dev/null +++ b/home/pi/scripts/tempunit @@ -0,0 +1 @@ +C diff --git a/home/pi/scripts/update.sh b/home/pi/scripts/update.sh deleted file mode 100644 index 138a87f8d6efdf79232283cfc2f361f8dc419f11..0000000000000000000000000000000000000000 --- a/home/pi/scripts/update.sh +++ /dev/null @@ -1,157 +0,0 @@ -#!/bin/bash - -# Script that updates all script files from Gihub -# Usage: sudo ./update.sh [OPTIONS] -# If no options are specified, user will be prompted -# 1: Load HVAC UI, F unit and don not reboot -# 2: Load Standard UI, C unit and don not reboot -# 3: Update only the update script and exit - -if [ "$1" = "1" ]; then - echo "HVAC selected"; - UI=1; - Unit=1; - DoReboot=2; -elif [ "$1" = "2" ]; then - echo "Standard selected"; - UI=2; - Unit=2; - DoReboot=2; -elif [ "$1" = "3" ]; then - echo "Updating update script..."; - wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/update.sh -O /home/pi/scripts/update.sh --backups=1; - sudo chmod 755 update.sh; - exit 0; -else - echo "Choose UI:"; - select yn in "HVAC (US)" "Standard (EU)"; do - case $yn in - "HVAC (US)" ) echo Loading HVAC elements...; UI=1; - break;; - "Standard (EU)" ) echo Loading Standard elements...; UI=2; - break;; - esac - done - - echo "Choose temperature Unit:"; - select yn in "Fahrenheit (F)" "Celsius (C)"; do - case $yn in - "Fahrenheit (F)" ) echo Using F unit...; Unit=1; break;; - "Celsius (C)" ) echo Using C unit; Unit=2; break;; - esac - done - - echo "Please reboot to update LCD UI"; - select yn in "Reboot now" "Don't reboot"; do - case $yn in - "Reboot now" ) echo Will reboot; DoReboot=1; break;; - "Don't reboot" ) echo Will not reboot; DoReboot=2; break;; - esac - done -fi -echo "Update started"; - - -# Generic code goes here - -sudo chmod 777 /etc/openhab2/rules /etc/openhab2/sitemaps /etc/openhab2/items /etc/openhab2/persistence /etc/openhab2/transform; -sudo chmod 777 /etc/openhab2/rules/default.rules /etc/openhab2/sitemaps/default.sitemap /etc/openhab2/items/default.items /etc/openhab2/things/default.things /etc/openhab2/persistence/rrd4j.persist /etc/openhab2/transform/binary.map; -sudo mkdir /etc/openhab2/html/hestiapi; -sudo chmod 777 /etc/openhab2/html /etc/openhab2/html/hestiapi; -mkdir /home/pi/scripts/update; -cd /home/pi/scripts/update; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/etc/openhab2/rules/default.rules; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/etc/openhab2/sitemaps/default.sitemap; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/etc/openhab2/items/default.items; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/etc/openhab2/things/default.things; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/etc/openhab2/persistence/rrd4j.persist; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/etc/openhab2/transform/binary.map; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/etc/openhab2/html/hestiapi/hestiapi.css; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/default.hvac.items; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/default.hvac.rules; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/default.hvac.sitemap; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/habpanel.hvac.config; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/habpanel.nohvac.config; - - -if [ "$UI" = "1" ]; then - echo "Loading HVAC Ui elements..."; - sudo mv default.rules /home/pi/scripts/default.nohvac.rules; - sudo mv default.sitemap /home/pi/scripts/default.nohvac.sitemap; - sudo mv default.items /home/pi/scripts/default.nohvac.items; - sudo mv default.hvac.rules /etc/openhab2/rules/default.rules; - sudo mv default.hvac.sitemap /etc/openhab2/sitemaps/default.sitemap; - sudo mv default.hvac.items /etc/openhab2/items/default.items; - sudo cp habpanel.hvac.config /var/lib/openhab2/config/org/openhab/habpanel.config; - echo "HVAC UI elements loaded!"; -elif [ "$UI" = "2" ]; then - echo "Loading Standard Ui elements..."; - sudo mv default.rules /etc/openhab2/rules/default.rules; - sudo mv default.sitemap /etc/openhab2/sitemaps/default.sitemap; - sudo mv default.items /etc/openhab2/items/default.items; - sudo cp habpanel.nohvac.config /var/lib/openhab2/config/org/openhab/habpanel.config; - echo "Standard UI elements loaded!"; -else - echo "Invalid selection" -fi - -# Generic code goes here - -sudo mv default.things /etc/openhab2/things/default.things; -sudo mv rrd4j.persist /etc/openhab2/persistence/rrd4j.persist; -sudo mv binary.map /etc/openhab2/transform/binary.map; -sudo mv hestiapi.css /etc/openhab2/html/hestiapi/hestiapi.css; -sudo chmod 777 /etc/openhab2/html/hestiapi/hestiapi.css; -cd /home/pi/scripts/update; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/F2C.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/C2F.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/bme280.py; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/bme280C.py; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/bme280F.py; -sudo mv /home/pi/scripts/update/* /home/pi/scripts/; -cd /home/pi/scripts/; -sudo chmod 777 F2C.sh C2F.sh bme280.py bme280C.py bme280F.py; -cd /home/pi/scripts/update; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/AdafruitDHTHum.py; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/AdafruitDHTTemp.py; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getBMEhumi.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getBMEtemp.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getBMEpress.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getcputemperature.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getssid.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/gettz.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getuseddiskspace.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getwifiinfo.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getwlan0ip.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/getwlan0mac.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/HVACEnable.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/HVACDisable.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/netcheck.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/openhabloader.blank.html; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/openhabloader.html; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/openhabloader.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/packitupandgo.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/update.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/publicip.sh; -wget https://github.com/HestiaPi/hestia-touch-openhab/raw/master/home/pi/scripts/wpa_supplicant.conf; -sudo mv /home/pi/scripts/update/* /home/pi/scripts/; -cd /home/pi/scripts/; -sudo chmod 755 AdafruitDHTHum.py AdafruitDHTTemp.py getBMEhumi.sh getBMEtemp.sh getBMEpress.sh getcputemperature.sh getssid.sh gettz.sh getuseddiskspace.sh getwifiinfo.sh getwlan0ip.sh getwlan0mac.sh HVACEnable.sh HVACDisable.sh netcheck.sh openhabloader.sh packitupandgo.sh update.sh publicip.sh; -sudo chmod 644 openhabloader.blank.html openhabloader.html wpa_supplicant.conf; -rmdir /home/pi/scripts/update; - - -if [ "$Unit" = "1" ]; then - echo "Using F unit..."; sudo /home/pi/scripts/C2F.sh; -elif [ "$Unit" = "2" ]; then - echo "Using C unit..."; sudo /home/pi/scripts/F2C.sh; -else - echo "Invalid unit selection" -fi - -if [ "$DoReboot" = "1" ]; then - echo "Rebooting..."; sudo reboot; -elif [ "$DoReboot" = "2" ]; then - echo "Update completed!"; - exit 0; -fi