Modbus TCP um einen Solaredege WR auszulesen

Patch …

Sathya Du bist der Beste , jetzt kommt auch was im Debug an

Allerdings kommt da z.B. 23000 an, wie bekomme ich denn da nun die Leistung in W raus ?

Slave-ID sollte noch 255 sein (es funktioniert aber offenbar auch mit 1).

Allerdings kommt da z.B. 23000 an, wie bekomme ich denn da nun die Leistung in W raus ?

Der Wert sollte direkt die Leistung in Watt sein (nach Datenblatt). Du könntest noch das Häkchen bei “Bytes invertieren” setzen, falls die Byte-Reihenfolge nicht stimmt. In dem oben geposteten Paket kommt 22550 raus.

Welchen Wert würdest du erwarten?

Eigentlich 46 W bei der Anzeige 24000

Register 40085 (Adresse 40084) gibt noch einen Skalierungsfaktor an. Allerdings ist dieser mit 0xFFFF offenbar nicht definiert.

Slave-ID 255 bringt gar nichts an Werten

… ok, dann also 1.

So ich habe jetz ausprobiert die Bytes zu invertieren, da kommen teilweise negative Werte.

Die beiden Häkchen IB IR habe ich auch probiert, kein Erfolg.

Der Node zeigt jetzt übrigens auch Connected an wie bei MQTT

Im Folgeregister für die Skalierung ist der Wert -3 drin

Das könnte dann hinkommen

Beispiel (15000 * (-3) / 1000) = 45 W

Eine Frage habe ich noch zu dem Function Node

Wenn ich da jetzt die beiden Werte verrechnen möchte, wie muss ich die verschiedenen Eingänge dann abfragen ?
Sprich 2 Eingänge 0 und 1 ergeben welche Variablen ?
$message[0][‘payload’] und $message[1][‘payload’] scheint nicht zu gehen.

Hallo @Interceptor43,

das Ganze läuft ereignisbasiert, d. h., du hast nur jeweils einen Eingang und kannst den Wert des anderen Eingangs nicht in dem Sinne abfragen (das ist keine SPS). Aber du kannst Werte zwischenspeichern:

if ($inputIndex == 0) {
    setNodeData('factor', $message['payload']);
} else {
    $factor = getNodeData('factor');
    return ['payload' => $message['payload'] * $factor / 1000.0];
}
1 Like

Ah ok verstehe.

Ich probiere das nachher mal aus

Ergebnis allerdings erst morgen, da aktuell keine Leistung mehr vom Dach fließt

Guten Morgen zusammen

@sathya : das mit dem Function Node klappt, vielen Dank

Aber irgendwas stimmt mit der Berechnung nicht.
Der übertragene Wert beträgt 26000, die Skalierung -2 und raus kommt was mit 55 W

Mein Handy zeigt mir aber 300 W an

Ist da vielleicht irgendwas zu beachten in Bezug auf High Byte und Low Byte ?!

So dele

Ich habe es hin bekommen.

Im IO Broker Forum hat einer eine Liste bereit gestellt mit den entsprechenden Skalierungen.

Es muss nichts invertiert werden.
In FC 3 habe ich die einzulesenden IDs eingetragen.
und im HauptConfig Fenster des ModbusNode dann die einzelnen Register die ausgegeben werden sollen.
IB ist nicht aktiviert.

Dann jeweils einen Function Node angehängt der das ganze mit dem Skalierungsfaktor verrechnet.

Et voila die Debug Nodes zeigen das an was ich haben will.
Überprüft habe ich das anhand der Leistung und der Frequenz.

Trotzdem vielen Dank für eure Hilfe.

Jetzt muss ich mich damit beschäftigen wie ich die Daten in einer Datenbank speichern kann.

Würde halt gerne sehen wie so der Leistungsgang bei bestimmten Zeiträumen ist.

2 Likes

Könntest du mit dem Influx-Node machen und dann nachher mit Grafana auswerten.

Ja habe schon gesehen das das mit Influx gehen müsste.
Evtl. komme ich heute Nachmittag mal dazu mich damit zu beschäftigen.

Würde das dann auch gerne in der UI anzeigen.

Soll ich das dann weiter hier fragen oder lieber einen neuen Thread aufmachen ?

Neuer Thread wäre super :+1:

1 Like

Ich habe noch was raus gefunden.

Die Skalierungswerte beziehen sich auf die Basis 10 , sprich pow(10,$factor)

Könnte ja für jemanden interessant sein zu wissen

2 Likes

Hoi @Interceptor43 das ist spannend, was du da erreicht hast. Habe auch einen SolarEdge WR lese diesen momentan noch via API aus, da kommen schöne JSONs daher. Wieso machst du das nicht so?

ModBus interessiert mich aber auch. Kannst du nun deinen funktionierenden Flow Posten, damit ich das nachbauen kann?

Was musstest du im WR aktivieren, für ModBus via IP?

Na ja ich hatte das vorher schon über ioBroker laufen, deshalb habe ich das hier auch so gemacht.

Außerdem ist mit der API schluß wenn das Internet mal weg ist, denke ich.

Im WR kannst Du das im Menu einstellen, ich weiß es leider nicht mehr genau wo da das der Installateur direkt mit gemacht hat.Solaredge.zip (1.4 KB)

So bei mir läuft das Auslesen auch. Hier eine Node, wie ich das gelöst habe und direkt im Homegear UI Anzeige.
Bildschirmfoto 2022-07-17 um 21.54.47

Hier noch mein Spaghetti Code des Filter:

$msg0['payload'] = round($message['payload']['I_AC_Energy_WH'] * pow (10, $message['payload']['I_AC_Energy_WH_SF'])/1000000, 3) . " MWh";
$msg1['payload'] = round($message['payload']['I_AC_Power'] * pow (10, $message['payload']['I_AC_Power_SF'])/1, 3) . " W";

switch ($message['payload']['I_Status']) {
    case 1:
        $msg2['payload']="Off";
        break;
   case 2:
        $msg2['payload']="Sleeping";
        break;
   case 3:
        $msg2['payload']="Grid Monitoring/wake-up";
        break;
   case 4:
        $msg2['payload']="Inverter on";
        break;
   case 5:
        $msg2['payload']="Production";
        break;
   case 6:
        $msg2['payload']="Shutting down";
        break;
   case 7:
        $msg2['payload']="Fault";
        break;        
   case 8:
        $msg2['payload']="Setup";
        break;
    
}
output (0, $msg0);
output (1, $msg1);
output (2, $msg2);

Und hier der komplette Flow:

