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

Ich habe einen hier. Falls du node red am start hast, können wir einen flow bauen der die api emuliert. Wiegesagt, ich bin gespannt drauf. Mein setup hat sich mittlerweile etwas geändert - 3xhms2000 aka 6kw einspeiseleistung via 16qmm direkt an den hauptanschluss und der shelly ist dem hichi gewichen (da schneller u genauer)

2 „Gefällt mir“

Node-red hab ich, das wär nicht das Problem.
Aber ohne den Shelly kann ich ja nicht mal die Einrichtung abschließen, d.h. der Stromwächter funktioniert bei mir noch gar nicht.
Und wo hast du denn die API her? :slight_smile:

Viele Grüße

Er meint bestimmt die Shelly API und die ist online verfügbar.
Du musst also die kompletten Daten dann im Shelly RPC Format zur Verfügung stellen.

1 „Gefällt mir“

Wie wird der Shelly eingebunden ?
Musst du den im heimischen Netzwerk suchen ?
Oder gibst du die IP und den Port an ?

Ja genau das =) ich denke, dass der sich einfach das JSON holt beim aufruf von https://admin:secret@shelly3em.home/status

Das JSON kann ich dir geben wenn wir wissen was er genau aufruft und das kannst du per node red auf deine werte ändern (vom anderen zähler) und ihm zurück geben.

Du müsstest also für den Start ein http-in mit einem debug node machen, damit wir wissen was er sich genau holt. Das hole ich dann hier auch und stelle es ein. dann kannst du das per template oder function feld füllen und per http-out zurück geben.

Ahso, ja, ok, das macht Sinn :slight_smile:

Also den Shelly muss/kann man entweder in lokalen Netz suchen lassen, oder man gibt direkt die IP-Adresse ein (ggf. noch User+Pass).
Beides geht.

Hier ist mal der Link zur Anleitung: indielux ready2plugin Stromwächter Anleitung – indielux

Mit „http-in“ meinst du, was unter der IP vom Stromwächter ankommt (abgefragt wird), damit wir wissen, was bei der Einrichtung abgefragt wird?

Falls ja, hast du da einen Beispiel-Flow?
Ich hab zwar node-red, aber in der Programmierung von node-red bin ich nicht fit.
Da bin ich nur Script-Kiddy und ändere nur :smiley:

Du musst mal die ip deines Node-Red eintragen mit Port und dann am http in die Nachricht im debug darstellen dann siehst du was da abgefragt wird bzw. was geändert werden soll per config und dann weißt du wo die Daten hingesendet werden sollen.
Wenn @Poolcat dir den Json vom 3 em bereitstellt dann kannst du das nachbauen.

1 „Gefällt mir“

Dann hier ein beispiel-flow für script kiddies :wink:

Http-in auf den vermuteten api call. dann das template mit der ausgabe von meinem shelly. dazu ein debug und ein change node - in dem change node als kurzes beispiel wie du die werte auf deine eigenen änderst und dann der http out.

nachdem der node läuft, auf dem stromwächter ip:port vom node red eingeben. ausprobieren kannst du es vom rechner aus indem du http://deine-node-red-ip-und-port/rpc/Shelly.GetStatus aufrufst

[
    {
        "id": "9ad3fd4602a12d76",
        "type": "tab",
        "label": "Testflow Tobi",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "c8107088.37ef9",
        "type": "http in",
        "z": "9ad3fd4602a12d76",
        "name": "",
        "url": "/rpc/Shelly.GetStatus",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 190,
        "y": 80,
        "wires": [
            [
                "4e8237da.b17dc8"
            ]
        ]
    },
    {
        "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": 370,
        "y": 80,
        "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": 390,
        "y": 160,
        "wires": [
            [
                "f7d3e35a.082c2"
            ]
        ]
    },
    {
        "id": "f7d3e35a.082c2",
        "type": "http response",
        "z": "9ad3fd4602a12d76",
        "name": "http-out",
        "statusCode": "",
        "headers": {},
        "x": 560,
        "y": 160,
        "wires": []
    },
    {
        "id": "6486684d09027f13",
        "type": "debug",
        "z": "9ad3fd4602a12d76",
        "name": "debug 13",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 80,
        "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": 190,
        "y": 160,
        "wires": [
            [
                "65401623.9abfe8"
            ]
        ]
    }
]

3 „Gefällt mir“

Danke :slight_smile:

Wird allerdings etwas dauern, bin etwas „unter Wasser“ derzeit.

Viele Grüße

1 „Gefällt mir“

Frage dazu:
Node-Red läuft als Add-on auf HomeAssistant, ich muss also als IP die IP von HomeAssistant und den Port 8123 (Standard-Port von HomeAssistant) eintragen?

die ip und den port unter dem du node red erreichst.

Tante Edit sagt, das Onkel Google sagt, dass es 1880 sein müsste.

