Code:
__init__() got an unexpected keyword argument 'cycle'
__init__() got an unexpected keyword argument 'cycle'
[EG]
[[UV]]
[[[Haushaltszaehler]]]
[[[[Zaehlerstand]]]]
type = num
dlms_code = "1.8.1"
visu = yes
history = yes
[smartmeter]
class_name = DLMS
class_path = plugins.dlms
serialport = "/dev/haushalt"
baudrate = auto
cycle = 60
2013-11-02 21:15:54,742 ERROR Main Plugin smartmeter exception: __init__() got an unexpected keyword argument 'cycle' -- plugin.py:__init__:57
Traceback (most recent call last):
File "/usr/smarthome/lib/plugin.py", line 53, in __init__
plugin_thread = Plugin(smarthome, plugin, classname, classpath, args)
File "/usr/smarthome/lib/plugin.py", line 80, in __init__
exec("self.plugin = {0}.{1}(smarthome{2})".format(classpath, classname, args))
File "<string>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'cycle'
#!/usr/local/bin/python
import logging
import time
import serial
import re
logger = logging.getLogger('DLMS')
class DLMS():
def __init__(self, smarthome, serialport, baudrate = "300", update_cycle = "20"):
self._sh = smarthome
self._update_cycle = int(update_cycle)
self._obis_codes = {}
self._serial = serial.Serial(serialport, int(baudrate), bytesize = serial.SEVENBITS, parity = serial.PARITY_EVEN, timeout = 2)
self._request = bytearray('\x06000\r\n', 'ascii')
def run(self):
self.alive = True
self._sh.scheduler.add('DLMS', self._update_values, prio = 5, cycle = self._update_cycle)
def stop(self):
self.alive = False
self._serial.close()
self._sh.scheduler.remove('DLMS')
def _update_values(self):
logger.debug("dlms: update")
start = time.time()
init_seq = bytes('/?!\r\n', 'ascii')
self._serial.flushInput()
self._serial.write(init_seq)
response = bytes()
prev_length = 0
try:
while self.alive:
response += self._serial.read()
length = len(response)
if (length == prev_length) or ((length > len(init_seq)) and (response[-1] == 0x0a)): # break if timeout or newline-character
break
prev_length = length
except Exception as e:
logger.warning("dlms: {0}".format(e))
# remove echoed chars if present
if (init_seq == response[:len(init_seq)]):
response = response[len(init_seq):]
if (len(response) >= 5) and ((response[4] - 0x30) in range(6)):
baud_capable = 300 * (1 << (response[4] - 0x30))
if baud_capable > self._serial.baudrate:
try:
logger.debug("dlms: meter returned capability for higher baudrate {}".format(baud_capable))
self._request[2] = response[4] # change request to set higher baudrate
self._serial.write(self._request)
logger.debug("dlms: trying to switch baudrate")
switch_start = time.time()
# Alt1:
#self._serial.baudrate = baud_capable
# Alt2:
#settings = self._serial.getSettingsDict()
#settings['baudrate'] = baud_capable
#self._serial.applySettingsDict(settings)
# Alt3:
port = self._serial.port
self._serial.close()
del self._serial
logger.debug("dlms: socket closed - creating new one")
self._serial = serial.Serial(port, baud_capable, bytesize = serial.SEVENBITS, parity = serial.PARITY_EVEN, timeout = 2)
logger.debug("dlms: Switching took: {:.2f}s".format(time.time() - switch_start))
logger.debug("dlms: switch done")
except Exception as e:
logger.warning("dlms: {0}".format(e))
return
else:
self._serial.write(self._request)
response = bytes()
prev_length = 0
try:
while self.alive:
response += self._serial.read()
length = len(response)
if (length == prev_length) or ((length >= 2) and (response[-2] == 0x03)): # break if timeout or "ETX"
break
prev_length = length
except Exception as e:
logger.warning("dlms: {0}".format(e))
logger.debug("dlms: Reading took: {:.2f}s".format(time.time() - start))
# remove echoed chars if present
if (self._request == response[:len(self._request)]):
response = response[len(self._request):]
# perform checks (start with STX, end with ETX, checksum match)
checksum = 0
for i in response[1:]:
checksum ^= i
if (len(response) < 5) or (response[0] != 0x02) or (response[-2] != 0x03) or (checksum != 0x00):
logger.warning("dlms: checksum/protocol error: response={} checksum={}".format(' '.join(hex(i) for i in response), checksum))
return
#print(str(response[1:-4], 'ascii'))
for line in re.split('\r\n', str(response[1:-4], 'ascii')):
#if re.match('[0-9]+\.[0-9]\.[0-9](.+)', line): # allows only x.y.z(foo)
if re.match('[0-9]+\.[0-9].+(.+)', line): # allows also x.y(foo)
try:
data = re.split(r'[(*)]+', line)
logger.debug("dlms: {} = {} {}".format(data[0], data[1], data[2]))
if data[0] in self._obis_codes:
for item in self._obis_codes[data[0]]['items']:
item(data[1], 'DLMS', 'OBIS {}'.format(data[0]))
except Exception as e:
logger.warning("dlms: line={} exception={}".format(line, e))
def parse_item(self, item):
if 'dlms_obis_code' in item.conf:
logger.debug("parse item: {0}".format(item))
obis_code = item.conf['dlms_obis_code']
if not obis_code in self._obis_codes:
self._obis_codes[obis_code] = {'items': [item], 'logics': []}
else:
self._obis_codes[obis_code]['items'].append(item)
return None
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
myplugin = Plugin('DLMS')
myplugin.run()


