Conexión del inversor fotovoltaico HUAWEI sun2000 a broker MQTT (Node Red), integración de FreeDS y vinculación con domoticz
JJ del grupo de telegram «OpenEVSE» nos cuenta cómo establecer una conexión entre inversor fotovoltaico Huawei sun2000 a broker MQTT (node red).
El objetivo es conectar el único cliente MODBUS-TCP que permite este inversor a una raspberry para, mediante un script python, publicar las lecturas obtenidas en el broker MQTT instalado en la misma máquina.
Una vez publicado, cualquier aplicación que soporte MQTT se puede suscribir al topic deseado (como domoticz). Por ejemplo, OpenEVSE, puede suscribirse directamente al topic del meter, que indica la cantidad de energía que estamos importando o exportando.
Otras aplicaciones, por ejemplo, FreeDS, están diseñadas para leer los datos desde un topic concreto que no podemos modificar. En estos casos, debemos echar mano de Node-red, que se encargará de “cambiar” los topic que publica nuestro script por los que “entiende” FreeDS, que se corresponden con los que usa ICCSolar.
Dividimos esta guía en varios apartados
- Requisitos inciales
- Descarga del software necesario
- Configuración en pUTTY
- Últimos pasos
- Comprobamos su funcionamiento
- Configuramos Node Red
- Reinicio del script
- Integración de FreeDS en el sistema:
- Cómo localizar errores en node red
- Vinculación de los datos con domoticz
- Creamos los Dummys (sensores) en domoticz
- Configuramos Node Red
- Comprobamos el funcionamiento en domoticz
- Cómo localizar errores en node red
- Inicio automático de Node RED con Raspberry Pi
- Sacar el máximo partido al inversor
Requisitos inciales
Para poder seguir este tutorial es necesario tener instalado Node Red en nuestra Raspberry, además de Domoticz (si queremos implementar su uso), MQTT y demás.
Tenemos que habilitar las dos conexiones en la raspberry. La wlan0 con direccion ip en el rango del wifi del inversor huawei, y el eth0 en el rango de la red principal. Eso lo haremos en el archivo /etc/dhcpcd.conf de la siguiente manera:
#Static IP eth0
interface eth0
metric 300
static ip_address=192.168.1.5/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8
# Static IP address wlan0.
interface wlan0
metric 200
static ip_address=192.168.86.5/24
static routers=192.168.86.1
static domain_name_servers=192.168.86.1 8.8.8.8
Y en /etc/wpa_supplicant/wpa_supplicant.conf
country=ES
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid=»miSSID»
psk=»miPass»
key_mgmt=WPA-PSK
}
Descarga del software necesario
Damos por hecho que ya tenemos el software necesario a consecuencia del seguimiento de los tutoriales anteriores para instalar Node red.
OJO a los que tenéis USER y PASS en MQTT de la raspberry y en MQTT de domoticz. Debéis tenerlo en cuenta a la hora de seguir el tutorial.
Configuración en pUTTY
Abrimos putty y lanzamos la siguiente línea para instalar pymodbus:
sudo pip install -U pymodbus
Ir a la carpeta donde queramos copiar el script. En mi caso es la siguiente:
cd home/pi
Crear el fichero:
sudo nano Modbus-TCP_Huawei_to_MQTT.py
Descarga el script desde:
https://github.com/ayasystems/Huawei-TCP-Modbus
Y edítalo con nuestros datos. Explicamos en el siguiente apartado cómo editar dichos datos:
Poner la Ip del broker MQTT (de vuestra Rpi) en la línea:
broker_url = "192.168.1.20"
Poner el user y password del broker MQTT, en la línea:
clientMQTT.username_pw_set(username="XXXXX",password="XXXXXX")
Si se quiere cambiar los topic, hay que hacerlo a partir de la siguiente línea:
clientMQTT.publish(topic="emon/NodeHuawei/Meter", payload= str(energiaExportada), qos=1, retain=False)
Cambiar por vuestro topic aquí:
emon/NodeHuawei/
Poner la IP de vuestro inversor (debéis configurarla fija en el router), en la línea:
leerDetalles("192.168.1.58")
Últimos pasos
Ahora hay que hacerlo ejecutable al inicio creando un servicio con systemd:
Abrimos el editor y creamos el archivo:
sudo nano /lib/systemd/system/Modbus_Huawei_MQTT.service
Y pegamos y guardamos el siguiente código (atención a la ruta del ExecStart):
[Unit]
Description=Mi Servicio para lanzar mi script Modbus_Huawei_MQTT
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/data/Modbus-TCP_Huawei_to_MQTT.py
[Install]
WantedBy=multi-user.target
Nuestro archivo debe tener el permiso como 644 para poder ejecutarse:
sudo chmod 644 /lib/systemd/system/Modbus_Huawei_MQTT.service
Para que el script corra al inicio, escribir en la consola los siguientes comandos:
sudo systemctl daemon-reload
sudo systemctl enable Modbus_Huawei_MQTT.service
Comprobamos su funcionamiento
Puedes revisar si tu script funciona con la siguiente línea:
sudo systemctl status Modbus_Huawei_MQTT.service
Configuramos Node Red
Abrimos node red (Recuerda que accedemos a ella introduciendo la IP de nuestra raspberry seguido de :1880) y cargamos el flow:



Introducimos en el recuadro siguiente texto (lo copiamos con control +c) y lo pegamos en el recuadro (con control + v):
[{"id":"2c11129a.b1b0be","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"3e709931.b785de","type":"mqtt in","z":"2c11129a.b1b0be","name":"","topic":"emon/NodeHuawei/#","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":240,"y":200,"wires":[["e0eecaba.032e58"]]},{"id":"e0eecaba.032e58","type":"debug","z":"2c11129a.b1b0be","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":490,"y":200,"wires":[]},{"id":"8d9bb244.7ccb2","type":"mqtt-broker","z":"","broker":"192.168.1.20","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"15","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":"","willTopic":"","willQos":"0","willRetain":null,"willPayload":""}]
Y tras pegar el texto clicamos sobre IMPORT:

Y veremos que se nos carga el flow completo.
Vamos a comprobar fácilmente si hemos introducido bien los datos. Para ello, clicamos sobre DEPLOY a la derecha.
En la ventana de debug de node red se veran todos los valores publicados:

Reinicio del script
Si por algún motivo se detiene el script, hay que lanzarlo de nuevo escribiendo en la consola (putty) el siguiente comando:
sudo systemctl restart Modbus_Huawei_MQTT.service
Tengo pendiente crear un script watchdog que vigile si esta funcionando y lo reinicie si esta detenido.
Integración de FreeDS en el sistema:
He considerado más robusto y estable tener como cliente Modbus-TCP a la raspberry y no el ESP32 de FreeDS, ya que la rpi siempre esta conectada como “servidor domótico” y el ESP32 no siempre lo tendré conectado. De este modo está todo más centralizado para publicar los valores del inversor en el broker MQTT y tenerlos disponibles para la domótica.
Se podría usar FreeDS igualmente, ya que una vez configurado como cliente Modbus-TCP del inversor (seleccionando “Huawei Modbus TCP”), también publica los valores en el broker MQTT, con el topic definido en la configuración, que por defecto es freeds_xxxx/, siendo xxxx los dos ultimos bytes de la MAC de vuestro ESP32.
Si queremos usar FreeDS con nuestro script, debemos seleccionar como fuente de datos “ICC Solar (Mqtt)” y echar mano de node-red. Lo único que tenemos que hacer es suscribirnos a los topic que publica el script python con los valores obtenidos del inversor y publicarlos como los topic de ICCSolar, que estan soportados por FreeDS.
El flow a importar en node-red es el siguiente:
[{"id":"6b0de1c1.e3901","type":"tab","label":"FreeDS","disabled":false,"info":""},{"id":"4170b486.8af64c","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"emon/NodeHuawei/Power_inversor","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":220,"y":160,"wires":[["e706f60e.ed4598","487e99ba.c0d5e8"]]},{"id":"110d3dac.e9670a","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"emon/NodeHuawei/Meter","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":190,"y":260,"wires":[["d86adf7f.2f7e08"]]},{"id":"e706f60e.ed4598","type":"mqtt out","z":"6b0de1c1.e3901","name":"","topic":"Inverter/PvWattsTotal","qos":"2","retain":"","broker":"8d9bb244.7ccb2","x":600,"y":160,"wires":[]},{"id":"ddcf5d6f.7deb8","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"Inverter/#","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":660,"y":60,"wires":[["d33760f1.118e88"]]},{"id":"d33760f1.118e88","type":"debug","z":"6b0de1c1.e3901","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":850,"y":60,"wires":[]},{"id":"11bcff15.faedb1","type":"mqtt out","z":"6b0de1c1.e3901","name":"","topic":"Inverter/GridWatts","qos":"2","retain":"","broker":"8d9bb244.7ccb2","x":770,"y":260,"wires":[]},{"id":"ee26402c.c807d8","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"emon/NodeHuawei/EnergiaDia","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":210,"y":320,"wires":[["bcdc4724.7db838"]]},{"id":"bcdc4724.7db838","type":"mqtt out","z":"6b0de1c1.e3901","name":"","topic":"Inverter/SolarKwUse","qos":"2","retain":"","broker":"8d9bb244.7ccb2","x":540,"y":320,"wires":[]},{"id":"a653c8c2.09d778","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"emon/NodeHuawei/String_1_Voltaje","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":220,"y":380,"wires":[["b7f34d17.573e78"]]},{"id":"b4a42715.ea0b9","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"emon/NodeHuawei/String_1_Corriente","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":230,"y":440,"wires":[["4b4bf8a6.c9cee8"]]},{"id":"ac1eb267.8edc28","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"emon/NodeHuawei/Power_paneles","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":220,"y":500,"wires":[["e5d94cf.f37dfb"]]},{"id":"b7f34d17.573e78","type":"mqtt out","z":"6b0de1c1.e3901","name":"","topic":"Inverter/MPPT1_Volts","qos":"2","retain":"","broker":"8d9bb244.7ccb2","x":540,"y":380,"wires":[]},{"id":"4b4bf8a6.c9cee8","type":"mqtt out","z":"6b0de1c1.e3901","name":"","topic":"Inverter/MPPT1_Amps","qos":"2","retain":"","broker":"8d9bb244.7ccb2","x":550,"y":440,"wires":[]},{"id":"e5d94cf.f37dfb","type":"mqtt out","z":"6b0de1c1.e3901","name":"","topic":"Inverter/MPPT1_Watts","qos":"2","retain":"","broker":"8d9bb244.7ccb2","x":550,"y":500,"wires":[]},{"id":"aad8f98b.da4ab8","type":"mqtt in","z":"6b0de1c1.e3901","name":"","topic":"emon/NodeHuawei/Temp_Inversor","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":220,"y":560,"wires":[["1603b1cd.0f1c16"]]},{"id":"1603b1cd.0f1c16","type":"mqtt out","z":"6b0de1c1.e3901","name":"","topic":"Inverter/Temperature","qos":"2","retain":"","broker":"8d9bb244.7ccb2","x":520,"y":560,"wires":[]},{"id":"95c12365.5f2158","type":"inject","z":"6b0de1c1.e3901","name":"DEBUG: Simular produccion solar de1000W","topic":"solar","payload":"1000","payloadType":"num","repeat":"10","crontab":"","once":false,"onceDelay":"","x":220,"y":120,"wires":[[]]},{"id":"3d709165.e6140e","type":"inject","z":"6b0de1c1.e3901","name":"DEBUG: Simular exceso 300W","topic":"solar","payload":"300","payloadType":"num","repeat":"10","crontab":"","once":false,"onceDelay":"","x":180,"y":220,"wires":[[]]},{"id":"487e99ba.c0d5e8","type":"debug","z":"6b0de1c1.e3901","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":570,"y":120,"wires":[]},{"id":"c1d88e.3b83477","type":"comment","z":"6b0de1c1.e3901","name":"Inversor Huawei SUN2000 en FreeDS con MQTT","info":"Nos suscribimos a los topic que publica, en el broker mqtt, el script python con los valores obtenidos del inversor y se publican como los topic de ICCSolar, que estan soportados por FreeDS.","x":210,"y":40,"wires":[]},{"id":"fc264e86.63a7a8","type":"debug","z":"6b0de1c1.e3901","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":220,"wires":[]},{"id":"d86adf7f.2f7e08","type":"change","z":"6b0de1c1.e3901","name":"convertir a numero y cambio signo","rules":[{"t":"set","p":"payload","pt":"msg","to":"($number(payload))*-1","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":260,"wires":[["fc264e86.63a7a8","11bcff15.faedb1"]]},{"id":"8d9bb244.7ccb2","type":"mqtt-broker","z":"","broker":"192.168.1.20","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"15","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":"","willTopic":"","willQos":"0","willRetain":null,"willPayload":""}]
El aspecto que tiene es el siguiente:

Cómo localizar errores en node red
Os damos un truquito para vuestra información. Tenemos un node en el listado de la izquierda que se llama DEBUG. Cuando lo llevamos a la pantalla principal, lo conectamos a un node y lo activamos, nos dá mucha información (como un LOG) en la columna de la derecha del todo. Os explicamos con unas cuantas imágenes cómo conseguirlo:


Mantén el cursor pulsando la bola del final del recuadro del mqtt/in y arrástrala hasta la bola del inicio del recuadro del debug:




Clicamos sobre deploy:

Activamos la cucaracha y a la derecha nos aparecerá el debug con info de errores /( y así podremos analizar qué estamos haciendo mal) o info correcta:


Vinculación de los datos con domoticz
Para que los datos del inversor nos aparezcan en domoticz, vamos a vincular la información entre Node Red y domoticz.
Para ello abrimos de nuevo Node Red (si es que no lo teníamos abierto).
Estos son los flows que utilizo para crear unas variables globales que se pueden emplear para programaciones en node-red y también los envío a domoticz.
Variables globales de Produccion solar, consumo de la casa y exceso de FV.
Importamos los flows exactamente igual que en el caso anterior, vamos a:
Node Red > Import > Clipboard
Copiamos y pegamos el siguiente texto:
[{"id":"b6c4d89e.3fb528","type":"tab","label":"ValoresFV","disabled":false,"info":""},{"id":"36144a7d.c21556","type":"mqtt in","z":"b6c4d89e.3fb528","name":"","topic":"emon/NodeHuawei/Power_inversor","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":140,"y":160,"wires":[["d9558c01.e3772"]]},{"id":"ceeed17a.f780b8","type":"mqtt in","z":"b6c4d89e.3fb528","name":"","topic":"emon/NodeHuawei/Meter","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":130,"y":236,"wires":[["c67f8a69.55291"]]},{"id":"d9558c01.e3772","type":"change","z":"b6c4d89e.3fb528","name":"Esolar Input","rules":[{"t":"set","p":"topic","pt":"msg","to":"Esolar","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":371.25,"y":101.25,"wires":[["edf211f9.9dc648"]]},{"id":"c67f8a69.55291","type":"change","z":"b6c4d89e.3fb528","name":"Meter Input","rules":[{"t":"set","p":"topic","pt":"msg","to":"meter","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":371.25,"y":241.25,"wires":[["df83c173.876de","db1d84f7.4d032"]]},{"id":"edf211f9.9dc648","type":"delay","z":"b6c4d89e.3fb528","name":"","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":571.25,"y":101.25,"wires":[["df83c173.876de"]]},{"id":"db1d84f7.4d032","type":"debug","z":"b6c4d89e.3fb528","name":"debug","active":false,"tosidebar":true,"console":false,"complete":"payload","x":463,"y":295,"wires":[]},{"id":"df83c173.876de","type":"function","z":"b6c4d89e.3fb528","name":"Almacenar consumo casa","func":"// Load defaultsnvar Esolar = global.get("Esolar");nvar uso = global.get("uso");nvar exceso = global.get("exceso");nn// Almacenar Solar PV en variable nif (msg.topic === "Esolar") {n Esolar = msg.payload ;n global.set("Esolar",Esolar)n}nn// Almacenar consumo casa en variablenif (msg.topic === "meter") {n uso = (msg.payload*-1)+(1*Esolar) ;n global.set("uso",uso)n}nn exceso = Esolar - uso;nn global.set("exceso",exceso)nn nnreturn [{payload: global.get('Esolar')}, {payload: global.get('uso')},{payload: global.get('exceso')}];n","outputs":"3","noerr":0,"x":571.25,"y":181.25,"wires":[["88b196cd.6bb05","f45b8da1.628a4"],["d34415ce.3a5","abd7d624.3da3d"],["bdd9d389.b4435","22603d.45ef77c4"]]},{"id":"88b196cd.6bb05","type":"debug","z":"b6c4d89e.3fb528","name":"produccion solar","active":false,"tosidebar":true,"console":false,"complete":"payload","x":911.25,"y":41.25,"wires":[]},{"id":"f45b8da1.628a4","type":"mqtt out","z":"b6c4d89e.3fb528","name":"","topic":"emon/NodeHuawei/PowerSOLAR","qos":"1","retain":"","broker":"8d9bb244.7ccb2","x":981.25,"y":81.25,"wires":[]},{"id":"d34415ce.3a5","type":"debug","z":"b6c4d89e.3fb528","name":"Consumo Casa","active":false,"tosidebar":true,"console":false,"complete":"payload","x":941.25,"y":121.25,"wires":[]},{"id":"abd7d624.3da3d","type":"mqtt out","z":"b6c4d89e.3fb528","name":"","topic":"emon/NodeHuawei/ConsumoCASA","qos":"","retain":"","broker":"8d9bb244.7ccb2","x":1001.25,"y":161.25,"wires":[]},{"id":"bdd9d389.b4435","type":"debug","z":"b6c4d89e.3fb528","name":"exceso","active":false,"console":"false","complete":"payload","x":901.25,"y":201.25,"wires":[]},{"id":"22603d.45ef77c4","type":"mqtt out","z":"b6c4d89e.3fb528","name":"emon/NodeHuawei/ExcesoFV","topic":"emon/NodeHuawei/ExcesoFV","qos":"","retain":"","broker":"8d9bb244.7ccb2","x":961.25,"y":241.25,"wires":[]},{"id":"8d9bb244.7ccb2","type":"mqtt-broker","z":"","broker":"192.168.1.20","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"15","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":"","willTopic":"","willQos":"0","willRetain":null,"willPayload":""}]

Creamos los Dummys (sensores) en domoticz
Iniciamos domoticz, y vamos a:
Domoticz > Setup > Hardware

Creamos uno por uno varios sensores, en total 3, clicando sobre Create Virtual Sensors:

Necesitremos crear 3 dummys tipo Usage (electric) (aunque el inversor permite vincular más información).
Los tres dummys que crearemos tipo Usage (Electric) los llamaremos:
- Produccion solar
- Exceso FV
- Consumo Casa

Nos vamos a:
Domoticz > Setup > Devices

Nos aparecen los dummys que acabamos de crear y anotamos los IDX y los nombres. Nos harán falta posteriormente.
Configuramos Node Red
Flow para exportar esos valores a Domoticz en mis dummys IDX 615, 616 y 617, que acabamos de crear. Tendrás que modificar estos números de IDX en tu node red tras importar el flow, además de los datos de tu domoticz.
Se incluye un cambio de signo en el exceso de FV para OpenEVSE, que entiende el signo negativo como exportado, al contrario que FreeDS).
[{"id":"94f4c4a7.04874","type":"tab","label":"DomoticZ","disabled":false,"info":""},{"id":"73dc5ba2.2e578c","type":"mqtt out","z":"94f4c4a7.04874","name":"Publicar en DomoticZ","topic":"domoticz/in","qos":"","retain":"","broker":"8d9bb244.7ccb2","x":960,"y":160,"wires":[]},{"id":"8e9a471f.c25dd","type":"function","z":"94f4c4a7.04874","name":"DomoticZ_IDX 615_Esolar","func":"nvar smes = msg.payload;nmsg.payload = {};nmsg.payload.idx = 615nmsg.payload.svalue = smes//smes;nreturn msg;","outputs":1,"noerr":0,"x":680,"y":120,"wires":[["73dc5ba2.2e578c"]]},{"id":"6b9acaef.41eb84","type":"function","z":"94f4c4a7.04874","name":"DomoticZ_IDX 616_uso","func":"nvar smes = msg.payload;nmsg.payload = {};nmsg.payload.idx = 616nmsg.payload.svalue = smes//smes;nreturn msg;","outputs":1,"noerr":0,"x":670,"y":180,"wires":[["73dc5ba2.2e578c"]]},{"id":"4a45be1c.7c6228","type":"function","z":"94f4c4a7.04874","name":"DomoticZ_IDX 617_exceso","func":"nvar smes = msg.payload;nmsg.payload = {};nmsg.payload.idx = 617nmsg.payload.svalue = smes//smes;nreturn msg;","outputs":1,"noerr":0,"x":740,"y":240,"wires":[["73dc5ba2.2e578c"]]},{"id":"adbb235f.b86f3","type":"mqtt in","z":"94f4c4a7.04874","name":"","topic":"emon/NodeHuawei/Power_inversor","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":220,"y":60,"wires":[["945869a1.e7ab4","cb477005.44ba98"]]},{"id":"135afbda.7e475c","type":"function","z":"94f4c4a7.04874","name":"Valores FV para Domoticz","func":"var solar = global.get("Esolar");nvar use = global.get("uso");nvar excess = global.get("exceso");nnnreturn [{payload: solar}, {payload: use}, {payload:excess}];","outputs":3,"noerr":0,"x":260,"y":200,"wires":[["8e9a471f.c25dd"],["ca7dab87.25def8"],["d1c78ff6.d53fd8","6f9aec20.743ef4"]]},{"id":"945869a1.e7ab4","type":"delay","z":"94f4c4a7.04874","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":240,"y":120,"wires":[["135afbda.7e475c"]]},{"id":"ca7dab87.25def8","type":"change","z":"94f4c4a7.04874","name":"num to str","rules":[{"t":"set","p":"payload","pt":"msg","to":"$string(payload)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":200,"wires":[["6b9acaef.41eb84"]]},{"id":"d1c78ff6.d53fd8","type":"change","z":"94f4c4a7.04874","name":"num to str","rules":[{"t":"set","p":"payload","pt":"msg","to":"$string(payload)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":240,"wires":[["4a45be1c.7c6228"]]},{"id":"89c0d59b.d0c868","type":"debug","z":"94f4c4a7.04874","name":"output","active":false,"console":"false","complete":"payload","x":610,"y":460,"wires":[]},{"id":"dfa5d23f.1a03c8","type":"mqtt in","z":"94f4c4a7.04874","name":"domoticz/in/#","topic":"domoticz/in/#","qos":"2","datatype":"auto","broker":"8d9bb244.7ccb2","x":110,"y":380,"wires":[["7aa9abd5.fc38c4"]]},{"id":"7aa9abd5.fc38c4","type":"debug","z":"94f4c4a7.04874","name":"output","active":false,"tosidebar":true,"console":false,"complete":"payload","x":330,"y":380,"wires":[]},{"id":"cb477005.44ba98","type":"debug","z":"94f4c4a7.04874","name":"output","active":false,"tosidebar":true,"console":false,"complete":"payload","x":470,"y":40,"wires":[]},{"id":"14a6b3b2.1b77ec","type":"mqtt out","z":"94f4c4a7.04874","name":"emon/NodeHuawei/ExcesoFV_OpenEvse","topic":"emon/NodeHuawei/ExcesoFV_OpenEvse","qos":"","retain":"","broker":"8d9bb244.7ccb2","x":790,"y":340,"wires":[]},{"id":"6f9aec20.743ef4","type":"change","z":"94f4c4a7.04874","name":"Cambio de signo (OpenEvse)","rules":[{"t":"set","p":"payload","pt":"msg","to":"($number(payload))*-1","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":300,"wires":[["14a6b3b2.1b77ec","89c0d59b.d0c868"]]},{"id":"8d9bb244.7ccb2","type":"mqtt-broker","z":"","broker":"192.168.1.20","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"15","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":"","willTopic":"","willQos":"0","willRetain":null,"willPayload":""}]

Comprobamos el funcionamiento en domoticz
Una vez hemos clicado en DEPLOY y nos aparece domoticz/in como connected, nos vamos a domoticz y comprobamos que está funcionando correctamente:

Cómo localizar errores en node red
Os damos un truquito para vuestra información. Tenemos un node en el listado de la izquierda que se llama DEBUG. Cuando lo llevamos a la pantalla principal, lo conectamos a un node y lo activamos, nos dá mucha información (como un LOG) en la columna de la derecha del todo. Os explicamos con unas cuantas imágenes cómo conseguirlo:


Mantén el cursor pulsando la bola del final del recuadro del mqtt/in y arrástrala hasta la bola del inicio del recuadro del debug:




Clicamos sobre deploy:

Activamos la cucaracha y a la derecha nos aparecerá el debug con info de errores /( y así podremos analizar qué estamos haciendo mal) o info correcta:


Inicio automático de Node RED con Raspberry Pi
Recordar que por defecto Node RED está apagado. Podemos iniciarlo de dos formas diferentes: manual o automático.
Para inicio manual introducimos en puTTY:
node-red-start
Para que Node Red inicie de forma automática (tras caídas de red, o tras apagar y encender la raspberry) lanzamos el siguiente comando en puTTY:
sudo systemctl enable nodered.service
Sacar el máximo partido al inversor
Tienes a tu disposición dos tutoriales para incluir también en domoticz dos derivadores de excedentes solares para sacar el máximo partido a la producción solar aunque tengas activado el veritido o inyección cero. Te los dejamos a continuación para que les eches un vistazo:
