diff --git a/runs/initRamdisk.sh b/runs/initRamdisk.sh index 1bfc064bd..0cbd742d8 100644 --- a/runs/initRamdisk.sh +++ b/runs/initRamdisk.sh @@ -208,6 +208,15 @@ initRamdisk(){ echo 0 > $RamdiskPath/device7_wh echo 0 > $RamdiskPath/device8_wh echo 0 > $RamdiskPath/device9_wh + echo 0 > $RamdiskPath/smarthome_device_minhaus_1 + echo 0 > $RamdiskPath/smarthome_device_minhaus_2 + echo 0 > $RamdiskPath/smarthome_device_minhaus_3 + echo 0 > $RamdiskPath/smarthome_device_minhaus_4 + echo 0 > $RamdiskPath/smarthome_device_minhaus_5 + echo 0 > $RamdiskPath/smarthome_device_minhaus_6 + echo 0 > $RamdiskPath/smarthome_device_minhaus_7 + echo 0 > $RamdiskPath/smarthome_device_minhaus_8 + echo 0 > $RamdiskPath/smarthome_device_minhaus_9 echo 0 > $RamdiskPath/smarthome_device_manual_1 echo 0 > $RamdiskPath/smarthome_device_manual_2 echo 0 > $RamdiskPath/smarthome_device_manual_3 diff --git a/runs/mqttsub.py b/runs/mqttsub.py index 2606e18cf..290b1b898 100644 --- a/runs/mqttsub.py +++ b/runs/mqttsub.py @@ -142,6 +142,23 @@ def on_message(client, userdata, msg): if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and len(str(msg.payload.decode("utf-8"))) > 6 and bool(re.match(ipallowed, msg.payload.decode("utf-8")))): writetoconfig(shconfigfile,'smarthomedevices','device_ip_'+str(devicenumb), msg.payload.decode("utf-8")) client.publish("openWB/config/get/SmartHome/Devices/"+str(devicenumb)+"/device_ip", msg.payload.decode("utf-8"), qos=0, retain=True) + if (( "openWB/config/set/SmartHome/Device" in msg.topic) and ("device_pbip" in msg.topic)): + devicenumb=re.sub(r'\D', '', msg.topic) + if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and len(str(msg.payload.decode("utf-8"))) > 6 and bool(re.match(ipallowed, msg.payload.decode("utf-8")))): + writetoconfig(shconfigfile,'smarthomedevices','device_pbip_'+str(devicenumb), msg.payload.decode("utf-8")) + client.publish("openWB/config/get/SmartHome/Devices/"+str(devicenumb)+"/device_pbip", msg.payload.decode("utf-8"), qos=0, retain=True) + if (( "openWB/config/set/SmartHome/Device" in msg.topic) and ("device_pbtype" in msg.topic)): + devicenumb=re.sub(r'\D', '', msg.topic) + validDeviceTypespb = ['none','shellypb'] + if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and len(str(msg.payload.decode("utf-8"))) > 2): + try: + # just check vor payload in list, deviceTypeIndex is not used + deviceTypeIndex = validDeviceTypespb.index(msg.payload.decode("utf-8")) + except ValueError: + pass + else: + writetoconfig(shconfigfile,'smarthomedevices','device_pbtype_'+str(devicenumb), msg.payload.decode("utf-8")) + client.publish("openWB/config/get/SmartHome/Devices/"+str(devicenumb)+"/device_pbtype", msg.payload.decode("utf-8"), qos=0, retain=True) if (( "openWB/config/set/SmartHome/Device" in msg.topic) and ("device_measureip" in msg.topic)): devicenumb=re.sub(r'\D', '', msg.topic) if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and len(str(msg.payload.decode("utf-8"))) > 6 and bool(re.match(ipallowed, msg.payload.decode("utf-8")))): @@ -185,13 +202,13 @@ def on_message(client, userdata, msg): if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and -100000 <= int(msg.payload) <= 100000): writetoconfig(shconfigfile,'smarthomedevices','device_einschaltschwelle_'+str(devicenumb), msg.payload.decode("utf-8")) client.publish("openWB/config/get/SmartHome/Devices/"+str(devicenumb)+"/device_einschaltschwelle", msg.payload.decode("utf-8"), qos=0, retain=True) - + if (( "openWB/config/set/SmartHome/Device" in msg.topic) and ("device_deactivateper" in msg.topic)): devicenumb=re.sub(r'\D', '', msg.topic) if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and 0 <= int(msg.payload) <= 100): writetoconfig(shconfigfile,'smarthomedevices','device_deactivateper_'+str(devicenumb), msg.payload.decode("utf-8")) client.publish("openWB/config/get/SmartHome/Devices/"+str(devicenumb)+"/device_deactivateper", msg.payload.decode("utf-8"), qos=0, retain=True) - + if (( "openWB/config/set/SmartHome/Device" in msg.topic) and ("device_deactivateWhileEvCharging" in msg.topic)): devicenumb=re.sub(r'\D', '', msg.topic) if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and 0 <= int(msg.payload) <= 2): @@ -421,16 +438,16 @@ def on_message(client, userdata, msg): client.publish("openWB/config/get/SmartHome/Devices/"+str(devicenumb)+"/device_nonewatt", msg.payload.decode("utf-8"), qos=0, retain=True) else: print( "invalid payload for topic '" + msg.topic + "': " + msg.payload.decode("utf-8")) - + if (( "openWB/config/set/SmartHome/Device" in msg.topic) and ("device_idmnav" in msg.topic)): devicenumb=re.sub(r'\D', '', msg.topic) if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and 1 <= int(msg.payload) <= 2 ): writetoconfig(shconfigfile,'smarthomedevices','device_idmnav_'+str(devicenumb), msg.payload.decode("utf-8")) client.publish("openWB/config/get/SmartHome/Devices/"+str(devicenumb)+"/device_idmnav", msg.payload.decode("utf-8"), qos=0, retain=True) else: - print( "invalid payload for topic '" + msg.topic + "': " + msg.payload.decode("utf-8")) - - + print( "invalid payload for topic '" + msg.topic + "': " + msg.payload.decode("utf-8")) + + if (( "openWB/config/set/SmartHome/Device" in msg.topic) and ("device_standbyDuration" in msg.topic)): devicenumb=re.sub(r'\D', '', msg.topic) if ( 1 <= int(devicenumb) <= numberOfSupportedDevices and 0 <= int(msg.payload) <= 86400 ): diff --git a/runs/smarthomemq.py b/runs/smarthomemq.py index 1c212dbd3..678affd82 100644 --- a/runs/smarthomemq.py +++ b/runs/smarthomemq.py @@ -186,6 +186,7 @@ def getdevicevalues(): # dyn daten einschaltgruppe Sbase.ausschaltwatt = 0 Sbase.einrelais = 0 + Sbase.eindevstatus = 0 mqtt_all = {} for mydevice in mydevices: mydevice.getwatt(uberschuss, uberschussoffset) @@ -429,6 +430,8 @@ def resetmaxeinschaltdauerfunc(): readmq() while True: # update_devices() + mqtt_man = {} + sendmess = 0 loadregelvars() resetmaxeinschaltdauerfunc() getdevicevalues() @@ -449,4 +452,18 @@ def resetmaxeinschaltdauerfunc(): logDebug(LOGLEVELDEBUG, "(" + str(i) + ") " + mydevice.device_name + " manueller Modus aktiviert, keine Regelung") + for i in range(1, (numberOfSupportedDevices+1)): + pref = 'openWB/config/set/SmartHome/Devices/' + str(i) + '/' + for mydevice in mydevices: + if (str(i) == str(mydevice.device_nummer)): + mydevice.updatebutton() + if (mydevice.btchange == 1): + sendmess = 1 + mqtt_man[pref + 'mode'] = mydevice.newdevice_manual + if (mydevice.btchange == 2): + sendmess = 1 + workman = mydevice.newdevice_manual_control + mqtt_man[pref + 'device_manual_control'] = workman + if (sendmess == 1): + sendmq(mqtt_man) time.sleep(5) diff --git a/runs/usmarthome/smartbase.py b/runs/usmarthome/smartbase.py index 5b3ae8233..c38cc1cb5 100644 --- a/runs/usmarthome/smartbase.py +++ b/runs/usmarthome/smartbase.py @@ -1,515 +1,14 @@ #!/usr/bin/python3 - -import subprocess -import json import time import os +from usmarthome.smartbase0 import Sbase0 +from usmarthome.smartmeas import Slsdm630, Slsdm120, Slwe514, Slfronius +from usmarthome.smartmeas import Sljson, Slsmaem, Slshelly, Sltasmota, Slmqtt +from usmarthome.smartmeas import Slhttp, Slavm, Slmystrom +from usmarthome.smartbut import Sbshelly from datetime import datetime, timezone -class Sbase0: - _basePath = '/var/www/html/openWB' - _prefixpy = _basePath+'/modules/smarthome/' - - def logClass(self, level, msg): - if (int(level) >= 0): - local_time = datetime.now(timezone.utc).astimezone() - with open(self._basePath+'/ramdisk/smarthome.log', 'a', - encoding='utf8', buffering=1) as file: - if (int(level) == 0): - file.write(local_time.strftime(format="%Y-%m-%d %H:%M:%S") - + '-: ' + str(msg) + '\n') - if (int(level) == 1): - file.write(local_time.strftime(format="%Y-%m-%d %H:%M:%S") - + '-: ' + str(msg) + '\n') - if (int(level) == 2): - file.write(local_time.strftime(format="%Y-%m-%d %H:%M:%S") - + '-: ' + str(msg) + '\n') - - def readret(self): - with open(self._basePath+'/ramdisk/smarthome_device_ret' + - str(self.device_nummer), 'r') as f1: - answer = json.loads(json.load(f1)) - return answer - - -class Slbase(Sbase0): - def __init__(self): - # - # setting - print('__init__ Slbase executed') - self.device_nummer = 0 - self.device_name = 'none' - self.device_type = 'none' - self.temp0 = '300' - self.temp1 = '300' - self.temp2 = '300' - self.devuberschuss = 0 - self.newwatt = 0 - self.newwattk = 0 - self.relais = 0 - self._smart_param = {} - self._device_differentmeasureoment = 0 - self._device_configured = '0' - self._device_ip = 'none' - self._device_measuretype = 'none' - self._device_measureip = 'none' - self._device_measureportsdm = '8899' - self._device_measureid = '0' - self._device_measuresmaser = '123' - self._device_measuresmaage = 15 - self._device_leistungurl = 'none' - self._device_stateurl = 'none' - self._device_measureurl = 'none' - self._device_measureurlc = 'none' - self._device_measurejsonurl = 'none' - self._device_measurejsonpower = 'none' - self._device_measurejsoncounter = 'none' - self._device_measureavmactor = 'none' - self._device_measureavmusername = 'none' - self._device_measureavmpassword = 'none' - self._device_actor = 'none' - self._device_username = 'none' - self._device_password = 'none' - - def updatepar(self, input_param): - self._smart_param = input_param.copy() - self.device_nummer = int(self._smart_param.get('device_nummer', '0')) - for key, value in self._smart_param.items(): - try: - valueint = int(value) - except Exception: - valueint = 0 - # params known to be used in sbase, to avoid logging - if (key in ['device_nummer', 'device_mineinschaltdauer', - 'device_finishTime', 'device_ausschaltschwelle', - 'device_manual_control', 'device_canSwitch', - 'device_standbyDuration', 'device_startTime', - 'device_onuntilTime', 'device_einschaltverzoegerung', - 'device_standbyPower', 'device_einschaltschwelle', - 'device_ausschaltverzoegerung', - 'device_speichersocbeforestop', - 'device_homeConsumtion', - 'device_deactivateWhileEvCharging', - 'device_startupMulDetection', 'device_onTime', - 'device_speichersocbeforestart', 'device_endTime', - 'device_maxeinschaltdauer', 'mode', - 'WHImported_temp', 'RunningTimeToday', - 'oncountnor', 'OnCntStandby', 'device_deactivateper', - 'device_startupDetection']): - pass - elif (key == 'device_differentMeasurement'): - self._device_differentmeasurement = valueint - elif (key == 'device_type'): - self.device_type = value - elif (key == 'device_configured'): - self._device_configured = value - elif (key == 'device_name'): - self.device_name = value - elif (key == 'device_temperatur_configured'): - self.device_temperatur_configured = valueint - elif (key == 'device_ip'): - self._device_ip = value - elif (key == 'device_measureType'): - self._device_measuretype = value - elif (key == 'device_measureip'): - self._device_measureip = value - elif (key == 'device_measurePortSdm'): - self._device_measureportsdm = value - elif (key == 'device_measuresmaage'): - self._device_measuresmaage = valueint - elif (key == 'device_measuresmaser'): - self._device_measuresmaser = value - elif (key == 'device_measureid'): - self._device_measureid = value - elif (key == 'device_leistungurl'): - self._device_leistungurl = value - elif (key == 'device_measureurl'): - self._device_measureurl = value - elif (key == 'device_measureurlc'): - self._device_measureurlc = value - elif (key == 'device_measurejsonurl'): - self._device_measurejsonurl = value - elif (key == 'device_measurejsonpower'): - self._device_measurejsonpower = value - elif (key == 'device_measurejsoncounter'): - self._device_measurejsoncounter = value - elif (key == 'device_measureavmactor'): - self._device_measureavmactor = value - elif (key == 'device_measureavmusername'): - self._device_measureavmusername = value - elif (key == 'device_measureavmpassword'): - self._device_measureavmpassword = value - elif (key == 'device_actor'): - self._device_actor = value - elif (key == 'device_username'): - self._device_username = value - elif (key == 'device_password'): - self._device_password = value - elif (key == 'device_stateurl'): - self._device_stateurl = value - else: - self.logClass(2, "(" + str(self.device_nummer) + ") " - + __class__.__name__ + " überlesen " + key + - " " + value) - - def __del__(self): - print('__del__ Slbase executed ') - - -class Slmqtt(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slmqtt excuted') - - def getwattread(self): - self._watt(self._device_ip) - - def sepwattread(self): - self._watt(self._device_measureip) - return self.newwatt, self.newwattk - - def _watt(self, ip): - argumentList = ['python3', self._prefixpy + 'mqtt/watt.py', - str(self.device_nummer), str(ip), - str(self.devuberschuss)] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - self.relais = int(answer['on']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('mqtt', self.device_nummer, ip, str(e1))) - - -class Slshelly(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slshelly excuted') - - def getwattread(self): - self._watt(self._device_ip) - - def sepwattread(self): - self._watt(self._device_measureip) - return self.newwatt, self.newwattk - - def _watt(self, ip): - argumentList = ['python3', self._prefixpy + 'shelly/watt.py', - str(self.device_nummer), str(ip), '0'] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - self.relais = int(answer['on']) - if (self.device_temperatur_configured > 0): - self.temp0 = str(answer['temp0']) - with open(self._basePath+'/ramdisk/device' + - str(self.device_nummer) + '_temp0', 'w') as f: - f.write(str(self.temp0)) - else: - self.temp0 = '300' - if (self.device_temperatur_configured > 1): - self.temp1 = str(answer['temp1']) - with open(self._basePath+'/ramdisk/device' + - str(self.device_nummer) + '_temp1', 'w') as f: - f.write(str(self.temp1)) - else: - self.temp1 = '300' - if (self.device_temperatur_configured > 2): - self.temp2 = str(answer['temp2']) - with open(self._basePath+'/ramdisk/device' + - str(self.device_nummer) + '_temp2', 'w') as f: - f.write(str(self.temp2)) - else: - self.temp2 = '300' - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('Shelly', self.device_nummer, ip, str(e1))) - - -class Slavm(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slavm excuted') - - def getwattread(self): - self._watt(self._device_ip, self._device_actor, - self._device_username, - self._device_password) - - def sepwattread(self): - self._watt(self._device_measureip, - self._device_measureavmactor, - self._device_measureavmusername, - self._device_measureavmpassword) - return self.newwatt, self.newwattk - - def _watt(self, ip, act, user, pw): - argumentList = ['python3', self._prefixpy + - 'avmhomeautomation/watt.py', - str(self.device_nummer), str(ip), - '0', '0', - act, user, pw] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - self.relais = int(answer['on']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('Avm ', self.device_nummer, ip, str(e1))) - - -class Sltasmota(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Sltasmota excuted') - - def getwattread(self): - self._watt(self._device_ip) - - def sepwattread(self): - self._watt(self._device_measureip) - return self.newwatt, self.newwattk - - def _watt(self, ip): - argumentList = ['python3', self._prefixpy + 'tasmota/watt.py', - str(self.device_nummer), str(ip), '0'] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - self.relais = int(answer['on']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('Tasmota', self.device_nummer, ip, str(e1))) - - -class Slhttp(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slhttp excuted') - - def getwattread(self): - self._watt(self._device_leistungurl, 'none', - self._device_stateurl) - - def sepwattread(self): - self._watt(self._device_measureurl, self._device_measureurlc, - 'none') - return self.newwatt, self.newwattk - - def _watt(self, url, urlc, urls): - argumentList = ['python3', self._prefixpy + 'http/watt.py', - str(self.device_nummer), '0', - str(self.devuberschuss), url, urlc, - '0', '0', urls] - proc = subprocess.Popen(argumentList) - proc.communicate() - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - self.relais = int(answer['on']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d Fehlermeldung: %s " - % ('http', self.device_nummer, str(e1))) - - -class Slmystrom(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slmystrom excuted') - - def getwattread(self): - self._watt(self._device_ip) - - def sepwattread(self): - self._watt(self._device_measureip) - return self.newwatt, self.newwattk - - def _watt(self, ip): - argumentList = ['python3', self._prefixpy + 'mystrom/watt.py', - str(self.device_nummer), str(ip), '0'] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - self.relais = int(answer['on']) - if (self.device_temperatur_configured > 0): - self.temp0 = str(answer['temp0']) - with open(self._basePath+'/ramdisk/device' + - str(self.device_nummer) + '_temp0', 'w') as f: - f.write(str(self.temp0)) - else: - self.temp0 = '300' - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('Mystrom', self.device_nummer, ip, str(e1))) - - -class Slsmaem(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slsmaem excuted') - - def sepwattread(self): - argumentList = ['python3', self._prefixpy + 'smaem/watt.py', - str(self.device_nummer), str(self._device_measureip), - str(self._device_measuresmaser), - str(self._device_measuresmaage)] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('smaem ', self.device_nummer, - str(self._device_measureip), str(e1))) - return self.newwatt, self.newwattk - - -class Slwe514(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slwe514 excuted') - - def sepwattread(self): - argumentList = ['python3', self._prefixpy + 'we514/watt.py', - str(self.device_nummer), str(self._device_measureip), - str(self._device_measureid)] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('we514 ', self.device_nummer, - str(self._device_measureip), str(e1))) - return self.newwatt, self.newwattk - - -class Sljson(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Sljson excuted') - - def sepwattread(self): - argumentList = ['python3', self._prefixpy + 'json/watt.py', - str(self.device_nummer), - self._device_measurejsonurl, - self._device_measurejsonpower, - self._device_measurejsoncounter] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %s Fehlermeldung: %s " - % ('json ', self.device_nummer, str(e1))) - return self.newwatt, self.newwattk - - -class Slfronius(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slfronius excuted') - - def sepwattread(self): - argumentList = ['python3', self._prefixpy + 'fronius/watt.py', - str(self.device_nummer), str(self._device_measureip), - str(self._device_measureid)] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('fronius ', self.device_nummer, - str(self._device_measureip), str(e1))) - return self.newwatt, self.newwattk - - -class Slsdm630(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slsdm630 excuted') - - def sepwattread(self): - argumentList = ['python3', self._prefixpy + 'sdm630/sdm630.py', - str(self.device_nummer), str(self._device_measureip), - str(self._device_measureid), - str(self._device_measureportsdm)] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('Sdm630 ', self.device_nummer, - str(self._device_measureip), str(e1))) - return self.newwatt, self.newwattk - - -class Slsdm120(Slbase): - def __init__(self): - # setting - super().__init__() - print('__init__ Slsdm120 excuted') - - def sepwattread(self): - argumentList = ['python3', self._prefixpy + 'sdm120/sdm120.py', - str(self.device_nummer), str(self._device_measureip), - str(self._device_measureid), - str(self._device_measureportsdm)] - try: - proc = subprocess.Popen(argumentList) - proc.communicate() - answer = self.readret() - self.newwatt = int(answer['power']) - self.newwattk = int(answer['powerc']) - except Exception as e1: - self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " - % ('Sdm120 ', self.device_nummer, - str(self._device_measureip), str(e1))) - return self.newwatt, self.newwattk - - class Sbase(Sbase0): # Instance variablen für ein und Auschaltgruppe einschwelle = 0 @@ -520,6 +19,7 @@ class Sbase(Sbase0): ausschaltwatt = 0 einrelais = 0 nureinschaltinsec = 0 + eindevstatus = 0 def __init__(self): # setting @@ -547,6 +47,9 @@ def __init__(self): self.abschalt = 0 self.device_homeconsumtion = 0 self.device_manual = 0 + self.device_manual_control = 0 + self.newdevice_manual = 0 + self.newdevice_manual_control = 0 self.device_type = 'none' self._smart_param = {} self._uberschussoffset = 0 @@ -578,9 +81,10 @@ def __init__(self): self._device_ontime = '00:00' self._device_onuntiltime = '00:00' self._device_nonewatt = 0 - self.device_manual_control = 0 self._device_deactivateper = 0 - + self._device_pbtype = 'none' + self._old_pbtype = 'none' + self._mydevicepb = 'none' self._oldrelais = '2' self._oldwatt = 0 # mqtt per @@ -608,6 +112,7 @@ def __init__(self): self._c_einverz_f = 'N' self._dynregel = 0 self.gruppe = 'none' + self.btchange = 0 def __del__(self): @@ -745,6 +250,7 @@ def postwatt(self): elif (self.gruppe == 'E'): if (self.relais == 1): Sbase.einrelais = 1 + Sbase.eindevstatus = max(Sbase.eindevstatus, self.devstatus) def updatepar(self, input_param): self._smart_param = input_param.copy() @@ -828,6 +334,10 @@ def updatepar(self, input_param): self.device_manual_control = valueint elif (key == 'device_deactivateper'): self._device_deactivateper = valueint + elif (key == 'device_pbtype'): + self._device_pbtype = value + + # openWB/config/set/SmartHome/Devices//mode auf 1 setzen -> Gerät wird # als 'Manuell' in der Geräteliste geführt # openWB/config/set/SmartHome/Devices//device_manual_control -> 0 @@ -887,6 +397,24 @@ def updatepar(self, input_param): self.gruppe = 'none' if (self.device_type == 'none'): self.device_canswitch = 0 + if (self._device_pbtype == 'shellypb'): + if (self._old_pbtype == 'none'): + self._mydevicepb = Sbshelly() + self._old_pbtype = 'shelly' + self.logClass(2, "(" + str(self.device_nummer) + + ") control Button. Neues Button" + + " device erzeugt Shelly") + else: + self.logClass(2, "(" + str(self.device_nummer) + + ") Control Button. Nur Parameter " + + " update ") + self._mydevicepb.updatepar(input_param) + if ((self._device_pbtype == 'none') and + (self._old_pbtype == 'shelly')): + del self._mydevicepb + self._old_pbtype = 'none' + self.logClass(2, "(" + str(self.device_nummer) + + ") Control Button gelöscht") if (self._device_differentmeasurement == 1): if (self._oldmeasuretype1 == self._device_measuretype): self.logClass(2, "(" + str(self.device_nummer) + @@ -942,6 +470,9 @@ def updatepar(self, input_param): "device gelöscht " + self._oldmeasuretype1) del self._mydevicemeasure self._oldmeasuretype1 = 'empty' + with open(self._basePath+'/ramdisk/smarthome_device_minhaus_' + + str(self.device_nummer), 'w') as f: + f.write(str(self.device_homeconsumtion)) def getueb(self): # (1 = mit Speicher, 2 = mit offset , 0 = manual eingeschaltet) @@ -1382,7 +913,8 @@ def conditions(self, speichersoc): str(Sbase.einschwelle) + " Überschuss " + str(self._uberschuss)) if (((Sbase.ausschaltwatt + self._uberschuss) > - Sbase.einschwelle) and Sbase.einrelais == 0): + Sbase.einschwelle) and Sbase.einrelais == 0 and + Sbase.eindevstatus == 10): self.logClass(2, "(" + str(self.device_nummer) + ") " + self.device_name + " erfolgreich, schalte aus ") @@ -1643,3 +1175,33 @@ def getwatt(self, uberschuss, uberschussoffset): def turndevicerelais(self, zustand, ueberschussberechnung, updatecnt): pass + + def updatebutton(self): + self.newdevice_manual = self.device_manual + self.newdevice_manual_control = self.device_manual_control + self.btchange = 0 + if (self._old_pbtype == 'none'): + return + self._mydevicepb.showstat(self.device_manual, self.relais) + (newmanual, newmanual_control) = self._mydevicepb.checkbut( + self.device_manual, self.relais, + self.device_manual_control) + if ((self.newdevice_manual == newmanual) and + self.newdevice_manual_control == newmanual_control): + # keine Änderung + return + self.newdevice_manual = newmanual + self.newdevice_manual_control = newmanual_control + self.logClass(2, "(" + str(self.device_nummer) + ") " + + self.device_name + + " Umschaltung manual modus alt/neu " + + str(self.device_manual) + "/" + + str(self.newdevice_manual) + + " on off alt/neu " + str(self.device_manual_control) + + "/" + str(self.newdevice_manual_control)) + if (self.newdevice_manual == self.device_manual): + # Änderung bezüglich on off + self.btchange = 2 + else: + # Änderung bezüglich mode + self.btchange = 1 diff --git a/runs/usmarthome/smartbase0.py b/runs/usmarthome/smartbase0.py new file mode 100644 index 000000000..c98aa2da5 --- /dev/null +++ b/runs/usmarthome/smartbase0.py @@ -0,0 +1,28 @@ +import json +from datetime import datetime, timezone + + +class Sbase0: + _basePath = '/var/www/html/openWB' + _prefixpy = _basePath+'/modules/smarthome/' + + def logClass(self, level, msg): + if (int(level) >= 0): + local_time = datetime.now(timezone.utc).astimezone() + with open(self._basePath+'/ramdisk/smarthome.log', 'a', + encoding='utf8', buffering=1) as file: + if (int(level) == 0): + file.write(local_time.strftime(format="%Y-%m-%d %H:%M:%S") + + '-: ' + str(msg) + '\n') + if (int(level) == 1): + file.write(local_time.strftime(format="%Y-%m-%d %H:%M:%S") + + '-: ' + str(msg) + '\n') + if (int(level) == 2): + file.write(local_time.strftime(format="%Y-%m-%d %H:%M:%S") + + '-: ' + str(msg) + '\n') + + def readret(self): + with open(self._basePath+'/ramdisk/smarthome_device_ret' + + str(self.device_nummer), 'r') as f1: + answer = json.loads(json.load(f1)) + return answer diff --git a/runs/usmarthome/smartbut.py b/runs/usmarthome/smartbut.py new file mode 100644 index 000000000..d5f7d6619 --- /dev/null +++ b/runs/usmarthome/smartbut.py @@ -0,0 +1,135 @@ +from usmarthome.smartbase0 import Sbase0 +import urllib.request +import json + + +class Spbase(Sbase0): + def __init__(self): + # + # setting + print('__init__ Spbase executed') + self._device_pbip = 'none' + self.device_nummer = 0 + + def updatepar(self, input_param): + self._smart_param = input_param.copy() + self.device_nummer = int(self._smart_param.get('device_nummer', '0')) + for key, value in self._smart_param.items(): + if (key == 'device_pbip'): + self._device_pbip = value + else: + self.logClass(2, "(" + str(self.device_nummer) + ") " + + __class__.__name__ + " überlesen " + key + + " " + value) + + def showstat(self, manual, relais): + pass + + +class Sbshelly(Spbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Sbshelly excuted') + self.counter = 0 + self.led = 9 + self.event_cnt = 0 + self.event = 'none' + self.oldevent_cnt = 0 + self.oldevent = 'none' + + def showstat(self, manual, relais): + if (manual == 0): # automatic mode + self.pboff() + else: # manual mode + if (relais == 0): + self.pbon() + else: + self.pbblink() + + def checkbut(self, manual, relais, manual_control): + newmanual = manual + newmanual_control = manual_control + try: + at = str(urllib.request.urlopen("http://" + + str(self._device_pbip) + + "/status", + timeout=3).read().decode("utf-8")) + except Exception as e1: + self.logClass(2, "Shelly button ch (%d) %s Fehlermeldung: %s " + % (self.device_nummer, + self._device_pbip, str(e1))) + return newmanual, newmanual_control + a = json.loads(at) + with open(self._basePath+'/ramdisk/smarthome_device_ret' + + str(self.device_nummer) + '_shelly_bp', 'w') as f: + f.write(str(a)) + self.oldevent_cnt = self.event_cnt + self.oldevent = self.event + self.event_cnt = int(a['inputs'][0]['event_cnt']) + self.event = str(a['inputs'][0]['event']) + if (self.oldevent == 'none'): + return newmanual, newmanual_control + if ((self.event == self.oldevent) and + (self.event_cnt == self.oldevent_cnt)): + return newmanual, newmanual_control + self.logClass(2, "Shelly button pressed (%d) %s %s" + % (self.device_nummer, + self._device_pbip, self.event)) + # im automatic modus -> ein mal Drücken wechselen auf manual + if (manual == 0): + newmanual = 1 + return newmanual, newmanual_control + # im manual modus -> ein mal Drücken wechselen zwischen on und off + if (self.event == 'S'): + if (manual_control == 1): + newmanual_control = 0 + else: + newmanual_control = 1 + return newmanual, newmanual_control + # im manual modus -> mehrmals drücken wechselen auf automat + newmanual = 0 + return newmanual, newmanual_control + + def pboff(self): + if (self.led == 0): + return + try: + urllib.request.urlopen("http://" + str(self._device_pbip) + + "/settings?led_status_disable=true", + timeout=3) + self.logClass(2, "Shelly button led off (%d) %s" + % (self.device_nummer, + self._device_pbip)) + + except Exception as e1: + self.logClass(2, "Shelly button off (%d) %s Fehlermeldung: %s " + % (self.device_nummer, + self._device_pbip, str(e1))) + self.led = 0 + + def pbon(self): + if (self.led == 1): + return + try: + urllib.request.urlopen("http://" + str(self._device_pbip) + + "/settings?led_status_disable=false", + timeout=3) + self.logClass(2, "Shelly button led on (%d) %s" + % (self.device_nummer, + self._device_pbip)) + except Exception as e1: + self.logClass(2, "Shelly button on (%d) %s Fehlermeldung: %s " + % (self.device_nummer, + self._device_pbip, str(e1))) + self.led = 1 + + def pbblink(self): + self.counter = self.counter + 1 + if (self.counter < 1): + return + self.counter = 0 + if (self.led == 0): + self.pbon() + else: + self.pboff() diff --git a/runs/usmarthome/smartmeas.py b/runs/usmarthome/smartmeas.py new file mode 100644 index 000000000..b86462a27 --- /dev/null +++ b/runs/usmarthome/smartmeas.py @@ -0,0 +1,479 @@ +from usmarthome.smartbase0 import Sbase0 +import subprocess + + +class Slbase(Sbase0): + def __init__(self): + # + # setting + print('__init__ Slbase executed') + self.device_nummer = 0 + self.device_name = 'none' + self.device_type = 'none' + self.temp0 = '300' + self.temp1 = '300' + self.temp2 = '300' + self.devuberschuss = 0 + self.newwatt = 0 + self.newwattk = 0 + self.relais = 0 + self._smart_param = {} + self._device_differentmeasureoment = 0 + self._device_configured = '0' + self._device_ip = 'none' + self._device_measuretype = 'none' + self._device_measureip = 'none' + self._device_measureportsdm = '8899' + self._device_measureid = '0' + self._device_measuresmaser = '123' + self._device_measuresmaage = 15 + self._device_leistungurl = 'none' + self._device_stateurl = 'none' + self._device_measureurl = 'none' + self._device_measureurlc = 'none' + self._device_measurejsonurl = 'none' + self._device_measurejsonpower = 'none' + self._device_measurejsoncounter = 'none' + self._device_measureavmactor = 'none' + self._device_measureavmusername = 'none' + self._device_measureavmpassword = 'none' + self._device_actor = 'none' + self._device_username = 'none' + self._device_password = 'none' + + def updatepar(self, input_param): + self._smart_param = input_param.copy() + self.device_nummer = int(self._smart_param.get('device_nummer', '0')) + for key, value in self._smart_param.items(): + try: + valueint = int(value) + except Exception: + valueint = 0 + # params known to be used in sbase, to avoid logging + if (key in ['device_nummer', 'device_mineinschaltdauer', + 'device_finishTime', 'device_ausschaltschwelle', + 'device_manual_control', 'device_canSwitch', + 'device_standbyDuration', 'device_startTime', + 'device_onuntilTime', 'device_einschaltverzoegerung', + 'device_standbyPower', 'device_einschaltschwelle', + 'device_ausschaltverzoegerung', + 'device_speichersocbeforestop', + 'device_homeConsumtion', + 'device_deactivateWhileEvCharging', + 'device_startupMulDetection', 'device_onTime', + 'device_speichersocbeforestart', 'device_endTime', + 'device_maxeinschaltdauer', 'mode', + 'WHImported_temp', 'RunningTimeToday', + 'oncountnor', 'OnCntStandby', 'device_deactivateper', + 'device_startupDetection']): + pass + elif (key == 'device_differentMeasurement'): + self._device_differentmeasurement = valueint + elif (key == 'device_type'): + self.device_type = value + elif (key == 'device_configured'): + self._device_configured = value + elif (key == 'device_name'): + self.device_name = value + elif (key == 'device_temperatur_configured'): + self.device_temperatur_configured = valueint + elif (key == 'device_ip'): + self._device_ip = value + elif (key == 'device_measureType'): + self._device_measuretype = value + elif (key == 'device_measureip'): + self._device_measureip = value + elif (key == 'device_measurePortSdm'): + self._device_measureportsdm = value + elif (key == 'device_measuresmaage'): + self._device_measuresmaage = valueint + elif (key == 'device_measuresmaser'): + self._device_measuresmaser = value + elif (key == 'device_measureid'): + self._device_measureid = value + elif (key == 'device_leistungurl'): + self._device_leistungurl = value + elif (key == 'device_measureurl'): + self._device_measureurl = value + elif (key == 'device_measureurlc'): + self._device_measureurlc = value + elif (key == 'device_measurejsonurl'): + self._device_measurejsonurl = value + elif (key == 'device_measurejsonpower'): + self._device_measurejsonpower = value + elif (key == 'device_measurejsoncounter'): + self._device_measurejsoncounter = value + elif (key == 'device_measureavmactor'): + self._device_measureavmactor = value + elif (key == 'device_measureavmusername'): + self._device_measureavmusername = value + elif (key == 'device_measureavmpassword'): + self._device_measureavmpassword = value + elif (key == 'device_actor'): + self._device_actor = value + elif (key == 'device_username'): + self._device_username = value + elif (key == 'device_password'): + self._device_password = value + elif (key == 'device_stateurl'): + self._device_stateurl = value + else: + self.logClass(2, "(" + str(self.device_nummer) + ") " + + __class__.__name__ + " überlesen " + key + + " " + value) + + def __del__(self): + print('__del__ Slbase executed ') + + +class Slmqtt(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slmqtt excuted') + + def getwattread(self): + self._watt(self._device_ip) + + def sepwattread(self): + self._watt(self._device_measureip) + return self.newwatt, self.newwattk + + def _watt(self, ip): + argumentList = ['python3', self._prefixpy + 'mqtt/watt.py', + str(self.device_nummer), str(ip), + str(self.devuberschuss)] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + self.relais = int(answer['on']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('mqtt', self.device_nummer, ip, str(e1))) + + +class Slshelly(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slshelly excuted') + + def getwattread(self): + self._watt(self._device_ip) + + def sepwattread(self): + self._watt(self._device_measureip) + return self.newwatt, self.newwattk + + def _watt(self, ip): + argumentList = ['python3', self._prefixpy + 'shelly/watt.py', + str(self.device_nummer), str(ip), '0'] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + self.relais = int(answer['on']) + if (self.device_temperatur_configured > 0): + self.temp0 = str(answer['temp0']) + with open(self._basePath+'/ramdisk/device' + + str(self.device_nummer) + '_temp0', 'w') as f: + f.write(str(self.temp0)) + else: + self.temp0 = '300' + if (self.device_temperatur_configured > 1): + self.temp1 = str(answer['temp1']) + with open(self._basePath+'/ramdisk/device' + + str(self.device_nummer) + '_temp1', 'w') as f: + f.write(str(self.temp1)) + else: + self.temp1 = '300' + if (self.device_temperatur_configured > 2): + self.temp2 = str(answer['temp2']) + with open(self._basePath+'/ramdisk/device' + + str(self.device_nummer) + '_temp2', 'w') as f: + f.write(str(self.temp2)) + else: + self.temp2 = '300' + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('Shelly', self.device_nummer, ip, str(e1))) + + +class Slavm(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slavm excuted') + + def getwattread(self): + self._watt(self._device_ip, self._device_actor, + self._device_username, + self._device_password) + + def sepwattread(self): + self._watt(self._device_measureip, + self._device_measureavmactor, + self._device_measureavmusername, + self._device_measureavmpassword) + return self.newwatt, self.newwattk + + def _watt(self, ip, act, user, pw): + argumentList = ['python3', self._prefixpy + + 'avmhomeautomation/watt.py', + str(self.device_nummer), str(ip), + '0', '0', + act, user, pw] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + self.relais = int(answer['on']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('Avm ', self.device_nummer, ip, str(e1))) + + +class Sltasmota(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Sltasmota excuted') + + def getwattread(self): + self._watt(self._device_ip) + + def sepwattread(self): + self._watt(self._device_measureip) + return self.newwatt, self.newwattk + + def _watt(self, ip): + argumentList = ['python3', self._prefixpy + 'tasmota/watt.py', + str(self.device_nummer), str(ip), '0'] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + self.relais = int(answer['on']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('Tasmota', self.device_nummer, ip, str(e1))) + + +class Slhttp(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slhttp excuted') + + def getwattread(self): + self._watt(self._device_leistungurl, 'none', + self._device_stateurl) + + def sepwattread(self): + self._watt(self._device_measureurl, self._device_measureurlc, + 'none') + return self.newwatt, self.newwattk + + def _watt(self, url, urlc, urls): + argumentList = ['python3', self._prefixpy + 'http/watt.py', + str(self.device_nummer), '0', + str(self.devuberschuss), url, urlc, + '0', '0', urls] + proc = subprocess.Popen(argumentList) + proc.communicate() + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + self.relais = int(answer['on']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d Fehlermeldung: %s " + % ('http', self.device_nummer, str(e1))) + + +class Slmystrom(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slmystrom excuted') + + def getwattread(self): + self._watt(self._device_ip) + + def sepwattread(self): + self._watt(self._device_measureip) + return self.newwatt, self.newwattk + + def _watt(self, ip): + argumentList = ['python3', self._prefixpy + 'mystrom/watt.py', + str(self.device_nummer), str(ip), '0'] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + self.relais = int(answer['on']) + if (self.device_temperatur_configured > 0): + self.temp0 = str(answer['temp0']) + with open(self._basePath+'/ramdisk/device' + + str(self.device_nummer) + '_temp0', 'w') as f: + f.write(str(self.temp0)) + else: + self.temp0 = '300' + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('Mystrom', self.device_nummer, ip, str(e1))) + + +class Slsmaem(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slsmaem excuted') + + def sepwattread(self): + argumentList = ['python3', self._prefixpy + 'smaem/watt.py', + str(self.device_nummer), str(self._device_measureip), + str(self._device_measuresmaser), + str(self._device_measuresmaage)] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('smaem ', self.device_nummer, + str(self._device_measureip), str(e1))) + return self.newwatt, self.newwattk + + +class Slwe514(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slwe514 excuted') + + def sepwattread(self): + argumentList = ['python3', self._prefixpy + 'we514/watt.py', + str(self.device_nummer), str(self._device_measureip), + str(self._device_measureid)] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('we514 ', self.device_nummer, + str(self._device_measureip), str(e1))) + return self.newwatt, self.newwattk + + +class Sljson(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Sljson excuted') + + def sepwattread(self): + argumentList = ['python3', self._prefixpy + 'json/watt.py', + str(self.device_nummer), + self._device_measurejsonurl, + self._device_measurejsonpower, + self._device_measurejsoncounter] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %s Fehlermeldung: %s " + % ('json ', self.device_nummer, str(e1))) + return self.newwatt, self.newwattk + + +class Slfronius(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slfronius excuted') + + def sepwattread(self): + argumentList = ['python3', self._prefixpy + 'fronius/watt.py', + str(self.device_nummer), str(self._device_measureip), + str(self._device_measureid)] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('fronius ', self.device_nummer, + str(self._device_measureip), str(e1))) + return self.newwatt, self.newwattk + + +class Slsdm630(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slsdm630 excuted') + + def sepwattread(self): + argumentList = ['python3', self._prefixpy + 'sdm630/sdm630.py', + str(self.device_nummer), str(self._device_measureip), + str(self._device_measureid), + str(self._device_measureportsdm)] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('Sdm630 ', self.device_nummer, + str(self._device_measureip), str(e1))) + return self.newwatt, self.newwattk + + +class Slsdm120(Slbase): + def __init__(self): + # setting + super().__init__() + print('__init__ Slsdm120 excuted') + + def sepwattread(self): + argumentList = ['python3', self._prefixpy + 'sdm120/sdm120.py', + str(self.device_nummer), str(self._device_measureip), + str(self._device_measureid), + str(self._device_measureportsdm)] + try: + proc = subprocess.Popen(argumentList) + proc.communicate() + answer = self.readret() + self.newwatt = int(answer['power']) + self.newwattk = int(answer['powerc']) + except Exception as e1: + self.logClass(2, "Leistungsmessung %s %d %s Fehlermeldung: %s " + % ('Sdm120 ', self.device_nummer, + str(self._device_measureip), str(e1))) + return self.newwatt, self.newwattk diff --git a/web/settings/smarthomeconfig.php b/web/settings/smarthomeconfig.php index dae8de799..a6597f1fb 100644 --- a/web/settings/smarthomeconfig.php +++ b/web/settings/smarthomeconfig.php @@ -621,6 +621,35 @@
+
+
+ +
+ + + Wenn Shelly Button gewählt wird, zeigt Shelly button den Modus (automatisch / manuell) und den an / aus Status vom Gerät an. + Shelly Button nur mit Netzteil betreiben.
+ Wenn Gerät im automatische Modus ist der Leuchtring aus.
+ Wenn Gerät im manuellem Modus ist:
+ - Ist das Gerät aus ist der Leuchtring an.
+ - Ist das Gerät an blinked der Leuchtring langsam.
+
Einmal drücken schaltet das Gerät von dem automatischen Modus in den manuellen Modus.
+ Einmal drücken im manuellen Modus schaltet das Gerät zwischen an und aus hin und her.
+ Zweimal drücken im manuellen Modus schaltet das Gerät in den automatischen Modus.
+
+
+
+
+ +
+ +
+
+
+
@@ -649,7 +678,7 @@ - + @@ -935,6 +964,14 @@ function visibility_device_typeDevices( data ){ showSection(".device-option-"+data); } + function visibility_device_pbtypeDevices( data ){ + if( typeof data == 'undefined' ){ + data = $('#device_pbtypeDevices').val(); + } + hideSection(".device_pbtypeDevices-option"); + showSection(".device_pbtypeDevices-option-"+data); + } + function visibility_device_differentMeasurementDevices( data ){ if( typeof data == 'undefined' ){ data = $('input[name=device_differentMeasurementDevices]:checked').attr("data-option"); @@ -1008,6 +1045,10 @@ function visibiltycheck(elementId, mqttpayload) { visibility_device_typeDevices( mqttpayload ); } + if ( elementId == 'device_pbtypeDevices') { + visibility_device_pbtypeDevices( mqttpayload ); + } + if ( elementId == 'device_differentMeasurementDevices') { visibility_device_differentMeasurementDevices( mqttpayload ); } @@ -1044,6 +1085,10 @@ function visibiltycheck(elementId, mqttpayload) { visibility_device_typeDevices(); }); + $('#device_pbtypeDevices').change(function(){ + visibility_device_pbtypeDevices(); + }); + $('#device_differentMeasurementDevices').change(function(){ visibility_device_differentMeasurementDevices(); }); @@ -1090,6 +1135,7 @@ function initForm() { visibility_device_configuredDevices(); visibility_device_typeDevices(); + visibility_device_pbtypeDevices(); visibility_device_differentMeasurementDevices(); visibility_device_measureTypeDevices(); visibility_device_canSwitchDevices(); diff --git a/web/settings/topicsToSubscribe_smarthomeconfig.js b/web/settings/topicsToSubscribe_smarthomeconfig.js index fba6fb0ea..7126d393c 100644 --- a/web/settings/topicsToSubscribe_smarthomeconfig.js +++ b/web/settings/topicsToSubscribe_smarthomeconfig.js @@ -63,9 +63,11 @@ var topicsToSubscribe = [ ["openWB/config/get/SmartHome/Devices/+/device_measuresmaser", 0], ["openWB/config/get/SmartHome/Devices/+/device_onTime", 0], ["openWB/config/get/SmartHome/Devices/+/device_onuntilTime", 0], - ["openWB/config/get/SmartHome/Devices/+/device_nonewatt", 0], - ["openWB/config/get/SmartHome/Devices/+/device_idmnav", 0], - ["openWB/config/get/SmartHome/Devices/+/device_deactivateper", 0], + ["openWB/config/get/SmartHome/Devices/+/device_nonewatt", 0], + ["openWB/config/get/SmartHome/Devices/+/device_idmnav", 0], + ["openWB/config/get/SmartHome/Devices/+/device_deactivateper", 0], + ["openWB/config/get/SmartHome/Devices/+/device_pbtype", 0], + ["openWB/config/get/SmartHome/Devices/+/device_pbip", 0], ["openWB/config/get/SmartHome/Devices/+/device_measuresmaage", 0] ];