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