Shelly 3EM pro. Leistung über http beziehen.

#7589949
Lesenswert?

Zwei varianten. RPC und skript.

Mit RPC: anfrage: http://192.168.178.26/rpc/EM.GetStatus?id=0 antwort: {"id":0,"a_current":0.030,"a_voltage":0.1,"a_act_power":-0.0,"a_aprt_power":0.0,"a_pf":1.00,"b_current":0.027,"b_voltage":0.1,"b_act_power":0.0,"b_aprt_power":0.0,"b_pf":1.00,"c_current":0.028,"c_voltage":237.5,"c_act_power":0.1,"c_aprt_power":6.7,"c_pf":1.00,"n_current":null,"total_current":0.085,"total_act_power":0.084,"total_aprt_power":6.679}

Mit skript: anfrage: http://192.168.178.30/script/1/pwr antwort: PWR: -0.219000

Skript dazu: function GetPwr(request, response) { //print('Executing function open'); let EMpower = Shelly.getComponentStatus("em:0"); response.body = "PWR: " + JSON.stringify(EMpower.total_act_power); response.code = 200; response.send(); }

HTTPServer.registerEndpoint('pwr', GetPwr)

// http://192.168.178.26/script/1/pwr

Ich hab dafür stunden gebraucht! Die doku ist katastrophal. Ziel war möglichst wenig WiFi traffic für sekunden-abfrage.

#7637770
Lesenswert?

Hallo, ja, genau das will ich auch: Shelly 3EM pro. Leistung über http beziehen. Ich bin auch auf die gleiche Lösung gekommen wie der TO:

1
http://192.168.0.151/rpc/EM.GetStatus?id=0

Wenn ich das in meinen Browser eingebe, bekomme ich auch die entsprechende Liste als Antwort.

Ich möchte aber innerhalb eines Python-Scripts auf die einzelnen Werte zugreifen, und komme da nicht weiter. Ich brauche die momentane Gesamtleistung um damit weiter zu rechnen.

Die Doku für den Pro 3EM verwirrt mich mehr, als dass sie mir hilft. Kann mir da jemand weiterhelfen?

Vielen Dank, atuditu

#7824144
Lesenswert?

Hallo Mathias. Du wirst es inzwischen wahrscheinlich herausgefunden haben. Ich wäre an der Lösung interessiert. Die Antwort mit dem Parsen scheint mir sowieso nicht die richtige gewesen zu sein. Ich stehe vor einem ähnlichen Problem: -Sicher funktioniert die Anfrage über den Browser. -Ich möchte die Anfrage aber aus einem Shelly Script heraus stellen. -mit let sta=Shelly.call("http.get", "http://10.0.0.16/rpc/EM.GetStatus?id=0"); bekomme ich aber immer nur Null als Antwort.

????

#7824396
Lesenswert?

So fast selbst gelöst (hab mir Hilfe bei ChatGPT geholt - hat aber auch nicht funktioniert!): Hier die Lösung, damit es sonst jemandem helfen kann:

function getShelly3EMPower() { let shelly3EM_IP = "10.0.0.16"; let url = "http://" + shelly3EM_IP + "/rpc/EM.GetStatus?id=0";

1
Shelly.call("HTTP.GET", {url: url}, function(result, error_code, error_message) {
2
    if (error_code === 0 && result) {
3
        let data = JSON.parse(result.body);
4
        let totalPower = data.total_act_power;
5
        print("Total Actual Power:", totalPower, "W");
6
    } else {
7
        print("Error fetching data:", error_message);
8
    }
9
});

}

...so recht ist mir aber nicht klar, wo sich dieser Code von meinem unterscheidet - scheinbar lässt sich Ergebnis nicht direkt zuweisen? Naja, ich werde weiter in meinem Java Buch lesen und hoffe, dass es mir etwas weiterhilft, obwohl ich bezweifle ob dies an Java oder eher an Shelly liegt!?

#7834834
Lesenswert?

Hallo Karl-Heinz, Sorry, dass ich mich erst so spät melde; ich hatte diesen Thread schon aus den Augen verloren.

Bei mir geht das mit zwei Shelly 3EM so:

1
try:
2
    power_1 = requests.get(f'http://{192.168.0.151}/rpc/EM.GetStatus?id=0',headers={'Content-Type':'application/json'}).json()['total_act_power']
3
    power_2 = requests.get(f'http://{192.168.0.152}/rpc/EM.GetStatus?id=0',headers={'Content-Type':'application/json'}).json()['total_act_power']
4
    
5
    
6
except:
7
    print('Fehler beim Abrufen der Daten von Shelly 3EM')
#7835899
Lesenswert?

Mathias M. schrieb:

1
try:
2
    power_1 =

requests.get(f'http://{192.168.0.151}/rpc/EM.GetStatus?id=0',headers={'Content-Type':'application/json'}).json()['total_act_power'] power_2 = requests.get(f'http://{192.168.0.152}/rpc/EM.GetStatus?id=0',headers={'Content-Type':'application/json'}).json()['total_act_power']

1
except:
2
    print('Fehler beim Abrufen der Daten von Shelly 3EM')

Dein Code benutzt zwar F-Strings, aber die Variablennamen (192.168.0.15[12]) sind ungültig. In diesem Fall kannst Du Dir die geschweiften Klammern ebenso sparen wie das "f".

Direkte Schlüsselzugriffe wie hier auf 'total_act_power' am Ende eines oder gar mehrerer Befehle... Wie wäre es eine Abfrage mit ".get('total_act_power', None)" mit Prüfung auf "None"?

Besonders häßlich finde ich allerdings, daß Du den Informationsgehalt aller Exceptions wegwirfst und stattdessen eine völlig nichtssagende Fehlermeldung ausgibt. Völlig gleichgültig, ob der Request fehlschlägt, weil der Host nicht erreichbar war, der Host einen unerwarteten HTTP-Statuscode zurückgegeben hat, ob sich der Body der Response nicht als JSON parsen ließ oder Du nicht auf den Schlüssel 'total_act_power' zugreifen konntest, die Fehlermeldung ist immer dieselbe: 'Fehler beim Abrufen der Daten von Shelly 3EM'...

... und so ganz grundsätzlich würde ich bei jeder Art von Netzwerkverbindung niemals ohne Timeout arbeiten. ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren