A two-part solution with Node-RED preprocessing and Home Assistant configuration
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.
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.
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.
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
ormqtt-eu.zen-iot.com
. Configure your Node-REDmqtt-broker
node to point to the one nearest your region.
The following tasks are performed in Node-Red
<username>/+/state
on the Zendure broker.solarInputPower
, packInputPower
, etc.) to ignore extraneous data.hyperTmp
from tenths of Kelvin into Celsius for human readability.input_number.set_value
calls—one per field—and returns them in a single run.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"}]
This Home Assistant YAML package performs the following key tasks:
InfluxDB Sensors
Queries InfluxDB each minute to pull in the latest solar power readings (Last_Oy7YHdWH
, Last_8V4jCh48
) and exposes them as HA sensors.
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.
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.
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
.
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: "
To generate a Grafana dashboard as shown in import the JSON code below.
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
}
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} }