Zendure Hyper 2000 MQTT readout with Node Red

Solar PV Home assistant Zendure Hyper 2000 Node Red MQTT

A two-part solution with Node-RED preprocessing and Home Assistant configuration

Uwe Sterr http://uwesterr.de
2025-05-05

Introduction

In this project gathering the Hyper 2000 MQTT data from the Zendure IOT server and the building of daily, monthly and yearly statistics is described.

In Figure 1, the schematic illustrates how energy flows from the solar panel into the Hyper 2000 unit for storage in its battery and onward to the home load depending on demand.

Power flow between solar panel, Hyper 2000, battery, and home
Figure 1: Power flow between the solar panel, Hyper 2000, battery, and home.

When integrating multiple Zendure Hyper 2000 power stations into Home Assistant (HA), a naive approach of pointing the MQTT integration directly at the broker can run into conflicts and scalability issues. In this post, we’ll walk through a two-part solution that leverages Node-RED to preprocess MQTT payloads and a dedicated HA package to turn them into sensors, energy counters, and utility meters.

The Challenge with a “Simple MQTT Broker” Approach

Out of the box, HA’s MQTT integration can subscribe to topics like <username>/+/state and create sensors via MQTT Discovery. However, when you have multiple Hyper 2000 units publishing under similar topics, you quickly run into:

Node-RED solves this by dynamically routing and transforming messages before they reach HA.

Part One: Node-RED Flow

In part one the Node-Red flow is described and a JSON for importing in Node-Red is given.

Note: Zendure provides two MQTT endpoints for its cloud service — mqtt.zen-iot.com or mqtt-eu.zen-iot.com. Configure your Node-RED mqtt-broker node to point to the one nearest your region.

The following tasks are performed in Node-Red

  1. Subscribes to MQTT: Listens to the wildcard topic <username>/+/state on the Zendure broker.
  2. Extracts Device ID: Splits the topic string to dynamically determine which Hyper 2000 unit sent the message.
  3. Filters Payload Fields: Uses a whitelist (solarInputPower, packInputPower, etc.) to ignore extraneous data.
  4. Converts Units: Transforms hyperTmp from tenths of Kelvin into Celsius for human readability.
  5. Batches Updates: Builds an array of Home Assistant input_number.set_value calls—one per field—and returns them in a single run.
  6. Calls HA Service: Passes the batched messages to api-call-service, which updates each dynamic entity in Home Assistant efficiently.

[{
  "id":"174a0ee09328c3e7","type":"mqtt in","name":"Zendure MQTT Generic",
  "topic":"<username>/+/state","datatype":"json","broker":"zendure_broker",
  "wires":[["d914e2832d938452"]]
}, {
  "id":"d914e2832d938452","type":"function","name":"Prepare Generic HA Payload",
  "func":"const deviceId = msg.topic.split('/')[1].toLowerCase();
"+
    "const payload = msg.payload;
"+
    "const validKeys = ['solarInputPower','solarPower1','solarPower2',
"+
      "'packInputPower','outputPackPower','outputHomePower','outputLimit',
"+
      "'remainOutTime','packNum','electricLevel','socSet',
"+
      "'gridInputPower','acOutputPower'];
"+
    "const messages = [];
"+
    "validKeys.forEach(key => { if (payload[key]!==undefined) {
"+
      "messages.push({ payload:{domain:'input_number',service:'set_value',
"+
        "data:{entity_id:`input_number.zendure_${deviceId}_${key.replace(/[A-Z]/g,m=>'_'+m.toLowerCase())}`,
"+
        "value:Number(payload[key])}}}); }});
"+
    "if (payload.hyperTmp!==undefined) {
"+
      "const c=payload.hyperTmp/10-273.15;
"+
      "messages.push({payload:{domain:'input_number',service:'set_value',
"+
        "data:{entity_id:`input_number.zendure_${deviceId}_temperature`,value:parseFloat(c.toFixed(1))}}});}
"+
    "return [messages];",
  "wires":[["b2419f04c8016e20"]]
}, {"id":"b2419f04c8016e20","type":"api-call-service",
  "name":"Set HA Input Numbers","server":"home_assistant",
  "domain":"input_number","service":"set_value",
  "data":"payload.data","wires":[["389a3ddb547266a4"]]
}, {"id":"389a3ddb547266a4","type":"debug","name":"Show Power","active":true,"complete":"payload"}]

