Files
solaredge_modbus_mqtt/solaredge_modbus_mqtt.py
T
Marijn Koesen 79a28d169e Replace the ENV variable with a config file
So it's safer to configure, as we don't need to pass env variables
to a docker run service. Also it's easier to configure without
needing to pass a whole lot of env vars.
2020-06-04 21:27:14 +02:00

77 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import json
import os
import solaredge_modbus
import sys
import time
import paho.mqtt.client as mqtt
import yaml
from solaredge_modbus_mqtt import SolarData
from pymodbus.exceptions import ConnectionException
if __name__ == "__main__":
argparser = argparse.ArgumentParser()
argparser.add_argument("--config", type=str, default=os.environ.get('CONFIG_FILE', 'config.yaml'), help="Path to the config.yaml")
args = argparser.parse_args()
with open(args.config, 'r') as stream:
try:
config = yaml.safe_load(stream)
except yaml.YAMLError as exc:
print(exc)
try:
mqtt = mqtt.Client(client_id="", clean_session=True, userdata=None, protocol=mqtt.MQTTv311, transport="tcp")
mqtt.username_pw_set(config['mqtt']['user'], config['mqtt']['pass'])
mqtt.connect(config['mqtt']['host'], config['mqtt']['port'], 60)
except OSError as err:
print("Cannot connect to MQTT on {0}:{1}, error: {2}".format(config['mqtt']['host'], config['mqtt']['port'], err))
sys.exit(1)
inverter = solaredge_modbus.Inverter(
host=config['modbus']['host'],
port=config['modbus']['port'],
timeout=config['modbus']['timeout'],
unit=config['modbus']['unit']
)
run = True
publishedAutoDiscovery = False
while run:
try:
solar_data = SolarData(inverter.read_all())
except ConnectionException as err:
print("Cannot connect to SolarEdge Modbus server on {0}:{1}, error: {2}".format(config['modbus']['host'], config['modbus']['port'], err))
sys.exit(2)
mqtt.loop()
if (publishedAutoDiscovery == False):
for k, v in solar_data.data.items():
message = {
"name": "SolarEdge " + k.replace("_", " ").title(),
"unique_id": "solaredge_" + k,
"unit_of_measurement": SolarData.fields[k]['unit'] if 'unit' in SolarData.fields[k] else '',
"state_topic": "home/hal_beneden/sensor/solaredge_inverter/" + k,
"force_update": "True",
"device": {
"identifiers": ["solaredge_inverter"],
"name": "SolarEdge Inverter"
}
}
mqtt.publish(
'test/homeassistant/sensor/solaredge_inverter/' + str(k) + '/config',
json.dumps(message),
qos=0,
retain=True
)
publishedAutoDiscovery = True
for k, v in solar_data.data.items():
mqtt.publish('test/home/hal_beneden/sensor/solaredge_inverter/' + k, payload=str(v), qos=0, retain=False)
time.sleep(args.poll_interval)