Se avete la fortuna di poter collegare il dongle RS485 che legge i dati del vostro inverter direttamente a raspderry che ospita il vostro HA, la parte iniziale di questa guida non vi serve e potete andare direttamente al capito dedicato.
Se invece avete un raspberry con il dongle RS485 collegato all’inverter, e un altro raspberry con HA ecco come è possible metterli in comunicazione vi MQTT.
Sul raspberry con il dongle RS485 installare Pyton:
sudo apt install python3-pymodbus python3-paho-mqtt
se risponde OK ci siamo..
Prima di procedere è necessario conoscere l’IP del raspberry che ospita HA, nel mio caso 192.168.0.7 comando:
ping -c 4 192.168.0.7 verificare che risponda.
Prima di procedere è necessario installare nel raspberry che ospita HA l’applicazione Mosquitto Broker. Andare poi nelle integrazioni e verificare che MQTT si sia aggiunta e non ci siano errori. Creare l’utente mqtt_powerx e scegliere una password (attenzione deve essere un’utente e non una persona)
Installata l’App Mosquitto torniamo sul raspberry collegato all0inverte e verifichiamo che MQTT risponda sulla porta 1883 con il comando:
nc -vz 192.168.0.7 1883
la risposta dovrebbe essere: Connection to 192.168.0.7 1883 port [tcp/*] succeeded!
Installiamo questo software con il comando:
sudo apt install mosquitto-clients
proviamo un semplice comando come:
mosquitto_pub -h 192.168.0.7 -u mqtt_powerx -P PASSWORD -t test/powerx -m “ciao”
Al posto di PASSWORD metti quella da te scelta. Se funziona non dovrebbe dare errori. Eseguiamo un test di comunicazione, sempre sul raspberry inverter digitare il comando:
mosquitto_sub -h 192.168.0.7 -u mqtt_powerx -P TUA_PASSWORD -t test/powerx
dopo aver dato invio il terminale dovrebbe restare in attesa, apri un altro terminale e digita:
mosquitto_pub -h 192.168.0.7 -u mqtt_powerx -P TUA_PASSWORD -t test/powerx -m “ciao”
se ha funzionato il primo terminale dovrebbe sbloccarsi e scrivere “ciao” poi rimanere nuovamente in attesa. Fermare tutto con CTRL + C .
Sempre sul raspberry inverter creare il file “powerx_soc.py “dentro una cartella dove si hanno diritti di lettura e scrittura, che contiene il seguente codice. Modificare il file con il giusto nome utente e password.
import time
import struct
import paho.mqtt.publish as publish
from pymodbus.client import ModbusSerialClient
MQTT_BROKER = "192.168.0.7"
MQTT_USER = "mqtt_powerx"
MQTT_PASSWORD = "LA_TUA_PASSWORD"
client = ModbusSerialClient(
port="/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0",
baudrate=115200,
parity="N",
stopbits=1,
bytesize=8,
timeout=2
)
discovery_sent = False
while True:
try:
if client.connect():
result = client.read_input_registers(
address=4626,
count=2,
slave=1
)
if not result.isError():
raw = struct.pack(
'>HH',
result.registers[0],
result.registers[1]
)
soc = struct.unpack('>f', raw)[0]
if not discovery_sent:
publish.single(
"homeassistant/sensor/powerx_soc/config",
payload='{"name":"PowerX SOC","state_topic":"powerx/soc","unit_of_measurement":"%","unique_id":"powerx_soc","state_class":"measurement","device":{"name":"FEB PowerX","manufacturer":"FEB","model":"PowerX"}}',
hostname=MQTT_BROKER,
auth={
"username": MQTT_USER,
"password": MQTT_PASSWORD
}
)
discovery_sent = True
publish.single(
"powerx/soc",
round(soc, 1),
hostname=MQTT_BROKER,
auth={
"username": MQTT_USER,
"password": MQTT_PASSWORD
}
)
print(f"SOC: {soc:.1f}%")
client.close()
except Exception as e:
print(e)
time.sleep(10)
Posizionarsi sulla cartella, verificare che il file sia presente, digitare il comando:
python3 powerx_soc.py
Dovrebbe iniziare a generare su ogni riga il valore di carica della batteria. Aprire un nuovo terminale e digitare il comando:
mosquitto_sub -h 192.168.0.7 -u mqtt_powerx -P TUA_PASSWORD -t powerx/soc
se c’è comunicazione dovrebbe comparire lo stesso valore della finestra 1.
Creiamo l’entità che riceve il dato sul raspberry HA digitando dal terminale del raspberry inverter il seguente comando (inserendo la password corretta):
mosquitto_pub -h 192.168.0.7 -u mqtt_powerx -P TUA_PASSWORD -r -t homeassistant/sensor/powerx_soc/config -m ‘{“name”:”PowerX SOC”,”state_topic”:”powerx/soc”,”unique_id”:”powerx_soc”}’
Sul raspberry HA nell’Integrazione MQTT dovrebbe comparire la nuova identità e se lo script Python è in esecuzione il suo valore dovrebbe essere uguale alla carica delle batterie del nostro impianto.
Se tutto funziona si può creare uno script più completo che legga anche gli altri valori come il PC, BAT, LOAD e GRID:
import time
import struct
import paho.mqtt.publish as publish
from pymodbus.client import ModbusSerialClient
MQTT_BROKER = "192.168.0.7"
MQTT_USER = "mqtt_powerx"
MQTT_PASSWORD = "TUA_PASSWORD"
MODBUS_PORT = "/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0"
client = ModbusSerialClient(
port=MODBUS_PORT,
baudrate=115200,
parity="N",
stopbits=1,
bytesize=8,
timeout=2
)
discovery_done = False
def read_float(address):
result = client.read_input_registers(
address=address,
count=2,
slave=1
)
if result.isError():
return None
raw = struct.pack(">HH",
result.registers[0],
result.registers[1])
return round(struct.unpack(">f", raw)[0], 2)
def mqtt_send(topic, value):
publish.single(
topic,
str(value),
hostname=MQTT_BROKER,
auth={
"username": MQTT_USER,
"password": MQTT_PASSWORD
}
)
while True:
try:
if client.connect():
if not discovery_done:
entities = {
"soc": "%",
"pv_power": "kW",
"battery_power": "kW",
"load_power": "kW",
"grid_power": "kW",
}
for sensor, unit in entities.items():
payload = (
f'{{'
f'"name":"PowerX {sensor}",'
f'"state_topic":"powerx/{sensor}",'
f'"unique_id":"powerx_{sensor}",'
f'"unit_of_measurement":"{unit}"'
f'}}'
)
publish.single(
f"homeassistant/sensor/powerx_{sensor}/config",
payload=payload,
hostname=MQTT_BROKER,
retain=True,
auth={
"username": MQTT_USER,
"password": MQTT_PASSWORD
}
)
discovery_done = True
soc = read_float(4626)
pv = read_float(4720)
battery = read_float(4722)
load = read_float(4724)
grid = read_float(4726)
if soc is not None:
mqtt_send("powerx/soc", soc)
if pv is not None:
mqtt_send("powerx/pv_power", pv)
if battery is not None:
mqtt_send("powerx/battery_power", battery)
if load is not None:
mqtt_send("powerx/load_power", load)
if grid is not None:
mqtt_send("powerx/grid_power", grid)
print(
f"SOC={soc}% "
f"PV={pv}kW "
f"BAT={battery}kW "
f"LOAD={load}kW "
f"GRID={grid}kW"
)
client.close()
except Exception as e:
print(e)
time.sleep(10)
Se avete usato lo stesso script powerx_soc in HA compariranno le nuove entità e finalmente il vostro HA ha tutti i valori necessari a monitorare il vostro impianto fotovoltaico.
Lascia un commento
Devi essere connesso per inviare un commento.