-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathflows.json
More file actions
1 lines (1 loc) · 25.3 KB
/
Copy pathflows.json
File metadata and controls
1 lines (1 loc) · 25.3 KB
1
[{"id":"b23651b72ce27b85","type":"tab","label":"reboot advantec","disabled":false,"info":"","env":[]},{"id":"9a8414b671da6487","type":"tab","label":"Growatt RS485","disabled":false,"info":"","env":[]},{"id":"6e8fa51d.3a538c","type":"server","name":"Home Assistant","addon":true},{"id":"176609ef4729396d","type":"mqtt-broker","name":"homeassistant mqtt","broker":"<HA_IP>","port":1883,"clientid":"<MQTT_CLIENT_ID>","autoConnect":true,"usetls":false,"protocolVersion":4,"keepalive":60,"cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"57b1650795c219ec","type":"modbus-client","name":"growatt via advantec icr3231","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":true,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"<GATEWAY_IP>","tcpPort":502,"tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":9600,"serialDatabits":8,"serialStopbits":1,"serialParity":"none","serialConnectionDelay":100,"serialAsciiResponseStartDelimiter":"0x3A","unit_id":1,"commandDelay":1,"clientTimeout":1000,"reconnectOnTimeout":true,"reconnectTimeout":2000,"parallelUnitIdsAllowed":true,"showErrors":true,"showWarnings":true,"showLogs":true},{"id":"1cf161fc7d5184d4","type":"mqtt out","z":"b23651b72ce27b85","name":"","topic":"reboot","qos":"1","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"176609ef4729396d","x":710,"y":220,"wires":[]},{"id":"b82ef70fa9544365","type":"function","z":"b23651b72ce27b85","name":"com check","func":"if (msg.payload.error || typeof msg.payload[0] !== 'number' || (msg.payload[0] !== 0 && msg.payload[0] !== 1)) {\n // Failure: Error, no data, or invalid value\n global.set('modbusFailures', (global.get('modbusFailures') || 0) + 1);\n if (global.get('modbusFailures') >= 3) { // Adjust threshold as needed\n msg.payload = \"reboot\"; // Or your trigger payload\n global.set('modbusFailures', 0); // Reset here\n return msg;\n }\n} else {\n // Success: Got 0 or 1\n global.set('modbusFailures', 0);\n}\nreturn null; // No reboot needed","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":340,"wires":[["1cf161fc7d5184d4","2458206b12347e67"]]},{"id":"4454446873c1724c","type":"api-current-state","z":"b23651b72ce27b85","name":"sunrise","server":"6e8fa51d.3a538c","version":3,"outputs":2,"halt_if":"above_horizon","halt_if_type":"str","halt_if_compare":"is","entity_id":"sun.sun","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"msg.sun_state","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":400,"y":220,"wires":[["b82ef70fa9544365","f7c487538eb58c65"],[]]},{"id":"8a185994df54b0ae","type":"inject","z":"b23651b72ce27b85","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":80,"wires":[["1cf161fc7d5184d4"]]},{"id":"d0f0745796430a2e","type":"debug","z":"b23651b72ce27b85","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":120,"y":80,"wires":[]},{"id":"f5195aafb8c5f796","type":"modbus-read","z":"b23651b72ce27b85","name":"modbus-read com check","topic":"","showStatusActivities":true,"logIOActivities":false,"showErrors":true,"showWarnings":true,"unitid":"","dataType":"InputRegister","adr":"0","quantity":"1","rate":"10","rateUnit":"m","delayOnStart":false,"startDelayTime":"","server":"57b1650795c219ec","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":150,"y":200,"wires":[["d0f0745796430a2e","4454446873c1724c"],["6b37c9cdd64e4263"]]},{"id":"f7c487538eb58c65","type":"debug","z":"b23651b72ce27b85","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":400,"y":20,"wires":[]},{"id":"2458206b12347e67","type":"debug","z":"b23651b72ce27b85","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":660,"y":460,"wires":[]},{"id":"6b37c9cdd64e4263","type":"debug","z":"b23651b72ce27b85","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":260,"y":380,"wires":[]},{"id":"b4dd26386eacd025","type":"function","z":"9a8414b671da6487","name":"convert data","func":"// Parse Modbus input register data\nvar data = msg.payload; // Array of 16-bit values\n\n// Helper to combine high/low registers into 32-bit and scale\nfunction combineHL(high, low, scale) {\n var value = (high * 65536 + low) * scale;\n return Math.round(value * 10) / 10; // Round to 1 decimal\n}\n\nvar parsed = {\n status: data[0], // 0: waiting, 1: normal, 3: fault\n pv_power: combineHL(data[1], data[2], 0.1), // Total PV power (W)\n pv1_voltage: data[3] * 0.1, // PV1 voltage (V)\n pv1_current: data[4] * 0.1, // PV1 current (A)\n pv2_voltage: data[7] * 0.1, // PV2 voltage (V)\n pv2_current: data[8] * 0.1, // PV2 current (A)\n ac_power: combineHL(data[35], data[36], 0.1), // Output AC power (W)\n ac_frequency: data[37] * 0.01, // Grid frequency (Hz)\n ac_voltage_r: data[38] * 0.1732, // Phase R voltage (V)\n //ac_current_r: data[39] * 0.1, // Phase R current (A)\n ac_current_r: data[0] === 1 ? data[39] * 0.1 : 0, // Phase R current (A)\n ac_voltage_s: data[42] * 0.1732, // Phase S voltage (V)\n //ac_current_s: data[43] * 0.1, // Phase S current (A)\n ac_current_s: data[0] === 1 ? data[43] * 0.1 : 0, // Phase S current (A)\n ac_voltage_t: data[46] * 0.1732, // Phase T voltage (V)\n //ac_current_t: data[47] * 0.1, // Phase T current (A)\n ac_current_t: data[0] === 1 ? data[47] * 0.1 : 0, // Phase T current (A)\n energy_today: combineHL(data[53], data[54], 0.1), // Energy today (kWh)\n energy_total: combineHL(data[55], data[56], 0.1), // Total energy (kWh)\n inverter_temp: data[93] * 0.1 // Inverter temperature (°C)\n};\n\nmsg.payload = parsed;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":40,"wires":[["5a6a342bd565060c"]]},{"id":"b4c7150b4ba3813f","type":"function","z":"9a8414b671da6487","name":"discovery node","func":"// Define device info for all sensors\nconst deviceInfo = {\n identifiers: [\"growatt_inverter_123\"],\n name: \"Growatt Inverter\",\n manufacturer: \"Growatt\",\n model: \"MID 12KTL3-XL \" // Replace with your model, e.g., \"MIC 3000TL-X\"\n};\n\n// Define sensors with HA discovery properties\nconst sensors = [\n { name: \"Growatt Status\", unique_id: \"growatt_status_123\", state_key: \"status\", value_template: \"{{ value_json.status }}\" },\n { name: \"Growatt PV Power\", unique_id: \"growatt_pv_power_123\", state_key: \"pv_power\", unit_of_measurement: \"W\", device_class: \"power\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.pv_power }}\" },\n { name: \"Growatt PV1 Voltage\", unique_id: \"growatt_pv1_voltage_123\", state_key: \"pv1_voltage\", unit_of_measurement: \"V\", device_class: \"voltage\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.pv1_voltage }}\" },\n { name: \"Growatt PV1 Current\", unique_id: \"growatt_pv1_current_123\", state_key: \"pv1_current\", unit_of_measurement: \"A\", device_class: \"current\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.pv1_current }}\" },\n { name: \"Growatt PV2 Voltage\", unique_id: \"growatt_pv2_voltage_123\", state_key: \"pv2_voltage\", unit_of_measurement: \"V\", device_class: \"voltage\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.pv2_voltage }}\" },\n { name: \"Growatt PV2 Current\", unique_id: \"growatt_pv2_current_123\", state_key: \"pv2_current\", unit_of_measurement: \"A\", device_class: \"current\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.pv2_current }}\" },\n { name: \"Growatt AC Power\", unique_id: \"growatt_ac_power_123\", state_key: \"ac_power\", unit_of_measurement: \"W\", device_class: \"power\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_power }}\" },\n { name: \"Growatt AC Frequency\", unique_id: \"growatt_ac_frequency_123\", state_key: \"ac_frequency\", unit_of_measurement: \"Hz\", device_class: \"frequency\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_frequency }}\" },\n { name: \"Growatt AC Voltage R\", unique_id: \"growatt_ac_voltage_r_123\", state_key: \"ac_voltage_r\", unit_of_measurement: \"V\", device_class: \"voltage\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_voltage_r }}\" },\n { name: \"Growatt AC Current R\", unique_id: \"growatt_ac_current_r_123\", state_key: \"ac_current_r\", unit_of_measurement: \"A\", device_class: \"current\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_current_r }}\" },\n { name: \"Growatt AC Voltage S\", unique_id: \"growatt_ac_voltage_s_123\", state_key: \"ac_voltage_s\", unit_of_measurement: \"V\", device_class: \"voltage\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_voltage_s }}\" },\n { name: \"Growatt AC Current S\", unique_id: \"growatt_ac_current_s_123\", state_key: \"ac_current_s\", unit_of_measurement: \"A\", device_class: \"current\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_current_s }}\" },\n { name: \"Growatt AC Voltage T\", unique_id: \"growatt_ac_voltage_t_123\", state_key: \"ac_voltage_t\", unit_of_measurement: \"V\", device_class: \"voltage\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_voltage_t }}\" },\n { name: \"Growatt AC Current T\", unique_id: \"growatt_ac_current_t_123\", state_key: \"ac_current_t\", unit_of_measurement: \"A\", device_class: \"current\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.ac_current_t }}\" },\n { name: \"Growatt Energy Today\", unique_id: \"growatt_energy_today_123\", state_key: \"energy_today\", unit_of_measurement: \"kWh\", device_class: \"energy\", state_class: \"total_increasing\", /* CHANGED: Added state_class (specific to energy as total_increasing) */ value_template: \"{{ value_json.energy_today }}\" },\n { name: \"Growatt Total Energy\", unique_id: \"growatt_energy_total_123\", state_key: \"energy_total\", unit_of_measurement: \"kWh\", device_class: \"energy\", state_class: \"total_increasing\", /* CHANGED: Added state_class (specific to energy as total_increasing) */ value_template: \"{{ value_json.energy_total }}\" },\n { name: \"Growatt Inverter Temperature\", unique_id: \"growatt_inverter_temp_123\", state_key: \"inverter_temp\", unit_of_measurement: \"°C\", device_class: \"temperature\", state_class: \"measurement\", /* CHANGED: Added state_class */ value_template: \"{{ value_json.inverter_temp }}\" }\n];\n\n// Create discovery messages\nlet messages = sensors.map(sensor => ({\n topic: `homeassistant/sensor/${sensor.unique_id}/config`,\n payload: JSON.stringify({\n name: sensor.name,\n unique_id: sensor.unique_id,\n state_topic: \"growatt/inverter/state\",\n unit_of_measurement: sensor.unit_of_measurement,\n device_class: sensor.device_class,\n state_class: sensor.state_class, /* CHANGED: Added state_class to the payload */\n value_template: sensor.value_template,\n device: deviceInfo\n }),\n retain: true,\n qos: 1\n}));\n\n// Debug all discovery topics\nnode.warn(\"Discovery topics: \" + messages.map(m => m.topic).join(\", \"));\n\n// Send messages with a delay to avoid overwhelming the broker\nlet index = 0;\nfunction sendNextMessage() {\n if (index < messages.length) {\n let msg = messages[index];\n node.warn(`Sending discovery message ${index + 1}: ${msg.topic}`);\n node.send(msg);\n index++;\n setTimeout(sendNextMessage, 500); // 500ms delay between messages\n }\n}\n\n// Start sending messages\nsendNextMessage();\n\nreturn null;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":120,"y":140,"wires":[["1959ea9cb378a58c"]]},{"id":"4bebd07709e96998","type":"mqtt out","z":"9a8414b671da6487","name":"state node mqtt","topic":"","qos":"1","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"176609ef4729396d","x":580,"y":140,"wires":[]},{"id":"5a6a342bd565060c","type":"function","z":"9a8414b671da6487","name":"state parse node","func":"// Input message from Modbus parsing node\nconst data = msg.payload;\n\n// Check if data exists\nif (!data || typeof data !== 'object') {\n node.error(\"Invalid input data: \" + JSON.stringify(data));\n return null;\n}\n\n// Debug input data\nnode.warn(\"Input data: \" + JSON.stringify(data));\n\n// Create a clean msg object\nconst newMsg = {\n topic: \"growatt/inverter/state\",\n payload: JSON.stringify({\n status: data.status || 0,\n pv_power: data.pv_power || 0,\n pv1_voltage: data.pv1_voltage || 0,\n pv1_current: data.pv1_current || 0,\n pv2_voltage: data.pv2_voltage || 0,\n pv2_current: data.pv2_current || 0,\n ac_power: data.ac_power || 0,\n ac_frequency: data.ac_frequency || 0,\n ac_voltage_r: data.ac_voltage_r || 0,\n ac_current_r: data.ac_current_r || 0,\n ac_voltage_s: data.ac_voltage_s || 0,\n ac_current_s: data.ac_current_s || 0,\n ac_voltage_t: data.ac_voltage_t || 0,\n ac_current_t: data.ac_current_t || 0,\n energy_today: data.energy_today || 0,\n energy_total: data.energy_total || 0,\n inverter_temp: data.inverter_temp || 0\n }),\n retain: false,\n qos: 1\n};\n\n// Debug only the payload\nnode.warn(\"State message payload: \" + newMsg.payload);\n\n// Return single message\nreturn newMsg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":40,"wires":[["4bebd07709e96998"]]},{"id":"1959ea9cb378a58c","type":"mqtt out","z":"9a8414b671da6487","name":"discovery node mqtt","topic":"","qos":"1","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"176609ef4729396d","x":340,"y":140,"wires":[]},{"id":"2945e1d010e49d37","type":"function","z":"9a8414b671da6487","name":"parse data xtra growatt sensors","func":"// Parse Modbus input register data\nvar data = msg.payload;\n\n// Helper to scale value\nfunction scaleValue(value, scale) {\n var result = value * scale;\n return Math.round(result * 10) / 10; // Round to 1 decimal\n}\n\n// Debug input\nnode.warn(\"Modbus input: \" + JSON.stringify(data));\n\n// Check input validity\nif (!data || !Array.isArray(data) || data.length < 6) {\n node.error(\"Invalid Modbus data: \" + JSON.stringify(data));\n var parsed = {\n pv_isolation_resistance: 0,\n r_dci_curr: 0,\n s_dci_curr: 0,\n t_dci_curr: 0,\n gfci_curr: 0\n };\n} else {\n var parsed = {\n pv_isolation_resistance: scaleValue(data[0], 1), // Register 200, kΩ\n r_dci_curr: scaleValue(data[1], 0.1), // Register 201, 0.1mA\n s_dci_curr: scaleValue(data[2], 0.1), // Register 202, 0.1mA\n //t_dci_curr: scaleValue(data[3], 0.1), // Register 203, 0.1mA\n t_dci_curr: data[3] > 10000 ? 0 : scaleValue(data[3], 0.1), // Register 203, 0.1mA - filter invalid 0xFFFF values\n gfci_curr: scaleValue(data[5], 0.1) // Register 205, mA\n };\n}\n\nmsg.payload = parsed;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":520,"wires":[["807d43476c2af8eb"]]},{"id":"d0422fbe720e2c94","type":"mqtt out","z":"9a8414b671da6487","name":"state xtra growatt sensors","topic":"","qos":"1","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"176609ef4729396d","x":490,"y":620,"wires":[]},{"id":"0e74496a0dde0b10","type":"function","z":"9a8414b671da6487","name":"State discovery Function Node xtra growatt sensors","func":"// Device info to match existing Growatt flow\nvar deviceInfo = {\n identifiers: [\"growatt_inverter_123\"],\n name: \"Growatt Inverter\",\n manufacturer: \"Growatt\",\n model: \"MID 12KTL3-XL\"\n};\n\n// Define sensors\nvar sensors = [\n {\n name: \"Growatt GFCI Current\",\n unique_id: \"growatt_gfci_curr_123\",\n state_key: \"gfci_curr\",\n unit_of_measurement: \"mA\",\n state_class: \"measurement\",\n value_template: \"{{ value_json.gfci_curr }}\",\n entity_category: \"diagnostic\",\n icon: \"mdi:current-ac\"\n }\n];\n\n// Create discovery messages\nvar discoveryMessages = sensors.map(sensor => ({\n topic: `homeassistant/sensor/${sensor.unique_id}/config`,\n payload: {\n name: sensor.name,\n unique_id: sensor.unique_id,\n state_topic: \"growatt/inverter/state\",\n unit_of_measurement: sensor.unit_of_measurement,\n state_class: sensor.state_class,\n value_template: sensor.value_template,\n entity_category: sensor.entity_category,\n icon: sensor.icon,\n device: deviceInfo\n },\n retain: true,\n qos: 1\n}));\n\n// Debug discovery messages\nnode.warn(\"Discovery messages: \" + JSON.stringify(discoveryMessages));\n\n// Return discovery messages\nreturn discoveryMessages;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":190,"y":440,"wires":[[]]},{"id":"fa2f254316dea0c7","type":"mqtt out","z":"9a8414b671da6487","name":"discovery xtra growatt sensors","topic":"","qos":"1","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"176609ef4729396d","x":530,"y":440,"wires":[]},{"id":"807d43476c2af8eb","type":"function","z":"9a8414b671da6487","name":"state node","func":"// Input from Parse Function node\n var data = msg.payload;\n\n // Debug input\n node.warn(\"Input data: \" + JSON.stringify(data));\n\n // Check if data exists\n if (!data || typeof data !== 'object') {\n node.error(\"Invalid input data: \" + JSON.stringify(data));\n return null;\n }\n\n // Create state message\n var stateMessage = {\n topic: \"growatt/inverter/state\",\n payload: {\n pv_isolation_resistance: data.pv_isolation_resistance || 0,\n r_dci_curr: data.r_dci_curr || 0,\n s_dci_curr: data.s_dci_curr || 0,\n t_dci_curr: data.t_dci_curr || 0,\n gfci_curr: data.gfci_curr || 0\n },\n retain: false,\n qos: 1\n };\n\n // Debug state message\n node.warn(\"State message payload: \" + JSON.stringify(stateMessage.payload));\n\n // Return state message\n return stateMessage;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":150,"y":660,"wires":[["d0422fbe720e2c94"]]},{"id":"297ff8b6a41f5a82","type":"function","z":"9a8414b671da6487","name":"discovery node change Sollia Total Energy today","func":"// Define device info for the sensor\nconst deviceInfo = {\n identifiers: [\"growatt_inverter_123\"],\n name: \"Growatt Inverter\",\n manufacturer: \"Growatt\",\n model: \"MID 12KTL3-XL\"\n};\n\n// Define only the Growatt Total Energy sensor with HA discovery properties\nconst sensors = [\n {\n name: \"Growatt Total Energy\",\n unique_id: \"growatt_energy_total_123\",\n state_key: \"energy_total\",\n unit_of_measurement: \"kWh\",\n device_class: \"energy\",\n state_class: \"measurement\",\n value_template: \"{{ value_json.energy_total }}\"\n }\n];\n\n// Create discovery message\nlet messages = sensors.map(sensor => ({\n topic: `homeassistant/sensor/${sensor.unique_id}/config`,\n payload: JSON.stringify({\n name: sensor.name,\n unique_id: sensor.unique_id,\n state_topic: \"growatt/inverter/state\",\n unit_of_measurement: sensor.unit_of_measurement,\n device_class: sensor.device_class,\n state_class: sensor.state_class,\n value_template: sensor.value_template,\n device: deviceInfo\n }),\n retain: true,\n qos: 1\n}));\n\n// Debug the discovery topic\nnode.warn(\"Discovery topic: \" + messages.map(m => m.topic).join(\", \"));\n\n// Send message\nlet index = 0;\nfunction sendNextMessage() {\n if (index < messages.length) {\n let msg = messages[index];\n node.warn(`Sending discovery message ${index + 1}: ${msg.topic}`);\n node.send(msg);\n index++;\n setTimeout(sendNextMessage, 500); // 500ms delay\n }\n}\n\n// Start sending messages\nsendNextMessage();\n\nreturn null;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":260,"y":220,"wires":[["96de717ae71b79d4"]]},{"id":"96de717ae71b79d4","type":"mqtt out","z":"9a8414b671da6487","name":"discovery node mqtt","topic":"","qos":"1","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"176609ef4729396d","x":600,"y":220,"wires":[]},{"id":"155a9fda036aa0bf","type":"modbus-read","z":"9a8414b671da6487","name":"modbus read xtra growatt sensors","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"showWarnings":true,"unitid":"","dataType":"InputRegister","adr":"200","quantity":"6","rate":"5","rateUnit":"m","delayOnStart":false,"startDelayTime":"","server":"57b1650795c219ec","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":140,"y":500,"wires":[["2945e1d010e49d37"],[]]},{"id":"797680da51d06eb3","type":"modbus-read","z":"9a8414b671da6487","name":"modbus read growatt rs485","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"showWarnings":true,"unitid":"","dataType":"InputRegister","adr":"0","quantity":"100","rate":"20","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"57b1650795c219ec","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":150,"y":40,"wires":[["b4dd26386eacd025"],[]]},{"id":"d781a0428e7ae522","type":"mqtt out","z":"9a8414b671da6487","name":"discovery node mqtt","topic":"","qos":"1","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"176609ef4729396d","x":580,"y":320,"wires":[]},{"id":"30046a08c58576c1","type":"function","z":"9a8414b671da6487","name":"discovery node change Sollia Total Energy","func":"// Define device info for the sensor\nconst deviceInfo = {\n identifiers: [\"growatt_inverter_123\"],\n name: \"Growatt Inverter\",\n manufacturer: \"Growatt\",\n model: \"MID 12KTL3-XL\"\n};\n\n// Define only the Growatt Total Energy sensor with HA discovery properties\nconst sensors = [\n {\n name: \"Growatt Inverter Growatt Total Energy\",\n unique_id: \"growatt_inverter_growatt_total_energy\",\n state_key: \"energy_total\",\n unit_of_measurement: \"kWh\",\n device_class: \"energy\",\n state_class: \"total_increasing\",\n value_template: \"{{ value_json.energy_total }}\"\n }\n];\n\n// Create discovery message\nlet messages = sensors.map(sensor => ({\n topic: `homeassistant/sensor/${sensor.unique_id}/config`,\n payload: JSON.stringify({\n name: sensor.name,\n unique_id: sensor.unique_id,\n state_topic: \"growatt/inverter/state\",\n unit_of_measurement: sensor.unit_of_measurement,\n device_class: sensor.device_class,\n state_class: sensor.state_class,\n value_template: sensor.value_template,\n device: deviceInfo\n }),\n retain: true,\n qos: 1\n}));\n\n// Debug the discovery topic\nnode.warn(\"Discovery topic: \" + messages.map(m => m.topic).join(\", \"));\n\n// Send message\nlet index = 0;\nfunction sendNextMessage() {\n if (index < messages.length) {\n let msg = messages[index];\n node.warn(`Sending discovery message ${index + 1}: ${msg.topic}`);\n node.send(msg);\n index++;\n setTimeout(sendNextMessage, 500); // 500ms delay\n }\n}\n\n// Start sending messages\nsendNextMessage();\n\nreturn null;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":230,"y":320,"wires":[["d781a0428e7ae522","f12fbfa67d398b30"]]},{"id":"707145c0fa6f1ad6","type":"inject","z":"9a8414b671da6487","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":80,"y":260,"wires":[["30046a08c58576c1"]]},{"id":"f12fbfa67d398b30","type":"debug","z":"9a8414b671da6487","name":"debug 5","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":580,"y":380,"wires":[]},{"id":"b327ab669d34aa85","type":"global-config","env":[],"modules":{"node-red-contrib-home-assistant-websocket":"0.80.3","node-red-contrib-modbus":"5.45.2"}}]