Erik, dat is eigenlijk heel simpel te implementeren. Gewoon één of meerdere scripts installeren (google mr-manuel github) en wat flow programmering in NodeRED. Hier is een voorbeeld:
De HomeWizard P1 meter is te traag als grid meter. Die kan je rustig vergeten.
[
{
“id”: “aa81a571a3f55f3c”,
“type”: “tab”,
“label”: “Flow Growatt PV”,
“disabled”: false,
“info”: “”,
“env”:
},
{
“id”: “bb2304f6de943703”,
“type”: “group”,
“z”: “aa81a571a3f55f3c”,
“name”: “Growatt PV”,
“style”: {
“fill”: “#ffefbf”,
“label”: true,
“color”: “#001f60”,
“stroke”: “#ff7f7f”
},
“nodes”: [
“93368161e0fb7274”,
“222677ee17a30d47”,
“c250859c59441a06”,
“489d8e56109442bc”,
“5b2336384d494151”,
“190cf511cbd3fa05”,
“4792c807776cd9f1”,
“a1a68563a8c8cc03”,
“4cc9057627ef0285”,
“fbed4cf9d457b5de”,
“5e6cf209fd8f0353”,
“b582af8615cc8aa3”,
“af751199364da26a”,
“b072f0594b6af30f”,
“1518fcb3555fda50”,
“19205d67d011e7e9”,
“1721b4b18403a510”,
“e43fb621e446491b”,
“0104a3ee4f5d902b”,
“4ebff8c4347f9550”,
“d7484d3ba92bbd5d”,
“750a2e83a5a825dc”,
“70dd864f7605cbe4”,
“f9d87d465b222e21”
],
“x”: 84,
“y”: 119,
“w”: 1022,
“h”: 442
},
{
“id”: “93368161e0fb7274”,
“type”: “http request”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “kWh Meter Roof”,
“method”: “GET”,
“ret”: “obj”,
“paytoqs”: “ignore”,
“url”: “http://192.168.1.7/api/v1/data”,
“tls”: “”,
“persist”: false,
“proxy”: “”,
“insecureHTTPParser”: false,
“authType”: “”,
“senderr”: false,
“headers”: ,
“x”: 320,
“y”: 220,
“wires”: [
[
“222677ee17a30d47”,
“fbed4cf9d457b5de”,
“5e6cf209fd8f0353”,
“b072f0594b6af30f”
]
]
},
{
“id”: “222677ee17a30d47”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Active Power W”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{ payload.active_power_w }}”,
“output”: “str”,
“x”: 600,
“y”: 240,
“wires”: [
[
“1721b4b18403a510”
]
]
},
{
“id”: “c250859c59441a06”,
“type”: “mqtt out”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “PV Roof”,
“topic”: “homewizard/kwh/roof”,
“qos”: “”,
“retain”: “”,
“respTopic”: “”,
“contentType”: “”,
“userProps”: “”,
“correl”: “”,
“expiry”: “”,
“broker”: “6459ecfea2a6ef49”,
“x”: 800,
“y”: 340,
“wires”:
},
{
“id”: “489d8e56109442bc”,
“type”: “http request”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “kWh Meter Garden Roof”,
“method”: “GET”,
“ret”: “obj”,
“paytoqs”: “ignore”,
“url”: “http://192.168.1.70/api/v1/data”,
“tls”: “”,
“persist”: false,
“proxy”: “”,
“insecureHTTPParser”: false,
“authType”: “”,
“senderr”: false,
“headers”: ,
“x”: 350,
“y”: 460,
“wires”: [
[
“5b2336384d494151”,
“190cf511cbd3fa05”,
“a1a68563a8c8cc03”,
“1518fcb3555fda50”
]
]
},
{
“id”: “5b2336384d494151”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Active Power W”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{ payload.active_power_w }}”,
“output”: “str”,
“x”: 600,
“y”: 480,
“wires”: [
[
“0104a3ee4f5d902b”
]
]
},
{
“id”: “190cf511cbd3fa05”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Active Voltage V”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{payload.active_voltage_v}}”,
“output”: “str”,
“x”: 600,
“y”: 400,
“wires”: [
[
“4792c807776cd9f1”
]
]
},
{
“id”: “4792c807776cd9f1”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Voltage”,
“rules”: [
{
“t”: “set”,
“p”: “Garden.Voltage”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 400,
“wires”: [
]
},
{
“id”: “a1a68563a8c8cc03”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Total Export kWh”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{payload.total_power_export_kwh}}”,
“output”: “str”,
“x”: 610,
“y”: 520,
“wires”: [
[
“4cc9057627ef0285”
]
]
},
{
“id”: “4cc9057627ef0285”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Export”,
“rules”: [
{
“t”: “set”,
“p”: “Garden.Export”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 520,
“wires”: [
]
},
{
“id”: “fbed4cf9d457b5de”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Total Export kWh”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{payload.total_power_export_kwh}}”,
“output”: “str”,
“x”: 610,
“y”: 280,
“wires”: [
[
“b582af8615cc8aa3”
]
]
},
{
“id”: “5e6cf209fd8f0353”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Active Voltage V”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{payload.active_voltage_v}}”,
“output”: “str”,
“x”: 600,
“y”: 160,
“wires”: [
[
“af751199364da26a”
]
]
},
{
“id”: “b582af8615cc8aa3”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Export”,
“rules”: [
{
“t”: “set”,
“p”: “Roof.Export”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 280,
“wires”: [
]
},
{
“id”: “af751199364da26a”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Voltage”,
“rules”: [
{
“t”: “set”,
“p”: “Roof.Voltage”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 160,
“wires”: [
]
},
{
“id”: “b072f0594b6af30f”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Active Current A”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{payload.active_current_a}}”,
“output”: “str”,
“x”: 600,
“y”: 200,
“wires”: [
[
“19205d67d011e7e9”
]
]
},
{
“id”: “1518fcb3555fda50”,
“type”: “template”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Active Current A”,
“field”: “payload”,
“fieldType”: “msg”,
“format”: “handlebars”,
“syntax”: “mustache”,
“template”: “{{payload.active_current_a}}”,
“output”: “str”,
“x”: 600,
“y”: 440,
“wires”: [
[
“e43fb621e446491b”
]
]
},
{
“id”: “19205d67d011e7e9”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Current”,
“rules”: [
{
“t”: “set”,
“p”: “Roof.Current”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 200,
“wires”: [
]
},
{
“id”: “1721b4b18403a510”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Wattage”,
“rules”: [
{
“t”: “set”,
“p”: “Roof.Watt”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 240,
“wires”: [
[
“750a2e83a5a825dc”
]
]
},
{
“id”: “e43fb621e446491b”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Current”,
“rules”: [
{
“t”: “set”,
“p”: “Garden.Current”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 440,
“wires”: [
]
},
{
“id”: “0104a3ee4f5d902b”,
“type”: “change”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “set flow.Wattage”,
“rules”: [
{
“t”: “set”,
“p”: “Garden.Watt”,
“pt”: “flow”,
“to”: “payload”,
“tot”: “msg”
}
],
“action”: “”,
“property”: “”,
“from”: “”,
“to”: “”,
“reg”: false,
“x”: 820,
“y”: 480,
“wires”: [
[
“70dd864f7605cbe4”
]
]
},
{
“id”: “4ebff8c4347f9550”,
“type”: “function”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “Set PV Data”,
“func”: “let roof_watts = Number(flow.get("Roof.Watt") /-1);\nlet garden_watts = Number(flow.get("Garden.Watt") /-1);\n\nlet roof_energy = Number(flow.get("Roof.Export"));\nlet garden_energy = Number(flow.get("Garden.Export"));\nlet total_energy = (roof_energy + garden_energy);\n\nlet roof_voltage = Number(flow.get("Roof.Voltage"));\nlet garden_voltage = Number(flow.get("Garden.Voltage"));\n\n// A negative value here means that the inverter is not\n// producing energy, and using some energy. Which usually \n// happens at the end of the day, with clouds or snow \n// covered panels (just some examples). \nif (roof_watts <= 0) {\n roof_watts = 0;\n}\n\nif (garden_watts <= 0) {\n garden_watts = 0;\n}\n\ntotal_watts = Math.trunc(roof_watts + garden_watts);\n\nvar message = {\n pv: {\n power: total_watts,\n voltage: roof_voltage,\n energy_forward: total_energy,\n L1: {\n power: total_watts,\n voltage: roof_voltage,\n energy_forward: total_energy,\n }\n }\n};\n\nnode.status({fill:"blue",shape:"ring",text:Number(msg.payload)*3 + "W"}); \n\nreturn { payload: message };”,
“outputs”: 1,
“timeout”: 0,
“noerr”: 0,
“initialize”: “// Code added here will be run once\n// whenever the node is started.\nvar roof_watts = 0;\nvar garden_watts = 0;”,
“finalize”: “”,
“libs”: ,
“x”: 590,
“y”: 340,
“wires”: [
[
“c250859c59441a06”,
“d7484d3ba92bbd5d”
]
]
},
{
“id”: “d7484d3ba92bbd5d”,
“type”: “debug”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: "debug ",
“active”: false,
“tosidebar”: true,
“console”: false,
“tostatus”: true,
“complete”: “payload”,
“targetType”: “msg”,
“statusVal”: “payload”,
“statusType”: “auto”,
“x”: 990,
“y”: 340,
“wires”:
},
{
“id”: “750a2e83a5a825dc”,
“type”: “debug”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “debug 28”,
“active”: true,
“tosidebar”: false,
“console”: false,
“tostatus”: true,
“complete”: “payload”,
“targetType”: “msg”,
“statusVal”: “payload”,
“statusType”: “auto”,
“x”: 1000,
“y”: 240,
“wires”:
},
{
“id”: “70dd864f7605cbe4”,
“type”: “debug”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “debug 29”,
“active”: true,
“tosidebar”: false,
“console”: false,
“tostatus”: true,
“complete”: “payload”,
“targetType”: “msg”,
“statusVal”: “payload”,
“statusType”: “auto”,
“x”: 1000,
“y”: 480,
“wires”:
},
{
“id”: “8bb7d06216e84d61”,
“type”: “inject”,
“z”: “aa81a571a3f55f3c”,
“name”: “PV kWh Meter Read Interval”,
“props”: [
{
“p”: “payload”
},
{
“p”: “topic”,
“vt”: “str”
}
],
“repeat”: “1”,
“crontab”: “”,
“once”: false,
“onceDelay”: 0.1,
“topic”: “”,
“payload”: “”,
“payloadType”: “date”,
“x”: 250,
“y”: 60,
“wires”: [
[
“50e9986290b46534”
]
]
},
{
“id”: “50e9986290b46534”,
“type”: “link out”,
“z”: “aa81a571a3f55f3c”,
“name”: “link out 1”,
“mode”: “link”,
“links”: [
“cb0ae8ced8fb02bd”,
“3b06eb3e67c91be0”,
“f9d87d465b222e21”
],
“x”: 435,
“y”: 60,
“wires”:
},
{
“id”: “f9d87d465b222e21”,
“type”: “link in”,
“z”: “aa81a571a3f55f3c”,
“g”: “bb2304f6de943703”,
“name”: “link in 1”,
“links”: [
“50e9986290b46534”
],
“x”: 125,
“y”: 340,
“wires”: [
[
“93368161e0fb7274”,
“489d8e56109442bc”,
“4ebff8c4347f9550”
]
]
},
{
“id”: “6459ecfea2a6ef49”,
“type”: “mqtt-broker”,
“name”: “local”,
“broker”: “localhost”,
“port”: “1883”,
“clientid”: “”,
“autoConnect”: true,
“usetls”: false,
“protocolVersion”: “5”,
“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”: “”
}
]