diff --git a/src/combined.py b/src/combined.py index 0f1ceb0..adbd9c8 100644 --- a/src/combined.py +++ b/src/combined.py @@ -8,7 +8,7 @@ # will be much nicer to use. import time -from energenie import Messages, OpenThings, radio, TwoBit, Devices +from energenie import OpenThings, radio, TwoBit, Devices # build FSK messages for MiHome purple @@ -16,13 +16,13 @@ PURPLE_ID = 0x68B # captured from a real device using Monitor.py m = OpenThings.alterMessage( - Messages.SWITCH, + Devices.create_message(Devices.SWITCH), header_sensorid=PURPLE_ID, recs_0_value=1) purple_on = OpenThings.encode(m) m = OpenThings.alterMessage( - Messages.SWITCH, + Devices.create_message(Devices.SWITCH), header_sensorid=PURPLE_ID, recs_0_value=0) purple_off = OpenThings.encode(m) diff --git a/src/energenie/Devices.py b/src/energenie/Devices.py index 412abbf..9c01236 100644 --- a/src/energenie/Devices.py +++ b/src/energenie/Devices.py @@ -94,6 +94,73 @@ return False +#----- DEFINED MESSAGE TEMPLATES ---------------------------------------------- + +import copy + +def create_message(message): + return copy.deepcopy(message) + +SWITCH = { + "header": { + "mfrid": MFRID_ENERGENIE, + "productid": PRODUCTID_MIHO005, + "encryptPIP": CRYPT_PIP, + "sensorid": 0 # FILL IN + }, + "recs": [ + { + "wr": True, + "paramid": OpenThings.PARAM_SWITCH_STATE, + "typeid": OpenThings.Value.UINT, + "length": 1, + "value": 0 # FILL IN + } + ] +} + + +JOIN_ACK = { + "header": { + "mfrid": 0, # FILL IN + "productid": 0, # FILL IN + "encryptPIP": CRYPT_PIP, + "sensorid": 0 # FILL IN + }, + "recs": [ + { + "wr": False, + "paramid": OpenThings.PARAM_JOIN, + "typeid": OpenThings.Value.UINT, + "length": 0 + } + ] +} + + +REGISTERED_SENSOR = { + "header": { + "mfrid": MFRID_ENERGENIE, + "productid": 0, # FILL IN + "encryptPIP": CRYPT_PIP, + "sensorid": 0 # FILL IN + } +} + + +def send_join_ack(radio, mfrid, productid, sensorid): + # send back a JOIN ACK, so that join light stops flashing + response = OpenThings.alterMessage(create_message(JOIN_ACK), + header_mfrid=mfrid, + header_productid=productid, + header_sensorid=sensorid) + p = OpenThings.encode(response) + radio.transmitter() + radio.transmit(p, inner_times=2) + radio.receiver() + + + #----- CONTRACT WITH AIR-INTERFACE -------------------------------------------- # this might be a real air_interface (a radio), or an adaptor interface @@ -316,51 +383,20 @@ def turn_on(self): #TODO: header construction should be in MiHomeDevice as it is shared - #but be careful to clone it, as later we might queue messages - #and they must be independent. - #TODO: might use OpenThings.alter_message to build a header? - payload = { - "header": { - "mfrid" : self.manufacturer_id, - "productid" : self.product_id, - "sensorid": self.device_id, - "encryptPIP": CRYPT_PIP - }, - "recs": [ - { - "wr": True, - "paramid": OpenThings.PARAM_SWITCH_STATE, - "typeid": OpenThings.Value.UINT, - "length": 1, - "value": True - } - ] - } + payload = OpenThings.alterMessage( + create_message(SWITCH), + header_productid = self.product_id, + header_sensorid = self.device_id, + recs_0_value = True) self.send_message(payload) def turn_off(self): #TODO: header construction should be in MiHomeDevice as it is shared - #but be careful to clone it, as later we might queue messages - #and they must be independent. - #TODO: might use OpenThings.alter_message to build a header? - payload = { - "header": { - "mfrid" : self.manufacturer_id, - "productid" : self.product_id, - "sensorid": self.device_id, - "encryptPIP": CRYPT_PIP - }, - "recs": [ - { - "wr": True, - "paramid": OpenThings.PARAM_SWITCH_STATE, - "typeid": OpenThings.Value.UINT, - "length": 1, - "value": False - } - ] - } - + payload = OpenThings.alterMessage( + create_message(SWITCH), + header_productid = self.product_id, + header_sensorid = self.device_id, + recs_0_value = False) self.send_message(payload) #TODO: difference between 'is on and 'is requested on' diff --git a/src/energenie/Messages.py b/src/energenie/Messages.py deleted file mode 100644 index 778dd69..0000000 --- a/src/energenie/Messages.py +++ /dev/null @@ -1,71 +0,0 @@ -# Message.py 03/04/2015 D.J.Whale -# -# pydict formatted message structures for OpenThings - -try: # python 2 - import Devices - import OpenThings -except ImportError: - from . import Devices - from . import OpenThings - -SWITCH = { - "header": { - "mfrid": Devices.MFRID, - "productid": Devices.PRODUCTID_MIHO005, - "encryptPIP": Devices.CRYPT_PIP, - "sensorid": 0 # FILL IN - }, - "recs": [ - { - "wr": True, - "paramid": OpenThings.PARAM_SWITCH_STATE, - "typeid": OpenThings.Value.UINT, - "length": 1, - "value": 0 # FILL IN - } - ] -} - - -JOIN_ACK = { - "header": { - "mfrid": 0, # FILL IN - "productid": 0, # FILL IN - "encryptPIP": Devices.CRYPT_PIP, - "sensorid": 0 # FILL IN - }, - "recs": [ - { - "wr": False, - "paramid": OpenThings.PARAM_JOIN, - "typeid": OpenThings.Value.UINT, - "length": 0 - } - ] -} - - -REGISTERED_SENSOR = { - "header": { - "mfrid": 0, # FILL IN - "productid": 0, # FILL IN - "encryptPIP": Devices.CRYPT_PIP, - "sensorid": 0 # FILL IN - } -} - - -def send_join_ack(radio, mfrid, productid, sensorid): - # send back a JOIN ACK, so that join light stops flashing - response = OpenThings.alterMessage(JOIN_ACK, - header_mfrid=mfrid, - header_productid=productid, - header_sensorid=sensorid) - p = OpenThings.encode(response) - radio.transmitter() - radio.transmit(p, inner_times=2) - radio.receiver() - - -# END diff --git a/src/energenie/Registry.py b/src/energenie/Registry.py index 6761dce..1bb048d 100644 --- a/src/energenie/Registry.py +++ b/src/energenie/Registry.py @@ -296,6 +296,7 @@ #print("fan %s" % fan) tv.turn_on() + tv.turn_off() #fan.turn_on() #print("tv switch:%s" % tv.has_switch()) diff --git a/src/monitor.py b/src/monitor.py index dcaff84..ef8bd1c 100644 --- a/src/monitor.py +++ b/src/monitor.py @@ -9,7 +9,7 @@ # However, it will log all messages from MiHome monitor, adaptor plus and house monitor # to a CSV log file, so could be the basis for a non-controlling energy logging app. -from energenie import Registry, Devices, Messages, OpenThings, radio +from energenie import Registry, Devices, OpenThings, radio import time import Logger @@ -56,7 +56,7 @@ mfrid = OpenThings.getFromMessage(decoded, "header_mfrid") productid = OpenThings.getFromMessage(decoded, "header_productid") sensorid = OpenThings.getFromMessage(decoded, "header_sensorid") - Messages.send_join_ack(radio, mfrid, productid, sensorid) + Devices.send_join_ack(radio, mfrid, productid, sensorid) if __name__ == "__main__": diff --git a/src/switch.py b/src/switch.py index 2fece13..bad8944 100644 --- a/src/switch.py +++ b/src/switch.py @@ -11,7 +11,7 @@ # Consider waiting for me to finish developing the device object interface first. import time -from energenie import Devices, Messages, Registry, OpenThings, radio +from energenie import Devices, Registry, OpenThings, radio from Timer import Timer @@ -60,7 +60,7 @@ mfrid = OpenThings.getFromMessage(decoded, "header_mfrid") productid = OpenThings.getFromMessage(decoded, "header_productid") sensorid = OpenThings.getFromMessage(decoded, "header_sensorid") - Messages.send_join_ack(radio, mfrid, productid, sensorid) + Devices.send_join_ack(radio, mfrid, productid, sensorid) def switch_toggle_loop(): @@ -79,7 +79,7 @@ productid = header["productid"] if Devices.hasSwitch(mfrid, productid): - request = OpenThings.alterMessage(Messages.SWITCH, + request = OpenThings.alterMessage(Devices.create_message(Devices.SWITCH), header_sensorid=sensorid, recs_0_value=switch_state) p = OpenThings.encode(request) @@ -99,7 +99,7 @@ # Seed the registry with a known device, to simplify tx-only testing SENSOR_ID = 0x68B # captured from a real device - device_header = OpenThings.alterMessage(Messages.REGISTERED_SENSOR, + device_header = OpenThings.alterMessage(Devices.create_message(Devices.REGISTERED_SENSOR), header_mfrid = Devices.MFRID, header_productid = Devices.PRODUCTID_MIHO005, # adaptor plus header_sensorid = SENSOR_ID)