Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9b5fded
Merge pull request #2039 from openWB/master
LKuemmel Nov 25, 2024
f717f28
Merge master into Release (#2050)
LKuemmel Dec 3, 2024
d1ccee6
Revert "Merge master into Release (#2050)"
LKuemmel Dec 5, 2024
b0420bd
Merge pull request #2057 from openWB/revert-2050-master
LKuemmel Dec 5, 2024
d982f63
Merge pull request #2058 from openWB/master
LKuemmel Dec 5, 2024
cb8fe8d
Merge pull request #2251 from openWB/master
LKuemmel Mar 11, 2025
31aef70
Merge pull request #2259 from openWB/master
LKuemmel Mar 14, 2025
8a8cefd
pro+: fix network setup (#2405)
LKuemmel May 16, 2025
cf7d39d
update ubuntu version to latest in github action (#2337)
LKuemmel Apr 16, 2025
503b475
fix keep cloud config on startup (#2406)
LKuemmel May 16, 2025
87108ed
Update version 2.1.7-Patch.2
LKuemmel May 16, 2025
87ffd48
Pro+: fix soc and mac (#2424)
LKuemmel May 28, 2025
8fd4fe2
Update version 2.1.7-Patch.3
LKuemmel May 28, 2025
d7924dc
Pro+:RFID-Read plugged to Pi or Pro (#2408)
LKuemmel May 19, 2025
563e25d
update version 2.1.7-Patch.4
LKuemmel Jul 15, 2025
f346706
Merge pull request #2605 from benderl/remote-support
benderl Jul 29, 2025
2d946b8
Update version 2.1.7-Patch.5
LKuemmel Aug 1, 2025
4b0b2a7
Merge branch 'Release' into release-merge
ndrsnhs Sep 22, 2025
7ec28c6
Merge pull request #2779 from openWB/release-merge
ndrsnhs Sep 22, 2025
b2e5402
Merge branch 'Release' into release-merge-1
LKuemmel Sep 24, 2025
cffea69
Merge pull request #2782 from openWB/release-merge-1
LKuemmel Sep 24, 2025
6a96959
Erster Wurf
gvzdus Oct 10, 2025
5715001
Prefinal vor Tests
gvzdus Oct 11, 2025
df8d98b
HttpDigest-Support
gvzdus Oct 11, 2025
8b7237e
on.py und off.py nachgezogen und mit Logging ausgestattet, watt.py ve…
gvzdus Oct 11, 2025
266f944
Fixed flake8 warnings
gvzdus Oct 11, 2025
1816180
Merge branch 'master' into smarthome-shelly-fix
LKuemmel Dec 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 44 additions & 39 deletions packages/modules/smarthome/shelly/off.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#!/usr/bin/python3
import sys
import time
import urllib.request
import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
import os
import json
named_tuple = time.localtime() # getstruct_time
time_string = time.strftime("%m/%d/%Y, %H:%M:%S shelly off.py", named_tuple)
import logging

log = logging.getLogger(__name__)
devicenumber = str(sys.argv[1])
ipadr = str(sys.argv[2])
uberschuss = int(sys.argv[3])
Expand All @@ -18,40 +19,44 @@
shaut = int(sys.argv[5])
user = str(sys.argv[6])
pw = str(sys.argv[7])

fbase = '/var/www/html/openWB/ramdisk/smarthome_device_ret.'
fnameg = fbase + str(ipadr) + '_shelly_infogv1'
if os.path.isfile(fnameg):
with open(fnameg, 'r') as f:
jsonin = json.loads(f.read())
gen = str(jsonin['gen'])
model = str(jsonin['model'])
else:
gen = "1"
if (gen == "1"):
if (chan == 0):
url = "http://" + str(ipadr) + "/relay/0?turn=off"
# urllib.request.urlopen("http://"+str(ipadr)+"/relay/0?turn=off",
# timeout=3)
fnameg = fbase + str(ipadr) + '_shelly_infogv2'
log_pfx = "Device " + str(devicenumber) + " IP " + ipadr + ": "

try:
if os.path.isfile(fnameg):
with open(fnameg, 'r') as f:
jsonin = json.loads(f.read())
gen = str(jsonin['gen'])
model = str(jsonin['model'])
else:
gen = "1"

if gen == "1":
if chan == 0:
url = f"http://{ipadr}/relay/0?turn=off"
else:
chan = chan - 1
url = f"http://{ipadr}/relay/{chan}?turn=off"
else:
if chan > 0:
chan = chan - 1
if "SPEM-003CE" in model:
chan = 100
url = f"http://{ipadr}/rpc/Switch.Set?id={chan}&on=false"

if shaut == 1:
if gen == "1":
# HTTP Basic Auth für Gen 1
auth = HTTPBasicAuth(user, pw)
else:
# HTTP Digest Auth für Gen 2 oder SPEM-003CE
auth = HTTPDigestAuth("admin", pw)
response = requests.get(url, auth=auth, timeout=3)
else:
chan = chan - 1
url = "http://" + str(ipadr) + "/relay/" + str(chan) + "?turn=off"
# urllib.request.urlopen("http://"+str(ipadr)+"/relay/" + str(chan) +
# "?turn=off", timeout=3)
else:
if (chan > 0):
chan = chan - 1
# shelly pro 3em mit add on hat fix id 100 als switch Kanal, das Device muss auf jeden fall mit separater
# Leistunsmessung erfasst werden, da die Leistung auf drei verschiedenenen Kanälen angeliefert werden kann
if ("SPEM-003CE" in model):
chan = 100
# gen 2 will das als off cmd IPderPro3EM/rpc/Switch.Set?id=100&on=false
url = "http://" + str(ipadr) + "/rpc/Switch.Set?id=" + str(chan) + "&on=false"
if (shaut == 1):
# print("Shelly off" + str(shaut) + user + pw)
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, user, pw)
authhandler = urllib.request.HTTPBasicAuthHandler(passman)
opener = urllib.request.build_opener(authhandler)
urllib.request.install_opener(opener)
with urllib.request.urlopen(url) as response:
response.read().decode("utf-8")
response = requests.get(url, timeout=3)

response.raise_for_status() # Fehler, wenn Statuscode nicht 2xx ist
except Exception as e:
log.error(f"{log_pfx}Error on changing switch: {str(e)}")
80 changes: 44 additions & 36 deletions packages/modules/smarthome/shelly/on.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
#!/usr/bin/python3
import sys
import urllib.request
import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
import os
import json
import logging

log = logging.getLogger(__name__)
devicenumber = str(sys.argv[1])
ipadr = str(sys.argv[2])
uberschuss = int(sys.argv[3])
Expand All @@ -15,40 +19,44 @@
shaut = int(sys.argv[5])
user = str(sys.argv[6])
pw = str(sys.argv[7])

fbase = '/var/www/html/openWB/ramdisk/smarthome_device_ret.'
fnameg = fbase + str(ipadr) + '_shelly_infogv1'
if os.path.isfile(fnameg):
with open(fnameg, 'r') as f:
jsonin = json.loads(f.read())
gen = str(jsonin['gen'])
model = str(jsonin['model'])
else:
gen = "1"
if (gen == "1"):
if (chan == 0):
url = "http://" + str(ipadr) + "/relay/0?turn=on"
# urllib.request.urlopen("http://"+str(ipadr)+"/relay/0?turn=on",
# timeout=3)
fnameg = fbase + str(ipadr) + '_shelly_infogv2'
log_pfx = "Device " + str(devicenumber) + " IP " + ipadr + ": "

try:
if os.path.isfile(fnameg):
with open(fnameg, 'r') as f:
jsonin = json.loads(f.read())
gen = str(jsonin['gen'])
model = str(jsonin['model'])
else:
gen = "1"

if gen == "1":
if chan == 0:
url = f"http://{ipadr}/relay/0?turn=on"
else:
chan = chan - 1
url = f"http://{ipadr}/relay/{chan}?turn=on"
else:
if chan > 0:
chan = chan - 1
if "SPEM-003CE" in model:
chan = 100
url = f"http://{ipadr}/rpc/Switch.Set?id={chan}&on=true"

if shaut == 1:
if gen == "1":
# HTTP Basic Auth für Gen 1
auth = HTTPBasicAuth(user, pw)
else:
# HTTP Digest Auth für Gen 2 oder SPEM-003CE
auth = HTTPDigestAuth("admin", pw)
response = requests.get(url, auth=auth, timeout=3)
else:
chan = chan - 1
url = "http://" + str(ipadr) + "/relay/" + str(chan) + "?turn=on"
# urllib.request.urlopen("http://"+str(ipadr)+"/relay/" + str(chan) +
# "?turn=on", timeout=3)
else:
if (chan > 0):
chan = chan - 1
# shelly pro 3em mit add on hat fix id 100 als switch Kanal, das Device muss auf jeden fall mit separater
# Leistunsmessung erfasst werden, da die Leistung auf drei verschiedenenen Kanälen angeliefert werden kann
if ("SPEM-003CE" in model):
chan = 100
# gen 2 will das als on cmd /rpc/Switch.Set?id=100&on=true
url = "http://" + str(ipadr) + "/rpc/Switch.Set?id=" + str(chan) + "&on=true"
if (shaut == 1):
# print("Shelly on" + str(shaut) + user + pw)
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, user, pw)
authhandler = urllib.request.HTTPBasicAuthHandler(passman)
opener = urllib.request.build_opener(authhandler)
urllib.request.install_opener(opener)
with urllib.request.urlopen(url) as response:
response.read().decode("utf-8")
response = requests.get(url, timeout=3)

response.raise_for_status() # Fehler, wenn Statuscode nicht 2xx ist
except Exception as e:
log.error(f"{log_pfx}Error on changing switch: {str(e)}")
Loading