Hi, you are on track, but not completely there.
I suggest, you create the following virtual hardware: Dummy (does nothing, use for virtual switches only) and create 15 virtual sensors under it as follows:
Give the sensors the name you like and note down their IDX numbers. You will need that later.
1. For pvstatus: 1 "Alert" Sensor
2. For pv1watt, pv2watt, pvpowerin and pvpowerout: 4 "Usage" Sensors
3. For pvfrequentie: "Custom" Sensor (on the x-axis fill in Hz).
4. For pvgridvoltage, pv1voltage and pv2voltage: 3 "Voltage" Sensors
5. For pvenergytoday and pvenergytotal: 2 "Custom" Sensors (on the x-axis fill in kWh).
6. For pv1current and pv2current: 2 "Ampere" Sensors
7. For pvtemperature and pvipmtemperature: 2 "Temperature" Sensors.
That makes 15 virtual Sensors. You can omit the ones, you don't want to use.
This will be the flow.
You will have to replace the IDX numbers 1001 - 1015 for the IDX numbers, you wrote down, when created the virtual sensors.
Code: Select all
[{"id":"1f6fae81.f09fe1","type":"debug","z":"79ac4ad4.26563c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":370,"y":220,"wires":[]},{"id":"a0aec7c7.7eb038","type":"mqtt in","z":"79ac4ad4.26563c","name":"MQTT In","topic":"energy/growatt","qos":"0","datatype":"json","broker":"f9f13036.e28b58","x":180,"y":280,"wires":[["1f6fae81.f09fe1","4f7c10a1.d16a5"]]},{"id":"4f7c10a1.d16a5","type":"function","z":"79ac4ad4.26563c","name":"","func":"var msg1 = {}; // pvstatus, Inverter run state\nvar msg2 = {}; // pv1watt, PV1 input watt (0.1W)\nvar msg3 = {}; // pv2watt, PV2 input watt (0.1W)\nvar msg4 = {}; // pvpowerin, Actual input power (0.1W)\nvar msg5 = {}; // pvpowerout, Actual output power (0.1W)\nvar msg6 = {}; // pvfrequentie, Grid frequency (0.01Hz)\nvar msg7 = {}; // pvgridvoltage, Three/single phase grid voltage (0.1V)\nvar msg8 = {}; // pvenergytoday, Today generated energy (0.1KWH)\nvar msg9 = {}; // pvenergytotal, Total generated energy (0.1KWH)\nvar msg10 = {}; // pv1voltage, PV1 voltage (0.1V)\nvar msg11 = {}; // pv2voltage, PV2 voltage (0.1V)\nvar msg12 = {}; // pv1current, PV1 input current (0.1A)\nvar msg13 = {}; // pv2current, PV2 input current (0.1A)\nvar msg14 = {}; // pvtemperature, Inverter temperature (0.1C)\nvar msg15 = {}; // pvipmtemperature, The inside IPM in inverter temperature (0.1C), be aware not available in all inverters!\n\nswitch (msg.payload.values.pvstatus) {\n case 0 :\n msg1.payload = {\"command\":\"udevice\",\"idx\":1001,\"nvalue\":0,\"svalue\": \"Waiting\"};\n break\n\n case 1 :\n msg1.payload = {\"command\":\"udevice\",\"idx\":1001,\"nvalue\":1,\"svalue\": \"Normal\"};\n break\n\n case 2 :\n msg1.payload = {\"command\":\"udevice\",\"idx\":1001,\"nvalue\":2,\"svalue\": \"Fault\"};\n break\n}\n\nmsg2.payload = {\"command\":\"udevice\",\"idx\":1002,\"nvalue\":0,\"svalue\":((msg.payload.values.pv1watt) / 10).toString()};\nmsg3.payload = {\"command\":\"udevice\",\"idx\":1003,\"nvalue\":0,\"svalue\":((msg.payload.values.pv2watt) / 10).toString()};\nmsg4.payload = {\"command\":\"udevice\",\"idx\":1004,\"nvalue\":0,\"svalue\":((msg.payload.values.pvpowerin) / 10).toString()};\nmsg5.payload = {\"command\":\"udevice\",\"idx\":1005,\"nvalue\":0,\"svalue\":((msg.payload.values.pvpowerout) / 10).toString()};\nmsg6.payload = {\"command\":\"udevice\",\"idx\":1006,\"nvalue\":0,\"svalue\":((msg.payload.values.pvfrequentie) / 100).toString()};\nmsg7.payload = {\"command\":\"udevice\",\"idx\":1007,\"nvalue\":0,\"svalue\":((msg.payload.values.pvgridvoltage) / 10).toString()};\nmsg8.payload = {\"command\":\"udevice\",\"idx\":1008,\"nvalue\":0,\"svalue\":((msg.payload.values.pvenergytoday) / 10).toString()};\nmsg9.payload = {\"command\":\"udevice\",\"idx\":1009,\"nvalue\":0,\"svalue\":((msg.payload.values.pvenergytotal) / 10).toString()};\nmsg10.payload = {\"command\":\"udevice\",\"idx\":1010,\"nvalue\":0,\"svalue\":((msg.payload.values.pv1voltage) / 10).toString()};\nmsg11.payload = {\"command\":\"udevice\",\"idx\":1011,\"nvalue\":0,\"svalue\":((msg.payload.values.pv2voltage) / 10).toString()};\nmsg12.payload = {\"command\":\"udevice\",\"idx\":1012,\"nvalue\":0,\"svalue\":((msg.payload.values.pv1current) / 10).toString()};\nmsg13.payload = {\"command\":\"udevice\",\"idx\":1013,\"nvalue\":0,\"svalue\":((msg.payload.values.pv2current) / 10).toString()};\nmsg14.payload = {\"command\":\"udevice\",\"idx\":1014,\"nvalue\":0,\"svalue\":((msg.payload.values.pvtemperature) / 10).toString()};\nmsg15.payload = {\"command\":\"udevice\",\"idx\":1015,\"nvalue\":0,\"svalue\":((msg.payload.values.pvipmtemperature) / 10).toString()};\n\nreturn [[msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9,msg10,msg11,msg12,msg13,msg14,msg15]];\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":360,"y":280,"wires":[["b2f06144.0b9f5","440bf20b.c27ab4"]]},{"id":"b2f06144.0b9f5","type":"debug","z":"79ac4ad4.26563c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":550,"y":340,"wires":[]},{"id":"440bf20b.c27ab4","type":"mqtt out","z":"79ac4ad4.26563c","name":"MQTT to Domoticz","topic":"domoticz/in","qos":"0","retain":"","broker":"f9f13036.e28b58","x":570,"y":280,"wires":[]},{"id":"f9f13036.e28b58","type":"mqtt-broker","z":"","name":"localhost","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
Any sensor, you do not want to use, you can comment out the corresponding message (2 places) and omit it from the return.
Actually the only thing that caused that no result has been presented was the path to the data.
You used msg.payload.pvstatus and that should be msg.payload.values.pv1watt, etc.