MqttDispatcherPy/MBusParser.py
Wolfgang Hottgenroth eea141df19 parsing added
2017-11-12 21:51:29 +01:00

99 lines
5.7 KiB
Python

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)))