Felicity Solar per API abfragen

Hallo zusammen,

ich habe habe mehrere Wechselrichter und auch zwei Akkus die ich gerne im HA anzeigen lassen möchte ich habe ich schon einen Teil nun geht es darum meinen Felicity WE anzuzeigen. Laut support kann ich dies per API leider bin ich da totaler Neuling über Ideen und Hilfe wäre ich sehr dankbar.

wie müsste ich da vorgehen ?

Moin, das würde mich auch gut interessieren.
Der Hybridinverter und der Akku tun für mich das, was sie tun sollen, eine Abfrage und Integration der Werte lokal wäre jedoch sinnvoll.
Der Support sagat jedoch “nope”.
Ok, der Zugriff über API ist dann wohl der einzige Weg…

Habe viel Kontakt nach China aber es ist der einzige Weg aber leider komme ich da nicht weiter

Habe nun Kontakt zu jemanden der den Felicity Wechselrichter per API abruft.
er hat es nur im IObroker realisiert.

Das hatte er mir gegeben leider bekomme ich es in der configuration.yaml nicht zu laufen

> rest_command:
>  login:
>  url: https://shine-api.felicitysolar.com/userlogin
>  method: POST
>  content_type: "application/x-www-form-urlencoded"
>  username: „XXXXXXXXXXX"
>  password: „XXXXXXXXX“
>  response_variable: token
>  get_values:
>  url: https://shine-api.felicitysolar.com/device/get_device_snapshot
>  method: POST
>  content_type: "application/x-www-form-urlencoded"
>  headers:
>  authorization: token
>  payload: ‚{ "deviceSn":"SeriennummerWE","deviceType":"OC","dateStr":"2024-12-26 13:02:20" }‘
>  response_variable: Felicity_data

Das wäre der Login mit auslesen der Daten vom IObroker

> schedule('*/1 * * * *', () => {
> httpPost('https://shine-api.felicitysolar.com/userlogin', { "userName":"**XXXXXXXX**","password":"**XXXXXXXXX**","version":"1.0" }, (error, response) => {
>  if (!error) {
>  console.log(response.statusCode);
>  console.log(response.data);
>  console.log(response.headers);
> var parsed = JSON.parse(response.data); 
> var token = parsed.data.token
> setState('0_userdata.0.FSolar.config.token', token, true, (err) => {
>  if (err) log('Cannot write object: ' + err);});
> } else {
>  console.error(error);
>  }
> });
> var token = getState('0_userdata.0.FSolar.config.token').val;
> console.log(token);
> httpPost('https://shine-api.felicitysolar.com/device/get_device_snapshot', { "deviceSn":"**SeriennummerWE**","deviceType":"OC","dateStr":"2024-12-26 13:02:20" },
>  { headers: { 'Authorization': token }}, (error, response) => {
>  if (!error) {
>  console.log(response.statusCode);
>  console.log(response.data);
>  console.log(response.headers);
> var parsed = JSON.parse(response.data)
> setState('0_userdata.0.FSolar.PV1Power', parsed.data.pvPower, true, (err) => {
>  if (err) log('Cannot write object: ' + err);});
>  setState('0_userdata.0.FSolar.PV2Power', parsed.data.pv2Power, true, (err) => {
>  if (err) log('Cannot write object: ' + err);});
>  setState('0_userdata.0.FSolar.SOC', parsed.data.emsSoc, true, (err) => {
>  if (err) log('Cannot write object: ' + err);});
>  setState('0_userdata.0.FSolar.backupPower', parsed.data.acTotalOutActPower, true, (err) => {
>  if (err) log('Cannot write object: ' + err);});
>  setState('0_userdata.0.FSolar.emsPower', parsed.data.emsPower, true, (err) => {
>  if (err) log('Cannot write object: ' + err);});
> } else {
>  console.error(error);
>  }
> });
> httpPost('https://shine-api.felicitysolar.com/device/get_device_snapshot', { "deviceSn":"070604850024080565","deviceType":"BP","dateStr":"2024-12-26 13:02:20" },
>  { headers: { 'Authorization': token }}, (error, response) => {
>  if (!error) {
>  console.log(response.statusCode);
>  console.log(response.data);
>  console.log(response.headers);
> var parsed = JSON.parse(response.data)
> setState('0_userdata.0.FSolar.bmsPower', parsed.data.bmsPower, true, (err) => {
>  if (err) log('Cannot write object: ' + err);});
> } else {
>  console.error(error);
>  }
> });
> });