[
    {
        "id": "12899975.c88ac7",
        "type": "tab",
        "label": "Solaredge MODBUS",
        "disabled": false,
        "info": ""
    },
    {
        "id": "84bebd57.32c5f8",
        "type": "se-modbus",
        "z": "12899975.c88ac7",
        "name": "Solar Edge Modbus tcp",
        "host": "192.168.101.145",
        "port": "1502",
        "poll": "10000",
        "device": "se_inverter",
        "x": 110,
        "y": 80,
        "wires": [
            [
                {
                    "id": "6c07ba6d.0e101c",
                    "port": 0
                }
            ]
        ]
    },
    {
        "id": "4484f1f2.8f78",
        "type": "ui-status",
        "z": "12899975.c88ac7",
        "uielement": "Base.genericStatus",
        "uiElementLabel": "Status",
        "uielementicon": "speedometer_1",
        "name": "PV Anzeige Energy",
        "room": "10",
        "label": "PV Energy",
        "inputs": 1,
        "outputs": 0,
        "inputIndexes": [
            [
                0,
                0
            ]
        ],
        "inputLabels2": [
            "Status"
        ],
        "inputDescriptions": [
            "Setzt den visualisierten Status. Der übergebene Text wird nicht modifiziert."
        ],
        "inputTypes": [
            "string"
        ],
        "outputIndexes": [],
        "outputLabels2": [],
        "outputDescriptions": [],
        "outputTypes": [],
        "passthrough-input": false,
        "x": 590,
        "y": 40,
        "wires": [],
        "inputLabels": [
            "input"
        ]
    },
    {
        "id": "6c07ba6d.0e101c",
        "type": "function",
        "z": "12899975.c88ac7",
        "name": "Display Filter",
        "func": "$msg0['payload'] = round($message['payload']['I_AC_Energy_WH'] * pow (10, $message['payload']['I_AC_Energy_WH_SF'])/1000000, 3) . \" MWh\";\n$msg1['payload'] = round($message['payload']['I_AC_Power'] * pow (10, $message['payload']['I_AC_Power_SF'])/1, 3) . \" W\";\n\nswitch ($message['payload']['I_Status']) {\n    case 1:\n        $msg2['payload']=\"Off\";\n        break;\n   case 2:\n        $msg2['payload']=\"Sleeping\";\n        break;\n   case 3:\n        $msg2['payload']=\"Grid Monitoring/wake-up\";\n        break;\n   case 4:\n        $msg2['payload']=\"Inverter on\";\n        break;\n   case 5:\n        $msg2['payload']=\"Production\";\n        break;\n   case 6:\n        $msg2['payload']=\"Shutting down\";\n        break;\n   case 7:\n        $msg2['payload']=\"Fault\";\n        break;        \n   case 8:\n        $msg2['payload']=\"Setup\";\n        break;\n    \n}\noutput (0, $msg0);\noutput (1, $msg1);\noutput (2, $msg2);",
        "inputs": "1",
        "outputs": 3,
        "noerr": 0,
        "x": 315,
        "y": 80,
        "wires": [
            [
                {
                    "id": "4484f1f2.8f78",
                    "port": 0
                }
            ],
            [
                {
                    "id": "22d20e29.fb2042",
                    "port": 0
                }
            ],
            [
                {
                    "id": "ecc74b60.14a44",
                    "port": 0
                }
            ]
        ]
    },
    {
        "id": "22d20e29.fb2042",
        "type": "ui-status",
        "z": "12899975.c88ac7",
        "uielement": "Base.genericStatus",
        "uiElementLabel": "Status",
        "uielementicon": "speedometer_1",
        "name": "PV Anzeige Power",
        "room": "10",
        "label": "PV Power",
        "inputs": 1,
        "outputs": 0,
        "inputIndexes": [
            [
                0,
                0
            ]
        ],
        "inputLabels2": [
            "Status"
        ],
        "inputDescriptions": [
            "Setzt den visualisierten Status. Der übergebene Text wird nicht modifiziert."
        ],
        "inputTypes": [
            "string"
        ],
        "outputIndexes": [],
        "outputLabels2": [],
        "outputDescriptions": [],
        "outputTypes": [],
        "passthrough-input": false,
        "x": 585,
        "y": 80,
        "wires": [],
        "inputLabels": [
            "input"
        ]
    },
    {
        "id": "ecc74b60.14a44",
        "type": "ui-status",
        "z": "12899975.c88ac7",
        "uielement": "Base.genericStatus",
        "uiElementLabel": "Status",
        "uielementicon": "speedometer_1",
        "name": "PV Anzeige Status",
        "room": "10",
        "label": "PV Status",
        "inputs": 1,
        "outputs": 0,
        "inputIndexes": [
            [
                0,
                0
            ]
        ],
        "inputLabels2": [
            "Status"
        ],
        "inputDescriptions": [
            "Setzt den visualisierten Status. Der übergebene Text wird nicht modifiziert."
        ],
        "inputTypes": [
            "string"
        ],
        "outputIndexes": [],
        "outputLabels2": [],
        "outputDescriptions": [],
        "outputTypes": [],
        "passthrough-input": false,
        "x": 585,
        "y": 120,
        "wires": [],
        "inputLabels": [
            "input"
        ]
    }
]

@sathya und @Interceptor43 habt ihr mir einen Tipp, wie ich den SolarEdge WR und den Powermeter auslesen kann? Denn mit obiger Node komem ich nur an die Produktionsdaten des Wechselrichter, ich möchte aber auch die Verbrauchsdaten des Hauses auslesen, um eine Anzeige zubauen, ob Strom bezogen oder exportiert wird (so wie ich dies aktuell mit der SolarEdge Cloud API mache).

1 Like