diff --git a/src/energenie/Devices.py b/src/energenie/Devices.py index 6416e07..ddb8ed6 100644 --- a/src/energenie/Devices.py +++ b/src/energenie/Devices.py @@ -5,14 +5,17 @@ MFRID = 0x04 PRODUCTID_C1_MONITOR = 0x01 PRODUCTID_R1_MONITOR_AND_CONTROL = 0x02 +PRODUCTID_MIHO013 = 0x03 +PRODUCTID_MIHO006 = 0x05 CRYPT_PID = 242 CRYPT_PIP = 0x0100 -# OpenHEMS does not support a broadcast id, but Energine added one for their +# OpenHEMS does not support a broadcast id, but Energenie added one for their # MiHome Adaptors. This makes simple discovery possible. BROADCAST_ID = 0xFFFFFF # energenie broadcast # TODO put additional products in here from the Energenie directory +# TODO make this table based def getDescription(mfrid, productid): if mfrid == MFRID: @@ -20,7 +23,11 @@ if productid == PRODUCTID_C1_MONITOR: product = "C1 MONITOR" elif productid == PRODUCTID_R1_MONITOR_AND_CONTROL: - product = "R1 MONITOR/CONTROL" + product = "MIHO005 ADAPTOR PLUS" + elif productid == PRODUCTID_MIHO006: + product = "MIHO006 HOUSE MONITOR" + elif productid == PRODUCTID_MIHO013: + product = "MIHO013 ETRV" else: product = "UNKNOWN" else: diff --git a/src/monitor.py b/src/monitor.py index dbf698f..c9c417e 100644 --- a/src/monitor.py +++ b/src/monitor.py @@ -38,14 +38,17 @@ # set defaults for any data that doesn't appear in this message # but build flags so we know which ones this contains - flags = [0,0,0,0,0] + flags = [0 for i in range(7)] switch = None voltage = None freq = None reactive = None real = None + apparent = None + current = None # capture any data that we want + #print(msg) for rec in msg['recs']: paramid = rec['paramid'] try: @@ -68,10 +71,16 @@ elif paramid == OpenHEMS.PARAM_REAL_POWER: flags[4] = 1 real = value + elif paramid == OpenHEMS.PARAM_APPARENT_POWER: + flags[5] = 1 + apparent = value + elif paramid == OpenHEMS.PARAM_CURRENT: + flags[6] = 1 + current = value # generate a line of CSV flags = "".join([str(a) for a in flags]) - csv = "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s" % (timestamp, mfrid, productid, sensorid, flags, switch, voltage, freq, reactive, real) + csv = "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s" % (timestamp, mfrid, productid, sensorid, flags, switch, voltage, freq, reactive, real, apparent, current) log_file.write(csv + '\n') log_file.flush() trace(csv) # testing @@ -175,17 +184,23 @@ #making it less likely to miss an incoming message due to #the radio being in transmit mode - # assume only 1 rec in a join, for now - if decoded["recs"][0]["paramid"] == OpenHEMS.PARAM_JOIN: - #TODO: write OpenHEMS.getFromMessage("header_mfrid") - response = OpenHEMS.alterMessage(JOIN_ACK_MESSAGE, - header_mfrid=decoded["header"]["mfrid"], - header_productid=decoded["header"]["productid"], - header_sensorid=decoded["header"]["sensorid"]) - p = OpenHEMS.encode(response) - radio.transmitter() - radio.transmit(p) - radio.receiver() + # handle messages with zero recs in them silently + #trace(decoded) + if len(decoded["recs"]) == 0: + print("Empty record:%s" % decoded) + else: + # assume only 1 rec in a join, for now + if decoded["recs"][0]["paramid"] == OpenHEMS.PARAM_JOIN: + #TODO: write OpenHEMS.getFromMessage("header_mfrid") + # send back a JOIN ACK, so that join light stops flashing + response = OpenHEMS.alterMessage(JOIN_ACK_MESSAGE, + header_mfrid=decoded["header"]["mfrid"], + header_productid=decoded["header"]["productid"], + header_sensorid=decoded["header"]["sensorid"]) + p = OpenHEMS.encode(response) + radio.transmitter() + radio.transmit(p) + radio.receiver() if sendSwitchTimer.check() and decoded != None: request = OpenHEMS.alterMessage(SWITCH_MESSAGE,