diff --git a/src/control_any_noreg.py b/src/control_any_noreg.py index 98b3973..75acafb 100644 --- a/src/control_any_noreg.py +++ b/src/control_any_noreg.py @@ -42,7 +42,7 @@ if __name__ == "__main__": - print("starting legacy socket tester") + print("starting socket tester (no registry)") energenie.init() diff --git a/src/control_any_reg.py b/src/control_any_reg.py index a0f6caa..e8b0957 100644 --- a/src/control_any_reg.py +++ b/src/control_any_reg.py @@ -34,7 +34,7 @@ if __name__ == "__main__": - print("starting socket tester") + print("starting socket tester (from registry)") energenie.init() socket_state = False diff --git a/src/discover_mihome.py b/src/discover_mihome.py index 0605f94..f4916e9 100644 --- a/src/discover_mihome.py +++ b/src/discover_mihome.py @@ -1,19 +1,59 @@ # discover_mihome.py 24/05/2016 D.J.Whale - -#TODO: Placeholder for mihome discovery example app. # -# This will sit in permanent receive mode and listen for any device id reports, -# and when it sees one that is not in the user registry, it will add it. -# -# This will be useful for building up a user registry that can then be used -# with the control_mihome tester to actually toggle all the switches, -# and with the monitor_mihome to dump all message reports. +# You can discover devices and store them in the registry with setup_tool.py +# However, this is an example of how to do your own discovery using +# one of the built in discovery design patterns. -# For the moment, you have to seed the registry in control_mihome with a known -# device_id to run the test (perhaps using an older version of the code to learn it). +import energenie -# This is only a temporary situation until the complete receive pipeline is written. -# But I want to implement this properly, rather than half-hearted. +# You could also use the standard energenie.Registry.ask callback instead if you want +# as that does exactly the same thing + +def ask_fn(address, message): + MSG = "Do you want to register to device: %s? " % str(address) + try: + if message != None: + print(message) + y = raw_input(MSG) + + except AttributeError: + y = input(MSG) + + if y == "": return True + y = y.upper() + if y in ['Y', 'YES']: return True + return False + + +def discover_mihome(): + # Select your discovery behaviour from one of these: + ##energenie.Registry.discovery_auto() + energenie.Registry.discovery_ask(ask_fn) + ##energenie.Registry.discovery_autojoin() + ##energenie.Registry.discovery_askjoin(ask_fn) + + # Run the receive loop permanently, so that receive messages are processed + try: + print("Discovery running, Ctrl-C to stop") + while True: + energenie.loop() + + except KeyboardInterrupt: + pass # user abort + + +if __name__ == "__main__": + + print("Starting discovery example") + + energenie.init() + + try: + discover_mihome() + + finally: + energenie.finished() + # END diff --git a/src/energenie/Registry.py b/src/energenie/Registry.py index bea7109..b6b4566 100644 --- a/src/energenie/Registry.py +++ b/src/energenie/Registry.py @@ -435,9 +435,13 @@ def ask(address, message): MSG = "Do you want to register to device: %s? " % str(address) try: + if message != None: + print(message) y = raw_input(MSG) + except AttributeError: y = input(MSG) + if y == "": return True y = y.upper() if y in ['Y', 'YES']: return True diff --git a/src/mihome_energy_monitor.py b/src/mihome_energy_monitor.py index 974edc8..0455e30 100644 --- a/src/mihome_energy_monitor.py +++ b/src/mihome_energy_monitor.py @@ -9,6 +9,104 @@ # show friendly data update messages on the screen # store data updates to the log file -# END +# monitor_mihome.py 27/09/2015 D.J.Whale +# +# Monitor Energine MiHome sockets + +#NOTE: This file will soon be deprecated, and replaced with mihome_energy_monitor.py + + + + +import energenie +##import Logger +import time + +APP_DELAY = 5 +MY_SENSOR_ID = 0x68b #TESTING +UNKNOWN_SENSOR_ID = 0x111 #TESTING + +energenie.radio.DEBUG = True + +#----- TEST APPLICATION ------------------------------------------------------- + +if __name__ == "__main__": + + print("starting monitor tester") + energenie.init() + + #TESTING + # Manually seed the device registry and router with a known device address + ##purple = energenie.Devices.MIHO005(MY_SENSOR_ID) + ##energenie.registry.add(purple, "purple") + ##energenie.fsk_router.add((energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, MY_SENSOR_ID), purple) + + # provide a default incoming message handler + # This is useful for logging every message + ##def incoming(address, message): + ## print("\nIncoming from %s" % str(address)) + ## Logger.logMessage(message) + ##energenie.fsk_router.when_incoming(incoming) + + # Register for update callbacks on a single device when a new message comes in. + # This is a useful way to add data logging on a per-device basis + ##def new_data(self, message): + ## print("\nnew data for %s" % self) + ## message.dump() + ## Logger.logMessage(message) + ##purple.when_updated(new_data) + + #TESTING: build a synthetic message + report_msg = energenie.OpenThings.Message(energenie.Devices.MIHO005_REPORT) + report_msg[energenie.OpenThings.PARAM_VOLTAGE]["value"] = 240 + + #TESTING: Poke a synthetic join request coming from a device id + # With the default discovery_autojoin this should enter it into the registry + join_msg = energenie.Devices.MIHO005.get_join_req(MY_SENSOR_ID) + energenie.fsk_router.incoming_message( + (energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, MY_SENSOR_ID), join_msg + ) + + energenie.registry.list() + energenie.fsk_router.list() + + switch_state = True + + try: + while True: + + #TESTING: Poke synthetic unknown into the router and let it route to unknown handler + ##print("synthetic unknown device") + ##report_msg.set(header_sensorid=UNKNOWN_SENSOR_ID) + ##energenie.fsk_router.incoming_message( + ## (energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, UNKNOWN_SENSOR_ID), report_msg) + + #TESTING: Poke synthetic known into the router and let it route to our class instance + print("synthetic known device") + report_msg.set(header_sensorid=MY_SENSOR_ID) + energenie.fsk_router.incoming_message( + (energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, MY_SENSOR_ID), report_msg) + + #TODO: Knit with real radio + # Process any received messages from the real radio + ##energenie.loop() + + # For all devices in the registry, if they offer a power reading, display it + #TODO + + # For all devices in the registry, if they have a switch, toggle it + for d in energenie.registry.devices(): + if d.has_switch(): + d.set_switch(switch_state) + switch_state = not switch_state + + ##print("voltage:%s" % purple.get_voltage()) + time.sleep(APP_DELAY) + + finally: + energenie.finished() + +# END + diff --git a/src/monitor_mihome.py b/src/monitor_mihome.py deleted file mode 100644 index 6bb3f54..0000000 --- a/src/monitor_mihome.py +++ /dev/null @@ -1,98 +0,0 @@ -# monitor_mihome.py 27/09/2015 D.J.Whale -# -# Monitor Energine MiHome sockets - -#NOTE: This file will soon be deprecated, and replaced with mihome_energy_monitor.py - - - - -import energenie -##import Logger -import time - -APP_DELAY = 5 -MY_SENSOR_ID = 0x68b #TESTING -UNKNOWN_SENSOR_ID = 0x111 #TESTING - -energenie.radio.DEBUG = True - -#----- TEST APPLICATION ------------------------------------------------------- - -if __name__ == "__main__": - - print("starting monitor tester") - energenie.init() - - #TESTING - # Manually seed the device registry and router with a known device address - ##purple = energenie.Devices.MIHO005(MY_SENSOR_ID) - ##energenie.registry.add(purple, "purple") - ##energenie.fsk_router.add((energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, MY_SENSOR_ID), purple) - - # provide a default incoming message handler - # This is useful for logging every message - ##def incoming(address, message): - ## print("\nIncoming from %s" % str(address)) - ## Logger.logMessage(message) - ##energenie.fsk_router.when_incoming(incoming) - - # Register for update callbacks on a single device when a new message comes in. - # This is a useful way to add data logging on a per-device basis - ##def new_data(self, message): - ## print("\nnew data for %s" % self) - ## message.dump() - ## Logger.logMessage(message) - ##purple.when_updated(new_data) - - #TESTING: build a synthetic message - report_msg = energenie.OpenThings.Message(energenie.Devices.MIHO005_REPORT) - report_msg[energenie.OpenThings.PARAM_VOLTAGE]["value"] = 240 - - #TESTING: Poke a synthetic join request coming from a device id - # With the default discovery_autojoin this should enter it into the registry - join_msg = energenie.Devices.MIHO005.get_join_req(MY_SENSOR_ID) - energenie.fsk_router.incoming_message( - (energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, MY_SENSOR_ID), join_msg - ) - - energenie.registry.list() - energenie.fsk_router.list() - - switch_state = True - - try: - while True: - - #TESTING: Poke synthetic unknown into the router and let it route to unknown handler - ##print("synthetic unknown device") - ##report_msg.set(header_sensorid=UNKNOWN_SENSOR_ID) - ##energenie.fsk_router.incoming_message( - ## (energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, UNKNOWN_SENSOR_ID), report_msg) - - #TESTING: Poke synthetic known into the router and let it route to our class instance - print("synthetic known device") - report_msg.set(header_sensorid=MY_SENSOR_ID) - energenie.fsk_router.incoming_message( - (energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, MY_SENSOR_ID), report_msg) - - #TODO: Knit with real radio - # Process any received messages from the real radio - ##energenie.loop() - - # For all devices in the registry, if they offer a power reading, display it - #TODO - - # For all devices in the registry, if they have a switch, toggle it - for d in energenie.registry.devices(): - if d.has_switch(): - d.set_switch(switch_state) - switch_state = not switch_state - - ##print("voltage:%s" % purple.get_voltage()) - time.sleep(APP_DELAY) - - finally: - energenie.finished() - -# END