# setup_tool.py 28/05/2016 D.J.Whale
#
# A simple menu-driven setup tool for the Energenie Python library.
# Just be a simple menu system.
# This then means you don't have to have all this in the demo apps
# and the demo apps can just refer to object variables names
# from an assumed auto_create registry, that is built using this setup tool.
import energenie
from energenie.lifecycle import *
#TODO: Catch Ctrl-C interrupt if possible
try:
readin = raw_input # Python 2
except NameError:
readin = input # Python 3
quit = False
@log_method
def do_legacy_learn():
"""Repeatedly broadcast a legacy switch message, so you can learn a socket to the pattern"""
pass #TODO
# get house code, default to energenie code
# get switch index, default 1 (0,1,2,3,4)
# go into transmit OOK mode
# in a loop until Ctrl-C
# transmit on message for house/device
# wait a short while
@log_method
def do_mihome_discovery():
"""Discover any mihome device when it sends reports"""
pass #TODO
# select join ask discovery mode
# in a loop until Ctrl-C
# just wait, the discovery agent will do everything for us
# in discover_askjoin mode, it will even ask the user for registry add/ignore
@log_method
def do_list_registry():
"""List the entries in the registry"""
energenie.registry.list()
@log_method
def do_rename_device():
"""Rename a device in the registry to a different name"""
#This is useful when turning auto discovered names into your own names
#TODO: The registry does not support a rename mode at the moment
#will need to add this by getting the record, deleting it, and appending it again
pass #TODO
@log_method
def do_delete_device():
"""Delete a device from the registry so it is no longer recognised"""
pass #TODO
#list the registry with numbers
# get the number of the device to delete, ctrl-C aborts
# ask the registry to delete it
@log_method
def do_switch_device():
"""Turn the switch on a socket on and off, to test it"""
pass #TODO
# select the device from a menu of numbered devices
# ask user for on/off/another/done
# if on, turn it on
# if off, turn it off
# if another, show list again
# if done, exit
@log_method
def do_show_device_status():
"""Show the readings associated with a device"""
pass #TODO
#TODO, not sure might show all devices in a simple table
#note different field names make table display hard, unless there are shorthand names
# for each device in the registry
# show a summary line for that device
@log_method
def do_watch_device():
"""Repeatedly show readings for a single device"""
pass #TODO
#show a list of devices
# get a device number from the user
# loop until Ctrl-C
# show device status
# wait until device status updates
@log_method
def do_logging():
"""Enter a mode where all communications are logged to screen and a file"""
pass #TODO
# loop until Ctrl-C
# if a device update comes in
# display summary of its data on screen
# add summary of data to energenie.csv using Logging.log_message
@log_method
def do_quit():
"""Finished with the program, so exit"""
global quit
quit = True
def show_menu(menu):
"""Display a menu on the console"""
i = 1
for item in menu:
print("%d. %s" % (i, item[0]))
i += 1
def get_choice(choices):
"""Get and validate a numberic choice from the tuple choices(first, last)"""
first = choices[0]
last = choices[1]
while True:
choice = readin("Choose %d to %d?" % (first, last))
try:
choice = int(choice)
if choice < first or choice > last:
print("Must enter a number between %d and %d" % (first, last))
else:
return choice
except ValueError:
print("Must enter a number")
pass
def handle_choice(menu, choice):
"""Route to the handler for the given menu choice"""
menu[choice-1][1]()
MAIN_MENU = [
("legacy learn mode", do_legacy_learn),
("mihome discovery mode", do_mihome_discovery),
("list registry", do_list_registry),
("watch device", do_watch_device),
("rename device", do_rename_device),
("delete device", do_delete_device),
("switch device", do_switch_device),
("show device status", do_show_device_status),
("logging", do_logging),
("quit", do_quit)
]
def setup_tool():
while not quit:
print("MAIN MENU")
show_menu(MAIN_MENU)
choice = get_choice((1,len(MAIN_MENU)+1))
handle_choice(MAIN_MENU, choice)
#----- MAIN ENTRY POINT -------------------------------------------------------
if __name__ == "__main__":
energenie.init()
try:
setup_tool()
finally:
energenie.finished()
# END