Default incoming message callback added to router, for logging/debug
1 parent 12c9069 commit 66ad0b4ca7d406deb4586a33591c87bd117b6227
@David Whale David Whale authored on 25 May 2016
Showing 3 changed files
View
7
doc/devices_classes_branch.txt
 
--------------------------------------------------------------------------------
TODO NEXT
 
 
DONE
* implement neater unknown message handler in the router
do it as a callback rather than overwriting the default method
 
 
 
* consider a callback in the router for new_data, for all messages
regardless of if known or not (good for generic data logging)
 
 
* design a way that a MIHO005 class instance can be auto generated from a product_id field
 
----
View
12
src/energenie/Registry.py
def __init__(self, name):
self.name = name # probably FSK or OOK
self.routes = {} # key(tuple of ids) -> value(device class instance)
self.unknown_cb = None
self.incoming_cb = None
 
def add(self, address, instance):
"""Add this device instance to the routing table"""
# When a message comes in for this address, it will be routed to its handle_message() method
# address might be a string, a number, a tuple, but probably always the same for any one router
self.routes[address] = instance
 
def handle_message(self, address, payload):
def incoming_message(self, address, payload):
if self.incoming_cb != None:
self.incoming_cb(address, payload)
 
if address in self.routes:
ci = self.routes[address]
ci.incoming_message(payload)
 
else: # unknown address
self.handle_unknown(address, payload)
 
def when_incoming(self, callback):
self.incoming_cb = callback
 
def when_unknown(self, callback):
"""Register a callback for unknown messages"""
#NOTE: this is the main hook point for auto discovery and registration
# Default action is just a debug message, and drop the payload
print("Unknown address: %s" % str(address))
 
 
 
 
# Might rename these, especially when we add in other protocols
# such as devices that are 868 wirefree doorbells etc.
 
#TODO: Name is not completely representative of function.
View
41
src/monitor_mihome.py
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)
 
# Register for update callbacks when a new message comes in for the purple device
# 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)
 
# Provide an unknown message handler so we can show data from unregistered devices
# This is a useful hook point for later adding device discovery
def unknown(address, message):
print("\nUnknown device:%s" % str(address))
message.dump()
energenie.fsk_router.when_unknown(unknown)
 
# 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)
 
# Override the default unknown handler, so we can show data from unregistered devices
# This is a useful hook point for later adding device discovery
def unknown(address, message):
print("\nUnknown device:%s" % str(hex(address[2])))
message.dump()
energenie.fsk_router.when_unknown(unknown)
 
try:
while True:
#TESTING: build a synthetic message
msg[energenie.OpenThings.PARAM_VOLTAGE]["value"] = 240
 
#TESTING: Poke synthetic unknown into the router and let it route to unknown handler
msg.set(header_sensorid=DUMMY_SENSOR_ID)
energenie.fsk_router.handle_message(
energenie.fsk_router.incoming_message(
(energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, DUMMY_SENSOR_ID), msg)
 
#TESTING: Poke synthetic known into the router and let it route to our class instance
msg.set(header_sensorid=MY_SENSOR_ID)
energenie.fsk_router.handle_message(
energenie.fsk_router.incoming_message(
(energenie.Devices.MFRID_ENERGENIE, energenie.Devices.PRODUCTID_MIHO005, MY_SENSOR_ID), msg)
 
#TODO: Knit with real radio
# Process any received messages from the real radio