Mqtt2Mongo/MeterBusDecoder.py

118 lines
6.4 KiB
Python
Raw Permalink Normal View History

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