Event handling (example)ΒΆ
The example below illustrates how event callbacks are registered and processed
using the default telldus.QueuedCallbackDispatcher
dispatcher.
For more information regarding the arguments to the callback functions, please refere to the official Telldus Core documentation (see the callback typedefs). Please note that the context mentioned there is not included in tellcore-py.
#!/usr/bin/env python
# Copyright (c) 2012-2014 Erik Johansson <erik@ejohansson.se>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA
import argparse
import sys
import tellcore.telldus as td
import tellcore.constants as const
METHODS = {const.TELLSTICK_TURNON: 'turn on',
const.TELLSTICK_TURNOFF: 'turn off',
const.TELLSTICK_BELL: 'bell',
const.TELLSTICK_TOGGLE: 'toggle',
const.TELLSTICK_DIM: 'dim',
const.TELLSTICK_LEARN: 'learn',
const.TELLSTICK_EXECUTE: 'execute',
const.TELLSTICK_UP: 'up',
const.TELLSTICK_DOWN: 'down',
const.TELLSTICK_STOP: 'stop'}
EVENTS = {const.TELLSTICK_DEVICE_ADDED: "added",
const.TELLSTICK_DEVICE_REMOVED: "removed",
const.TELLSTICK_DEVICE_CHANGED: "changed",
const.TELLSTICK_DEVICE_STATE_CHANGED: "state changed"}
CHANGES = {const.TELLSTICK_CHANGE_NAME: "name",
const.TELLSTICK_CHANGE_PROTOCOL: "protocol",
const.TELLSTICK_CHANGE_MODEL: "model",
const.TELLSTICK_CHANGE_METHOD: "method",
const.TELLSTICK_CHANGE_AVAILABLE: "available",
const.TELLSTICK_CHANGE_FIRMWARE: "firmware"}
TYPES = {const.TELLSTICK_CONTROLLER_TELLSTICK: 'tellstick',
const.TELLSTICK_CONTROLLER_TELLSTICK_DUO: "tellstick duo",
const.TELLSTICK_CONTROLLER_TELLSTICK_NET: "tellstick net"}
def device_event(id_, method, data, cid):
method_string = METHODS.get(method, "UNKNOWN METHOD {0}".format(method))
string = "[DEVICE] {0} -> {1}".format(id_, method_string)
if method == const.TELLSTICK_DIM:
string += " [{0}]".format(data)
print(string)
def device_change_event(id_, event, type_, cid):
event_string = EVENTS.get(event, "UNKNOWN EVENT {0}".format(event))
string = "[DEVICE_CHANGE] {0} {1}".format(event_string, id_)
if event == const.TELLSTICK_DEVICE_CHANGED:
type_string = CHANGES.get(type_, "UNKNOWN CHANGE {0}".format(type_))
string += " [{0}]".format(type_string)
print(string)
def raw_event(data, controller_id, cid):
string = "[RAW] {0} <- {1}".format(controller_id, data)
print(string)
def sensor_event(protocol, model, id_, dataType, value, timestamp, cid):
string = "[SENSOR] {0} [{1}/{2}] ({3}) @ {4} <- {5}".format(
id_, protocol, model, dataType, timestamp, value)
print(string)
def controller_event(id_, event, type_, new_value, cid):
event_string = EVENTS.get(event, "UNKNOWN EVENT {0}".format(event))
string = "[CONTROLLER] {0} {1}".format(event_string, id_)
if event == const.TELLSTICK_DEVICE_ADDED:
type_string = TYPES.get(type_, "UNKNOWN TYPE {0}".format(type_))
string += " {0}".format(type_string)
elif (event == const.TELLSTICK_DEVICE_CHANGED
or event == const.TELLSTICK_DEVICE_STATE_CHANGED):
type_string = CHANGES.get(type_, "UNKNOWN CHANGE {0}".format(type_))
string += " [{0}] -> {1}".format(type_string, new_value)
print(string)
parser = argparse.ArgumentParser(description='Listen for Telldus events.')
parser.add_argument(
'--all', action='store_true', help='Trace all events')
parser.add_argument(
'--device', action='store_true', help='Trace device events')
parser.add_argument(
'--change', action='store_true', help='Trace device change events')
parser.add_argument(
'--raw', action='store_true', help='Trace raw events')
parser.add_argument(
'--sensor', action='store_true', help='Trace sensor events')
parser.add_argument(
'--controller', action='store_true', help='Trace controller events')
args = vars(parser.parse_args())
try:
import asyncio
loop = asyncio.get_event_loop()
dispatcher = td.AsyncioCallbackDispatcher(loop)
except ImportError:
loop = None
dispatcher = td.QueuedCallbackDispatcher()
core = td.TelldusCore(callback_dispatcher=dispatcher)
callbacks = []
for arg in args:
if not (args[arg] or args['all']):
continue
try:
if arg == 'device':
callbacks.append(core.register_device_event(device_event))
elif arg == 'change':
callbacks.append(
core.register_device_change_event(device_change_event))
elif arg == 'raw':
callbacks.append(core.register_raw_device_event(raw_event))
elif arg == 'sensor':
callbacks.append(core.register_sensor_event(sensor_event))
elif arg == 'controller':
callbacks.append(core.register_controller_event(controller_event))
else:
assert arg == 'all'
except AttributeError:
if not args['all']:
raise
if len(callbacks) == 0:
print("Must enable at least one event")
parser.print_usage()
sys.exit(1)
try:
if loop:
loop.run_forever()
else:
import time
while True:
core.callback_dispatcher.process_pending_callbacks()
time.sleep(0.5)
except KeyboardInterrupt:
pass