Skip to content
Snippets Groups Projects
Commit 55f7a8ec authored by jkerdreu's avatar jkerdreu
Browse files

Added device_class_finder(), and mixin for OnOff() ..

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/trunk@1983 b32b6428-25c9-4566-ad07-03861ab6144f
parent 08d1df7c
Branches
No related tags found
No related merge requests found
......@@ -4,29 +4,33 @@ from . import dpts
# match and attribute
def bool_(attribute,data,dpt):
def bool_(attribute,dpt,data):
val = dpts.decode[dpt](data)
attribute.value = bool(val)
def bool_inv(attribute,data,dpt):
def bool_inv(attribute,dpt,data):
val = dpts.decode[dpt](data)
attribute.value = not bool(val)
def on_off(attribute,data,dpt):
def on_off(attribute,dpt,data):
val = bool(dpts.decode[dpt](data))
if val:
attribute.value = 'ON'
else:
attribute.value = 'OFF'
def round_(attribute,data,dpt):
def round_(attribute,dpt,data):
val = dpts.decode[dpt](data)
attribute.value = round(val)
def set_(attribute,dpt,data):
val = dpts.decode[dpt](data)
attribute.value = val
funct = {
"bool" : bool_,
"bool_inv" : bool_inv,
"round" : round_,
"set" : set_,
"on_off" : on_off,
}
\ No newline at end of file
......@@ -6,9 +6,9 @@ from functools import partial
logger = logging.getLogger(__name__)
class KNXDev:
def __init__(self,gw,cfg):
#print(extract_classname(self))
self.gateway= gw
self.cfg = cfg
self.attributes_binding = {}
......@@ -20,11 +20,13 @@ class KNXDev:
logger.warn("Please define setup() in this device")
def write(self,group_addr,dpt,data):
""" return a function to be call to write the data to right group_addr """
func = partial(self.gateway.knx.write,group_addr,data,dpt)
return func
def bind_attribute(self,group_addr,attribute,func,dpt):
ptr = partial(func,attribute,data=None,dpt='1')
def bind_attribute(self,attribute,group_addr,func,dpt):
""" bind a group_addr to a xaal attribute, and apply the func """
ptr = partial(func,attribute,dpt,data=None)
self.attributes_binding.update({group_addr: ptr})
def parse(self,cemi):
......@@ -32,45 +34,58 @@ class KNXDev:
func = self.attributes_binding[cemi.group_addr]
func(data=cemi.data)
class PowerRelay(KNXDev):
def setup(self):
self.dev = devices.powerrelay(self.addr)
# =============================================================================
# PowerRelay / Lamp ..
# =============================================================================
class OnOffMixin:
def setup_onoff(self,state_attribute):
cmd = self.cfg.get('cmd',None)
if cmd:
self.dev.add_method('on', self.write(cmd,'1',1))
self.dev.add_method('off',self.write(cmd,'1',0))
state = self.cfg.get('state',None)
if state == None:
if cmd: state = cmd
state = self.cfg.get('state',None) or cmd
mod = self.cfg.get('mod','bool')
if state:
self.bind_attribute(state,self.dev.get_attribute("power"),funct['bool'],'1')
self.dev.info = cmd or state
self.bind_attribute(state_attribute,state,funct[mod],'1')
self.dev.info = "KNX %s" % cmd or state
class PowerRelay(KNXDev,OnOffMixin):
def setup(self):
self.dev = devices.powerrelay(self.addr)
self.setup_onoff(self.dev.get_attribute("power"))
class PowerRelayToggle(KNXDev,OnOffMixin):
def setup(self):
self.dev = devices.powerrelay_toggle(self.addr)
self.setup_onoff(self.dev.get_attribute("power"))
toggle = self.cfg.get('toggle',None)
if toggle:
self.dev.add_method('toggle', self.write(toggle,'1',1))
class Lamp(KNXDev):
class Lamp(KNXDev,OnOffMixin):
def setup(self):
self.dev = devices.lamp(self.addr)
cmd = self.cfg.get('cmd',None)
if cmd:
self.dev.add_method('on', self.write(cmd,'1',1))
self.dev.add_method('off',self.write(cmd,'1',0))
self.setup_onoff(self.dev.get_attribute("light"))
class Switch(KNXDev):
def setup(self):
self.dev = devices.switch(self.addr)
state = self.cfg.get('state',None)
if state == None:
if cmd: state = cmd
if state:
self.bind_attribute(state,self.dev.get_attribute("light"),funct['bool'],'1')
self.dev.info = cmd or state
self.bind_attribute(self.dev.get_attribute('position'),state,funct['bool'],'1')
self.dev.info = "KNX %s" % state
# =============================================================================
# Sensors
# =============================================================================
class PowerMeter(KNXDev):
def setup(self,addr):
def setup(self):
self.dev = devices.powermeter(self.addr)
state = self.cfg.get('state',None)
if state == None:
self.bind_attribute(state,self.dev.get_attribute('power'),funct['round'],'9')
self.dev.info = state
types = {
'PowerRelay' : PowerRelay,
'Lamp' : Lamp,
'PowerMeter' : PowerMeter
}
\ No newline at end of file
self.dev.unsupported_attributes = ['devices']
power = self.cfg.get('power',None)
p_dpt = self.cfg.get('power_dpt','9')
p_mod = self.cfg.get('power_mod','set')
if power:
self.bind_attribute(self.dev.get_attribute('power'),power,funct[p_mod],p_dpt)
self.dev.info = "KNX %s" % power
\ No newline at end of file
......@@ -5,10 +5,24 @@ from xaal.lib import tools,Device,Engine
from .knxrouter import KNXConnector
from . import devices
import inspect
PACKAGE_NAME = 'xaal.knx'
logger = tools.get_logger(PACKAGE_NAME,'DEBUG')
def device_class_finder():
""" look trought the device module to find binding class"""
BLACK_LIST = ['KNXDev','partial']
result = {}
dict_ = devices.__dict__
for k in dir(devices):
target = dict_[k]
if (inspect.isclass(target)) and (k not in BLACK_LIST):
if str(k).endswith('Mixin'):continue
result.update({k.upper():target})
return result
class GW(gevent.Greenlet):
def __init__(self,engine):
gevent.Greenlet.__init__(self)
......@@ -36,8 +50,9 @@ class GW(gevent.Greenlet):
self.knx = KNXConnector()
devs = self.cfg['devices']
devices_class = device_class_finder()
for k in devs:
klass = devices.types.get(devs[k]['type'],None)
klass = devices_class.get(devs[k]['type'].upper(),None)
if klass:
dev = klass(self,devs[k])
xaal_dev = dev.dev
......@@ -45,6 +60,8 @@ class GW(gevent.Greenlet):
xaal_dev.version = 0.1
xaal_dev.product_id = 'KNX ' + devs[k]['type']
self.devices.append(dev)
else:
logger.warn("Unkown device type %s" % devs[k]['type'])
l = [k.dev for k in self.devices]
self.engine.add_devices(l)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment