Creating an IzoT Python Application

The following example Python 3 code defines an interface for an IzoT device, initializes the ISI engine with the appropriate values, and then starts that device application. The device in this example will automatically enroll itself. If a Lamp Controller device is later added to the network, this will handle the connections of the datapoints, such that changing the value on the Keypad will update the light level on the Keypad device, and also on the connected Lamp Controller device. More details are available in the subsequent sections. This example code is a subset of the full keypad.py example that is found in the examples keypad section. This smaller example only connects the lights to a Lamp Controller; the full example also connects a temperature and a humidity sensor to an Environment Sensor device.

from izot.examples.common.framework.framework import Framework 
from izot.examples.common.framework.framework import FrameworkMenu 
from izot.examples.common.framework.framework import ApplicationType 
import izot.device 
from izot.resources.profiles.iotKeypad import iotKeypad 
from izot.resources.profiles.iotAnalogOutput import iotAnalogOutput   

PROGRAM_ID = '9F:FF:FF:05:00:70:00:01'    # Program Id for Keypad application 
APP_NAME = 'keypad_example' 
APP_DESCRIPTION = 'The IzoT Keypad example application' 
APP_TYPE = ApplicationType.KEYPAD   

def main ():     
	global app     
	global keypad     
	global lux       

	framework = Framework (APP_NAME, APP_TYPE, APP_DESCRIPTION, PROGRAM_ID)     
	app = framework.app        # Get the app object from the framework     
	keypad = app.block (profile = iotKeypad())     
	lux    = app.block (profile = iotAnalogOutput()) 
      
	#     
	# For automatic ISI connections     
	# - the keypad is an ISI host   for the 'Light Level' function     
	# - the keypad is an ISI client for the 'Keypad'      function     
	def on_user_interface(sender, argument):         
		framework.isi.state = argument.event_code    # Update the isi engine 'state' in the framework         
		if argument.event_code == izot.device.isi.IsiEvent.WARM:             
			auto_enrollment_start()     
	# Event handler registration     
	app.isi.OnUserInterface += on_user_interface           

	def on_enrollment (sender, argument):         
		""" Checks whether incoming enrollment invitation is acceptable """         
		if argument.enrollment.type_id == lux_assembly.enrollment.type_id:             
			argument.result = lux_assembly         
		elif argument.enrollment.type_id == keypad_assembly.enrollment.type_id:             
			argument.result = keypad_assembly     
	# Event handler registration     
	app.isi.OnEnrollment += on_enrollment           

	# ISI Assembly objects     
	global lux_assembly     
	global keypad_assembly     
	keypad_assembly = izot.device.isi.Assembly(         
		assembly   = (keypad.nvoLoadControl, keypad.nviLoadStatus),         
		enrollment = izot.device.isi.Enrollment (             
			direction = izot.device.isi.IsiDirection.VARIOUS,             
			type_id = keypad.nvoLoadControl))     
	lux_assembly = izot.device.isi.Assembly (         
		assembly   = lux.nviAnalog,         
		enrollment = izot.device.isi.Enrollment (             
			direction = izot.device.isi.IsiDirection.INPUT,             
			type_id = lux.nviAnalog))     
	framework.assembly1 = keypad_assembly     
	framework.assembly2 = lux_assembly           

	# Configure, and start, the IzoT application     
	framework.app_start ()           

	# Add the standard console menu     
	framework_menu = FrameworkMenu(framework)           

	# Run the application     
	try:         
		done = False         
		while not done:             
			app.service(0.100)  # Allow the IzoT stack time to service its events                           

			# Test for user input             
			if kbhit(0.0):                 
				done = framework_menu.execute()     
	finally:         
		app.stop ()                 # Stop the IzoT applicationtext