Jetzt würde ich hilfe benötigen um mich erstmal einzuwählen

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)

Hallo, es gibt einen Port am WR bzw. Batterie dieser kann für Anfragen im Heinetz benutzt werden. Ich habe es mit Nodered realisiert. Bei mir getestet mit einen WR T-REX-10KLP3G01 + Batterie LUX-E-48200LG03. Ich kann leider noch keine Files hochladen.

Leider weis ich gerade nicht was du mit Port meinst ?
Am WE gibt es keine Schnittstelle die ich für das abfragen her nehmen kann laut Support von China

TCP Port 53970 der WR ist ja mit WLAN ausgestattet der Port ist eigentlich auch nur für die FSOLAR APP gedacht. Ich habe die Kommunikation per Wireshark mitgeschnitten und die Anfragen nachgebaut. Der Support möchte natürlich alles über die Cloud schicken. Der Vorteil ist man alle 5sek die Daten abrufen kann. Hast du NodeRed im Einsatz?

Hi Mic233,

NodRed habe ich am laufen in meinen HA.
Wie könnte ich da die Daten abgreifen ?

Hi,
euer Gespräch ist hochinteressant für mich, da ich auch einen Felicity Wechselrichter einbinden will. Wenn ihr die Konfiguration schickt, würde ich die auch gleich mit probieren.
Das Nodered Addon ist bei mir auch aktiv.
Ich könnte auch mit Dokumenten beisteuern, wie man den Wechselrichter alternativ via Modbus abfragen kann. Der Modbus ist via Com-Port und dort über die Pins 3 und 4 verfügbar. Wenn die API aber nutzbar ist, ist das aber vielleicht noch besser.

P:S: wenn Upload nicht geht, dann setze einen Link zu z.B. Google Drive oder Microsoft OneDrive oder so. Dann laden wir uns das von dort herunter, das geht doch auch.

Hallo ich habe die kompletten Flows hochgeladen. Wenn nur ein WR abgefragt wird, werden die String & Array Bausteine nicht benötigt.

Freu mich wenn´s hilft.

Die Daten kommen dann als JSON rein… die IP Adresse ist natürlich anzupassen.

