OTGW graph - OTGW grafiek! Great way to monitor your Central Heating System

After many, many hours tinkering, starting from zero knowledge I came up with this graph. I got the idea for this graph from here

:arrow_forward: I use a cheap OTGW (Opentherm) interface to monitor and or control my Remeha Calenta heating system.

I will add another version later…
But this is for me a great help to understand the behaviour of my heating system.

Note that you can use of course the buttons on top to get a more detailed view but also use the mouse scroll wheel!

I found this example! which helped me on the way… A.I. was not able to help me get 3 graphs on one display…

YAML code to paste in the Plotly Graph card configuration:

type: custom:plotly-graph
title: Centrale Verwarming
hours_to_show: 3

config:
  displayModeBar: false

layout:
  height: 750
  dragmode: false
  # De NIEUWE legenda voor de onderste grafiek
  legend:
    orientation: h
    "y": -0.1
    x: 0.5
    xanchor: center
    itemsizing: constant
    font:
      size: 12
  # De NIEUWE legenda voor de middelste grafiek
  legend2:
    orientation: h
    "y": 0.60         # Positie in het gat tussen Y1 en Y2
    x: 0.5
    xanchor: center
    font:
      size: 12

# marge voor de totale grafiek
  margin:
    t: 0
    l: 90
    r: 60
    b: 10

  grid:
    rows: 3
    columns: 1
    roworder: bottom to top #zonder deze regel staan de x-axis ticks bovenaan

#-------------------------------------------------------------------------------
# --- X-AS ---
#-------------------------------------------------------------------------------
  xaxis:
    rangeselector:
      visible: true
      bgcolor: "#242"
      font:
        color: white
      buttons:
        - count: 1
          label: 1h
          step: hour
          stepmode: backward
        - count: 3
          label: 3h
          step: hour
          stepmode: backward
        - count: 6  
          label: 6h
          step: hour
          stepmode: backward
        - count: 12
          label: 12h
          step: hour
          stepmode: backward
        - count: 1
          label: 1d
          step: day
          stepmode: backward

#-------------------------------------------------------------------------------
# --- Y-ASSEN ---
#-------------------------------------------------------------------------------# bovenste domain:
  yaxis3:
    overlaying: y2  #zeer belangrijk! 
    visible: true
    fixedrange: true
    tickmode: array
    tickvals:
      - 1
      - 2
      - 3
    ticktext:
      - <span style="color:red">BRANDER</span>
      - <span style="color:green">VERWARMING</span>
      - <span style="color:blue">HEET WATER</span>
    range:
      - 0.5
      - 3.5
#    title: Status
    domain: # 90-100%
      - 0.92
      - 1
    side: left
    showgrid: true
    gridcolor: rgba(255,255,255,0.1)
#    anchor: x

# middelste domain: temperatuur thermostaat en kamer temperatuur
  yaxis2:
    overlaying: y2 #zeer belangrijk! 
    visible: true
    title: Temperatuur
    side: left
    fixedrange: true
    range:
      # de getallen achter de komma zorgen ervoor dat er een lijn zichtbaar is
      - 15.95 
      - 21.05
    tickmode: linear
    dtick: 1
    tickformat: .1f
    titlefont:
      #color: magenta
    tickfont:
      #color: magenta
    domain: # 65-85%
      - 0.60
      - 0.90
    showgrid: true
    gridcolor: rgba(255,255,255,0.1)

# onderste domain - ROWORDER bepaald dus dat dit het onderste domain is    
  yaxis:
    visible: true
    title: Status
    side: left
    fixedrange: true
    range:
      - 0
      - 100
    showgrid: true
    gridcolor: rgba(255,255,255,0.1)
    domain: # 0-60% van het verticale beeld
      - 0
      - 0.56

#--- ENTITEITEN ---
# Entiteiten voor het bovenste domain Y3
entities:
  - entity: binary_sensor.opentherm_gateway_otgw_otgw_flame
    name: Brander
    line:
      color: red
      width: 10
    filters:
      - resample: 1m
      - map_y: "(y === 'on' || y === 'true') ? 1 : null"
    yaxis: y3
    showlegend: false

  - entity: binary_sensor.opentherm_gateway_otgw_otgw_central_heating
    name: Verwarming
    line:
      color: green
      width: 10
    filters:
      - resample: 1m
      - map_y: "(y === 'on' || y === 'true') ? 2 : null"
    yaxis: y3
    showlegend: false

  - entity: binary_sensor.opentherm_gateway_otgw_otgw_domestic_hot_water
    name: Heet water
    line:
      color: blue
      width: 10
    filters:
      - resample: 1m
      - map_y: "(y === 'on' || y === 'true') ? 3 : null"
    yaxis: y3
    showlegend: false

# Entiteiten voor het middelste domain Y2
  - entity: sensor.opentherm_gateway_otgw_otgw_room_temperature
    name: Gemeten kamer temperatuur
    line:
      color: magenta
      width: 2
    show_value: true
    yaxis: y2
    legend: legend2   # <--- Koppel aan de middelste legenda


  - entity: sensor.opentherm_gateway_otgw_otgw_room_setpoint
    name: Ingestelde temperatuur thermostaat
    line:
      color: yellow
      width: 2
      dash: dot
    show_value: true
    yaxis: y2
    legend: legend2   # <--- Koppel aan de middelste legenda

# Entiteiten voor het onderste domain Y1
  - entity: sensor.opentherm_gateway_otgw_otgw_boiler_flow_water_temperature
    name: AANVOER temperatuur CV water
    yaxis: y1
    line:
      color: orangered
      width: 1


  - entity: sensor.opentherm_gateway_otgw_otgw_return_water_temperature
    name: RETOUR temperatuur CV water
    yaxis: y1
    line:
      color: dodgerblue
      width: 1

  - entity: sensor.opentherm_gateway_otgw_otgw_control_setpoint
    name: Gevraagde aanvoertemperatuur Thermostaat
    yaxis: y1
    line:
      color: silver
      width: 1

  - entity: sensor.opentherm_gateway_otgw_otgw_relative_modulation_level
    name: Modulatie percentage
    yaxis: y1
    line:
      color: cyan
      width: 1

# --- ---
view_layout:
  position: main