Skip to content
Snippets Groups Projects
Commit 588d8826 authored by jkerdreu's avatar jkerdreu
Browse files

Edisio switches done :)

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/trunk@2101 b32b6428-25c9-4566-ad07-03861ab6144f
parent 373e961d
No related branches found
No related tags found
No related merge requests found
......@@ -8,6 +8,7 @@ from xaal.schemas import devices
import platform
import logging
import serial
import time
PACKAGE_NAME = "xaal.edisio"
logger = logging.getLogger(PACKAGE_NAME)
......@@ -18,6 +19,12 @@ def hex_to_str(data):
r = r + '%02x ' % k
return r
def addr_to_str(addr):
r = ""
for k in addr:
r = r + '%02x' % k
return r
class GW(gevent.Greenlet):
def __init__(self,engine):
......@@ -26,13 +33,14 @@ class GW(gevent.Greenlet):
self.config()
self.setup()
self.setup_gw()
self.devices = {}
def config(self):
cfg = tools.load_cfg(PACKAGE_NAME)
if not cfg:
cfg= tools.new_cfg(PACKAGE_NAME)
cfg['config']['port'] = '/dev/ttyUSB0'
cfg['devices'] = {}
cfg['config']['base_addr'] = tools.get_random_uuid()[0:-10]
logger.warn("Created an empty config file")
cfg.write()
self.cfg = cfg
......@@ -53,19 +61,78 @@ class GW(gevent.Greenlet):
gw.product_id = "Edisio Gateway"
gw.version = 0.1
gw.info = "%s@%s" % (PACKAGE_NAME,platform.node())
#emb = gw.new_attribute('embedded',[])
#emb.value = [io.dev.address for io in self.in_out]
#self.engine.add_device(gw)
self.gw = gw
def _run(self):
self.stack = bytearray()
self.last_pkt = bytearray()
self.last_pkt_t = 0
while 1:
data = self.ser.read(16)
if data:
self.parse_data(data)
def split(self,data):
data_size = len(data)
chunk = []
result = data
for i in range(0,data_size):
if (i+3) > data_size:
break
if (data[i+1]==0x64) and (data[i+2]==0xd) and (data[i+3]==0xa):
chunk=data[0:i]
result = data[i+4:]
return chunk,result
def parse_data(self,data):
logger.debug("[%s] %s" % (len(data),hex_to_str(data)))
data = self.stack + data
pkt,stack = self.split(data)
if pkt:
self.parse_pkt(pkt)
self.stack = stack
def filter(self,pkt):
r = True
if (pkt == self.last_pkt) and (time.time()-self.last_pkt_t < 0.5):
r = False
self.last_pkt = pkt
self.last_pkt_t = time.time()
return r
def parse_pkt(self,pkt):
if len(pkt)!=12:
return
if (pkt[0]==0x6c) and (pkt[1]==0x76) and (pkt[2]==0x63):
if self.filter(pkt):
addr = addr_to_str(pkt[3:7])
btn = int(pkt[7])
logger.debug("%s %s" % (addr,btn))
self.send_notif(addr,btn)
def send_notif(self,addr,btn):
if addr not in self.devices.keys():
self.add_buttons(addr)
dev = self.devices[addr][btn-1]
if dev:
dev.send_notification('click')
def add_buttons(self,addr):
base_addr = self.cfg['config'].get('base_addr')
group_id = tools.get_random_uuid()
l = []
for i in range(0,8):
btn = Device('button.basic',base_addr+addr+'%02d'%(i+1))
btn.vendor_id = 'Edisio'
btn.product_id = 'Edision Switches'
btn.hw_id = 'Btn:%s/%s' % (addr,i)
btn.info = 'Edisio ' + btn.hw_id
btn.group_id = group_id
l.append(btn)
self.engine.add_device(btn)
self.devices.update({addr:l})
def setup(engine):
GW.spawn(engine)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment