Seite 2 von 3

Re: WR2 Shelly...

Verfasst: Mo Nov 29, 2021 4:45 pm
von HSC
Nee, habe ich nicht...
VG

Re: WR2 Shelly...

Verfasst: Mo Nov 29, 2021 4:46 pm
von okaegi
okay dann mach ich es und liefer es aus.
Gruss Oliver

Re: WR2 Shelly...

Verfasst: Fr Dez 03, 2021 1:36 pm
von okaegi
Wr1 shelly nun in der neusten nightly auch auf python umgestellt.
Gruss Oliver

Re: WR2 Shelly...

Verfasst: Do Feb 24, 2022 11:40 am
von newbe2020
Hallo Forum,

ich habe einen Shelly 1PM plus mit Messfunktion als WR2 konfiguriert. Leider bekomme ich keine Leistung in OpenWB standalone (Beta:
1.9.254) angezeigt, sondern nur folgende debug.log Einträge:

***********
urllib.error.HTTPError: HTTP Error 404: Not Found
raise HTTPError(req.full_url, code, msg, hdrs, fp)
File "/usr/lib/python3.7/urllib/request.py", line 649, in http_error_default
result = func(*args)
File "/usr/lib/python3.7/urllib/request.py", line 503, in _call_chain
return self._call_chain(*args)
File "/usr/lib/python3.7/urllib/request.py", line 569, in error
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.7/urllib/request.py", line 641, in http_response
response = meth(req, response)
File "/usr/lib/python3.7/urllib/request.py", line 531, in open
return opener.open(url, data, timeout)
File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen
answer = json.loads(str(urllib.request.urlopen("http://"+str(ipadr)+"/status", timeout=3).read().decode("utf-8")))
File "/var/www/html/openWB/modules/wr_shelly/shellywr.py", line 32, in <module>
Traceback (most recent call last):
urllib.error.HTTPError: HTTP Error 404: Not Found
raise HTTPError(req.full_url, code, msg, hdrs, fp)
File "/usr/lib/python3.7/urllib/request.py", line 649, in http_error_default
result = func(*args)
File "/usr/lib/python3.7/urllib/request.py", line 503, in _call_chain
return self._call_chain(*args)
File "/usr/lib/python3.7/urllib/request.py", line 569, in error
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.7/urllib/request.py", line 641, in http_response
response = meth(req, response)
File "/usr/lib/python3.7/urllib/request.py", line 531, in open
return opener.open(url, data, timeout)
File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen
answer = json.loads(str(urllib.request.urlopen("http://"+str(ipadr)+"/status", timeout=3).read().decode("utf-8")))
File "/var/www/html/openWB/modules/wr_shelly/shellywr.py", line 32, in <module>
Traceback (most recent call last):
*******
Das Webinterface des shelly zeigt über die URL im WLAN in dem auch die OpenWB hängt brav die Leistung an.
Weiß jemand was zu tun ist? Gibt es da noch spezielle Einstellungen die am Shelly vorgenommen werden müssen?

viele Grüße

Re: WR2 Shelly...

Verfasst: Do Feb 24, 2022 12:37 pm
von derNeueDet
Hast du nur eine IP eingegeben oder http:// vor der URL?

Wenn nur IP, dann mal mit http:// davor probieren.


Edit: nee kannst du vergessen, ich sehe gerade, dass das im Code davor gebaut wird.


Dann die Frage in die andere Richtung: hast du http davor stehen?

VG
Det

Re: WR2 Shelly...

Verfasst: Do Feb 24, 2022 12:42 pm
von newbe2020
hi Det,

http konnte man auch nicht eingeben. Meine Vermutung das die neue Shelly Generation "plus" irgendwie anders abgefragt werden muss.