[
    {
        "id": "5c0b35da34348aee",
        "type": "tab",
        "label": "Daten holen",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "c50808832b04496e",
        "type": "inject",
        "z": "5c0b35da34348aee",
        "name": "get dev set infor",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "devsetinfor",
        "payload": "wifilocalMonitor:get dev set infor",
        "payloadType": "str",
        "x": 300,
        "y": 300,
        "wires": [
            [
                "bc737b9b2149196a"
            ]
        ]
    },
    {
        "id": "0912f67552aa3207",
        "type": "debug",
        "z": "5c0b35da34348aee",
        "name": "debug 2",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1020,
        "y": 300,
        "wires": []
    },
    {
        "id": "bc737b9b2149196a",
        "type": "tcp request",
        "z": "5c0b35da34348aee",
        "name": "",
        "server": "192.168.178.52",
        "port": "53970",
        "out": "time",
        "ret": "string",
        "splitc": "1000",
        "newline": "",
        "trim": false,
        "tls": "",
        "x": 770,
        "y": 300,
        "wires": [
            [
                "0912f67552aa3207",
                "025394cdf4e55bad"
            ]
        ]
    },
    {
        "id": "f6474b25abdd27bb",
        "type": "inject",
        "z": "5c0b35da34348aee",
        "name": "get dev basice infor",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "devbasiceinfor",
        "payload": "wifilocalMonitor:get dev basice infor",
        "payloadType": "str",
        "x": 310,
        "y": 360,
        "wires": [
            [
                "bc737b9b2149196a"
            ]
        ]
    },
    {
        "id": "cde5658634725368",
        "type": "inject",
        "z": "5c0b35da34348aee",
        "name": "get dev real infor",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "devrealinfor",
        "payload": "wifilocalMonitor:get dev real infor",
        "payloadType": "str",
        "x": 300,
        "y": 420,
        "wires": [
            [
                "bc737b9b2149196a"
            ]
        ]
    },
    {
        "id": "eca69a13889ce1ca",
        "type": "inject",
        "z": "5c0b35da34348aee",
        "name": "get Date",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "getdate",
        "payload": "wifilocalMonitor:get Date",
        "payloadType": "str",
        "x": 280,
        "y": 480,
        "wires": [
            [
                "bc737b9b2149196a"
            ]
        ]
    },
    {
        "id": "239574fd2adcb9d6",
        "type": "function",
        "z": "5c0b35da34348aee",
        "name": "global set devsetinfor",
        "func": "global.set(\"devsetinfor\",msg.payload);\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1240,
        "y": 360,
        "wires": [
            []
        ]
    },
    {
        "id": "75a9f5db9ca67c96",
        "type": "function",
        "z": "5c0b35da34348aee",
        "name": "global set devrealnfor",
        "func": "global.set(\"devrealinfor\",msg.payload);\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1240,
        "y": 480,
        "wires": [
            []
        ]
    },
    {
        "id": "c0a5ac693bd048d5",
        "type": "comment",
        "z": "5c0b35da34348aee",
        "name": "Hilfe",
        "info": "Die IP des Wechselrichters ist zu ersetzen!",
        "x": 770,
        "y": 240,
        "wires": []
    },
    {
        "id": "025394cdf4e55bad",
        "type": "switch",
        "z": "5c0b35da34348aee",
        "name": "",
        "property": "topic",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "devsetinfor",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "devbasiceinfor",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "devrealinfor",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "getdate",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 4,
        "x": 990,
        "y": 400,
        "wires": [
            [
                "239574fd2adcb9d6"
            ],
            [
                "d7b0e7de725a8d9a"
            ],
            [
                "75a9f5db9ca67c96"
            ],
            [
                "f44666bb6637c7e6"
            ]
        ]
    },
    {
        "id": "d7b0e7de725a8d9a",
        "type": "function",
        "z": "5c0b35da34348aee",
        "name": "global set devbasiceinfor",
        "func": "global.set(\"devbasiceinfor\",msg.payload);\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1250,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "f44666bb6637c7e6",
        "type": "function",
        "z": "5c0b35da34348aee",
        "name": "global get Date",
        "func": "global.set(\"getdate\",msg.payload);\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1220,
        "y": 540,
        "wires": [
            []
        ]
    },
    {
        "id": "9b7b42abcd132849",
        "type": "tab",
        "label": "Softwarestand",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "039c95c2c8c00770",
        "type": "inject",
        "z": "9b7b42abcd132849",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 100,
        "y": 80,
        "wires": [
            [
                "d48914c3b9458516"
            ]
        ]
    },
    {
        "id": "292822f5736e2cfb",
        "type": "debug",
        "z": "9b7b42abcd132849",
        "name": "debug 4",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "jsonata",
        "statusVal": "",
        "statusType": "auto",
        "x": 720,
        "y": 80,
        "wires": []
    },
    {
        "id": "dc45a99a2e88dde6",
        "type": "json",
        "z": "9b7b42abcd132849",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 530,
        "y": 80,
        "wires": [
            [
                "292822f5736e2cfb"
            ]
        ]
    },
    {
        "id": "d48914c3b9458516",
        "type": "function",
        "z": "9b7b42abcd132849",
        "name": "Device Basic Informations",
        "func": "msg.payload = global.get(\"devbasiceinfor\");\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 310,
        "y": 80,
        "wires": [
            [
                "dc45a99a2e88dde6"
            ]
        ]
    },
    {
        "id": "8fc43c6757c73477",
        "type": "tab",
        "label": "Geraeteeinstellungen",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "b4dad6a5d908b026",
        "type": "debug",
        "z": "8fc43c6757c73477",
        "name": "debug 8",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "jsonata",
        "statusVal": "",
        "statusType": "auto",
        "x": 1080,
        "y": 80,
        "wires": []
    },
    {
        "id": "4e668195a001e8c5",
        "type": "debug",
        "z": "8fc43c6757c73477",
        "name": "debug 9",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1080,
        "y": 160,
        "wires": []
    },
    {
        "id": "d921bc1f71291e48",
        "type": "json",
        "z": "8fc43c6757c73477",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 910,
        "y": 80,
        "wires": [
            [
                "b4dad6a5d908b026"
            ]
        ]
    },
    {
        "id": "da47b5d64a1e5ce1",
        "type": "json",
        "z": "8fc43c6757c73477",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": true,
        "x": 920,
        "y": 160,
        "wires": [
            [
                "4e668195a001e8c5"
            ]
        ]
    },
    {
        "id": "9862b51a9e73dc3b",
        "type": "inject",
        "z": "8fc43c6757c73477",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 140,
        "y": 80,
        "wires": [
            [
                "baab2536e7f2ee58"
            ]
        ]
    },
    {
        "id": "baab2536e7f2ee58",
        "type": "function",
        "z": "8fc43c6757c73477",
        "name": "Device Set Informations",
        "func": "msg.payload = global.get(\"devsetinfor\");\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 350,
        "y": 80,
        "wires": [
            [
                "56ad239c495a411e"
            ]
        ]
    },
    {
        "id": "19d5056e9ea0eecc",
        "type": "function",
        "z": "8fc43c6757c73477",
        "name": "Array[0]",
        "func": "msg.payload = msg.payload[0]+ \"}\";\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 740,
        "y": 80,
        "wires": [
            [
                "d921bc1f71291e48"
            ]
        ]
    },
    {
        "id": "10263c8e2b9b12e2",
        "type": "function",
        "z": "8fc43c6757c73477",
        "name": "Array[1]",
        "func": "msg.payload = \"{\" + msg.payload[1];\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 740,
        "y": 160,
        "wires": [
            [
                "da47b5d64a1e5ce1"
            ]
        ]
    },
    {
        "id": "56ad239c495a411e",
        "type": "string",
        "z": "8fc43c6757c73477",
        "name": "",
        "methods": [
            {
                "name": "split",
                "params": [
                    {
                        "type": "str",
                        "value": "}{"
                    },
                    {
                        "type": "num",
                        "value": "300000"
                    }
                ]
            }
        ],
        "prop": "payload",
        "propout": "payload",
        "object": "msg",
        "objectout": "msg",
        "x": 550,
        "y": 80,
        "wires": [
            [
                "19d5056e9ea0eecc",
                "10263c8e2b9b12e2"
            ]
        ]
    },
    {
        "id": "61f50c1675d21aa1",
        "type": "tab",
        "label": "Daten Echtzeit",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "ca486dac92734db2",
        "type": "inject",
        "z": "61f50c1675d21aa1",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 100,
        "y": 120,
        "wires": [
            [
                "7d6245613e3e6c6f"
            ]
        ]
    },
    {
        "id": "7d6245613e3e6c6f",
        "type": "function",
        "z": "61f50c1675d21aa1",
        "name": "Real Informations",
        "func": "msg.payload = global.get(\"devrealinfor\");\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 310,
        "y": 120,
        "wires": [
            [
                "d315b42003b16b73"
            ]
        ]
    },
    {
        "id": "d315b42003b16b73",
        "type": "string",
        "z": "61f50c1675d21aa1",
        "name": "",
        "methods": [
            {
                "name": "split",
                "params": [
                    {
                        "type": "str",
                        "value": "}{"
                    },
                    {
                        "type": "num",
                        "value": "10000"
                    }
                ]
            }
        ],
        "prop": "payload",
        "propout": "payload",
        "object": "msg",
        "objectout": "msg",
        "x": 510,
        "y": 120,
        "wires": [
            [
                "43307e9bbebd8c86",
                "be197eaa5b35810b"
            ]
        ]
    },
    {
        "id": "5a62ece942b21929",
        "type": "debug",
        "z": "61f50c1675d21aa1",
        "name": "debug 17",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "jsonata",
        "statusVal": "",
        "statusType": "auto",
        "x": 1080,
        "y": 120,
        "wires": []
    },
    {
        "id": "6f56b8ba3066bd32",
        "type": "debug",
        "z": "61f50c1675d21aa1",
        "name": "debug 18",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1080,
        "y": 200,
        "wires": []
    },
    {
        "id": "43307e9bbebd8c86",
        "type": "function",
        "z": "61f50c1675d21aa1",
        "name": "Array[0]",
        "func": "msg.payload = msg.payload[0]+ \"}\";\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 700,
        "y": 120,
        "wires": [
            [
                "e28b55691b720a70"
            ]
        ]
    },
    {
        "id": "e28b55691b720a70",
        "type": "json",
        "z": "61f50c1675d21aa1",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 890,
        "y": 120,
        "wires": [
            [
                "5a62ece942b21929"
            ]
        ]
    },
    {
        "id": "be197eaa5b35810b",
        "type": "function",
        "z": "61f50c1675d21aa1",
        "name": "Array[1]",
        "func": "msg.payload = \"{\" + msg.payload[1];\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 700,
        "y": 200,
        "wires": [
            [
                "d8da03b24201531d"
            ]
        ]
    },
    {
        "id": "d8da03b24201531d",
        "type": "json",
        "z": "61f50c1675d21aa1",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": true,
        "x": 880,
        "y": 200,
        "wires": [
            [
                "6f56b8ba3066bd32"
            ]
        ]
    },
    {
        "id": "155723a7a498260e",
        "type": "tab",
        "label": "Uhrzeit",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "f975745e9b37e261",
        "type": "inject",
        "z": "155723a7a498260e",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 100,
        "y": 100,
        "wires": [
            [
                "4e780b11deca9d16"
            ]
        ]
    },
    {
        "id": "4e780b11deca9d16",
        "type": "function",
        "z": "155723a7a498260e",
        "name": "Get Date",
        "func": "msg.payload = global.get(\"getdate\");\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 280,
        "y": 100,
        "wires": [
            [
                "8a6772914449867f"
            ]
        ]
    },
    {
        "id": "1f608bef2a8420be",
        "type": "debug",
        "z": "155723a7a498260e",
        "name": "debug 20",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "jsonata",
        "statusVal": "",
        "statusType": "auto",
        "x": 660,
        "y": 100,
        "wires": []
    },
    {
        "id": "8a6772914449867f",
        "type": "json",
        "z": "155723a7a498260e",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 470,
        "y": 100,
        "wires": [
            [
                "1f608bef2a8420be"
            ]
        ]
    }
]

Felicity Registers.ods

Das ist die von Felicity zur Verfügung gestellte Modbus Datei, übersetzt von Felicity aus dem Chinesischen ins Englische und damit lesbar.

Wie gesagt, der Modbus ist via COM-Port via Pins 3 & 4 verfügbar.

und diese Daten müssen dann wohin geschrieben werden ? in eine Config-Datei z.B. configuration.yaml ?

Der Teil würde mich auch mal interessieren. Falls möglich bitte auch mal hier rein posten. Danke !

Das ist der Komplette Nodered Flow die Daten können dann aus den JSON Objekten rausgeholt werden und müssen dann weiterverabeitet werden. Ich schreibe sie per iobroker in eine Influx DB

So was mache ich schon, via einer passenden Config lese ich schon die Bundesliga Daten von der ESPN API via REST API aus. Das Ergebnis ist dort genauso ein JSON-Daten-Objekt. Durch das Hacs Addon auto-entities kann ich dann Entitäten der einzelnen Bundesligavereine anlegen und das wird dann benötigt um die Live-Spielstände auszugeben. Das geht alles prima.

Da ich als neuer Nutzer keine weitere Antwort geben darf, kommt hier alles weitere rein :

Das muss dann mit RS485 to TCP Converter an HomeAssistant weitergeleitet werden.

Wichtig ist Baudrate 2400 zu wählen, das habe ich erst neulich gelesen, sonst geht es nicht.
Felicity hatte mir Folgendes geschickt :

3          485_A3
4          485_B3

und dazu geschrieben, dass ich diese Verbindung (Teil-Screenshot aus dem Handbuch) nutzen soll.

Bei mir ist das in der Datei sensor.yaml !

 - name: Felicity Solar Inverter
   type: rtuovertcp
   host: 192.168.2.177
   port: 1502
   sensors:
   - name: "Felicity Working Mode"
     slave: 1
     address: 4353
     input_type: holding
     data_type: int16
     scale: 1
     unit_of_measurement: ""
     unique_id: felicity_working_mode
     # Possible Values: 0 (Standby), 1 (CC Mode), 2 (CV Mode), 3 (CF Mode)

   - name: "Felicity Fault Code"
     slave: 1
     address: 4360
     input_type: holding
     data_type: int16
     scale: 0.1
     precision: 1
     unit_of_measurement: "V"
     device_class: "voltage"
     unique_id: felicity_fault_code

   - name: "Felicity Battery Capacity"
     slave: 1
     address: 4368
     input_type: holding
     data_type: int16
     scale: 1
     precision: 1
     unit_of_measurement: "%"
     device_class: "power"
     unique_id: felicity_battery_capacity

   - name: "Felicity Load Percentage"
     slave: 1
     address: 4374
     input_type: holding
     data_type: int16
     scale: 0.1
     precision: 1
     unit_of_measurement: "%"
     device_class: "power"
     unique_id: felicity_load_percentage

   - name: "Felicity Total AC input power"
     slave: 1
     address: 4392
     input_type: holding
     data_type: int16
     scale: 0.1
     precision: 1
     unit_of_measurement: "Wh"
     device_class: "energy"
     unique_id: felicity_total_AC_input_power

   - name: "Felicity Total AC output active power"
     slave: 1
     address: 4404
     input_type: holding
     data_type: int32
     scale: 1
     unit_of_measurement: "Wh"
     device_class: "energy"
     unique_id: felicity Total_AC_output_active_power
     
   - name: "Felicity Total SoC"
     slave: 1
     address: 4624
     input_type: holding
     data_type: int16
     scale: 1
     unit_of_measurement: "%"
     device_class: "battery"
     unique_id: felicity_total_soc  
     
   - name: "Felicity PV generated inquiry day"
     slave: 1
     address: 4446
     input_type: holding
     data_type: int32
     scale: 1
     unit_of_measurement: "V"
     device_class: "voltage"
     unique_id: felicity_pv_generated_inquiry_day

   - name: "Felicity AC generated inquiry day"
     slave: 1
     address: 4476
     input_type: holding
     data_type: int32
     scale: 1
     unit_of_measurement: "V"
     device_class: "voltage"
     unique_id: felicity_ac_generated_inquiry_day