Normal ist der Port 1880 kann aber auch jeder andere sein wenn du es händisch vergibst.

Okay, Port 1880 funktioniert.

Wenn ich deinen (@Poolcat ) flow einsetze und die IP von Node-Red angebe, dann bekomme ich auch folgende Rückmeldung:

So wolltest du das haben bzw. testen, korrekt?
Ich musste nach dem Port noch „/endpoint“ mit angeben, sonst bekomm ich einen Fehler.

Ich bekomme auch eine Rückmeldung im Debug-Fenster von node-red.
image

Wenn ich allerdings die URL im Anmeldefenster vom Stromwächter eingebe, dann passiert in node-red gar nix.
Auch wird mir beim Stromwächter angezeigt, dass etwas nicht funktioniert (der Hintergrund blinkt einmal rot, sonst gibt es keine Rückmeldung).

Gleiches Verhalten, wenn ich nur IP und Port angebe, ohne den Rest der URL.

Deploy wurd natürlich jedes Mal gemacht.
Auch hab ich verschiedene Varianten ausprobiert (nur IP:PORT, mit/ohne „http:\“, mit/ohne Rest der URL, mit/ohne „/endpoint“, mit/ohne Nutzername/Passwort.

Wenn ich einen neuen http-in in node-red einfüge, muss ich „irgendwas“ (aber was?) als URL-Eigenschafts-Wert einfügen, aber ich weiß nicht, was.

Habt ihr Ideen?

Falls es hilft:
Im Browser in den Entwicklungswerkzeugen sieht man, dass hier gescannt wird bzw. ein Ereignis ausgelöst wird, wenn ich den Shelly „festlegen“ möchte.

Siehe Screenshot:

Ich weiß nur nicht, ob uns das weiterhilft :slight_smile:

Wenn ich die Festlegung manuell auslöse (im linken Menü unter „setup“ erkennbar), dann kommt „Connection error: CONN:ERROR“ zurück (rechte Seite).

image

oha - das /endpoint muss da weg - wir können dem Stromwächter ja keine neue URL beibringen. Mir fallen verschiedene Sachen ein wie das gehen könnte (apache url rewrite, node red config der endpoint url, reverse proxy).

Wie genau hast du denn ha am laufen? RPi mit hass.io oder RPi mit docker und dann da drin ein ha container oder noch was ganz anderes?

Ja, ich hab es ja auch mit und ohne „/endpoint“ ausprobiert.
Nur daran liegt also vermutlich nicht.

Ich hab HA auf einem RPi mit hass.io laufen.
Node-red läuft dann als add-on.
Wenn ich direkt die IP (von HomeAssistant) mit dem Port 1880 aufrufe, komme ich auch direkt auf die node-red Oberfläche.
Ich muss vorher halt noch User+PW von meinem HA-System eingeben, aber das hab ich auf der Einrichtungsseite vom Stromwächter ja auch gemacht.

wiegesagt, es muss über die url ohne /endpoint erreichbar sein - sonst geht es nicht.

node-red add-on: httpNodeRoot müsste geändert werden wird aber vom add-on fest vorgegeben ohne änderungsmöglichkeit → addon-node-red/node-red/rootfs/etc/node-red/settings.js at main · hassio-addons/addon-node-red · GitHub

Einen reverse proxy gibt es zwar, dort müsste man aber die config komplett einmal umgraben (addons/nginx_proxy at master · home-assistant/addons · GitHub)

aber für einen test - hast du vlt noch einen zweiten RPi oder eine andere maschine mit der man das testen könnte?

Einen zweiten RP1 hab ich leider nicht.

Daher zurück zur „/endpoint“-Thematik:

In node-red sieht die node so aus:


In den Eigenschaften ist „/endpoint“ nicht definiert, aber es wird trotzdem in der node-Grafik dargestellt. Ist das korrekt oder muss ich da auch was ändern? Falls ja, was?

Wenn ich im Browser die URL ohne „/endpoint“ angebe, dann bekomm ich eine Fehlermeldung.
Kann ich da etwas anderes probieren oder einstellen?
image

Ich hab jetzt Indielux mal angeschrieben und gefragt, ob die uns sagen können, wie der Shelly3M auf deren Einrichtungsseite angesprochen wird und welche Daten sonst so abgefragt werden.
Vielleicht bekommen wir ja eine Antwort zurück, die uns weiterhilft :slight_smile:

Fragen kostet ja nix :slight_smile:

Viele Grüße

1 „Gefällt mir“

Das Problem mit Node red ist bestimmt der Port.
Da Shelly den Port 80 benutzt musst du da bestimmt eine Weiterleitung hinterlegen.
Alternativ auf dem Udp multicast Protocol: multicast UDP 224.0.1.187 port 5683 zuhören beim suchen.