<shelly_ip>/status liefert auch ein "not found" zurück, hingegen <shelly_ip>/#/status lädt die normale Weboberfläche des Shelly inklusive Watt.
Hatte das shellywr.py schon entsprechend angepasst, leider ohne Erfolg :-(

Gruß

Re: WR2 Shelly...

Verfasst: Do Feb 24, 2022 1:03 pm
von derNeueDet
Ah, Shelly Plus. Ja, der ist anders abzufragen.

Im smarthome hat Okaegi das schon allgemein gelöst.

https://github.com/snaptec/openWB/blob/ ... ly/watt.py

Alternativ kannst du das JSON WR Modul nutzen.
Lass mal sehen, was als Ergebnis zurück kommt, wenn du das an deinen Shelly schickst

http://<ipdesShelly>/rpc/Shelly.GetStatus

Re: WR2 Shelly...

Verfasst: Do Feb 24, 2022 1:27 pm
von newbe2020
Ich habe mir den Code aus dem shelly Smarthome modul mal angesehen und mir nur das rausgezogen was für die neu Shelly version nötig war. Was soll ich sagen, es funktioniert!!! Unten die Änderungen im shellywr.py die nötig waren in fett.

********* /var/www/html/openWB/modules/wr_shelly/shellywr.py ********
#!/usr/bin/python3
import sys
import os
import time
import json
import getopt
import socket
import struct
import codecs
import binascii
import urllib.request


def totalPowerFromShellyJson(answer):
if 'meters' in answer:
meters = answer['meters'] # shelly
else:
meters = answer['emeters'] # shellyEM & shelly3EM
total = 0
# shellyEM has one meter, shelly3EM has three meters:
for meter in meters:
total = total + meter['power']
return int(total)


ipadr = str(sys.argv[1])
fname = str(sys.argv[2])

aktpower = 0

# Versuche Daten von Shelly abzurufen.
# answer = json.loads(str(urllib.request.urlopen("http://"+str(ipadr)+"/#/status", timeout=3).read().decode("utf-8")))
answer = json.loads(str(urllib.request.urlopen("http://"+str(ipadr)+"/rpc/Shelly.GetStatus", timeout=3).read().decode("utf-8")))
f = open('/var/www/html/openWB/ramdisk/shelly_wr_ret.' + str(ipadr), 'w')
f.write(str(answer))
f.close()
# Versuche Werte aus der Antwort zu extrahieren.
try:
# aktpower = totalPowerFromShellyJson(answer) * -1
aktpower = int(answer['switch:0'] ['apower']) * -1
except:
aktpower = 0

f1 = open('/var/www/html/openWB/ramdisk/' + str(fname), 'w')
f1.write(str(aktpower))
f1.close()


Viele Grüße

Re: WR2 Shelly...

Verfasst: Do Feb 24, 2022 4:07 pm
von okaegi
Shelly und Shelly plus sind unterschiedlich von der Rückgabe. In Smarthome 2.0 hat es die Logik drin das er zuerst rausfindet ob es ein Shelly oder Shelly plus ist, und dann es wird der in Zukunft unterschiedlich abgefragt. Ich bau das gleiche Verhalten mal in der WR Shelly ein...
Gruss Oliver

Re: WR2 Shelly...

Verfasst: Do Feb 24, 2022 6:14 pm
von okaegi
Hier ist das wr shelly modul, welches die Logik vom smarthome 2.0 eingebaut hat.
Es sollte sowohl mit shelly wie auch shelly plus laufen. Ich habe ein wr mit shelly, könntest du das mit deinem shelly plus testen ? Ich teste das mit meinem wr shelly. Es hat neue Datein auf der ramdisk. Dein shelly müsste als gen = 2 entdeckt werden.
Wenn ich deinen Feedback habe, kann ich es als pr übergeben.
Danke Oliver
********* /var/www/html/openWB/modules/wr_shelly/shellywr.py ********

Code: Alles auswählen


#!/usr/bin/python3
import sys
import os
import time
import json
import getopt
import socket
import struct
import codecs
import binascii
import urllib.request

def totalPowerFromShellyJson(answer):
    if 'meters' in answer:
        meters = answer['meters']  # shelly
    else:
        meters = answer['emeters']  # shellyEM & shelly3EM
    total = 0
    # shellyEM has one meter, shelly3EM has three meters:
    for meter in meters:
        total = total + meter['power']
    return int(total)

ipadr = str(sys.argv[1])
fname = str(sys.argv[2])

aktpower = 0
gen = '1'
fnprefix = '/var/www/html/openWB/ramdisk/shelly_wr_ret.' + str(ipadr)
fnameinf =   fnprefix + '_shelly_info'
fnameg =     fnprefix + '_shelly_infog'
if os.path.isfile(fnameg):
    f = open(fnameg, 'r')
    gen=str(f.read())
    f.close()
else:   
    answergen= json.loads(str(urllib.request.urlopen("http://"+str(ipadr)+"/shelly", timeout=3).read().decode("utf-8")))
    #answergen.update(g_dictionary)
    f = open(fnameinf, 'w')
    json.dump(answergen,f)
    f.close()
    if 'gen' in answergen:
        gen = str(int(answergen['gen']))
    f = open(fnameg, 'w')
    f.write(str(gen))
    f.close()
if (gen == "1"):
    answer = json.loads(str(urllib.request.urlopen("http://"+str(ipadr)+"/status", timeout=3).read().decode("utf-8")))
else:
    answer = json.loads(str(urllib.request.urlopen("http://"+str(ipadr)+"/rpc/Shelly.GetStatus",timeout=3).read().decode("utf-8")))
f = open(fnprefix, 'w')
f.write(str(answer))
f.close()
# Versuche Werte aus der Antwort zu extrahieren.
try:
    if (gen == "1"):
        aktpower = totalPowerFromShellyJson(answer) * -1
    else:
        aktpower = int(answer['switch:0'] ['apower']) * -1
except:
    aktpower = 0
f1 = open('/var/www/html/openWB/ramdisk/' + str(fname), 'w')
f1.write(str(aktpower))
f1.close()