import json import MeterbusLib from logger import Logger from AbstractParser import AbstractParser from AbstractNextStage import AbstractNextStage from TemperatureDatabasePreparer import TemperatureDatabasePreparer from EnergyDatabasePreparer import EnergyDatabasePreparer OnePhaseElectric_Finder, ThreePhaseElectric_Finder, Thermometer_Hottis, Watermeter_Hyd = 'OnePhaseElectric_Finder', 'ThreePhaseElectric_Finder', 'Thermometer_Hottis', 'Watermeter_Hyd' devices = [] device_dishwasher_electric = MeterbusLib.Device(0x53, OnePhaseElectric_Finder, "Dishwasher", ["Energy total", "Energy partial", "Voltage", "Current", "Power", "img. Power"]) devices.append(device_dishwasher_electric) 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) 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) 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) class MBusParser(AbstractParser, AbstractNextStage): def __init__(self): super(MBusParser, self).__init__() self.topic = "IoT/Measurement/MeterbusHub" def execute(self, data): # Logger.log("MBusParser %s" % (str(data))) self.executeNextStage(data) try: j = json.loads(data['payload']) name = j['metadata']['name'] Logger.log("name: %s" % (name)) telegram = j['data']['telegram'] if telegram[-1] == ' ': telegram = telegram[:-1] Logger.log("telegram: <%s>" % (telegram)) mbusTelegram = MeterbusLib.Telegram(devices) mbusTelegram.fromHexString(telegram) mbusTelegram.parse() # Logger.log(json.dumps(mbusTelegram.getJSON(), indent=2)) if mbusTelegram.frame.category == OnePhaseElectric_Finder: # one-phase electricity v = EnergyDatabasePreparer({'name': mbusTelegram.frame.comment, 'power': mbusTelegram.frame.dib[4].value, 'energy': mbusTelegram.frame.dib[0].value, 'timestamp':data['timestamp']}) elif mbusTelegram.frame.category == ThreePhaseElectric_Finder: # three-phases electricity v = EnergyDatabasePreparer({'name': mbusTelegram.frame.comment, 'power': mbusTelegram.frame.dib[17].value, 'energy': mbusTelegram.frame.dib[0], 'timestamp':data['timestamp']}) elif mbusTelegram.frame.category == Thermometer_Hottis: # thermometer v = [] vv = TemperatureDatabasePreparer({'name': 'Hedge', 'temperature': mbusTelegram.frame.dib[4].value, 'timestamp':data['timestamp']}) v.append(vv) vv = TemperatureDatabasePreparer({'name': 'House', 'temperature': mbusTelegram.frame.dib[6].value, 'timestamp':data['timestamp']}) v.append(vv) else: raise Exception('illegal name in mbus message found') self.executeNextStage(v) except Exception, e: Logger.log("Exception in MBusParser, %s" % (str(e)))