Reads out a Fronius Symo Hybrid Inverter via Modbus and publishes the data via MQTT.
There are 3 channels with different timing behavior.
{
"invAcPower": 1375.0, # current inverter AC power in W (positive values: outcoming from inverter)
"invDcPower": 1393.8000488, # current inverter DC power in W (positive values: incoming into inverter)
"invEfficiency": 98.651166, # inverter efficiency ("invDcPower" / "invAcPower") in %
"metAcPower": -1178.3900146, # current meter AC power in W (your endpoint: importing: + / exporting: -)
"mpptBatPower": 0.0, # current battery power in W (negative values means charging)
"mpptModPower": 1393.8, # current modules power in W (module string)
"mpptModVoltage": 520.1, # current modules voltage in V (module string)
"selfConsumption": -0.19661, # current own consumption in W ("invAcPower" - "metAcPower")
"status": "ok", # message status
"timestamp": "2022-05-03T17:28:40+02:00" # message creating time
}
{
"eflowInvAcOut": 24.1058917, # exported AC energy by inverter in Wh # see "eflow!"
"eflowInvDcOut": 24.414075, # imported DC energy by inverter: accumulated since last message in Wh
"eflowModOut": 24.4241958, # modules energy accumulated since last message in Wh
"invAcEnergyTot": 23494744.0, # absolute energy exported by inverter
"invStateCode": 4, # see docu: Fronius Operating Codes
"invStateText": "(4) NORMAL", # check documentation
"metEnergyExpTot": 13908758.0, # absolute energy exported by this inverter in Wh (your endpoint == meter)
"metEnergyImpTot": 3297517.0, # absolute energy imported by this inverter in Wh (your endpoint == meter)
"metFrequency": 50.0, # electric grid frequency in Hz
"mpptBatStateCode": 4, # battery (string) status
"mpptBatStateText": "(4) NORMAL",
"mpptModStateCode": 4, # module string status
"mpptModStateText": "(4) NORMAL",
"status": "ok", # message status
"timestamp": "2022-05-03T17:28:30+02:00" # message creating time
}
"eflow!" means accumulated energy since the last message. So all value may be summed up over a specific time period. This is not very accurate, as it just measures and accumulates every 10 seconds without regard of real variations (sampling theorem)!
{
"batFillLevel": 99.0, # battery fill status in %
"batStateCode": 5,
"batStateText": "(5) FULL",
"status": "ok", # message status
"timestamp": "2022-05-03T17:27:30+02:00" # message creating time
}
- Only tested with a "Fronius Symo Hybrid 4.0-3-S" (only 1 module string)
- Therefore, only one module string is supported.
- Check the Fronius inverter/Modbus docu for a basic understanding: Local version
- Only Linux systems supported. (Supposed to run as Linux service.)
Make sure Modbus is enabled. Use "float" as "Sun Spec Model Type".
Python 3 ...
sudo apt-get install python3-dev python3-pip python3-venv python3-wheel -y
cd /opt
sudo mkdir fronius-mqtt-bridge
sudo chown <user>:<user> fronius-mqtt-bridge # type in your user
git clone https://github.com/rosenloecher-it/fronius-mqtt-bridge fronius-mqtt-bridge
cd fronius-mqtt-bridge
python3 -m venv venv
# activate venv
source ./venv/bin/activate
# check python version >= 3.7
python --version
# install required packages
pip install -r requirements.txt
# or: pip install -r requirements-dev.txt
# cd ... goto project dir
cp ./fronius-mqtt-bridge.yaml.sample ./fronius-mqtt-bridge.yaml
# security concerns: make sure, no one can read the stored passwords
chmod 600 ./fronius-mqtt-bridge.yaml
Edit your fronius-mqtt-bridge.yaml
. See comments there.
# see command line options
./fronius-mqtt-bridge.sh --help
# prepare your own config file based on ./fronius-mqtt-bridge.yaml.sample
# the embedded json schema may contain additional information
./fronius-mqtt-bridge.sh --json-schema
# start the logger
./fronius-mqtt-bridge.sh --print-logs --config-file ./fronius-mqtt-bridge.yaml
# abort with ctrl+c
# prepare your own service script based on fronius-mqtt-bridge.service.sample
cp ./fronius-mqtt-bridge.service.sample ./fronius-mqtt-bridge.service
# edit/adapt pathes and user in fronius-mqtt-bridge.service
vi ./fronius-mqtt-bridge.service
# install service
sudo cp ./fronius-mqtt-bridge.service /etc/systemd/system/
# alternativ: sudo cp ./fronius-mqtt-bridge.service.sample /etc/systemd/system//fronius-mqtt-bridge.service
# after changes
sudo systemctl daemon-reload
# start service
sudo systemctl start fronius-mqtt-bridge
# check logs
journalctl -u fronius-mqtt-bridge
journalctl -u fronius-mqtt-bridge --no-pager --since "5 minutes ago"
# enable autostart at boot time
sudo systemctl enable fronius-mqtt-bridge.service
I use an
If no messages get logged check your broker.
sudo apt-get install mosquitto-clients
# prepare credentials
SERVER="<your server>"
# start listener
mosquitto_sub -h $SERVER -d -t smarthome/#
# send single message
mosquitto_pub -h $SERVER -d -t smarthome/test -m "test_$(date)"
# just as info: clear retained messages
mosquitto_pub -h $SERVER -d -t smarthome/test -n -r -d
MIT © Raul Rosenlöcher
The code is available at GitHub.