diff --git a/README.md b/README.md
index 1f311d5..9a1079c 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# pe1-modbus
+NOTE: This project is not an official HA or HACS integration.
+
This project offers a guideline how a Fröling PE1 / Lambdatronic Pellet boiler can be integrated into Home Assistant (HA - https://www.home-assistant.io) using the builtin Modbus interface.
This repo also includes python scripts that use a modbus module to read registers from PE1 an then post them via MQTT to use inside Home Assistant but this is not necessary since HA has it's own Modbus interface where we can directly map PE1 registers to HA entities.
@@ -197,3 +199,38 @@ action:
Now we can use this dropdown via `input_select.heating_mode_select` and change the heating mode via the modbus interface!
We can also use the same approach to remote control the flow temeperature set point and the hotwater boiler temperature setpoint.
+
+## Visualization
+
+The following shows some visualization ideas, using the new entities we have setup.
+
+### Heating Curve (Flow Target Setpoint)
+
+Most HA visualization options for displaying line and scatter plots are designed to display time-based/historic data from HA entities. The `plotly-graph` card which can be installed via HACS however can be configured in a specific ways to not only use a time-based x-axis. This way we can use entities representing the heating curve lower and upper setpoints, along with the outside temperture and the target flow setpoint to construct a heating curve like shown below.
+
+The plotly-graph configuration for this visualization can be found in `/visualization/heating_curve.yaml`.
+
+
+
+### Historic Data
+
+
+
+
+
+
+For some of those plots the `apexcharts-card` was used which you can integrate via HACS.
+
+As the HA energy dashboard does not (yet) offer support for something like pellet consumption, since it does not support weight metrics like g/kg etc. we can use a `Utility Meter` for that purpose. The pellet consumption plot uses the modbus entity `modbus_pe1_pellet_consumption_kg` in combination with a Utility Meter which can be setup in the Helpers section of HA. The Utility meter enables us to display only the delta of consumption for each day, since the original modbus_pe1_pellet_consumption_kg entity is a total increasing count.
+
+### System Status
+HA offers the `picture-elements` lovelance card, which we can use to display custom images, entity state labels, icons and more. Using draw.io or even the Microsoft Word, we can draw shapes representing our heating system components and overlay some of our entities to achieve something like shown below.
+
+
+
+The picture-element configuration for this visualization can be found in `/visualization/system_status.yaml`.
+
+The corresponding images used for this visualization can be found in the /img directory.
+
+If you want to achieve this exact visualization, some additional template sensors are needed that can be found in the `/template.yaml`.
+
diff --git a/img/boiler.png b/img/boiler.png
new file mode 100644
index 0000000..82e70c4
Binary files /dev/null and b/img/boiler.png differ
diff --git a/img/buffer_c.png b/img/buffer_c.png
new file mode 100644
index 0000000..c1f8f62
Binary files /dev/null and b/img/buffer_c.png differ
diff --git a/img/buffer_ch.png b/img/buffer_ch.png
new file mode 100644
index 0000000..031f933
Binary files /dev/null and b/img/buffer_ch.png differ
diff --git a/img/buffer_cw.png b/img/buffer_cw.png
new file mode 100644
index 0000000..ef02650
Binary files /dev/null and b/img/buffer_cw.png differ
diff --git a/img/buffer_h.png b/img/buffer_h.png
new file mode 100644
index 0000000..91a7b29
Binary files /dev/null and b/img/buffer_h.png differ
diff --git a/img/buffer_hw.png b/img/buffer_hw.png
new file mode 100644
index 0000000..5aaf963
Binary files /dev/null and b/img/buffer_hw.png differ
diff --git a/img/buffer_temp_history.png b/img/buffer_temp_history.png
new file mode 100644
index 0000000..447849a
Binary files /dev/null and b/img/buffer_temp_history.png differ
diff --git a/img/buffer_w.png b/img/buffer_w.png
new file mode 100644
index 0000000..9963cde
Binary files /dev/null and b/img/buffer_w.png differ
diff --git a/img/buffer_wc.png b/img/buffer_wc.png
new file mode 100644
index 0000000..54cc50c
Binary files /dev/null and b/img/buffer_wc.png differ
diff --git a/img/buffer_wh.png b/img/buffer_wh.png
new file mode 100644
index 0000000..4bdf362
Binary files /dev/null and b/img/buffer_wh.png differ
diff --git a/img/e-p-hot.png b/img/e-p-hot.png
new file mode 100644
index 0000000..6eb5ab3
Binary files /dev/null and b/img/e-p-hot.png differ
diff --git a/img/e-pat-off.png b/img/e-pat-off.png
new file mode 100644
index 0000000..160dd33
Binary files /dev/null and b/img/e-pat-off.png differ
diff --git a/img/e-pat-on.png b/img/e-pat-on.png
new file mode 100644
index 0000000..431fdde
Binary files /dev/null and b/img/e-pat-on.png differ
diff --git a/img/empty.png b/img/empty.png
new file mode 100644
index 0000000..37690fb
Binary files /dev/null and b/img/empty.png differ
diff --git a/img/heating_flow_history.png b/img/heating_flow_history.png
new file mode 100644
index 0000000..e3a6d99
Binary files /dev/null and b/img/heating_flow_history.png differ
diff --git a/img/hotwater_history.png b/img/hotwater_history.png
new file mode 100644
index 0000000..26ba856
Binary files /dev/null and b/img/hotwater_history.png differ
diff --git a/img/pe1_heating_curve.png b/img/pe1_heating_curve.png
new file mode 100644
index 0000000..26bea7a
Binary files /dev/null and b/img/pe1_heating_curve.png differ
diff --git a/img/pe1_schematic.png b/img/pe1_schematic.png
new file mode 100644
index 0000000..d70dc72
Binary files /dev/null and b/img/pe1_schematic.png differ
diff --git a/img/pe1_system.gif b/img/pe1_system.gif
new file mode 100644
index 0000000..51a832d
Binary files /dev/null and b/img/pe1_system.gif differ
diff --git a/img/pellet_consumption.png b/img/pellet_consumption.png
new file mode 100644
index 0000000..290614d
Binary files /dev/null and b/img/pellet_consumption.png differ
diff --git a/img/radiator_schematic_cold.png b/img/radiator_schematic_cold.png
new file mode 100644
index 0000000..c3cbbfb
Binary files /dev/null and b/img/radiator_schematic_cold.png differ
diff --git a/img/radiator_schematic_hot.png b/img/radiator_schematic_hot.png
new file mode 100644
index 0000000..6dc586c
Binary files /dev/null and b/img/radiator_schematic_hot.png differ
diff --git a/img/radiator_schematic_warm.png b/img/radiator_schematic_warm.png
new file mode 100644
index 0000000..22199d0
Binary files /dev/null and b/img/radiator_schematic_warm.png differ
diff --git a/template.yaml b/template.yaml
index 268363e..70a3567 100644
--- a/template.yaml
+++ b/template.yaml
@@ -164,4 +164,130 @@
mdi:white-balance-sunny
{% else %}
mdi:alert-circle
- {% endif %}
\ No newline at end of file
+ {% endif %}
+
+ - name: Visualization Is Heating Active
+ unique_id: "visualization_heating_active"
+ state: >
+ {% if states('sensor.modbus_pe1_flow_temperature_target') | int > 0%}
+ true
+ {% else %}
+ false
+ {% endif %}
+
+ - name: Visualization Is Buffer Cold
+ unique_id: "visualization_buffer_cold"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_bottom') | int < 30 and states('sensor.modbus_pe1_buffer_temperature_top') | int < 30%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Buffer Cold Warm
+ unique_id: "visualization_buffer_cold_warm"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_bottom') | int < 30 and states('sensor.modbus_pe1_buffer_temperature_top') | int >= 30 and states('sensor.modbus_pe1_buffer_temperature_top') | int < 50%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Buffer Cold Hot
+ unique_id: "visualization_buffer_cold_hot"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_bottom') | int < 30 and states('sensor.modbus_pe1_buffer_temperature_top') | int >= 50%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Buffer Warm Cold
+ unique_id: "visualization_buffer_warm_cold"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_bottom') | int >= 30 and states('sensor.modbus_pe1_buffer_temperature_bottom') | int < 50 and states('sensor.modbus_pe1_buffer_temperature_top') | int < 30%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Buffer Warm
+ unique_id: "visualization_buffer_warm"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_bottom') | int >= 30 and states('sensor.modbus_pe1_buffer_temperature_bottom') | int < 50 and states('sensor.modbus_pe1_buffer_temperature_top') | int >= 30 and states('sensor.modbus_pe1_buffer_temperature_top') | int < 50%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Buffer Warm Hot
+ unique_id: "visualization_buffer_warm_hot"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_bottom') | int >= 30 and states('sensor.modbus_pe1_buffer_temperature_bottom') | int < 50 and states('sensor.modbus_pe1_buffer_temperature_top') | int >= 50%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Buffer Hot Warm
+ unique_id: "visualization_buffer_hot_warm"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_top') | int >= 30 and states('sensor.modbus_pe1_buffer_temperature_top') | int < 50 and states('sensor.modbus_pe1_buffer_temperature_bottom') | int >= 50%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Buffer Hot
+ unique_id: "visualization_buffer_hot"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_temperature_bottom') | int >= 50 and states('sensor.modbus_pe1_buffer_temperature_top') | int >= 50 %}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Radiator Cold
+ unique_id: "visualization_radiator_cold"
+ state: >
+ {% if states('sensor.modbus_pe1_flow_temperature_actual') | int < 30%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Radiator Warm
+ unique_id: "visualization_radiator_warm"
+ state: >
+ {% if states('sensor.modbus_pe1_flow_temperature_actual') | int >= 30 and states('sensor.modbus_pe1_flow_temperature_actual') | int < 40%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Visualization Is Radiator Hot
+ unique_id: "visualization_radiator_hot"
+ state: >
+ {% if states('sensor.modbus_pe1_flow_temperature_actual') | int >= 40%}
+ true
+ {% else %}
+ false
+ {% endif %}
+ - name: Buffer Pump Status
+ unique_id: "visualization_buffer_pump_status"
+ state: >
+ {% if states('sensor.modbus_pe1_buffer_pump_control') | float(0) > 0%}
+ on
+ {% else %}
+ off
+ {% endif %}
+ icon: >
+ {% if this.state == 'on' %}
+ mdi:pump
+ {% else %}
+ mdi:pump-off
+ {% endif %}
+ - name: Boiler Pump Status
+ unique_id: "visualization_water_boiler_pump_status"
+ state: >
+ {% if states('sensor.modbus_pe1_water_boiler_pump_control') | float(0) > 0%}
+ on
+ {% else %}
+ off
+ {% endif %}
+ icon: >
+ {% if this.state == 'on' %}
+ mdi:pump
+ {% else %}
+ mdi:pump-off
+ {% endif %}
\ No newline at end of file
diff --git a/visualization/buffer.yaml b/visualization/buffer.yaml
new file mode 100644
index 0000000..86bae7c
--- /dev/null
+++ b/visualization/buffer.yaml
@@ -0,0 +1,46 @@
+type: custom:apexcharts-card
+header:
+ show: true
+ title: Buffer Temperature
+ show_states: true
+ colorize_states: true
+graph_span: 24hrs
+all_series_config:
+ type: area
+ opacity: 0.1
+ stroke_width: 1
+series:
+ - entity: sensor.modbus_pe1_buffer_temperature_top
+ name: Top
+ color: red
+ group_by:
+ func: avg
+ duration: 5min
+ yaxis_id: degrees
+ - entity: sensor.modbus_pe1_buffer_temperature_bottom
+ name: Bottom
+ color: orange
+ group_by:
+ func: avg
+ duration: 5min
+ yaxis_id: degrees
+ - entity: sensor.modbus_pe1_buffer_pump_control
+ name: Pump Control
+ type: line
+ curve: stepline
+ group_by:
+ func: max
+ duration: 10min
+ stroke_width: 1
+ color: green
+ opacity: 1
+ yaxis_id: state
+yaxis:
+ - id: state
+ show: false
+ opposite: true
+ - id: degrees
+ show: true
+apex_config:
+ grid:
+ show: false
diff --git a/visualization/heating_curve.yaml b/visualization/heating_curve.yaml
new file mode 100644
index 0000000..d1cc2e3
--- /dev/null
+++ b/visualization/heating_curve.yaml
@@ -0,0 +1,88 @@
+type: custom:plotly-graph
+hours_to_show: current_day
+title: Heating Flow Setpoint
+layout:
+ dragmode: pan
+ annotations:
+ - 'y': $ex hass.states["sensor.modbus_pe1_flow_temperature_target"].state
+ x: $ex hass.states["sensor.modbus_pe1_outside_temperature"].state
+ text: >-
+ $ex hass.states["sensor.modbus_pe1_flow_temperature_target"].state + '°C
+ now'
+ showarrow: true
+ arrowcolor: lightgrey
+ arrowsize: 0.8
+ arrowwidth: 1.8
+ arrowside: end
+ yshift: 10
+ xaxis:
+ type: number
+ showlegend: false
+ title: Outside [°C]
+ yaxis:
+ fixedrange: true
+ showlabel: true
+ range:
+ - 0
+ - 100
+ title: Flow Setpoint [°C]
+ height: 300
+ margin:
+ r: 50
+ l: 80
+ t: 50
+entities:
+ - entity: ''
+ x: $ex [-10, 10, hass.states["sensor.modbus_pe1_outside_temperature"].state]
+ 'y': >-
+ $ex
+ [hass.states["sensor.modbus_pe1_heating_curve_setpoint_upper"].state,hass.states["sensor.modbus_pe1_heating_curve_setpoint_lower"].state]
+ line:
+ shape: line
+ color: lightgrey
+ dash: dot
+ width: 1
+ marker:
+ size:
+ - 5
+ - 5
+ symbol:
+ - circle
+ - circle
+ color:
+ - orangered
+ - orange
+ mode: lines+markers+text
+ text: >-
+ $ex [hass.states["sensor.modbus_pe1_heating_curve_setpoint_upper"].state +
+ '°C',hass.states["sensor.modbus_pe1_heating_curve_setpoint_lower"].state +
+ '°C']
+ textposition:
+ - top
+ - top
+ - bottom
+ hovertemplate: |
+ $fn ({ hass }) => '%{y}'
+ showlegend: false
+ - entity: ''
+ x: $ex [hass.states["sensor.modbus_pe1_outside_temperature"].state]
+ 'y': $ex [hass.states["sensor.modbus_pe1_flow_temperature_target"].state]
+ line:
+ shape: line
+ color: lightgrey
+ dash: dot
+ width: 1
+ marker:
+ size:
+ - 6
+ symbol:
+ - diamond
+ color:
+ - green
+ mode: markers
+ hovertemplate: |
+ $fn ({ hass }) => '%{y}'
+ showlegend: false
+raw_plotly_config: true
+config:
+ displayModeBar: false
\ No newline at end of file
diff --git a/visualization/heating_flow.yaml b/visualization/heating_flow.yaml
new file mode 100644
index 0000000..fed3a5d
--- /dev/null
+++ b/visualization/heating_flow.yaml
@@ -0,0 +1,64 @@
+type: custom:apexcharts-card
+experimental:
+ color_threshold: true
+header:
+ show: true
+ title: Heating Flow
+ show_states: true
+ colorize_states: true
+graph_span: 24hrs
+series:
+ - entity: sensor.modbus_pe1_flow_temperature_actual
+ name: Flow Actual
+ group_by:
+ func: avg
+ duration: 5min
+ color: orange
+ stroke_width: 0
+ opacity: 0.3
+ type: area
+ - entity: sensor.modbus_pe1_flow_temperature_target
+ name: Flow Target
+ color: green
+ group_by:
+ func: avg
+ duration: 5min
+ stroke_width: 2
+ opacity: 1
+ - entity: sensor.modbus_pe1_outside_temperature
+ name: Outside
+ color: steelblue
+ group_by:
+ func: avg
+ duration: 5min
+ stroke_width: 1
+ opacity: 1
+ - entity: sensor.sonoff_sensor_temperature
+ name: Foyer
+ color: violet
+ group_by:
+ func: avg
+ duration: 5min
+ stroke_width: 1
+ opacity: 1
+ - entity: sensor.sonoff_hygroscope_lr_temperature
+ name: Living Room
+ color: pink
+ group_by:
+ func: avg
+ duration: 5min
+ stroke_width: 1
+ opacity: 1
+ - entity: sensor.sonoff_hygroscope_gr_temperature
+ name: Guest Room
+ color: indianred
+ group_by:
+ func: avg
+ duration: 5min
+ stroke_width: 1
+ opacity: 1
+apex_config:
+ grid:
+ show: false
+ legend:
+ show: false
diff --git a/visualization/hotwater.yaml b/visualization/hotwater.yaml
new file mode 100644
index 0000000..ac96576
--- /dev/null
+++ b/visualization/hotwater.yaml
@@ -0,0 +1,46 @@
+type: custom:apexcharts-card
+header:
+ show: true
+ title: Hot Water
+ show_states: true
+ colorize_states: true
+graph_span: 24hrs
+series:
+ - entity: sensor.modbus_pe1_hotwater_temperature_top
+ name: Temperature
+ type: area
+ group_by:
+ func: avg
+ duration: 10min
+ color: orange
+ stroke_width: 0
+ opacity: 0.5
+ yaxis_id: degrees
+ - entity: sensor.modbus_pe1_water_boiler_pump_control
+ name: Pump Control
+ type: area
+ curve: stepline
+ stroke_width: 1
+ color: green
+ opacity: 0.5
+ yaxis_id: state
+ - entity: switch.smart_switch_23022396705558510d0248e1e9bb85e5_outlet
+ name: E-Patrone
+ transform: 'return x == ''on'' ? 100: 0;'
+ type: area
+ curve: stepline
+ stroke_width: 0
+ color: red
+ opacity: 0.5
+ yaxis_id: state
+yaxis:
+ - id: state
+ show: false
+ opposite: true
+ - id: degrees
+ show: true
+ min: 33
+ max: 67
+apex_config:
+ grid:
+ show: false
diff --git a/visualization/pellet_consumption_daily.yaml b/visualization/pellet_consumption_daily.yaml
new file mode 100644
index 0000000..c1553d3
--- /dev/null
+++ b/visualization/pellet_consumption_daily.yaml
@@ -0,0 +1,10 @@
+chart_type: bar
+period: day
+type: statistics-graph
+entities:
+ - sensor.pellets_consumption_daily
+stat_types:
+ - change
+days_to_show: 365
+title: Pellets Consumption [kg]
+hide_legend: true
diff --git a/visualization/system_status.yaml b/visualization/system_status.yaml
new file mode 100644
index 0000000..a0b1b63
--- /dev/null
+++ b/visualization/system_status.yaml
@@ -0,0 +1,347 @@
+type: picture-elements
+image: /local/empty.png
+style: |
+ ha-card {
+ {% if is_state('sensor.buffer_pump_status','on') %}
+ --state-animation-1: rotation 2s linear infinite;
+ --state-color-1: steelblue;
+ {% else %}
+ --state-color-1: grey;
+ {% endif %}
+
+ {% if is_state('sensor.boiler_pump_status','on') %}
+ --state-animation-2: rotation 2s linear infinite;
+ --state-color-2: steelblue;
+ {% else %}
+ --state-color-2: grey;
+ {% endif %}
+
+ {% if states('sensor.modbus_pe1_furnace_status') in ['Heating', 'Heating up', 'Pre-heating', 'Ignition', 'Preparation'] %}
+ --state-animation-3: blink 2s linear infinite;
+ --state-color-3: red;
+ {% else %}
+ --state-color-3: grey;
+ {% endif %}
+
+ {% if is_state('switch.smart_switch_23022396705558510d0248e1e9bb85e5_outlet', 'on')%}
+ --state-animation-4: blink 2s linear infinite;
+ {% endif %}
+
+ {% if is_state('sensor.visualization_is_radiator_cold','true') %}
+ --state-color-radiator: grey;
+ {% elif is_state('sensor.visualization_is_radiator_warm','true') %}
+ --state-color-radiator: orange;
+ {% elif is_state('sensor.visualization_is_radiator_hot','true') %}
+ --state-color-radiator: orangered;
+ {% endif %}
+
+ }
+
+ @keyframes rotation {
+ 0% {transform: translate(-50%, -50%) scale(0.8,0.8) rotate(0deg)}
+ 100% {transform: translate(-50%, -50%) scale(0.8,0.8) rotate(360deg)}
+ }
+
+
+ @keyframes blink {
+ 0% {opacity: 1;}
+ 25% {opacity: 0.6;}
+ 50% {opacity: 0.2;}
+ 75% {opacity: 0.6;}
+ 100% {opacity: 1;}
+ }
+elements:
+ - type: image
+ image: /local/pe1_schematic.png
+ style:
+ top: 70%
+ left: 20%
+ width: 30%
+ - type: image
+ image: /local/boiler.png
+ style:
+ top: 75%
+ left: 85%
+ width: 20%
+ - type: image
+ entity: switch.smart_switch_23022396705558510d0248e1e9bb85e5_outlet
+ style:
+ top: 78%
+ left: 89%
+ width: 20%
+ state_image:
+ 'on': /local/e-p-hot.png
+ 'off': /local/e-pat-off.png
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_cold
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_c.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_cold_warm
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_cw.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_cold_hot
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_ch.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_warm_cold
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_wc.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_warm
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_w.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_warm_hot
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_wh.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_hot_warm
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_hw.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_buffer_hot
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/buffer_h.png
+ style:
+ top: 55%
+ left: 55%
+ width: 30%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_radiator_cold
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/rad_off.png
+ style:
+ top: 23%
+ left: 19%
+ width: 25%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_radiator_warm
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/rad_warm_10.gif
+ style:
+ top: 23%
+ left: 19%
+ width: 25%
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_radiator_hot
+ state: 'true'
+ elements:
+ - type: image
+ image: /local/rad_hot_10.gif
+ style:
+ top: 23%
+ left: 19%
+ width: 25%
+ - type: state-icon
+ entity: sensor.modbus_pe1_system_status
+ style:
+ top: 92%
+ left: 10%
+ '--paper-item-icon-color': white
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: state-icon
+ entity: sensor.modbus_pe1_heating_mode
+ style:
+ top: 92%
+ left: 16.5%
+ '--paper-item-icon-color': white
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: state-icon
+ entity: input_select.heating_mode_select
+ style:
+ top: 92%
+ left: 16.5%
+ '--paper-item-icon-color': white
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ opacity: 0
+ - type: state-icon
+ entity: sensor.modbus_pe1_furnace_status
+ style:
+ top: 57%
+ left: 23.3%
+ '--paper-item-icon-color': var(--state-color-3)
+ animation: var(--state-animation-3)
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_heating_active
+ state: 'true'
+ elements:
+ - type: icon
+ entity: sensor.modbus_pe1_flow_temperature_target
+ icon: mdi:heat-wave
+ style:
+ top: 67%
+ left: 23.3%
+ color: red
+ opacity: 1
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: conditional
+ conditions:
+ - entity: sensor.visualization_is_heating_active
+ state: 'false'
+ elements:
+ - type: icon
+ entity: sensor.modbus_pe1_flow_temperature_target
+ icon: mdi:heat-wave
+ style:
+ top: 67%
+ left: 23.3%
+ color: grey
+ opacity: 1
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: state-icon
+ entity: sensor.modbus_pe1_pellet_fill_level
+ style:
+ top: 92%
+ left: 23.3%
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: conditional
+ conditions:
+ - entity: switch.smart_switch_23022396705558510d0248e1e9bb85e5_outlet
+ state: 'off'
+ elements:
+ - type: state-icon
+ entity: switch.smart_switch_23022396705558510d0248e1e9bb85e5_outlet
+ style:
+ top: 78%
+ left: 96%
+ '--paper-item-icon-color': lightgrey
+ transform: translate(-50%, -50%) scale(0.6, 0.6)
+ - type: conditional
+ conditions:
+ - entity: switch.smart_switch_23022396705558510d0248e1e9bb85e5_outlet
+ state: 'on'
+ elements:
+ - type: state-icon
+ entity: switch.smart_switch_23022396705558510d0248e1e9bb85e5_outlet
+ style:
+ top: 78%
+ left: 96%
+ transform: translate(-50%, -50%) scale(0.6, 0.6)
+ animation: var(--state-animation-4)
+ - type: state-icon
+ entity: sensor.modbus_pe1_buffer_charge
+ style:
+ top: 27%
+ left: 64%
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: state-icon
+ entity: sensor.buffer_pump_status
+ style:
+ top: 27%
+ left: 47%
+ '--paper-item-icon-color': var(--state-color-1)
+ animation: var(--state-animation-1)
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: state-icon
+ entity: sensor.boiler_pump_status
+ style:
+ top: 85%
+ left: 79%
+ '--paper-item-icon-color': var(--state-color-2)
+ animation: var(--state-animation-2)
+ transform: translate(-50%,-50%) scale(0.8,0.8)
+ - type: state-label
+ entity: sensor.modbus_pe1_buffer_temperature_top
+ style:
+ top: 42%
+ left: 55%
+ opacity: 0
+ - type: state-label
+ entity: sensor.modbus_pe1_buffer_temperature_bottom
+ style:
+ top: 75%
+ left: 55%
+ opacity: 0
+ - type: state-label
+ entity: sensor.modbus_pe1_flow_temperature_actual
+ style:
+ top: 22%
+ left: 20%
+ opacity: 0
+ - type: custom:hui-element
+ card_type: gauge
+ name: ''
+ needle: true
+ min: 0
+ max: 70
+ segments:
+ - from: 0
+ color: steelblue
+ - from: 30
+ color: orange
+ - from: 40
+ color: orangered
+ - from: 55
+ color: red
+ entity: sensor.modbus_pe1_hotwater_temperature_top
+ style:
+ '--ha-card-background': rgba(1,1,1,0)
+ '--ha-card-border-width': 0
+ '--primary-text-color': black
+ border: none
+ top: 68%
+ left: 85%
+ width: 20%