NodeRed wird für die Verbindung via direkt-API zum Felicity-Wechselrichter benötigt.
Die andere Variante ist nur eine mögliche Alternative. Falls euch das nicht gelingt, nicht so zusagt. Kann ja nicht schaden, noch eine andere Verbindungsoption zu haben.

Kurz und knapp : nein !
Du brauchst NodeRed um via WLAN direkt mit dem Wechselrichter zu kommunizieren, wie das auch via APP FSOLAR funktioniert. Das andere alles mit Com-Port usw. das ist die Alternative.

Also wenn das ganze nun richtig verstehe muss an den COM Port vom Wechselrichter ein Kabel Angeschlossen werden davon wird der PIN3 und PIN4 benötigt.

  • Wo sollte das Kabel hin gehen ?
  • Wie sieht die Verdrahtung aus ?
  • Wo muss der Programmtext hin ?

ich glaube jetzt wird es langsam

  1. Mit dem NodeRed hole ich die Daten vom WE → über das Kabel was an COM angeschlossen wird wo der Smartmeter hängt.
  2. mit den Daten von der Yaml Datei hole ich die Werte ab und stelle sie im Home Assistant zur verfügung.

Ist das Korrekt ?

NodeRed ist für die API via WLAN ganz direkt und die Alternative ist der Com-Port.

