Reads Deye solar inverter metrics using Modbus over ethernet and publishes them over MQTT.
Supports single inverter installations, as well as fleet of microinverters.
The meaning of certain inverter registers depends on the inverter type. You should choose metric group(s) that are appropriate to your inverter model. If your inverter is not listed below, it may still work with one of the already existing metric groups. Give it a try and experiment. In the worst case it won't work.
When your inverter is not supported, feel free to open an issue in this github project. Maybe, together we will find a way to add the support.
When your inverter turns out to work well with an already exiting metrics group, then please be so kind, and let me know in this issue. This will help in building the list of supported inverters below. Thanks!
The list below is built basing on the reports from the users. Compatiblity is not guaranteed.
Inverter model | Metric groups |
---|---|
Deye SUN-4/5/6/7/8/10/12K-G05-P | string, settings |
[Deye Microinverters 300/500/600/800/1000/1300/2000]() | micro, settings_micro |
Deye Microinverters M60/M80/M100 | micro, settings |
Deye Microinverters M130/M160/M180/M200/M220 | micro, settings |
Deye SG04LP3 | deye_sg04lp3, deye_sg04lp3_battery, deye_sg04lp3_ups, deye_sg04lp3_timeofuse, deye_sg04lp3_generator, settings |
Deye SG01LP1 | deye_hybrid, deye_hybrid_battery, deye_hybrid_bms, deye_hybrid_timeofuse, settings |
Deye SG01HP3 | deye_sg01hp3, deye_sg01hp3_battery, deye_sg01hp3_bms, deye_sg01hp3_ups, settings |
Meter model | Metric groups |
---|---|
IGEN DTSD422-D3 | igen_dtsd422 |
Rebranded models | Inverter model | Metric groups |
---|---|---|
Bosswerk MI600 | micro | |
Fuji Solar FU-SUN-4/5/6/7/8/10/12K-G05 | string |
The communication with the logger can be performed using either Modbus/TCP or Modbus/AT protocol.
This project has been started with Modbus/TCP protocol support and it's still the default one.
However, logger firmware versions 2.x does not seem to expose Modbus/TCP interface anymore, hence Modbus/AT protocol support has been implemented. Use DEYE_LOGGER_PROTOCOL
environment variable to select
the communication protocol.
Please note, that Modbus/TCP uses tcp/ip, while Modbus/AT uses udp/ip communication.
config.env.example
as config.env
config.env
, see Configuration for more detailsRun the container
docker run -d --name deye-mqtt \
--env-file config.env \
--restart unless-stopped \
ghcr.io/kbialek/deye-inverter-mqtt
-d
will detach the container, so it will run in the background--restart=unless-stopped
will make docker to restart the container on host rebootdocker stop deye-mqtt
docker rm -v deye-mqtt
docker logs deye-mqtt
docker-compose.yaml
file. Here is a working exampleRun the container
docker compose -f <path-to-docker-compose.yaml> up -d
<path-to-docker-compose.yaml>
with path to your docker-compose.yaml
docker compose -f <path-to-docker-compose.yaml> down -v
Put certificates and client private key in a folder of your choice. The following files are required.
ca.crt
client.crt
client.key
Check configuration section if you want to use alternative file names.
--volume
option to the command as follows:
--volume <certs_folder>:/opt/deye_inverter_mqtt/certs:ro
<certs_folder>
with the certificates folder location of your choiceMQTT_TLS_ENABLED=true
PermissionError: [Errno 1] Operation not permitted
It can happen on debian buster based linux distributions, including raspbian.
Solution: Install libseccomp2
from the backports
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
echo "deb http://deb.debian.org/debian buster-backports main" | sudo tee -a /etc/apt/sources.list.d/buster-backports.list
sudo apt update
sudo apt install -t buster-backports libseccomp2
These problems typically manifest with timeout errors.
The first thing to check is, if given network address is reachable from within the docker container. In order to do this run the following commands:
docker run --rm -ti --entrypoint /bin/sh ghcr.io/kbialek/deye-inverter-mqtt
telnet
by running apk update && apk add busybox-extras
telnet <ip> <port>
<ip>
and <port>
with appropriate valuesConnected to <ip>
- connection works fine. The next step is to enable DEBUG logs in config.env
and open a github issuetelnet: can't connect to remote host (<ip>): Connection refused
- The next step is: fix your network configurationFor best performance, multiple Modbus registers are read at once, in so called register ranges. It's been reported here that Deye-SUN-5K-SG03LP1 reading times out when more than 16 registers is requested at once. To mitigate this problem you may try to set DEYE_LOGGER_MAX_REG_RANGE_LENGTH
to lower number.
All configuration options are controlled through environment variables.
LOG_LEVEL
- application log level, can be any of DEBUG
, INFO
, WARN
, ERROR
, defaults to INFO
LOG_STREAM
- log destination stream, can be any of STDOUT
, STDERR
, defaults to STDOUT
DEYE_PUBLISH_ON_CHANGE
- when set to true
, the event data will only be published if it has changed compared to last readings, defaults to false
DEYE_PUBLISH_ON_CHANGE_MAX_INTERVAL
- when DEYE_PUBLISH_ON_CHANGE
is true
, this variable defines the maximum age of a valid event list in seconds, defaults to 360 secondsDEYE_DATA_READ_INTERVAL
- interval between subsequent data reads, in seconds, defaults to 60DEYE_METRIC_GROUPS
- a comma delimited set of:
string
- string invertermicro
- micro inverterdeye_hybrid
- hybrid inverterdeye_hybrid_battery
- hybrid inverter batterydeye_hybrid_timeofuse
- hybrid inverter time-of-use settingsdeye_sg04lp3
- sg04lp3 inverterdeye_sg04lp3_battery
- sg04lp3 batterydeye_sg04lp3_ups
- sg04lp3 upsdeye_sg04lp3_timeofuse
- sg04lp3 time-of-use settingsdeye_sg01hp3
- sg01hp3 inverterdeye_sg01hp3_battery
- sg01hp3 batterydeye_sg01hp3_bms
- sg01hp3 bmsdeye_sg01hp3_ups
- sg01hp3 upsigen_dtsd422
- dtsd422 smart metersettings
- inverter settings, all types except microsettings_micro
- inverter settings for micro invertersDEYE_LOGGER_COUNT
- declares the number of inverters, and therefore loggers to connect, optional, defaults to 0
, which means, that multi-inverter support is disabledDEYE_LOGGER_SERIAL_NUMBER
or DEYE_LOGGER_{N}_SERIAL_NUMBER
- inverter data logger serial numberDEYE_LOGGER_IP_ADDRESS
or DEYE_LOGGER_{N}_IP_ADDRESS
- inverter data logger IP addressDEYE_LOGGER_PORT
or DEYE_LOGGER_{N}_PORT
- inverter data logger communication port, optional, defaults to 8899 for Modbus/TCP, and 48899 for Modbus/ATDEYE_LOGGER_PROTOCOL
or DEYE_LOGGER_{N}_PROTOCOL
- inverter communication protocol, optional, either tcp
for Modbus/TCP, or at
for Modbus/AT, defaults to tcp
DEYE_LOGGER_MAX_REG_RANGE_LENGTH
or DEYE_LOGGER_{N}_MAX_REG_RANGE_LENGTH
- controls maximum number of registers to be read in a single Modbus registers read operation, defaults to 256DEYE_FEATURE_MQTT_PUBLISHER
- controls, if the service will publish metrics over mqtt, defaults to true
DEYE_FEATURE_SET_TIME
- when set to true
, the service will automatically set the inverter/logger time, defaults to false
DEYE_FEATURE_ACTIVE_POWER_REGULATION
- enables active power regulation control over MQTT command topicDEYE_FEATURE_TIME_OF_USE
- enables Time Of Use feature control over MQTTDEYE_FEATURE_MULTI_INVERTER_DATA_AGGREGATOR
- enables multi-inverter data aggregation and publishingMQTT_HOST
- MQTT Broker IP addressMQTT_PORT
- MQTT Broker port, , defaults to 1883
MQTT_USERNAME
- MQTT Broker username for authentication, defaults to None
MQTT_PASSWORD
- MQTT Broker password for authentication, defaults to None
MQTT_TOPIC_PREFIX
- mqtt topic prefix used for all inverter metrics, defaults to deye
MQTT_AVAILABILITY_TOPIC
- mqtt availability topic, defaults to status
MQTT_LOGGER_STATUS_TOPIC
- logger connectivity status topic, defaults to logger_status
MQTT_TLS_ENABLED
- enables TLS encryption for the communication with the broker, defaults to false
MQTT_TLS_INSECURE
- Set to true in order to skip server certificate verification, defaults to false
MQTT_TLS_CA_CERT_PATH
- CA certificate location to be used instead of the system certification authority, defaults to None
MQTT_TLS_CLIENT_CERT_PATH
- Client certificate location for TLS based authentication, defaults to None
MQTT_TLS_CLIENT_KEY_PATH
- Client private key location for TLS based authentication, defaults to None
PLUGINS_DIR
- Path to a directory containing custom plugins extending the functionality of the servicePLUGINS_ENABLED
- A list of plugin names that will be loaded when successfully discovered in PLUGINS_DIR
, defaults to []
Reports deye-inverter-mqtt service status (not the inverter/logger status):
online
- when the service is connected to the MQTT brokeroffline
- when the service is disconnected from the MQTT brokerThe default topic name is status
and can be changed in the configuration.
Reports solar inverter's logger connectivity status
online
- when the service connect to the logger successfullyoffline
- when the service can't connect to the loggerThe default topic name is logger_status
and can be changed in the configuration.
This feature enables monitoring of N microinverters from a single service instance (docker container), which simplifies the installation and configuration.
It is designed to monitor a fleet of microinverters.
To activate this feature, set DEYE_LOGGER_COUNT
environment variable to the number of loggers you would like to connect to. Next configure each logger by adding a set of environment variables, as follows:
DEYE_LOGGER_{N}_IP_ADDRESS=192.168.XXX.YYY
DEYE_LOGGER_{N}_SERIAL_NUMBER=0123456789
# Optionals
DEYE_LOGGER_{N}_PROTOCOL=at
DEYE_LOGGER_{N}_PORT=48899
DEYE_LOGGER_{N}_MAX_REG_RANGE_LENGTH_PORT=256
Replace {N}
with logger index. All loggers in the range of 1 to DEYE_LOGGER_COUNT
must be configured.
All other configuration options, in particular the metric groups, are shared by all configured loggers. For example, if you set DEYE_FEATURE_SET_TIME=true
, it will activate set-time feature for all configured loggers.
Each logger gets its own MQTT topic prefix {MQTT_TOPIC_PREFIX}/{N}
Additionally, you can enable multi-inverter data aggregation. Set DEYE_FEATURE_MULTI_INVERTER_DATA_AGGREGATOR=true
to compute and report Aggregated daily energy
and Aggregated AC active power
for the entire fleet. See aggregated metrics
Monitors current logger status and sets the time at the logger/inverter once the connection to it can be established.
This is useful in a setup where the inverter has no access to the public internet, or is cut off from the Solarman cloud services.
This feature is disabled by default and must be activated by setting DEYE_FEATURE_SET_TIME
in the config file.
The service can optionally read inverter settings. This feature may be useful when you dynamically modify active power regulation factor. Enable it by adding settings
or settings_micro
metric group to DEYE_METRIC_GROUPS
env variable.
It is possible to modify selected inverter settings over MQTT.
Setting | Topic | Unit | Value range | Feature flag |
---|---|---|---|---|
active power regulation | {MQTT_TOPIC_PREFIX}/settings/active_power_regulation/command |
% | 0-120 | DEYE_FEATURE_ACTIVE_POWER_REGULATION |
time of use | {MQTT_TOPIC_PREFIX}/timeofuse/time/(1-6)/command |
time | 0000 - 2359 | DEYE_FEATURE_TIME_OF_USE |
time of use | {MQTT_TOPIC_PREFIX}/timeofuse/power/(1-6)/command |
W | 0 - max power(1) | DEYE_FEATURE_TIME_OF_USE |
time of use | {MQTT_TOPIC_PREFIX}/timeofuse/voltage/(1-6)/command |
V | 0.00 - 63.00 | DEYE_FEATURE_TIME_OF_USE |
time of use | {MQTT_TOPIC_PREFIX}/timeofuse/soc/(1-6)/command |
% | 0 - 100 | DEYE_FEATURE_TIME_OF_USE |
time of use | {MQTT_TOPIC_PREFIX}/timeofuse/enabled/(1-6)/command |
On/Off | 0,1 | DEYE_FEATURE_TIME_OF_USE |
time of use | {MQTT_TOPIC_PREFIX}/timeofuse/control/command |
string | write, reset | DEYE_FEATURE_TIME_OF_USE |
(1) max inverter power in Watts e.g. 8000, 10000 or 12000
Prerequisites:
DEYE_FEATURE_TIME_OF_USE
to true
deye_sg04lp3_timeofuse
Time Of Use configuration is modified using the following workflow:
{MQTT_TOPIC_PREFIX}/timeofuse/*/*/command
topics as needed. See the table above for more details about used MQTT topics. These changes are not immediately written to the inverter. They are buffered in the service memory instead.write
command to topic {MQTT_TOPIC_PREFIX}/timeofuse/control/command
. It will build a new Time Of Use configuration by putting your changes on top of the inverter configuration present in the service memory. Next the entire Time Of Use configuration is sent to the inverter. The modifications are cleared, and you can start over sending new modifications.reset
command to purge buffered modifications without writing them to the inverter.The Deye logger usually only updates the measurements only every 5 minutes, so that shorter DEYE_DATA_READ_INTERVAL
values
would provide duplicate readings of the same measurements. Increasing the read interval to 5 minutes is not a good solution
since it is not known when the measurements are actually updated which could add a delay of one 5 min interval.
To get the latest measurements without much delay but still avoid publishing duplicate readings, the DEYE_PUBLISH_ON_CHANGE
option can be enabled. With this feature, a new logger reading is only published if any of the new values differs from the
previous reading.
For the rare case that none of the measurements may have changed between subsequent measurements, a maximum interval between
two published messaged is configured with the variable DEYE_PUBLISH_ON_CHANGE_MAX_INTERVAL
(default 360 seconds = 6 minutes).
This project currently has no built-in integration with Home Assistant. You can use the Deye MQTT HA Plugin to integrate all data published via MQTT into Home Assistant.
This feature allows advanced users to extend the functionality of this project. At the moment the plugins can be used to provide custom event processors. This means, that you can now process the readings as you like. No need to rely on MQTT at all anymore.
plugins
directory. The filename must begin with deye_plugin_
DeyePlugin
class. See plugins/deye_plugin_sample.py
for inspiration.Mount your plugins
dir into the container filesystem
--volume ./plugins:/opt/deye_inverter_mqtt/plugins:ro
The tool allows reading and writing raw register values directly in the terminal.
USE AT YOUR OWN RISK! Be sure to know what you are doing. Writing invalid values may damage the inverter. By using this tool you accept this risk, and you take full responsibility for the consequences.
To read register value execute:
docker run --rm --env-file config.env ghcr.io/kbialek/deye-inverter-mqtt r <reg_address>
where <reg_address>
is register address (decimal)
To write register value execute:
docker run --rm --env-file config.env ghcr.io/kbialek/deye-inverter-mqtt w <reg_address> <reg_value>
where <reg_address>
is register address (decimal), and
Read CONTRIBUTING.md