Configuration capteur d'irradiance sur cerboGX Nodred

Bonjour, j’ai un capteur d’irradiance ZTS-300AL-RA-N01 à paramétrer dans Nodred, tout est ok pour la gestion en entrée, les valeurs sont là. En sortie, j’utilise : virtual device/ météo / irradiance. Mais où je bloque, c’est justement la liaison, puisque Virtual Device n’a pas de possibilité de se câbler. Et je ne trouve pas la fonction pour faire la liaison. L’appareil irradiance est présent sur VRM et dans la liste du CerboGX, j’ai une valeur de W/m2 dans Nodred. quelqu’un à une solution pour envoyer l’info ?

Il faut alimenter l’appareil virtuel en données.

Voici un exemple que j’ai implémenté pour alimenter deux compteurs virtuels au départ des données de production et réseau fournies par la passerelle Enphase.

[{"id":"42b073802c3257dd","type":"link in","z":"0ee9e0ece3f93e25","name":"Prod Data","links":["811ea9503afc422d"],"x":100,"y":1400,"wires":[["995ddc73456dfd25"]],"l":true},{"id":"995ddc73456dfd25","type":"function","z":"0ee9e0ece3f93e25","name":"Format","func":"// Data from ivp/meters/reports\n// reportType: \"production\"\nlet prod = [];\n\nlet prod_power = msg.payload[0].lines[0].currW;\nif (typeof prod_power !== 'number' || prod_power < 2) prod_power = 0;\nprod.push({ path: '/Ac/Power', payload: prod_power });\nprod.push({ path: '/Ac/L1/Power', payload: prod_power });\n\nlet prod_current = msg.payload[0].lines[0].rmsCurrent;\nif (typeof prod_current !== 'number' || prod_current < 0) prod_current = 0;\nprod.push({ path: '/Ac/L1/Current', payload: prod_current });\n\nlet prod_voltage = msg.payload[0].lines[0].rmsVoltage;\nif (typeof prod_voltage !== 'number' || prod_voltage < 0) prod_voltage = 0;\nprod.push({ path: '/Ac/L1/Voltage', payload: prod_voltage });\n\nlet prod_energy_fwd = msg.payload[0].lines[0].whDlvdCum;\nif (typeof prod_energy_fwd !== 'number' || prod_energy_fwd < 0) prod_energy_fwd = 0;\nelse prod_energy_fwd /= 1000;\n\nif (prod_power > 0) {\n    prod.push({ path: '/Ac/Energy/Forward', payload: prod_energy_fwd });\n    prod.push({ path: '/Ac/L1/Energy/Forward', payload: prod_energy_fwd });\n}\n\n// reportType: \"net-consumption\"\ngrid = [];\n\nlet grid_power = msg.payload[1].lines[0].currW;\nif (typeof grid_power !== 'number') grid_power = 0;\ngrid.push({ path: '/Ac/Power', payload: grid_power });\ngrid.push({ path: '/Ac/L1/Power', payload: grid_power });\n\nlet grid_current = msg.payload[1].lines[0].rmsCurrent;\nif (typeof grid_current !== 'number') grid_current = 0;\ngrid.push({ path: '/Ac/L1/Current', payload: grid_current });\n\nlet grid_voltage = msg.payload[1].lines[0].rmsVoltage;\nif (typeof grid_voltage !== 'number' || grid_voltage < 0) grid_voltage = 0;\ngrid.push({ path: '/Ac/L1/Voltage', payload: grid_voltage });\n\nlet grid_freq = msg.payload[1].lines[0].freqHz;\nif (typeof grid_freq !== 'number') grid_freq = 0;\ngrid.push({ path: '/Ac/Frequency', payload: grid_freq });\n\nlet energy_cum = msg.payload[1].lines[0].whDlvdCum;\nif (typeof energy_cum !== 'number') energy_cum = 0;\nelse energy_cum /= 1000;\n\nlet grid_energy = flow.get('grid_energy');\nif (typeof grid_energy !== 'object' || typeof grid_energy.cum !== 'number' || typeof grid_energy.fwd !== 'number' || typeof grid_energy.rev !== 'number') {\n    grid_energy = {\n        cum: energy_cum,\n        fwd: 0,\n        rev: 0\n    };\n} else {\n    let delta = grid_energy.cum - energy_cum;\n    grid_energy.fwd += delta < 0 ? -delta : 0;\n    grid_energy.rev += delta > 0 ? delta : 0;\n    grid_energy.cum = energy_cum;\n}\n\ngrid.push({ path: '/Ac/Energy/Forward', payload: grid_energy.fwd });\ngrid.push({ path: '/Ac/L1/Energy/Forward', payload: grid_energy.fwd });\ngrid.push({ path: '/Ac/Energy/Reverse', payload: grid_energy.rev });\ngrid.push({ path: '/Ac/L1/Energy/Reverse', payload: grid_energy.rev });\n\nflow.set('grid_energy', grid_energy);\n\nnode.status({ fill: \"grey\", shape: \"dot\", text: 'Prod: ' + prod_power + ' - Grid: ' + grid_power });\n\nreturn [prod, grid];\n","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":260,"y":1400,"wires":[["0953a538c4b19e72"],["dcfbce165ca27537"]]},{"id":"731af39657ee5b7b","type":"victron-virtual","z":"0ee9e0ece3f93e25","name":"Grid","device":"grid","default_values":true,"battery_capacity":25,"include_battery_temperature":false,"grid_nrofphases":1,"include_motor_temp":false,"include_controller_temp":false,"include_coolant_temp":false,"include_motor_rpm":true,"include_motor_direction":true,"position":0,"pvinverter_nrofphases":1,"fluid_type":0,"include_tank_battery":false,"include_tank_temperature":false,"tank_battery_voltage":3.3,"tank_capacity":0.2,"temperature_type":2,"include_humidity":false,"include_pressure":false,"include_temp_battery":false,"temp_battery_voltage":3.3,"x":610,"y":1420,"wires":[]},{"id":"6ee7c406b6d4f20f","type":"victron-virtual","z":"0ee9e0ece3f93e25","name":"Enphase","device":"pvinverter","default_values":true,"battery_capacity":25,"include_battery_temperature":false,"grid_nrofphases":1,"include_motor_temp":false,"include_controller_temp":false,"include_coolant_temp":false,"include_motor_rpm":true,"include_motor_direction":true,"position":0,"pvinverter_nrofphases":1,"fluid_type":0,"include_tank_battery":false,"include_tank_temperature":false,"tank_battery_voltage":3.3,"tank_capacity":0.2,"temperature_type":2,"include_humidity":false,"include_pressure":false,"include_temp_battery":false,"temp_battery_voltage":3.3,"x":620,"y":1380,"wires":[]},{"id":"dcfbce165ca27537","type":"victron-output-custom","z":"0ee9e0ece3f93e25","service":"com.victronenergy.grid/100","path":"/Ac/L1/Power","serviceObj":{"service":"com.victronenergy.grid/100","name":"Grid (100)"},"pathObj":{"path":"/Ac/L1/Power","name":"/Ac/L1/Power","type":"number","value":0},"name":"Grid by path","onlyChanges":false,"x":430,"y":1420,"wires":[]},{"id":"0953a538c4b19e72","type":"victron-output-custom","z":"0ee9e0ece3f93e25","service":"com.victronenergy.pvinverter/100","path":"/Ac/Energy/Forward","serviceObj":{"service":"com.victronenergy.pvinverter/100","name":"Enphase (100)"},"pathObj":{"path":"/Ac/Energy/Forward","name":"/Ac/Energy/Forward","type":"number","value":24560.690259},"name":"Prod AC by path","onlyChanges":false,"x":440,"y":1380,"wires":[]},{"id":"0f54168b666d9a3d","type":"comment","z":"0ee9e0ece3f93e25","name":"Compteurs virtuels","info":"","x":110,"y":1360,"wires":[]}]

