MqttDispatcherPy/MBusParser.py

99 lines
5.7 KiB
Python
Raw Normal View History

2017-11-12 21:51:29 +01:00
import json
import MeterbusLib
2017-11-10 22:03:30 +01:00
from logger import Logger
from AbstractParser import AbstractParser
from AbstractNextStage import AbstractNextStage
2017-11-12 21:51:29 +01:00
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)
2017-11-10 22:03:30 +01:00
class MBusParser(AbstractParser, AbstractNextStage):
def __init__(self):
super(MBusParser, self).__init__()
self.topic = "IoT/Measurement/MeterbusHub"
def execute(self, data):
2017-11-12 21:51:29 +01:00
# 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)))