Kannst du das mit iobroker und InfluxDB auch mal bitte hier rein posten ?

Jein, entweder via NodeRed und API in JSON Daten umwandeln und die Entitäten können dann via HACS addon auto-entities angelegt werden und dann direkt im HomeAssistant zur Anzeige z.B. weiterverarbeitet werden

oder man nutzt den Com-Port und liest den direkt via type serial und Baudrate 2400 oder über einen RS485 to TCP Converter macht man die Daten transportfähig und wertet das Ergebnis dann aus.

Achtung nicht via HomeAssistant dann rtuovertcp und via Converter RTUOVERTCP aktivieren, sondern nur an einer Stelle und die andere muss sich dann heraushalten. Das sind die beiden Optionen soweit ich das verstanden habe.

Konfigurationsfehler gefunden, SSL ausgeschaltet, dann ging es. Aber weil ich das auf diese Weise schon mit Bundesliga-Daten und ESPN-API mache, weiß ich ungefähr, wie das geht. Das muss ich noch prüfen. Vermutlich müssen wir der ID für die JSON-Bereiche ein felicity_ voranstellen, damit ich mit einer Filterung nach felicity_* alle Elemente für Entitäten markieren kann

Kann ich die Daten auch direkt im HomeAssistant verwenden ?

Nja die NodeRed version habe ich jetzt mal drinnen.
Hast du über auto-entities schon mal was anzeigen lassen ?

Das ist nur Bahnhof für mich :sleepy:

Ich glaube dass ich ab jetzt frei antworten kann. Weil eine Antwort wegen Spamfilter zeitweise geblockt wurde und ich derweil aber einen neuen dritten Post schickte, musste für die Wiederfreigabe des geblockten Posts meine Sperre für 3 Posts gelöst werden.

Damit es mit den Antworten nicht zu unübersichtlich wird, ergänze ich mal hier :
Bei mir ist jetzt auch bei NodeRed alles soweit vorbereitet, dass mir von dort keine Fehler mit ! mehr gemeldet werden.
Aber wie geht das jetzt weiter ? Wie kann man die internen Funktionen des Wechselrichters, die man via NodeRed jetzt auch HomeAssistant bekannt gemacht hat, jetzt auch nutzen, um in HomeAssistant Daten anzuzeigen ? Hat da jemand eine Idee ?

Wäre aktuell auch soweit das das NodeRed läuft.

Kann man im NodeRed kontrollieren ob was ankommt ?

Das muss irgendwie gehen, da weiß ich aber noch nicht wie. Zumindest kann man aber von NodeRed eine Meldung bekommen, ob es in der Struktur einen Fehler gibt oder ob nicht ! Ist kein Ausrufezeichen als Fehlermeldung zu sehen, läuft es zumindest ohne Fehler durch.