#!/usr/local/bin/python # Copyright (c) 2012-2014 Erik Johansson # # 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