Shelly 3em pro - Entwicklung Flow/Json Daten (Stromwächter)

Die werden dem Shelly ne websocket Verbindung aufdrücken oder MQTT hinterlegen.

Hoi :slight_smile:

Ok, da bin ich jetzt nicht ganz mitgekommen.
Du meinst, dass „fix“ der Port 80 für die Verbindung mit dem Shelly verwendet wird, korrekt?
Meine Angabe des Ports (1880 für node-red) hat daher gar keine Auswirkung bzw. funktioniert einfach nicht.
Das ist dein Punkt, oder?

Die Port-Weiterleitung (von 80 auf 1880) müsste ich dann in meinem Router einstellen, oder?

Viele Grüße

Also… mal sehen :slight_smile:

1 „Gefällt mir“

Ich würde mal ein script schreiben um das Bonjour Signal des Shelly zu simulieren um zu schauen ob man da was mit dem Port veranstalten kann.

1 „Gefällt mir“

Passt doch erstmal die url an. Ich glaube es ist weder websocket noch mqtt noch multicast noch iein port. Dafür brauchst du einen rechner mit node red oder einen esp… oder halt einen raspi

Ich hab die URL ja schon angepasst bzw. viele verschiedene Varianten ausprobiert.
Hast du noch einen Vorschlag, wie ich die URL anpassen könnte?

Viele Grüße

.

Rechner mit node-red: Hab hier noch ein altes Notebook mit Linux drauf. Das werd ich mal reaktivieren und node-red installieren.

ESP: Da hab ich jede Menge, aber „nur“ der ESP reicht doch nicht, oder?

Top, nimm das lappi u aktualisiers durch. Dann docker u portainer drauf (geht ratzfatz), dann node red im container und schon kannst du testen. Beim esp wär micha gefragt - es geht ja um einen kleinen reverse proxy. Wenn es klappt, sehen wir weiter dass wir es stromsparend hinbekommen =)

So, kleines Update :slight_smile:

Notebook mit neuem Linux aufgesetzt, Docker installiert, node-red innerhalb docker installiert, alles gestartet → läuft :+1:

Ist auch jetzt direkt mit der richtigen URL (korrekt @Poolcat?) erreichbar und gibt Daten zurück (im Browser).

Hab es trotzdem mal auf der Stromwächter-Installationsseite probiert, mit und ohne Port-Angabe, aber es hat nicht funktioniert → keine Rückmeldung im node-red im debug-node und der Browser gibt die Fehlermeldung „CONN_ERROR“ zurück.

image

Hab dann node-red neu installiert (bzw. mit dem Port 80 neu gestartet).

docker run -it -p 80:1880 -v node_red_data:/data --name mynodered nodered/node-red

Jetzt ist node-red über den Port 80 im Netzwerk erreichbar.

Im Browser gibt es auch wieder eine Rückmeldung und im node-red seh ich die Daten im debug-node.

image

Die Installation über die Stromwächter-Installationsseite funktioniert leider immer noch nicht.
Unabhängig davon, ob ich den Port 80 mit angebe, oder nicht.

Aber die Fehlermeldung im Browser ist jetzt eine andere und zwar diese hier „HTTP ERROR 404“.
Und im node-red kommt auch nichts an.

image

Irgendwelche Ideen? :slight_smile:

3 „Gefällt mir“

ja perfekt. Dann hier der flow abgeändert dass er dir anzeigt, welche api funktion aufgerufen wird. den gibst du mir dann durch, ich starte ihn hier und packe die ausgabe mit rein.

Wenn er nix anzeigt beim suchen, dann ist es wirklich etwas anderes aber das glaube ich nicht :wink:

Edit: ich habe den flow mal angepasst damit er alle http rpc einfallstore bearbeiten kann =)