#!/usr/local/bin/python
import logging
import time
import serial
import re
logger = logging.getLogger('DLMS')
class DLMS():
def __init__(self, smarthome, serialport, baudrate = "300", update_cycle = "60"):
self._sh = smarthome
self._update_cycle = int(update_cycle)
self._obis_codes = {}
self._serial = serial.Serial(serialport, int(baudrate), bytesize = serial.SEVENBITS, parity = serial.PARITY_EVEN, timeout = 2)
def run(self):
self.alive = True
self._sh.scheduler.add('DLMS', self._update_values, prio = 5, cycle = self._update_cycle)
def stop(self):
self.alive = False
self._sh.scheduler.remove('DLMS')
def _update_values(self):
logger.debug("dlms: update")
request = "/?!\r\n"
start = time.time()
self._serial.write(bytes(request, 'utf-8'))
response = bytes()
try:
while self.alive:
prev_len = len(response)
response += self._serial.read()
if (prev_len == len(response)):
break
except Exception as e:
logger.warning("dlms: {0}".format(e))
logger.debug("dlms: Reading took: {:.2f}s".format(time.time() - start))
for line in re.split('\r\n', str(response,'ascii')):
# if re.match('[0-9]+\.[0-9]\.[0-9](.+)', line): # für x.y.z(foo)
if re.match('[0-9]+\.[0-9].+(.+)', line): # für x.y(foo)
try:
data = re.split(r'[(*)]+', line)
logger.debug("dlms: {} = {} {}".format(data[0], data[1], data[2]))
if data[0] in self._obis_codes:
for item in self._obis_codes[data[0]]['items']:
item(data[1], 'DLMS', 'OBIS {}'.format(data[0]))
except Exception as e:
logger.warning("dlms: line={} exception={}".format(line, e))
def parse_item(self, item):
if 'dlms_obis_code' in item.conf:
logger.debug("parse item: {0}".format(item))
obis_code = item.conf['dlms_obis_code']
if not obis_code in self._obis_codes:
self._obis_codes[obis_code] = {'items': [item], 'logics': []}
else:
self._obis_codes[obis_code]['items'].append(item)
return None
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
myplugin = Plugin('DLMS')
myplugin.run()
[dlms]
class_name = DLMS
class_path = plugins.dlms
serialport = /dev/ttyO1
[Stromzaehler]
[[Bezug]]
[[[Energie]]]
type = num
dlms_obis_code = 1.8.1
[[[Leistung]]]
type = num
eval = "(3600000 / sh.Stromzaehler.Bezug.Energie.prev_change()) if not isinstance(sh.Stromzaehler.Bezug.Energie.prev_change(), datetime.datetime) else 0"
eval_trigger = Stromzaehler.Bezug.Energie
[[Lieferung]]
[[[Energie]]]
type = num
dlms_obis_code = 2.8.1
[[[Leistung]]]
type = num
eval = "(3600000 / sh.Stromzaehler.Lieferung.Energie.prev_change()) if not isinstance(sh.Stromzaehler.Lieferung.Energie.prev_change(), datetime.datetime) else 0"
eval_trigger = Stromzaehler.Lieferung.Energie
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.


Einen Kommentar schreiben: