diff --git a/src/energenie/Devices.py b/src/energenie/Devices.py index a7a41d5..412abbf 100644 --- a/src/energenie/Devices.py +++ b/src/energenie/Devices.py @@ -4,6 +4,7 @@ # This table is mostly reverse-engineered from various websites and web catalogues. import OnAir +import OpenThings # This level of indirection allows easy mocking for testing ook_interface = OnAir.TwoBitAirInterface() @@ -268,6 +269,9 @@ self.capabilities.receive = True def turn_on(self): + #TODO should this be here, or in LegacyDevice?? + #addressing should probably be in LegacyDevice + #child devices might interpret the command differently payload = { "house_address": self.device_id[0], "device_index": self.device_id[1], @@ -276,6 +280,9 @@ self.send_message(payload) def turn_off(self): + #TODO: should this be here, or in LegacyDevice??? + #addressing should probably be in LegacyDevice + #child devices might interpret the command differently payload = { "house_address": self.device_id[0], "device_index": self.device_id[1], @@ -308,16 +315,53 @@ return self.readings def turn_on(self): - #TODO: build header - #TODO: add rec SWITCH=1 - #TODO: self.send_message() - self.send_message("turn on") # TODO + #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 + } + ] + } + self.send_message(payload) def turn_off(self): - #TODO: build header - #TODO: add rec SWITCH=0 - #TODO: self.send_message(OPENTHINGS_SWITCH_MESSAGE, False) - self.send_message("turn off") # TODO + #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 + } + ] + } + + self.send_message(payload) #TODO: difference between 'is on and 'is requested on' #TODO: difference between 'is off' and 'is requested off' diff --git a/src/energenie/OnAir.py b/src/energenie/OnAir.py index 86321c9..c7d7b6f 100644 --- a/src/energenie/OnAir.py +++ b/src/energenie/OnAir.py @@ -57,7 +57,7 @@ radio.transmitter(fsk=True) #TODO: configure other radio parameters #TODO: transmit payload - radio.transmit(p, outer_times=0, inner_times=4, outer_delay=0) + radio.transmit(p, outer_times=1, inner_times=4, outer_delay=0) # radio auto-returns to previous state after transmit completes @log_method diff --git a/src/energenie/Registry.py b/src/energenie/Registry.py index c4b5428..6761dce 100644 --- a/src/energenie/Registry.py +++ b/src/energenie/Registry.py @@ -284,8 +284,8 @@ # seed the registry - #registry.add(Devices.MIHO005(device_id=0x68b), "tv") - registry.add(Devices.ENER002(device_id=(0xC8C8C, 1)), "fan") + registry.add(Devices.MIHO005(device_id=0x68b), "tv") + #registry.add(Devices.ENER002(device_id=(0xC8C8C, 1)), "fan") # test the auto create mechanism import sys @@ -293,10 +293,10 @@ # variables should now be created in module scope #print("tv %s" % tv) - print("fan %s" % fan) + #print("fan %s" % fan) - #tv.turn_on() - fan.turn_on() + tv.turn_on() + #fan.turn_on() #print("tv switch:%s" % tv.has_switch()) #print("tv send:%s" % tv.can_send()) @@ -308,6 +308,9 @@ if __name__ == "__main__": + import OpenThings + + OpenThings.init(Devices.CRYPT_PID) test_with_registry() diff --git a/src/energenie/radio.py b/src/energenie/radio.py index b6ba08f..5377d31 100644 --- a/src/energenie/radio.py +++ b/src/energenie/radio.py @@ -132,6 +132,9 @@ #Note, this optionally does a mode change before and after #extern void radio_transmit(uint8_t* payload, uint8_t len, uint8_t repeats); + ##import OpenThings + ##print("***TX %s" % OpenThings.decode(payload)) + framelen = len(payload) if framelen < 1 or framelen > 255: raise ValueError("frame len must be 1..255")