58 рядки
2.0 KiB
Python
58 рядки
2.0 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
|
|
import logging
|
|
import inspect
|
|
|
|
try:
|
|
from config import APP_NAME as ROOT_LOGGER_NAME
|
|
except ImportError:
|
|
ROOT_LOGGER_NAME = 'root'
|
|
logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__)
|
|
|
|
|
|
class room(object):
|
|
def __init__(self, mqtt_client):
|
|
self.mqtt_client = mqtt_client
|
|
|
|
def all_off(self, device=None, key=None, data=None):
|
|
logger.info("Switching all off \"%s\"", type(self).__name__)
|
|
for name, obj in inspect.getmembers(self):
|
|
try:
|
|
if obj.__module__ == 'devices':
|
|
obj.all_off()
|
|
except AttributeError:
|
|
pass # not a module or has no method all_off
|
|
|
|
|
|
class room_collection(object):
|
|
ALLOWED_CLASSES = ("room", "room_collection")
|
|
|
|
def __init__(self, mqtt_client):
|
|
self.mqtt_client = mqtt_client
|
|
|
|
def all_off(self, device=None, key=None, data=None):
|
|
logger.info("Switching all off \"%s\"", type(self).__name__)
|
|
for sub_name in dir(self):
|
|
# attribute name is not private
|
|
if not sub_name.startswith("__"):
|
|
sub = getattr(self, sub_name)
|
|
if sub.__class__.__bases__[0].__name__ in self.ALLOWED_CLASSES:
|
|
sub.all_off()
|
|
|
|
def all_devices(self, object_to_analyse=None, depth=0):
|
|
target = object_to_analyse or self
|
|
#
|
|
devices = []
|
|
for name, obj in inspect.getmembers(target):
|
|
if not callable(obj): # sort out methods
|
|
try:
|
|
if obj.__module__.startswith('function.') and not obj.__module__.endswith('.videv'):
|
|
devices.extend(self.all_devices(obj, depth+1)) # rekurse in function instances
|
|
elif obj.__module__ == "devices":
|
|
devices.append(obj)
|
|
except AttributeError:
|
|
pass # sort out non modules
|
|
return devices
|