1.5.7b
113
doc/Domoticz/nefit/mqtt.py
Normal file
@@ -0,0 +1,113 @@
|
||||
# Based on https://github.com/emontnemery/domoticz_mqtt_discovery
|
||||
import Domoticz
|
||||
import time
|
||||
|
||||
class MqttClient:
|
||||
Address = ""
|
||||
Port = ""
|
||||
mqttConn = None
|
||||
isConnected = False
|
||||
mqttConnectedCb = None
|
||||
mqttDisconnectedCb = None
|
||||
mqttPublishCb = None
|
||||
|
||||
def __init__(self, destination, port, mqttConnectedCb, mqttDisconnectedCb, mqttPublishCb, mqttSubackCb):
|
||||
Domoticz.Debug("MqttClient::__init__")
|
||||
self.Address = destination
|
||||
self.Port = port
|
||||
self.mqttConnectedCb = mqttConnectedCb
|
||||
self.mqttDisconnectedCb = mqttDisconnectedCb
|
||||
self.mqttPublishCb = mqttPublishCb
|
||||
self.mqttSubackCb = mqttSubackCb
|
||||
self.Open()
|
||||
|
||||
def __str__(self):
|
||||
Domoticz.Debug("MqttClient::__str__")
|
||||
if (self.mqttConn != None):
|
||||
return str(self.mqttConn)
|
||||
else:
|
||||
return "None"
|
||||
|
||||
def Open(self):
|
||||
Domoticz.Debug("MqttClient::Open")
|
||||
if (self.mqttConn != None):
|
||||
self.Close()
|
||||
self.isConnected = False
|
||||
self.mqttConn = Domoticz.Connection(Name=self.Address, Transport="TCP/IP", Protocol="MQTT", Address=self.Address, Port=self.Port)
|
||||
self.mqttConn.Connect()
|
||||
|
||||
def Connect(self):
|
||||
Domoticz.Debug("MqttClient::Connect")
|
||||
if (self.mqttConn == None):
|
||||
self.Open()
|
||||
else:
|
||||
ID = 'Domoticz_'+str(int(time.time()))
|
||||
Domoticz.Log("MQTT CONNECT ID: '" + ID + "'")
|
||||
self.mqttConn.Send({'Verb': 'CONNECT', 'ID': ID})
|
||||
|
||||
def Ping(self):
|
||||
Domoticz.Debug("MqttClient::Ping")
|
||||
if (self.mqttConn == None or not self.isConnected):
|
||||
self.Open()
|
||||
else:
|
||||
self.mqttConn.Send({'Verb': 'PING'})
|
||||
|
||||
def Publish(self, topic, payload, retain = 0):
|
||||
Domoticz.Log("MqttClient::Publish " + topic + " (" + payload + ")")
|
||||
if (self.mqttConn == None or not self.isConnected):
|
||||
self.Open()
|
||||
else:
|
||||
self.mqttConn.Send({'Verb': 'PUBLISH', 'Topic': topic, 'Payload': bytearray(payload, 'utf-8'), 'Retain': retain})
|
||||
|
||||
def Subscribe(self, topics):
|
||||
Domoticz.Debug("MqttClient::Subscribe")
|
||||
subscriptionlist = []
|
||||
for topic in topics:
|
||||
subscriptionlist.append({'Topic':topic, 'QoS':0})
|
||||
if (self.mqttConn == None or not self.isConnected):
|
||||
self.Open()
|
||||
else:
|
||||
self.mqttConn.Send({'Verb': 'SUBSCRIBE', 'Topics': subscriptionlist})
|
||||
|
||||
def Close(self):
|
||||
Domoticz.Log("MqttClient::Close")
|
||||
#TODO: Disconnect from server
|
||||
self.mqttConn = None
|
||||
self.isConnected = False
|
||||
|
||||
def onConnect(self, Connection, Status, Description):
|
||||
Domoticz.Debug("MqttClient::onConnect")
|
||||
if (Status == 0):
|
||||
Domoticz.Log("Successful connect to: "+Connection.Address+":"+Connection.Port)
|
||||
self.Connect()
|
||||
else:
|
||||
Domoticz.Log("Failed to connect to: "+Connection.Address+":"+Connection.Port+", Description: "+Description)
|
||||
|
||||
def onDisconnect(self, Connection):
|
||||
Domoticz.Log("MqttClient::onDisonnect Disconnected from: "+Connection.Address+":"+Connection.Port)
|
||||
self.Close()
|
||||
# TODO: Reconnect?
|
||||
if self.mqttDisconnectedCb != None:
|
||||
self.mqttDisconnectedCb()
|
||||
|
||||
def onMessage(self, Connection, Data):
|
||||
topic = ''
|
||||
if 'Topic' in Data:
|
||||
topic = Data['Topic']
|
||||
payloadStr = ''
|
||||
if 'Payload' in Data:
|
||||
payloadStr = Data['Payload'].decode('utf8','replace')
|
||||
payloadStr = str(payloadStr.encode('unicode_escape'))
|
||||
|
||||
if Data['Verb'] == "CONNACK":
|
||||
self.isConnected = True
|
||||
if self.mqttConnectedCb != None:
|
||||
self.mqttConnectedCb()
|
||||
|
||||
if Data['Verb'] == "SUBACK":
|
||||
if self.mqttSubackCb != None:
|
||||
self.mqttSubackCb()
|
||||
|
||||
if Data['Verb'] == "PUBLISH":
|
||||
if self.mqttPublishCb != None:
|
||||
self.mqttPublishCb(topic, Data['Payload'])
|
||||
165
doc/Domoticz/nefit/plugin.py
Normal file
@@ -0,0 +1,165 @@
|
||||
"""
|
||||
<plugin key="nefit" name="Nefit EMS-ESP with Proddy firmware" version="0.0.1">
|
||||
<description>
|
||||
Plugin to control Nefit EMS-ESP with '<a href="https://github.com/proddy/EMS-ESP"> Proddy</a>' firmware<br/>
|
||||
<br/>
|
||||
Automatically creates Domoticz devices for connected device.<br/>
|
||||
Do not forget to "Accept new Hardware Devices" on first run<br/>
|
||||
</description>
|
||||
<params>
|
||||
<param field="Address" label="MQTT Server address" width="300px" required="true" default="127.0.0.1"/>
|
||||
<param field="Port" label="Port" width="300px" required="true" default="1883"/>
|
||||
<param field="Mode6" label="Debug" width="75px">
|
||||
<options>
|
||||
<option label="Extra verbose" value="Verbose+"/>
|
||||
<option label="Verbose" value="Verbose"/>
|
||||
<option label="True" value="Debug"/>
|
||||
<option label="False" value="Normal" default="true" />
|
||||
</options>
|
||||
</param>
|
||||
</params>
|
||||
</plugin>
|
||||
"""
|
||||
|
||||
import Domoticz
|
||||
import json
|
||||
import time
|
||||
from mqtt import MqttClient
|
||||
|
||||
class Thermostat:
|
||||
def checkDevices(self):
|
||||
if 1 not in Devices:
|
||||
Domoticz.Debug("Create Temperature Device")
|
||||
Domoticz.Device(Name="Woonkamer", Unit=1, Type=80, Subtype=5).Create()
|
||||
if 2 not in Devices:
|
||||
Domoticz.Debug("Create System Pressure Device")
|
||||
Domoticz.Device(Name="System Pressure", Unit=2, Type=243, Subtype=9).Create()
|
||||
if 3 not in Devices:
|
||||
Domoticz.Debug("Create Thermostat Device")
|
||||
Domoticz.Device(Name="Nefit", Unit=3, Type=242, Subtype=1).Create()
|
||||
|
||||
def onMqttMessage(self, topic, payload):
|
||||
if "thermostat_currtemp" in payload:
|
||||
temp=round(float(payload["thermostat_currtemp"]),1)
|
||||
Domoticz.Debug("Current temp: {}".format(temp))
|
||||
if Devices[1].sValue != temp:
|
||||
Devices[1].Update(nValue=1, sValue=str(temp))
|
||||
if "sysPress" in payload:
|
||||
pressure=payload["sysPress"]
|
||||
Domoticz.Debug("System Pressure: {}".format(pressure))
|
||||
if Devices[2].sValue != pressure:
|
||||
Devices[2].Update(nValue=1, sValue=str(pressure))
|
||||
if "thermostat_seltemp" in payload:
|
||||
temp=payload["thermostat_seltemp"]
|
||||
Domoticz.Debug("Temp setting: {}".format(temp))
|
||||
if Devices[3].sValue != temp:
|
||||
Devices[3].Update(nValue=1, sValue=str(temp))
|
||||
|
||||
def onCommand(self, mqttClient, unit, command, level, color):
|
||||
topic = "home/ems-esp/thermostat_cmd_temp"
|
||||
if (command == "Set Level"):
|
||||
mqttClient.Publish(topic, str(level))
|
||||
|
||||
class BasePlugin:
|
||||
mqttClient = None
|
||||
|
||||
def onStart(self):
|
||||
self.debugging = Parameters["Mode6"]
|
||||
|
||||
if self.debugging == "Verbose+":
|
||||
Domoticz.Debugging(2+4+8+16+64)
|
||||
if self.debugging == "Verbose":
|
||||
Domoticz.Debugging(2+4+8+16+64)
|
||||
if self.debugging == "Debug":
|
||||
Domoticz.Debugging(2+4+8)
|
||||
|
||||
self.controller = Thermostat()
|
||||
|
||||
self.controller.checkDevices()
|
||||
|
||||
self.topics = list(["home/ems-esp/thermostat_data", "home/ems-esp/boiler_data", "home/ems-esp/STATE"])
|
||||
self.mqttserveraddress = Parameters["Address"].replace(" ", "")
|
||||
self.mqttserverport = Parameters["Port"].replace(" ", "")
|
||||
self.mqttClient = MqttClient(self.mqttserveraddress, self.mqttserverport, self.onMQTTConnected, self.onMQTTDisconnected, self.onMQTTPublish, self.onMQTTSubscribed)
|
||||
|
||||
def checkDevices(self):
|
||||
Domoticz.Log("checkDevices called")
|
||||
|
||||
def onStop(self):
|
||||
Domoticz.Log("onStop called")
|
||||
|
||||
def onCommand(self, Unit, Command, Level, Color):
|
||||
Domoticz.Debug("Command: " + Command + " (" + str(Level))
|
||||
self.controller.onCommand(self.mqttClient, Unit, Command, Level, Color)
|
||||
|
||||
def onConnect(self, Connection, Status, Description):
|
||||
self.mqttClient.onConnect(Connection, Status, Description)
|
||||
|
||||
def onDisconnect(self, Connection):
|
||||
self.mqttClient.onDisconnect(Connection)
|
||||
|
||||
def onMessage(self, Connection, Data):
|
||||
self.mqttClient.onMessage(Connection, Data)
|
||||
|
||||
def onHeartbeat(self):
|
||||
Domoticz.Debug("Heartbeating...")
|
||||
|
||||
# Reconnect if connection has dropped
|
||||
if self.mqttClient.mqttConn is None or (not self.mqttClient.mqttConn.Connecting() and not self.mqttClient.mqttConn.Connected() or not self.mqttClient.isConnected):
|
||||
Domoticz.Debug("Reconnecting")
|
||||
self.mqttClient.Open()
|
||||
else:
|
||||
self.mqttClient.Ping()
|
||||
|
||||
def onMQTTConnected(self):
|
||||
Domoticz.Debug("onMQTTConnected")
|
||||
self.mqttClient.Subscribe(self.topics)
|
||||
|
||||
def onMQTTDisconnected(self):
|
||||
Domoticz.Debug("onMQTTDisconnected")
|
||||
|
||||
def onMQTTSubscribed(self):
|
||||
Domoticz.Debug("onMQTTSubscribed")
|
||||
|
||||
def onMQTTPublish(self, topic, rawmessage):
|
||||
Domoticz.Debug("MQTT message: " + topic + " " + str(rawmessage))
|
||||
|
||||
message = ""
|
||||
try:
|
||||
message = json.loads(rawmessage.decode('utf8'))
|
||||
except ValueError:
|
||||
message = rawmessage.decode('utf8')
|
||||
|
||||
if (topic in self.topics):
|
||||
self.controller.onMqttMessage(topic, message)
|
||||
|
||||
global _plugin
|
||||
_plugin = BasePlugin()
|
||||
|
||||
def onStart():
|
||||
global _plugin
|
||||
_plugin.onStart()
|
||||
|
||||
def onStop():
|
||||
global _plugin
|
||||
_plugin.onStop()
|
||||
|
||||
def onConnect(Connection, Status, Description):
|
||||
global _plugin
|
||||
_plugin.onConnect(Connection, Status, Description)
|
||||
|
||||
def onDisconnect(Connection):
|
||||
global _plugin
|
||||
_plugin.onDisconnect(Connection)
|
||||
|
||||
def onMessage(Connection, Data):
|
||||
global _plugin
|
||||
_plugin.onMessage(Connection, Data)
|
||||
|
||||
def onCommand(Unit, Command, Level, Color):
|
||||
global _plugin
|
||||
_plugin.onCommand(Unit, Command, Level, Color)
|
||||
|
||||
def onHeartbeat():
|
||||
global _plugin
|
||||
_plugin.onHeartbeat()
|
||||
10
doc/Domoticz/readme.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
to install the plugin:
|
||||
- copy the directory 'nefit' to the domoticz/plugins directory
|
||||
- make sure that 'Accept new Hardware Devices' is enabeled in settings/sysem
|
||||
- create new hardware with type 'Nefit EMS-ESP with Proddy firmware'
|
||||
- set MQTT server and port
|
||||
|
||||
The plugin crrently creates 3 devices:
|
||||
- a room temperature meter
|
||||
- a system pressure meter
|
||||
- a thermostat setpoint control
|
||||
|
Before Width: | Height: | Size: 42 KiB |
@@ -2,7 +2,7 @@
|
||||
alias: Alert shower time
|
||||
trigger:
|
||||
platform: mqtt
|
||||
topic: home/boiler/showertime
|
||||
topic: home/ems-esp/showertime
|
||||
action:
|
||||
- service: notify.general_notify
|
||||
data_template:
|
||||
@@ -13,7 +13,7 @@
|
||||
alias: Alert shower too long
|
||||
trigger:
|
||||
platform: mqtt
|
||||
topic: home/boiler/command
|
||||
topic: home/ems-esp/command
|
||||
payload: 'shower_alarm'
|
||||
action:
|
||||
- service: notify.admin_notify
|
||||
@@ -21,21 +21,21 @@
|
||||
title: "Shower Alert!"
|
||||
message: "Shower time exceeded limit"
|
||||
|
||||
# when boiler starts send boottime
|
||||
# when ems-esp starts send boottime
|
||||
- id: boiler_restart
|
||||
alias: See if boiler restarts
|
||||
alias: See if ems-esp restarts
|
||||
trigger:
|
||||
platform: mqtt
|
||||
topic: home/boiler/start
|
||||
topic: home/ems-esp/start
|
||||
payload: 'start'
|
||||
action:
|
||||
- service: notify.admin_notify
|
||||
data_template:
|
||||
title: "boiler has booted"
|
||||
message: "Boiler"
|
||||
title: "ems-esp has booted"
|
||||
message: "EMS-ESP"
|
||||
- service: mqtt.publish
|
||||
data_template:
|
||||
topic: 'home/boiler/start'
|
||||
topic: 'home/ems-esp/start'
|
||||
payload: >
|
||||
{{ now().strftime("%H:%M:%S %-d/%b/%Y") }}
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
- platform: mqtt
|
||||
name: 'Tap Water'
|
||||
state_topic: 'home/boiler/tapwater_active'
|
||||
state_topic: 'home/ems-esp/tapwater_active'
|
||||
payload_on: "1"
|
||||
payload_off: "0"
|
||||
|
||||
- platform: mqtt
|
||||
name: 'Heating'
|
||||
state_topic: 'home/boiler/heating_active'
|
||||
state_topic: 'home/ems-esp/heating_active'
|
||||
payload_on: "1"
|
||||
payload_off: "0"
|
||||
|
||||
@@ -1,20 +1,30 @@
|
||||
- platform: mqtt
|
||||
name: Thermostat
|
||||
modes:
|
||||
- low
|
||||
- manual
|
||||
- auto
|
||||
name: Thermostat
|
||||
modes:
|
||||
- low
|
||||
- manual
|
||||
- auto
|
||||
|
||||
mode_state_topic: "home/boiler/thermostat_data"
|
||||
current_temperature_topic: "home/boiler/thermostat_data"
|
||||
temperature_state_topic: "home/boiler/thermostat_data"
|
||||
mode_state_topic: "home/ems-esp/thermostat_data"
|
||||
current_temperature_topic: "home/ems-esp/thermostat_data"
|
||||
temperature_state_topic: "home/ems-esp/thermostat_data"
|
||||
|
||||
temperature_command_topic: "home/boiler/thermostat_cmd_temp"
|
||||
mode_command_topic: "home/boiler/thermostat_cmd_mode"
|
||||
temperature_command_topic: "home/ems-esp/thermostat_cmd_temp"
|
||||
mode_command_topic: "home/ems-esp/thermostat_cmd_mode"
|
||||
|
||||
mode_state_template: "{{ value_json.thermostat_mode }}"
|
||||
current_temperature_template: "{{ value_json.thermostat_currtemp }}"
|
||||
temperature_state_template: "{{ value_json.thermostat_seltemp }}"
|
||||
mode_state_template: "{{ value_json.thermostat_mode }}"
|
||||
current_temperature_template: "{{ value_json.thermostat_currtemp }}"
|
||||
temperature_state_template: "{{ value_json.thermostat_seltemp }}"
|
||||
|
||||
temp_step: 0.5
|
||||
temp_step: 0.5
|
||||
|
||||
- platform: mqtt
|
||||
name: boiler
|
||||
min_temp: 40
|
||||
max_temp: 60
|
||||
temp_step: 1
|
||||
current_temperature_topic: "home/ems-esp/boiler_data"
|
||||
temperature_state_topic: "home/ems-esp/boiler_data"
|
||||
temperature_command_topic: "home/ems-esp/boiler_cmd_wwtemp"
|
||||
current_temperature_template: "{{ value_json.wWCurTmp }}"
|
||||
temperature_state_template: "{{ value_json.wWSelTemp }}"
|
||||
|
||||
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 107 KiB |
@@ -2,6 +2,6 @@ shower_coldshot:
|
||||
sequence:
|
||||
- service: mqtt.publish
|
||||
data_template:
|
||||
topic: 'home/boiler/shower_coldshot'
|
||||
topic: 'home/ems-esp/shower_coldshot'
|
||||
payload: '1'
|
||||
|
||||
|
||||
@@ -1,132 +1,138 @@
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/thermostat_data'
|
||||
state_topic: 'home/ems-esp/thermostat_data'
|
||||
name: 'Current Room Temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: "{{ value_json.thermostat_currtemp }}"
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/thermostat_data'
|
||||
state_topic: 'home/ems-esp/thermostat_data'
|
||||
name: 'Current Set Temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: "{{ value_json.thermostat_seltemp }}"
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/thermostat_data'
|
||||
state_topic: 'home/ems-esp/thermostat_data'
|
||||
name: 'Current Mode'
|
||||
value_template: "{{ value_json.thermostat_mode }}"
|
||||
|
||||
# last time boiler was started
|
||||
# last time esp-esp was started
|
||||
- platform: template
|
||||
sensors:
|
||||
boiler_boottime:
|
||||
value_template: '{{ as_timestamp(states.automation.see_if_boiler_restarts.attributes.last_triggered) | timestamp_custom("%H:%M:%S %d/%m/%y") }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/showertime'
|
||||
state_topic: 'home/ems-esp/showertime'
|
||||
name: 'Last shower duration'
|
||||
force_update: true
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Tap Water'
|
||||
value_template: '{{ value_json.tapwaterActive }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Heating'
|
||||
value_template: '{{ value_json.heatingActive }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Warm Water selected temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: '{{ value_json.wWSelTemp }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Warm Water tapwater flow rate'
|
||||
unit_of_measurement: 'l/min'
|
||||
value_template: '{{ value_json.wWCurFlow }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Warm Water current temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: '{{ value_json.wWCurTmp }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Warm Water activated'
|
||||
value_template: '{{ value_json.wWActivated }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Warm Water 3-way valve'
|
||||
value_template: '{{ value_json.wWHeat }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Current flow temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: '{{ value_json.curFlowTemp }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Return temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: '{{ value_json.retTemp }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Gas'
|
||||
value_template: '{{ value_json.burnGas }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Boiler pump'
|
||||
value_template: '{{ value_json.heatPmp }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Fan'
|
||||
value_template: '{{ value_json.fanWork }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Ignition'
|
||||
value_template: '{{ value_json.ignWork }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Circulation pump'
|
||||
value_template: '{{ value_json.wWCirc }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Burner max power'
|
||||
unit_of_measurement: '%'
|
||||
value_template: '{{ value_json.selBurnPow }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Burner max power'
|
||||
unit_of_measurement: '%'
|
||||
value_template: '{{ value_json.selBurnPow }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Burner current power'
|
||||
unit_of_measurement: '%'
|
||||
value_template: '{{ value_json.curBurnPow }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'System Pressure'
|
||||
unit_of_measurement: 'bar'
|
||||
value_template: '{{ value_json.sysPress }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Boiler temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: '{{ value_json.boilTemp }}'
|
||||
|
||||
- platform: mqtt
|
||||
state_topic: 'home/boiler/boiler_data'
|
||||
state_topic: 'home/ems-esp/boiler_data'
|
||||
name: 'Pump modulation'
|
||||
unit_of_measurement: '%'
|
||||
value_template: '{{ value_json.pumpMod }}'
|
||||
@@ -137,7 +143,6 @@
|
||||
value_template: '{{ as_timestamp(states.sensor.last_shower_duration.last_updated) | int | timestamp_custom("%-I:%M %P on %a %-d %b") }}'
|
||||
|
||||
boiler_updated:
|
||||
# value_template: '{{ (as_timestamp(now()) - as_timestamp(states.sensor.boiler_temperature.last_updated)) | int | timestamp_custom("%-M min %-S seconds ago") }}'
|
||||
value_template: '{{ as_timestamp(states.sensor.boiler_temperature.last_updated) | timestamp_custom("%H:%M on %d/%b") }}'
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- platform: mqtt
|
||||
name: "Shower Timer"
|
||||
state_topic: "home/boiler/shower_timer"
|
||||
command_topic: "home/boiler/shower_timer"
|
||||
state_topic: "home/ems-esp/shower_timer"
|
||||
command_topic: "home/ems-esp/shower_timer"
|
||||
payload_on: "1"
|
||||
payload_off: "0"
|
||||
optimistic: false
|
||||
@@ -10,8 +10,8 @@
|
||||
|
||||
- platform: mqtt
|
||||
name: "Long Shower Alert"
|
||||
state_topic: "home/boiler/shower_alert"
|
||||
command_topic: "home/boiler/shower_alert"
|
||||
state_topic: "home/ems-esp/shower_alert"
|
||||
command_topic: "home/ems-esp/shower_alert"
|
||||
payload_on: "1"
|
||||
payload_off: "0"
|
||||
optimistic: false
|
||||
|
||||
@@ -13,7 +13,8 @@ views:
|
||||
- sensor.warm_water_selected_temperature
|
||||
- sensor.warm_water_current_temperature
|
||||
- sensor.warm_water_activated
|
||||
- sensor.warm_water_3way_valve
|
||||
- sensor.warm_water_3_way_valve
|
||||
- sensor.warm_water_tapwater_flow_rate
|
||||
- type: divider
|
||||
- sensor.boiler_temperature
|
||||
- sensor.return_temperature
|
||||
@@ -38,16 +39,15 @@ views:
|
||||
- type: divider
|
||||
- sensor.last_shower_duration
|
||||
- sensor.showertime_time
|
||||
- type: custom:button-card
|
||||
color: auto
|
||||
- type: entity-button
|
||||
icon: mdi:shower-head
|
||||
name: send a cold shot of shower water
|
||||
style:
|
||||
- text-transform: none
|
||||
- color: rgb(28, 128, 199)
|
||||
- font-weight: bold
|
||||
entity: script.shower_coldshot
|
||||
show_state: false
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: script.turn_on
|
||||
service_data:
|
||||
entity_id: script.shower_coldshot
|
||||
|
||||
- type: vertical-stack
|
||||
cards:
|
||||
@@ -57,3 +57,6 @@ views:
|
||||
- sensor.dark_sky_temperature
|
||||
- type: thermostat
|
||||
entity: climate.thermostat
|
||||
- type: thermostat
|
||||
name: WarmWater
|
||||
entity: climate.boiler
|
||||
|
||||
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 72 KiB |
BIN
doc/telnet/telnet_menu.jpg
Normal file
|
After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 130 KiB |