Part Two: Home Assistant YAML Package

Summary of Part Two YAML

This Home Assistant YAML package performs the following key tasks:

  1. InfluxDB Sensors
    Queries InfluxDB each minute to pull in the latest solar power readings (Last_Oy7YHdWH, Last_8V4jCh48) and exposes them as HA sensors.

  2. Integration Sensors
    Uses the integration platform to turn instantaneous power (W) into cumulative energy (kWh) via trapezoidal integration—for each device and the combined output.

  3. Template Sensors
    Wraps the dynamic input_number entities (populated by Node-RED) in standard HA sensors with unique_id and device_class, making them visible and automatable in the UI.

  4. Input Number Definitions
    Declares all of the numeric entities (temperature, solar_input_power, etc.) so that Node-RED can update them dynamically via input_number.set_value.

  5. Utility Meters
    Sets up daily, monthly, and yearly meters for each device and for the combined total, automatically rolling up energy generation for graphing, billing, or ROI analysis.

Save the following as /config/packages/zendure.yaml:

sensor:
  - platform: influxdb
    host: localhost
    port: 8086
    username: hainfluxuser
    password: YOUR_INFLUXDB_PASSWORD
    database: home_assistant
    scan_interval: 60
    queries:
      - name: Last_Oy7YHdWH
        measurement: Zendure_solar_power
        field: "Oy7YHdWH"
        where: "device='Oy7YHdWH'"
        group_function: last
        unit_of_measurement: W
      - name: Last_8V4jCh48
        measurement: Zendure_solar_power
        field: "8V4jCh48"
        where: "device='8V4jCh48'"
        group_function: last
        unit_of_measurement: W

  - platform: integration
    source: sensor.zendure_8v4jch48_solar_input_power
    name: "Zendure 8v4jch48 Solar Energy"
    unit_prefix: k
    round: 2
    method: trapezoidal
  - platform: integration
    source: sensor.zendure_0y7yhdwh_solar_input_power
    name: "Zendure 0y7YHdWH Solar Energy"
    unit_prefix: k
    round: 2
    method: trapezoidal
  - platform: integration
    source: sensor.zendure_combined_solar_input_power
    name: "Zendure Combined Solar Energy"
    unit_prefix: k
    round: 2
    method: trapezoidal

template:
  - sensor:
      - name: "Zendure 8v4jch48 Solar Input Power"
        unique_id: "zendure_8v4jch48_solar_input_power_sensor"
        device_class: power
        state: "{{ states('input_number.zendure_8v4jch48_solar_input_power') }}"
      - name: "Zendure 0y7YHdWH Solar Input Power"
        unique_id: "zendure_0y7yhdwh_solar_input_power_sensor"
        device_class: power
        state: "{{ states('input_number.zendure_0y7yhdwh_solar_input_power') }}"
      - name: "Zendure Combined Solar Input Power"
        unique_id: "zendure_combined_solar_input_power_sensor"
        device_class: power
        state: >
          {% set a = states('input_number.zendure_8v4jch48_solar_input_power')|float(0) %}
          {% set b = states('input_number.zendure_0y7yhdwh_solar_input_power')|float(0) %}
          {{ (a + b)|round(2) }}

input_number:
  # 0y7YHdWH device
  zendure_0y7yhdwh_temperature:
    name: "0y7YHdWH Temperature"
    min: -20
    max: 80
    step: 0.1
    unit_of_measurement: "°C"
  zendure_0y7yhdwh_solar_input_power:
    name: "0y7YHdWH Solar Input Power"
    min: 0
    max: 5000
    step: 1
    unit_of_measurement: "

Visualization of data

To generate a Grafana dashboard as shown in import the JSON code below.

Grafan dashboard
Figure 2: Grafana dashboard.