Remarque: Victron recommande, à juste titre, de ne pas utiliser un compteur virtuel comme compteur réseau.

Concernant une sonde météo virtuelle, je viens de faire un rapide test. D’après la documentation seul l’irradiance et la vitesse du vent sont configurables. Voici un code qui pourra t’aider.

[{"id":"f380eabfce94b9bd","type":"victron-virtual","z":"d2a2f062beac4968","name":"Météo","device":"meteo","default_values":true,"battery_capacity":25,"include_battery_temperature":false,"grid_nrofphases":1,"include_motor_temp":false,"include_controller_temp":false,"include_coolant_temp":false,"include_motor_rpm":true,"include_motor_direction":true,"position":0,"pvinverter_nrofphases":1,"fluid_type":0,"include_tank_battery":false,"include_tank_temperature":false,"tank_battery_voltage":3.3,"tank_capacity":0.2,"temperature_type":2,"include_humidity":false,"include_pressure":false,"include_temp_battery":false,"temp_battery_voltage":3.3,"x":670,"y":120,"wires":[]},{"id":"9bed323f33c57333","type":"victron-output-custom","z":"d2a2f062beac4968","service":"com.victronenergy.meteo/100","path":"/Irradiance","serviceObj":{"service":"com.victronenergy.meteo/100","name":"Météo (100)"},"pathObj":{"path":"/Irradiance","name":"/Irradiance","type":"number","value":117},"name":"Météo by Path","onlyChanges":false,"x":500,"y":120,"wires":[]},{"id":"94b31977100aec4c","type":"function","z":"d2a2f062beac4968","name":"Push data","func":"\nlet msg0 = [\n    { path: '/Irradiance', payload: 117 },\n    { path: '/WindSpeed', payload: 2 }\n]\n\nreturn [msg0];","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":120,"wires":[["9bed323f33c57333"]]},{"id":"5486a77b922ed312","type":"inject","z":"d2a2f062beac4968","name":"Every 1m","props":[],"repeat":"60","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":150,"y":120,"wires":[["94b31977100aec4c"]]}]

image

Résultat sur VRM

image

Résultat sur la console

1 Like

Merci Quentin, je vais regarder ça ce soir, belle fin d’après-midi.

Un grand merci à Quentin, j’ai enfin un retour exacte de la disponibilité réelle de puissance. aidé par l’IA, et l’entraide de ce site, j’ai réalisé un montage adapté à la lecture affichage de l’Irradiance solaire disponible.
un capteur d’une cinquantaine d’Euro; plus un adaptateur Modbus RTU/TCP d’une cinquantaine d’Euro également; un Flux Nodred, et voila une information des plus précieuses dans mon système. Bien entendu, l’affichage dans le VRM avec un Noeud multiplicateur adapté à mon installation affiche donc les watts dispo. je peut dans ce cas allumer mes consommateurs en fonction du besoin. Et dans un avenir proche, envoyer par MQTT à tous mes routeurs ESP32 les commandes nécessaires à leur pilotage.

Je suis content que tu sois parvenu a résoudre ton problème avec le code que j’ai fourni.

L’emploi du noeud Custom Control pour alimenter en donnée l’appareil virtuel est bien inscrit dans l’aide du noeud Virtual Device mais, beaucoup, moi le premier, ont tendance à lire en diagonale et zappent cette information essentielle.

image

Bon, on peut titiller sur le terme Custom Output qui se trouve être Custom Control

1 Like