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"]]}]

Résultat sur VRM

Résultat sur la console