In Figure 2, a screenshot of the Grafana dashbaord is presented.

{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": {
          "type": "grafana",
          "uid": "-- Grafana --"
        },
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "fiscalYearStartMonth": 0,
  "graphTooltip": 0,
  "id": 6,
  "links": [],
  "panels": [
    {
      "fieldConfig": {
        "defaults": {},
        "overrides": []
      },
      "gridPos": {
        "h": 6,
        "w": 23,
        "x": 0,
        "y": 0
      },
      "id": 11,
      "options": {
        "code": {
          "language": "plaintext",
          "showLineNumbers": false,
          "showMiniMap": false
        },
        "content": "| Feld             | Beschreibung                                                                                                                                                                                                                             | Geräteklasse | Automatische Erkennung [Hub 1200] (2. iii.) |\n|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|---------------------------------------------|\n| electricLevel    | Ladestand über alle Batterien in %                                                                                                                                                                                                       | Sensor       | Ja                                          |\n| remainOutTime    | Verbleibende Zeit bis Batterien entladen in min. Ob die Entladegrenze berücksichtigt wird, ist mir nicht bekannt                                                                                                                          | Sensor       | Ja                                          |\n| remainInputTime  | Verbleibende Zeit bis Batterien geladen in min. Ob die Ladegrenze berücksichtigt wird, ist mir nicht bekannt                                                                                                                              | Sensor       | Ja                                          |\n| socSet           | (Obere) Ladegrenze in % * 10                                                                                                                                                                                                              | Sensor       | Ja                                          |\n| inputLimit       | Maximale Leistungsaufnahme aus dem Netz (z. B. beim AC-Laden mit dem Hyper 2000 oder Ace 1500)                                                                                                                                             | Sensor       | Nein                                        |\n| outputLimit      | Maximale Leistungsabgabe ans \"Haus\" (Obergrenze) in W                                                                                                                                                                                     | Sensor       | Ja                                          |\n| solarInputPower  | Aktuelle Solarleistung über alle Eingänge in W                                                                                                                                                                                            | Sensor       | Ja                                          |\n| packInputPower   | Aktuelle Entladeleistung der Batterien in W                                                                                                                                                                                               | Sensor       | Ja                                          |\n| outputPackPower  | Aktuelle Ladeleistung der Batterien in W                                                                                                                                                                                                 | Sensor       | Ja                                          |\n| outputHomePower  | Aktuelle Leistungsabgabe ans \"Haus\" in W                                                                                                                                                                                                  | Sensor       | Ja                                          |\n| packNum          | Anzahl angeschlossener Batterien                                                                                                                                                                                                          | Sensor       | Ja                                          |\n| packState        | Status über alle Batterien (0: Standby, 1: Mind. eine Batterie wird geladen, 2: Mind. eine Batterie wird entladen)                                                                                                                      | Sensor       | Ja                                          |\n| buzzerSwitch     | Bestätigungston Ein oder Aus                                                                                                                                                                                                              | Schalter     | Ja                                          |\n| masterSwitch     | Funktion nicht bekannt. Steht bei mir immer auf Ein                                                                                                                                                                                       | Schalter     | Ja                                          |\n| wifiState        | WLAN-Verbindungsstatus (1: Verbunden, 0: Getrennt)                                                                                                                                                                                        | Sensor       | Nein                                        |\n| hubState         | Verhalten des Hub/Hyper bei Erreichen der Entladegrenze (0: Ausgabe beenden und Standby; 1: Ausgabe beenden und Ausschalten)                                                                                                              | Sensor       | Nein                                        |\n| inverseMaxPower  | Maximal zulässige Abgabeleistung ans \"Haus\" / Gesetzliche Obergrenze in W                                                                                                                                                                  | Sensor       | Nein                                        |\n| packData         | Sammel-Topic über die Batteriewerte, filterbar über die jeweilige Batterieseriennummer (maxVol: Spannung der Zelle mit der höchsten Spannung in V * 100; minVol: Spannung der Zelle mit der niedrigsten Spannung in V * 100; maxTemp: Temperatur der Zelle mit der höchsten Temperatur in K; socLevel: Ladestand in %; sn: Seriennummer) | Sensor       | Ja                                          |\n| solarPower1      | Aktuelle Solarleistung Eingang PV 1 in W                                                                                                                                                                                                   | Sensor       | Ja                                          |\n| solarPower2      | Aktuelle Solarleistung Eingang PV 2 in W                                                                                                                                                                                                   | Sensor       | Ja                                          |\n| passMode         | Bypass-Modus (0: Automatisch, 1: Immer aus, 2: Immer ein)                                                                                                                                                                                 | Sensor       | Ja                                          |\n| autoRecover      | Automatisches Rücksetzen des Bypass-Modus (0: Aus; 1: Ein)                                                                                                                                                                                 | Schalter     | Ja                                          |\n| sn               | Seriennummer des Hub/Hyper                                                                                                                                                                                                                | Sensor       | Nein                                        |\n| heatState        | Batterieheizung AB2000 und S-Serie (0: Aus, 1: Ein)                                                                                                                                                                                       | Sensor       | Nein                                        |\n| acMode           | AC-Modus (2: Entladen, 1: Laden)                                                                                                                                                                                                          |              |                                             |",
        "mode": "markdown"
      },
      "pluginVersion": "11.6.0",
      "title": "Variable explanation ",
      "type": "text"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "watt"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 12,
        "w": 23,
        "x": 0,
        "y": 6
      },
      "id": 2,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "07",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "friendly_name::tag",
              "operator": "=",
              "value": "Zendure Oy7YHdWH Power"
            }
          ]
        },
        {
          "alias": "8v",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "friendly_name::tag",
              "operator": "=",
              "value": "Zendure 8v4jch48 Power"
            }
          ]
        },
        {
          "alias": "Solar power combined",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "C",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_combined_solar_input_power"
            }
          ]
        }
      ],
      "title": "Solar output power",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "kwatth"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 23,
        "x": 0,
        "y": 18
      },
      "id": 10,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "07 daily energy",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "kWh",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_0y7yhdwh_daily_energy"
            }
          ]
        },
        {
          "alias": "8v daily engery",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "kWh",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_8v4jch48_daily_energy"
            }
          ]
        },
        {
          "alias": "total daily solar energy ",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "kWh",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "C",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_combined_daily_energy"
            }
          ]
        }
      ],
      "title": "Daily energy",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "%"
        },
        "overrides": [
          {
            "__systemRef": "hideSeriesFrom",
            "matcher": {
              "id": "byNames",
              "options": {
                "mode": "exclude",
                "names": [
                  "07"
                ],
                "prefix": "All except:",
                "readOnly": true
              }
            },
            "properties": [
              {
                "id": "custom.hideFrom",
                "value": {
                  "legend": false,
                  "tooltip": false,
                  "viz": true
                }
              }
            ]
          }
        ]
      },
      "gridPos": {
        "h": 11,
        "w": 11,
        "x": 0,
        "y": 29
      },
      "id": 3,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "07",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "%",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "friendly_name::tag",
              "operator": "=",
              "value": "0y7YHdWH Electric Level"
            }
          ]
        },
        {
          "alias": "8v",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "%",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "friendly_name::tag",
              "operator": "=",
              "value": "8V4jCh48 Electric Level"
            }
          ]
        }
      ],
      "title": "Battery Status",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "watt"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 12,
        "x": 11,
        "y": 29
      },
      "id": 4,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "07 solar power 1",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_0y7yhdwh_solar_power1"
            }
          ]
        },
        {
          "alias": "07 solar power 2",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_0y7yhdwh_solar_power2"
            }
          ]
        }
      ],
      "title": "Solar output power 1 & 2",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "always",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "watt"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 11,
        "x": 0,
        "y": 40
      },
      "id": 5,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "07 home output power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_0y7yhdwh_output_home_power"
            }
          ]
        },
        {
          "alias": "07 pack output power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_0y7yhdwh_output_pack_power"
            }
          ]
        }
      ],
      "title": "Output power home and pack",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "always",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "watt"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 12,
        "x": 11,
        "y": 40
      },
      "id": 7,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "8v home output power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_8v4jch48_output_home_power"
            }
          ]
        },
        {
          "alias": "8v pack output power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_8v4jch48_output_pack_power"
            }
          ]
        }
      ],
      "title": "Output power  home and pack",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "watt"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 11,
        "x": 0,
        "y": 51
      },
      "id": 8,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "07 pack input power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_0y7yhdwh_pack_input_power"
            }
          ]
        },
        {
          "alias": "07 grid input power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_0y7yhdwh_grid_input_power"
            }
          ]
        }
      ],
      "title": "Input power  home and grid",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "watt"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 12,
        "x": 11,
        "y": 51
      },
      "id": 9,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "8v pack input power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_8v4jch48_pack_input_power"
            }
          ]
        },
        {
          "alias": "8v grid input power",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "W",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "entity_id::tag",
              "operator": "=",
              "value": "zendure_8v4jch48_grid_input_power"
            }
          ]
        }
      ],
      "title": "Input power home & grid",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "celsius"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 11,
        "x": 0,
        "y": 62
      },
      "id": 12,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "alias": "07 temperature",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "°C",
          "orderByTime": "ASC",
          "policy": "default",
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": false,
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "friendly_name::tag",
              "operator": "=",
              "value": "0y7YHdWH Temperature"
            }
          ]
        },
        {
          "alias": "8v temp",
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "groupBy": [],
          "hide": false,
          "measurement": "°C",
          "orderByTime": "ASC",
          "policy": "default",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "field"
              }
            ]
          ],
          "tags": [
            {
              "key": "friendly_name::tag",
              "operator": "=",
              "value": "8V4jCh48 Temperature"
            }
          ]
        }
      ],
      "title": "Temperature",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "influxdb",
        "uid": "cdl6fhlajycqof"
      },
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisBorderShow": false,
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "barWidthFactor": 0.6,
            "drawStyle": "line",
            "fillOpacity": 0,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "insertNulls": false,
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green"
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": "watt"
        },
        "overrides": []
      },
      "gridPos": {
        "h": 11,
        "w": 11,
        "x": 7,
        "y": 73
      },
      "id": 1,
      "options": {
        "legend": {
          "calcs": [
            "max",
            "lastNotNull"
          ],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "hideZeros": false,
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "11.6.0",
      "targets": [
        {
          "datasource": {
            "type": "influxdb",
            "uid": "cdl6fhlajycqof"
          },
          "hide": false,
          "query": "SELECT \n  mean(\"0y7YHdWH\")   AS \"Oy7YHdWH\",\n  mean(\"8V4jCh48\")   AS \"8V4jCh48\"\nFROM \"home_assistant\".\"autogen\".\"Zendure_solar_power\"\nWHERE $timeFilter\nGROUP BY time($interval)\nFILL(null)",
          "rawQuery": true,
          "refId": "A",
          "resultFormat": "time_series"
        }
      ],
      "title": "Panel Title",
      "type": "timeseries"
    }
  ],
  "preload": false,
  "schemaVersion": 41,
  "tags": [],
  "templating": {
    "list": []
  },
  "time": {
    "from": "now-6h",
    "to": "now"
  },
  "timepicker": {},
  "timezone": "browser",
  "title": "Lutz PV",
  "uid": "fejriyxn2t5ogb",
  "version": 38
}

Citation

For attribution, please cite this work as

Sterr (2025, May 5). Uwe's Blog: Zendure Hyper 2000 MQTT readout with Node Red. Retrieved from http://uwesterr.de/posts/2025-05-05-zendure-hyper-2000-mqtt-readout-with-node-red/

BibTeX citation

@misc{sterr2025zendure,
  author = {Sterr, Uwe},
  title = {Uwe's Blog: Zendure Hyper 2000 MQTT readout with Node Red},
  url = {http://uwesterr.de/posts/2025-05-05-zendure-hyper-2000-mqtt-readout-with-node-red/},
  year = {2025}
}