Buenas tardes a todos,

Como podréis ver en mi post de presentación, tengo un BMS Daly de 16S y 150A con ventilador y quería conectarlo al NodeRed.

El paquete que compré incluía el accesorio bluetooth y el conversor USB a RS485/UART como estos:

Conectar BMS DALY al NodeRed paso a paso (USB)-cables-regalo.png

Con la App siempre he podido ver los valores via Bluetooth, pero ya que tengo el voltronic y el SDM en NodeRed, quería tener también los valores del Daly directamente de él. MINISTROPEPÓN me dijo que él mirase un script que había creado VictorJChamorro para leer su Daly, pero por más que lo intentaba, tenía que cambiar muchas cosas (tales como TTYUSBXXX) para que funcionase dentro de los archivos .PY, sin lograr que funcionase al final. Además otra de las limitaciones de su código es que es específico para su hardware: número de celdas, capacidad, etc. Este método sin embargo, obtiene símplemente todo de la manera que tú lo hayas configurado previamente con W10 o con la app bluetooth, sea 4S, 8S o 16S como es mi caso.

Por fin esta mañana álguien comentó en un post de DIYSolar que sigo, otra herramienta para decodificar los datos de los Dalys/sinowealth y sobre todo, que parecía más fácil de implementar. Aquí van los pasos a seguir:


  • Primero de todo, hay que instalar el instalador de Github llamado GIT. Entramos en consola (o sesión SSH) y lo instalamos siguiendo las instrucciones estas. Yo tengo Ubuntu así que usé sudo apt-get install git-all


Código:
https://github.com/git-guides/install-git



Código:
git clone https://github.com/dreadnought/python-daly-bms.git
cd python-daly-bms
sudo python3 setup.py install

  • lo siguiente es ver qué USBs tenemos y en cual nuestro Linux ha instalado el conversor USB->UART. Para ello vamos otra vez al símbolo de sistema y escribimos esto:


Código:
dmesg | grep tty
Nos debe salir algo parecido a esto:

Conectar BMS DALY al NodeRed paso a paso (USB)-usbtty.jpg

En esa lista, tenéis que buscar vuestro conversor USB->UART que os llegó con el BMS o el que estéis usando. Ojo que por este método también se podrían usar adaptadores TCP/IP y puertos COM virtuales, etc. El mío es este:

[ 1231.590717] usb 5-1: ch341-uart converter now attached to ttyUSB0

Ahora ya tenemos la información para probar el código python que hemos instalado:

Código:
daly-bms-cli  -d /dev/ttyUSB0 --soc
y nos tendría que salir algo parecido a esto:

Nombre:  test.JPG
Visitas: 982
Tamaño: 19,6 KB

Si obtenemos ese resultado significa que tenemos conexión con el BMS a través del USB y que funciona.

Lo siguiente es irnos a nuestro NodeRed y crear un flujo específico para él. El fundamento es que vamos a correr esa "aplicación" python, y que lo que habéis visto que es el resultado, lo meteremos en nuestro NodeRed como un JSON a descifrar. Aquí una captura de dicho flow:

Conectar BMS DALY al NodeRed paso a paso (USB)-flujo.jpg

En realidad ahora lo que vamos a correr es el código python entero, que nos da una salida mucho mas grande que antes, con todo lo que podíamos ver antes por la app/W10:

Código:
daly-bms-cli  -d /dev/ttyUSB0 --all
Y aquí la salida de una ejecución del código de arriba en la terminal SSH:

Código:
{"soc":{"total_voltage":53,"current":5.7,"soc_percent":96.7},"cell_voltage_range":{"highest_voltage":3.317,"highest_cell":11,"lowest_voltage":3.311,"lowest_cell":5},"temperature_range":{"highest_temperature":30,"highest_sensor":1,"lowest_temperature":30,"lowest_sensor":1},"mosfet_status":{"mode":"discharging","charging_mosfet":true,"discharging_mosfet":true,"capacity_ah":170.192},"status":{"cells":16,"temperature_sensors":1,"charger_running":false,"load_running":false,"states":{"DI1":false,"DI2":true},"cycles":17},"cell_voltages":{"1":3.317,"2":3.311,"3":3.317,"4":3.313,"5":3.313,"6":3.309,"7":3.317,"8":3.309,"9":3.317,"10":3.314,"11":3.317,"12":3.312,"13":3.317,"14":3.314,"15":3.312,"16":3.312},"temperatures":{"1":30},"balancing_status":{"error":"not implemented"},"errors":[]}