[
    {
        "id": "9ad3fd4602a12d76",
        "type": "tab",
        "label": "Testflow Tobi",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "c8107088.37ef9",
        "type": "http in",
        "z": "9ad3fd4602a12d76",
        "name": "",
        "url": "/rpc/:name",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 140,
        "y": 40,
        "wires": [
            [
                "417db4e53665a4fb",
                "b9bd869d3852a6ce"
            ]
        ]
    },
    {
        "id": "4e8237da.b17dc8",
        "type": "template",
        "z": "9ad3fd4602a12d76",
        "name": "page",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"ble\": {},\n    \"cloud\": {\n        \"connected\": false\n    },\n    \"em:0\": {\n        \"id\": 0,\n        \"a_current\": 0.275,\n        \"a_voltage\": 227.2,\n        \"a_act_power\": 0.0,\n        \"a_aprt_power\": 62.3,\n        \"a_pf\": 0.00,\n        \"a_freq\": 50.0,\n        \"b_current\": 1.023,\n        \"b_voltage\": 228.6,\n        \"b_act_power\": 196.0,\n        \"b_aprt_power\": 233.8,\n        \"b_pf\": 0.83,\n        \"b_freq\": 50.0,\n        \"c_current\": 1.295,\n        \"c_voltage\": 227.0,\n        \"c_act_power\": 279.7,\n        \"c_aprt_power\": 293.8,\n        \"c_pf\": 0.95,\n        \"c_freq\": 50.0,\n        \"n_current\": null,\n        \"total_current\": 2.592,\n        \"total_act_power\": 475.743,\n        \"total_aprt_power\": 589.851,\n        \"user_calibrated_phase\": []\n    },\n    \"emdata:0\": {\n        \"id\": 0,\n        \"a_total_act_energy\": 771669.17,\n        \"a_total_act_ret_energy\": 280.69,\n        \"b_total_act_energy\": 764778.38,\n        \"b_total_act_ret_energy\": 1127262.55,\n        \"c_total_act_energy\": 3924531.44,\n        \"c_total_act_ret_energy\": 0.00,\n        \"total_act\": 5460979.00,\n        \"total_act_ret\": 1127543.23\n    },\n    \"eth\": {\n        \"ip\": null\n    },\n    \"modbus\": {},\n    \"mqtt\": {\n        \"connected\": true\n    },\n    \"script:1\": {\n        \"id\": 1,\n        \"running\": true,\n        \"mem_used\": 364,\n        \"mem_peak\": 2254,\n        \"mem_free\": 24836\n    },\n    \"sys\": {\n        \"mac\": \"EC62609774F0\",\n        \"restart_required\": false,\n        \"time\": \"13:14\",\n        \"unixtime\": 1717326878,\n        \"uptime\": 3032897,\n        \"ram_size\": 241276,\n        \"ram_free\": 116292,\n        \"fs_size\": 524288,\n        \"fs_free\": 176128,\n        \"cfg_rev\": 32,\n        \"kvs_rev\": 1,\n        \"schedule_rev\": 0,\n        \"webhook_rev\": 0,\n        \"available_updates\": {\n            \"stable\": {\n                \"version\": \"1.3.2\"\n            }\n        },\n        \"reset_reason\": 3\n    },\n    \"temperature:0\": {\n        \"id\": 0,\n        \"tC\": 46.1,\n        \"tF\": 114.9\n    },\n    \"wifi\": {\n        \"sta_ip\": \"192.168.178.140\",\n        \"status\": \"got ip\",\n        \"ssid\": \"Strahlemann\",\n        \"rssi\": -51\n    },\n    \"ws\": {\n        \"connected\": false\n    }\n}",
        "output": "json",
        "x": 450,
        "y": 100,
        "wires": [
            [
                "6486684d09027f13",
                "078793b6b8d58f69"
            ]
        ]
    },
    {
        "id": "65401623.9abfe8",
        "type": "change",
        "z": "9ad3fd4602a12d76",
        "name": "Set Headers",
        "rules": [
            {
                "t": "set",
                "p": "headers",
                "pt": "msg",
                "to": "{}",
                "tot": "json"
            },
            {
                "t": "set",
                "p": "headers.content-type",
                "pt": "msg",
                "to": "application/json",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 450,
        "y": 260,
        "wires": [
            [
                "f7d3e35a.082c2"
            ]
        ]
    },
    {
        "id": "f7d3e35a.082c2",
        "type": "http response",
        "z": "9ad3fd4602a12d76",
        "name": "http-out",
        "statusCode": "",
        "headers": {},
        "x": 640,
        "y": 260,
        "wires": []
    },
    {
        "id": "6486684d09027f13",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "debug 13",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 620,
        "y": 100,
        "wires": []
    },
    {
        "id": "078793b6b8d58f69",
        "type": "change",
        "z": "9ad3fd4602a12d76",
        "name": "update some vals",
        "rules": [
            {
                "t": "set",
                "p": "payload[\"em:0\"].a_act_power",
                "pt": "msg",
                "to": "123",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload[\"em:0\"].b_act_power",
                "pt": "msg",
                "to": "456",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 590,
        "y": 160,
        "wires": [
            [
                "65401623.9abfe8"
            ]
        ]
    },
    {
        "id": "417db4e53665a4fb",
        "type": "switch",
        "z": "9ad3fd4602a12d76",
        "name": "",
        "property": "req.params.name",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "Shelly.GetStatus",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 290,
        "y": 100,
        "wires": [
            [
                "4e8237da.b17dc8"
            ],
            [
                "65401623.9abfe8"
            ]
        ]
    },
    {
        "id": "b9bd869d3852a6ce",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "GET /rpc/:name",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "req.params.name",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 360,
        "y": 40,
        "wires": []
    },
    {
        "id": "c5b80fafc3cd4570",
        "type": "http in",
        "z": "9ad3fd4602a12d76",
        "name": "",
        "url": "/rpc",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 140,
        "y": 360,
        "wires": [
            [
                "77ee36a170097d09",
                "65401623.9abfe8"
            ]
        ]
    },
    {
        "id": "e24e7581b5a9fa7f",
        "type": "http in",
        "z": "9ad3fd4602a12d76",
        "name": "",
        "url": "/rpc",
        "method": "post",
        "upload": false,
        "swaggerDoc": "",
        "x": 140,
        "y": 420,
        "wires": [
            [
                "78a411c3c28a2493",
                "65401623.9abfe8"
            ]
        ]
    },
    {
        "id": "77ee36a170097d09",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "GET /rpc",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 360,
        "y": 360,
        "wires": []
    },
    {
        "id": "78a411c3c28a2493",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "POST /rpc",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 370,
        "y": 420,
        "wires": []
    },
    {
        "id": "7cecc792e96dd665",
        "type": "websocket in",
        "z": "9ad3fd4602a12d76",
        "name": "",
        "server": "87099d1bc7b3ee56",
        "client": "",
        "x": 140,
        "y": 480,
        "wires": [
            [
                "348d95f4efa803f2"
            ]
        ]
    },
    {
        "id": "348d95f4efa803f2",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "WS /rpc",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 360,
        "y": 480,
        "wires": []
    },
    {
        "id": "87099d1bc7b3ee56",
        "type": "websocket-listener",
        "path": "/rpc",
        "wholemsg": "false"
    }
]
1 „Gefällt mir“

Werd ich am WE direkt ausprobieren.
Aber trotzdem eine Vorab-Frage :slight_smile:
In node-red (und der debug-node) kommt ja nichts an (also beim aktuellen Flow), wieso sollte dann beim neuen Flow etwas ankommen?
Oder steh ich grad auf dem Schlauch? :thinking: :man_shrugging:

=)

Edit: für noch genauer oben auf michas link gehen u dort unter rpc channels. Es gibt verschiedene arten die rpc anzusprechen u in der api verschiedene funktionen. Der alte flow konnte nur einen call auf einem channel. Der neue loggt alles.

Funktioniert leider nicht.

Die debug-node bleibt leer, es gibt keinerlei Rückmeldung.

Ich bekomme nur Daten (in der debug-node), wenn ich die URL im Browser direkt aufrufe.

Antwort von Indielux:
Ich glaub, ich muss das mal ohne „/rcp“ probieren, sondern nur „/“ bzw. „/status“.
Bin aber grad unterwegs, daher frühestens am WE.

Viele Grüße

3 „Gefällt mir“

Oh wow - das ist der alte standard, den die aktuellen Geräte gar nicht mehr können. Sei es drum - du hast die Linuxkiste am start - ich bereite dir etwas vor das wir auch etwas sehen. Das JSON ist btw dasselbe wie oben aus dem aufruf. Nur wahrscheinlich brauchen wir einen reverse proxy für die root abfrage („/“) was auch immer die bringen soll… Ist aber kein problem mit dem docker setup :wink:

Hier der testflow mit einem aus dem web gemopsten json vom 3em. die root umbiegung ist noch nicht drin - ich denke nicht das man die braucht =)

[
    {
        "id": "9ad3fd4602a12d76",
        "type": "tab",
        "label": "Testflow Tobi",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "c8107088.37ef9",
        "type": "http in",
        "z": "9ad3fd4602a12d76",
        "name": "",
        "url": "/status",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 130,
        "y": 40,
        "wires": [
            [
                "b9bd869d3852a6ce",
                "4e8237da.b17dc8"
            ]
        ]
    },
    {
        "id": "4e8237da.b17dc8",
        "type": "template",
        "z": "9ad3fd4602a12d76",
        "name": "page",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"wifi_sta\": {\n        \"connected\": true,\n        \"ssid\": \"WLAN\",\n        \"ip\": \"192.168.0.144\",\n        \"rssi\": -36\n    },\n    \"cloud\": {\n        \"enabled\": true,\n        \"connected\": true\n    },\n    \"mqtt\": {\n        \"connected\": false\n    },\n    \"time\": \"11:03\",\n    \"unixtime\": 1649754212,\n    \"serial\": 59968,\n    \"has_update\": true,\n    \"mac\": \"68C63AFB5737\",\n    \"cfg_changed_cnt\": 3,\n    \"actions_stats\": {\n        \"skipped\": 0\n    },\n    \"relays\": [\n        {\n            \"ison\": false,\n            \"has_timer\": false,\n            \"timer_started\": 0,\n            \"timer_duration\": 0,\n            \"timer_remaining\": 0,\n            \"overpower\": false,\n            \"is_valid\": true,\n            \"source\": \"http\"\n        }\n    ],\n    \"emeters\": [\n        {\n            \"power\": -1696.09,\n            \"pf\": -0.98,\n            \"current\": 7.33,\n            \"voltage\": 236.95,\n            \"is_valid\": true,\n            \"total\": 177173.9,\n            \"total_returned\": 542320.4\n        },\n        {\n            \"power\": -1679.18,\n            \"pf\": -0.98,\n            \"current\": 7.30,\n            \"voltage\": 234.63,\n            \"is_valid\": true,\n            \"total\": 186179.5,\n            \"total_returned\": 461668.3\n        },\n        {\n            \"power\": -1061.61,\n            \"pf\": -0.95,\n            \"current\": 4.76,\n            \"voltage\": 234.03,\n            \"is_valid\": true,\n            \"total\": 888586.5,\n            \"total_returned\": 183124.3\n        }\n    ],\n    \"total_power\": -4436.88,\n    \"fs_mounted\": true,\n    \"update\": {\n        \"status\": \"pending\",\n        \"has_update\": true,\n        \"new_version\": \"20220324-123835/v1.11.8-3EM-fix-g0014dcb\",\n        \"old_version\": \"20210909-150410/v1.11.4-DNSfix-ge6b2f6d\"\n    },\n    \"ram_total\": 49440,\n    \"ram_free\": 30132,\n    \"fs_size\": 233681,\n    \"fs_free\": 154867,\n    \"uptime\": 7890250\n}",
        "output": "json",
        "x": 330,
        "y": 100,
        "wires": [
            [
                "6486684d09027f13",
                "078793b6b8d58f69"
            ]
        ]
    },
    {
        "id": "65401623.9abfe8",
        "type": "change",
        "z": "9ad3fd4602a12d76",
        "name": "Set Headers",
        "rules": [
            {
                "t": "set",
                "p": "headers",
                "pt": "msg",
                "to": "{}",
                "tot": "json"
            },
            {
                "t": "set",
                "p": "headers.content-type",
                "pt": "msg",
                "to": "application/json",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 450,
        "y": 260,
        "wires": [
            [
                "f7d3e35a.082c2"
            ]
        ]
    },
    {
        "id": "f7d3e35a.082c2",
        "type": "http response",
        "z": "9ad3fd4602a12d76",
        "name": "http-out",
        "statusCode": "",
        "headers": {},
        "x": 640,
        "y": 260,
        "wires": []
    },
    {
        "id": "6486684d09027f13",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "debug 13",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 560,
        "y": 100,
        "wires": []
    },
    {
        "id": "078793b6b8d58f69",
        "type": "change",
        "z": "9ad3fd4602a12d76",
        "name": "update some vals",
        "rules": [
            {
                "t": "set",
                "p": "payload.emeters[0].power",
                "pt": "msg",
                "to": "123",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.emeters[1].power",
                "pt": "msg",
                "to": "456",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.emeters[2].power",
                "pt": "msg",
                "to": "345",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.total_power",
                "pt": "msg",
                "to": "123",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 590,
        "y": 160,
        "wires": [
            [
                "65401623.9abfe8"
            ]
        ]
    },
    {
        "id": "b9bd869d3852a6ce",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "GET /status",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 350,
        "y": 40,
        "wires": []
    }
]
4 „Gefällt mir“

Na top, DAS hat funktioniert :slight_smile:
:+1: :+1: :+1:

Danke schon mal für den ganzen Support!!

Jetzt etwas mehr „Details“ :smiley:

Bin jetzt weiter zum Dashboard gekommen:

Das „Austauschen“ der Werte innerhalb node-red funktioniert, aber ich musste nicht „power“ austauschen, sondern „current“. Und auch nur für die drei Phasen.
Die Anzeigen im Dashboard werden nämlich hart codierten 230 V (also ganz genau 230 V) und dem jeweiligen Strombedarf pro Phase verrechnet.
Der Powerfaktor „pf“ wird ignoriert.

Gilt aber nur für das Dashboard :slight_smile:

Hab mich dann auch in der Cloud angemeldet, dort werden die Daten auch live angezeigt, aber anders verrechnet.
Für die Verrechnung wird die „voltage“, „current“ und „pf“ verwendet.
Also jeweils die live-daten vom emulierten Shelly3M (bzw. die korrigierten).

In der Cloud springen die Werte aber hin und her.
Z.B, zwischen hier:

und hier:

Auch klackt immer wieder ein Relay im Stromwächter, wenn zwischen diesen beiden Anzeigen hin- und hergewechselt wird.
Ich hab auch nicht ganz verstanden, warum der überhaupt annimmt, ich würd etwas erzeugen (also, mal ja, mal nein), weil am PV-Eingang ja nichts angesteckt ist.
Ich muss da mal ein PV-Modul oder Netzgerät anschließen und mal weiter testen.

Der debug-node vom „normalen“ http-in ist übrigens immer „empty“.
image

Ich vermute, der Stromwächter fragt nicht gezielt Werte ab, sondern einfach „alles“ und nimmt sich für die Berechnung intern die Werte, die er haben möchte.

Aber cool, jetzt bin ich schon einen Schritt weiter :slight_smile:

Viele Grüße

4 „Gefällt mir“

Du musst denn debug auf volle msg stellen und nicht auf msg.Payload .

Okidok, probier ich aus! :+1: