From eea141df1997d2585d2116181d3f0672d1794e34 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Sun, 12 Nov 2017 21:51:29 +0100 Subject: [PATCH] parsing added --- MBusParser.py | 90 +++++++++++++++++++++++++++++++++++++++++++++-- MqttDispatcher.py | 4 +-- 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/MBusParser.py b/MBusParser.py index a35546b..3638ecb 100644 --- a/MBusParser.py +++ b/MBusParser.py @@ -1,6 +1,43 @@ + +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): @@ -8,5 +45,54 @@ class MBusParser(AbstractParser, AbstractNextStage): self.topic = "IoT/Measurement/MeterbusHub" def execute(self, data): - #Logger.log("MBusParser %s" % (str(data))) - self.executeNextStage(data) \ No newline at end of file + # 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))) diff --git a/MqttDispatcher.py b/MqttDispatcher.py index 4040556..f196c61 100644 --- a/MqttDispatcher.py +++ b/MqttDispatcher.py @@ -50,11 +50,11 @@ try: Logger.log("MqttReader started ...") mbusParser = MBusParser() - #mqttReader.registerParser(mbusParser) + mqttReader.registerParser(mbusParser) Logger.log("MBusParser started ...") modbusParser = ModbusParser() - mqttReader.registerParser(modbusParser) + #mqttReader.registerParser(modbusParser) Logger.log("ModbusParser started ...") persistentQueue = PersistentQueue()