2015-06-09 22:33:02 +02:00
|
|
|
'''
|
|
|
|
Created on 09.06.2015
|
|
|
|
|
|
|
|
@author: wn
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
import threading
|
|
|
|
from logger import Logger
|
|
|
|
import Queue
|
2015-06-15 22:28:31 +02:00
|
|
|
import json
|
|
|
|
import MeterbusLib
|
|
|
|
from MeterbusLibExceptions import MeterbusLibException
|
2015-06-09 22:33:02 +02:00
|
|
|
|
|
|
|
|
2016-06-25 15:44:13 +02:00
|
|
|
OnePhaseElectric_Finder, ThreePhaseElectric_Finder, Thermometer_Hottis, Watermeter_Hyd = 'OnePhaseElectric_Finder', 'ThreePhaseElectric_Finder', 'Thermometer_Hottis', 'Watermeter_Hyd'
|
2015-06-15 22:28:31 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
devices = []
|
|
|
|
device_dishwasher_electric = MeterbusLib.Device(0x53, OnePhaseElectric_Finder, "Dishwasher", ["Energy total", "Energy partial", "Voltage", "Current", "Power", "img. Power"])
|
|
|
|
devices.append(device_dishwasher_electric)
|
2015-12-26 22:11:02 +01:00
|
|
|
device_computer_electric = MeterbusLib.Device(85, OnePhaseElectric_Finder, "Computer", ["Energy total", "Energy partial", "Voltage", "Current", "Power", "img. Power"])
|
|
|
|
devices.append(device_computer_electric)
|
|
|
|
device_freezer_electric = MeterbusLib.Device(86, OnePhaseElectric_Finder, "Freezer", ["Energy total", "Energy partial", "Voltage", "Current", "Power", "img. Power"])
|
|
|
|
devices.append(device_freezer_electric)
|
2015-06-15 22:28:31 +02:00
|
|
|
device_laundry_electric = MeterbusLib.Device(82, OnePhaseElectric_Finder, "Laundry", ["Energy total", "Energy partial", "Voltage", "Current", "Power", "img. Power"])
|
|
|
|
devices.append(device_laundry_electric)
|
|
|
|
device_dryer_electric = MeterbusLib.Device(81, OnePhaseElectric_Finder, "Dryer", ["Energy total", "Energy partial", "Voltage", "Current", "Power", "img. Power"])
|
|
|
|
devices.append(device_dryer_electric)
|
|
|
|
device_light_electric = MeterbusLib.Device(84, OnePhaseElectric_Finder, "Light", ["Energy total", "Energy partial", "Voltage", "Current", "Power", "img. Power"])
|
|
|
|
devices.append(device_light_electric)
|
|
|
|
device_3phase_electric = MeterbusLib.Device(0x50, ThreePhaseElectric_Finder, "3 Phase Electric", ["Energy T1 total", "Energy T1 partial", "Energy T2 total", "Energy T2 partial",
|
|
|
|
"Voltage phase 1", "Current phase 1", "Power phase 1", "img. Power phase 1",
|
|
|
|
"Voltage phase 2", "Current phase 2", "Power phase 2", "img. Power phase 2",
|
|
|
|
"Voltage phase 3", "Current phase 3", "Power phase 3", "img. Power phase 3",
|
|
|
|
"converter ratio", "Power total", "img. Power total", "tariff"
|
|
|
|
])
|
|
|
|
devices.append(device_3phase_electric)
|
|
|
|
device_thermometer = MeterbusLib.Device(0x21, Thermometer_Hottis, "Thermometer", ["Uptime Seconds", "Uptime Minutes", "Uptime Hours", "Uptime Days",
|
|
|
|
"Temperature 1", "Temperature 2", "Temperature 3", "Temperature 4",
|
|
|
|
"rawdata"
|
|
|
|
])
|
|
|
|
devices.append(device_thermometer)
|
2016-06-25 15:44:13 +02:00
|
|
|
device_watermeter = MeterbusLib.Device(0x30, Watermeter_Hyd, "Watermeter", ["Volume", "Minimum Volume", "Volume Flow", "OpTime", "Flow Temperature", "TimePoint1", "Volume2", "tariff1", "TimePoint2", "TimePoint3"])
|
|
|
|
devices.append(device_watermeter)
|
2015-06-09 22:33:02 +02:00
|
|
|
|
|
|
|
|
|
|
|
class MeterBusDecoder(threading.Thread):
|
|
|
|
def __init__(self, inQueue, outQueue):
|
|
|
|
threading.Thread.__init__(self)
|
|
|
|
self.inQueue = inQueue
|
|
|
|
self.outQueue = outQueue
|
|
|
|
self.setDaemon(True)
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
while True:
|
2015-06-15 22:28:31 +02:00
|
|
|
msg = self.inQueue.get()
|
2015-06-09 22:33:02 +02:00
|
|
|
|
2015-06-15 22:28:31 +02:00
|
|
|
Logger.log("MeterBusDecoder is doing something with %s" % msg)
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
mbusPayload = msg['data']['telegram']
|
|
|
|
if mbusPayload[-1] == ' ':
|
|
|
|
mbusPayload2 = mbusPayload[:-1]
|
|
|
|
else:
|
|
|
|
mbusPayload2 = mbusPayload
|
|
|
|
Logger.log("<" + mbusPayload2 + ">")
|
|
|
|
|
|
|
|
telegram = MeterbusLib.Telegram(devices)
|
|
|
|
telegram.fromHexString(mbusPayload2)
|
|
|
|
telegram.parse()
|
|
|
|
Logger.log(json.dumps(telegram.getJSON(), indent=2))
|
|
|
|
|
|
|
|
msg['metadata']['consumer'] = telegram.frame.comment
|
|
|
|
msg['metadata']['category'] = telegram.frame.category
|
|
|
|
|
|
|
|
|
|
|
|
if telegram.frame.category == OnePhaseElectric_Finder:
|
|
|
|
msg['data']['current'] = telegram.frame.dib[3].value
|
|
|
|
msg['data']['power'] = telegram.frame.dib[4].value
|
|
|
|
msg['data']['energy'] = telegram.frame.dib[0].value
|
|
|
|
elif telegram.frame.category == ThreePhaseElectric_Finder:
|
|
|
|
msg['data']['current'] = telegram.frame.dib[5].value + telegram.frame.dib[9].value + telegram.frame.dib[13].value
|
|
|
|
msg['data']['power'] = telegram.frame.dib[17].value
|
|
|
|
msg['data']['energy'] = telegram.frame.dib[0].value
|
2016-06-25 15:44:13 +02:00
|
|
|
elif telegram.frame.category == Watermeter_Hyd:
|
|
|
|
msg['data']['volume'] = telegram.frame.dib[0].value
|
|
|
|
msg['data']['flow'] = telegram.frame.dib[2].value
|
|
|
|
msg['data']['temperature'] = telegram.frame.dib[4].value
|
|
|
|
elif telegram.frame.category == Thermometer_Hottis:
|
|
|
|
msg['data']['temperature1'] = telegram.frame.dib[4].value
|
|
|
|
msg['data']['temperature2'] = telegram.frame.dib[5].value
|
|
|
|
msg['data']['temperature3'] = telegram.frame.dib[6].value
|
|
|
|
msg['data']['temperature4'] = telegram.frame.dib[7].value
|
|
|
|
msg['data']['operatingTime'] = "%i-%i:%i:%i" % (telegram.frame.dib[3].value, telegram.frame.dib[2].value, telegram.frame.dib[1].value, telegram.frame.dib[0].value)
|
|
|
|
msg['metadata']['version'] = 2
|
2015-06-15 22:28:31 +02:00
|
|
|
|
|
|
|
msg['data']['decodedTelegram'] = telegram.getJSON()
|
2016-06-25 15:44:13 +02:00
|
|
|
|
|
|
|
Logger.log(msg)
|
2015-06-15 22:28:31 +02:00
|
|
|
except KeyError, e:
|
2015-06-26 11:52:22 +02:00
|
|
|
Logger.log("MeterBusDecoder, parse, KeyError: %s" % e)
|
2015-06-15 22:28:31 +02:00
|
|
|
except MeterbusLibException, e:
|
2015-06-26 11:52:22 +02:00
|
|
|
Logger.log("MeterBusDecoder, parse, MeterbusLibException: %s %s" % (e.__class__.__name__,e))
|
|
|
|
except Exception, e:
|
|
|
|
Logger.log("MeterBusDecoder, parse, Exception: %s %s" % (e.__class__.__name__,e))
|
2015-06-09 22:33:02 +02:00
|
|
|
|
2015-06-15 22:28:31 +02:00
|
|
|
|
|
|
|
try:
|
2015-06-09 22:33:02 +02:00
|
|
|
self.outQueue.put_nowait(msg)
|
|
|
|
except Queue.Full:
|
2015-06-26 11:52:22 +02:00
|
|
|
Logger.log("MeterBusDecoder, put queue overrun, drop result of %s" % str(msg))
|
|
|
|
except Exception, e:
|
|
|
|
Logger.log("MeterBusDecoder, put Exception: %s %s" % (e.__class__.__name__,e))
|
2015-06-09 22:33:02 +02:00
|
|
|
|