Aquí os dejo mi flujo NodeRed tal y como se ve en la imagen de arriba:

Código:
[{"id":"2d370f5ff4dd4d5b","type":"tab","label":"TEST","disabled":false,"info":""},{"id":"c6112dcb65c5ddb2","type":"exec","z":"2d370f5ff4dd4d5b","command":"daly-bms-cli  -d /dev/ttyUSB0 --all","addpay":"","append":"","useSpawn":"false","timer":"","winHide":false,"oldrc":false,"name":"Información Daly_BMS","x":360,"y":60,"wires":[["e851b1aff1b99155"],["b89c44c31f5eb7c4"],["a43c266aa5dbc733"]]},{"id":"e1edfbbb19624974","type":"inject","z":"2d370f5ff4dd4d5b","name":"Heartbeat","props":[{"p":"payload"}],"repeat":"5","crontab":"","once":false,"onceDelay":"5","topic":"","payloadType":"date","x":130,"y":60,"wires":[["c6112dcb65c5ddb2"]]},{"id":"0e39bad73cc3f72e","type":"debug","z":"2d370f5ff4dd4d5b","name":"Standard output","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":620,"y":160,"wires":[]},{"id":"b89c44c31f5eb7c4","type":"debug","z":"2d370f5ff4dd4d5b","name":"Standard error","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":620,"y":60,"wires":[]},{"id":"a43c266aa5dbc733","type":"debug","z":"2d370f5ff4dd4d5b","name":"Return code","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":610,"y":100,"wires":[]},{"id":"e851b1aff1b99155","type":"json","z":"2d370f5ff4dd4d5b","name":"","property":"payload","action":"","pretty":false,"x":250,"y":340,"wires":[["0e39bad73cc3f72e","b18ee3aa2d83b8be","a1811841ba700681","c8b7c7a4542bfdf8","b372ca57dcd5531b","e4a166f84b7326b2","5963ec16091eeb0e","d8e3899dd92a8013","3cb502460ccf084c"]]},{"id":"7927d75c10c2a051","type":"influxdb out","z":"2d370f5ff4dd4d5b","influxdb":"4478a6abb6eff41d","name":"VoltajeBateriaDaly","measurement":"VoltajeBateriaDaly","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":910,"y":280,"wires":[]},{"id":"a0873c1f9c8c5915","type":"influxdb out","z":"2d370f5ff4dd4d5b","influxdb":"4478a6abb6eff41d","name":"IntensidadBateriaDaly","measurement":"IntensidadBateriaDaly","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":920,"y":320,"wires":[]},{"id":"382230b57f8fd9dd","type":"influxdb out","z":"2d370f5ff4dd4d5b","influxdb":"4478a6abb6eff41d","name":"SOCDaly","measurement":"SOCDaly","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":880,"y":360,"wires":[]},{"id":"a00e2e37ece73c76","type":"influxdb out","z":"2d370f5ff4dd4d5b","influxdb":"4478a6abb6eff41d","name":"CapacidadAHDaly","measurement":"CapacidadAHDaly","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":910,"y":440,"wires":[]},{"id":"5667ca404877300d","type":"influxdb out","z":"2d370f5ff4dd4d5b","influxdb":"4478a6abb6eff41d","name":"CiclosBateriaDaly","measurement":"CiclosBateriaDaly","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":910,"y":400,"wires":[]},{"id":"7bcaefbda40c2966","type":"influxdb out","z":"2d370f5ff4dd4d5b","influxdb":"4478a6abb6eff41d","name":"TempBateriaDaly","measurement":"TempBateriaDaly","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":910,"y":480,"wires":[]},{"id":"d9dd18b50ae18efe","type":"influxdb out","z":"2d370f5ff4dd4d5b","influxdb":"4478a6abb6eff41d","name":"VoltajesCeldasDaly","measurement":"VoltajesCeldasDaly","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":910,"y":520,"wires":[]},{"id":"b18ee3aa2d83b8be","type":"function","z":"2d370f5ff4dd4d5b","name":"VoltajeBateriaDaly","func":"var voltajeBateriaDaly = parseFloat(msg.payload.soc.total_voltage)\n\nreturn {topic : \"VoltajeBateriaDaly\", payload : voltajeBateriaDaly};","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":280,"wires":[["7927d75c10c2a051"]]},{"id":"a1811841ba700681","type":"function","z":"2d370f5ff4dd4d5b","name":"IntensidadBateriaDaly","func":"var IntensidadBateriaDaly = parseFloat(msg.payload.soc.current)\n\nreturn {topic : \"IntensidadBateriaDaly\", payload : IntensidadBateriaDaly};","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":320,"wires":[["a0873c1f9c8c5915"]]},{"id":"c8b7c7a4542bfdf8","type":"function","z":"2d370f5ff4dd4d5b","name":"SOCBateriaDaly","func":"var SOCDaly = parseFloat(msg.payload.soc.soc_percent)\n\nreturn {topic : \"SOCDaly\", payload : SOCDaly};","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":360,"wires":[["382230b57f8fd9dd"]]},{"id":"b372ca57dcd5531b","type":"function","z":"2d370f5ff4dd4d5b","name":"SOCBateriaDaly","func":"var CiclosBateria = parseFloat(msg.payload.status.cycles)\n\nreturn {topic : \"CiclosBateria\", payload : CiclosBateria};","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":400,"wires":[["5667ca404877300d"]]},{"id":"e4a166f84b7326b2","type":"function","z":"2d370f5ff4dd4d5b","name":"CapacidadBateria","func":"var CapacidadBateria = parseFloat(msg.payload.mosfet_status.capacity_ah)\n\nreturn {topic : \"CapacidadBateria\", payload : CapacidadBateria};","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":440,"wires":[["a00e2e37ece73c76"]]},{"id":"5963ec16091eeb0e","type":"function","z":"2d370f5ff4dd4d5b","name":"TemperaturaBateria","func":"var TemperaturaBateria = parseFloat(msg.payload.temperatures[\"1\"])\n\nreturn {topic : \"TemperaturaBateria\", payload : TemperaturaBateria};","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":480,"wires":[["7bcaefbda40c2966"]]},{"id":"d8e3899dd92a8013","type":"function","z":"2d370f5ff4dd4d5b","name":"VoltajeBateriaDaly","func":"var voltajeCeldasDaly = msg.payload.cell_voltages\nvar res = Object.values(voltajeCeldasDaly);\nreturn {topic : \"voltajeCeldasDaly\", payload : voltajeCeldasDaly};","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":520,"wires":[["d9dd18b50ae18efe"]]},{"id":"3cb502460ccf084c","type":"debug","z":"2d370f5ff4dd4d5b","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":320,"y":620,"wires":[]},{"id":"4478a6abb6eff41d","type":"influxdb","hostname":"127.0.0.1","port":"8086","protocol":"http","database":"DalyBMS","name":"DalyBMS","usetls":false,"tls":"","influxdbVersion":"1.x","url":"http://localhost:8086","rejectUnauthorized":true}]

Pero en realidad la chicha como aquel que dice está en el nodo EXEC al que le tienes que pasar un ping cada 5 segundos (mi máquina tarda algo menos de 3, así que así no la sobrecargo mucho). Os recomiendo antes de poner el flujo a correr, ver cuanto tarda en sacar los valores a mano corriendo el ejecutable terminado en --all y ver cuanto tarda:

Conectar BMS DALY al NodeRed paso a paso (USB)-exec.jpg

Y ya con esto, puedo tener un dashboard completo en el Grafana mostrando SOC, temperaturas de batería, voltaje, etc y en un futuro ¿próximo? ponerme con los gestores de excedentes, que como veréis ahí abajo me sobra mucho sol todavía, habiendo puesto termo eléctrico y coche a cargar:

Conectar BMS DALY al NodeRed paso a paso (USB)-grafana.jpg