Skip to content
Snippets Groups Projects
Commit 0fc71f1e authored by jkerdreu's avatar jkerdreu
Browse files

Initial release



git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/branches/0.7@2673 b32b6428-25c9-4566-ad07-03861ab6144f
parent 9d8ba8d0
Branches
No related tags found
No related merge requests found
from setuptools import setup,find_packages
with open('README.rst') as f:
long_description = f.read()
VERSION = "0.1"
setup(
name='xaal.sensefloor',
version=VERSION,
license='GPL License',
author='Jerome Kerdreux',
author_email='Jerome.Kerdreux@imt-atlantique.fr',
#url='',
description=('xAAL devices for Future Shape Sense Floor' ),
long_description=long_description,
classifiers=[
'Programming Language :: Python',
'Topic :: Software Development :: Libraries :: Python Modules',
],
keywords=['xaal', 'Sense Floor'],
platforms='any',
packages=find_packages(),
include_package_data=True,
install_requires=[
'xaal.lib',
'python-socketio==5.0.0',
]
)
#from gevent import monkey; monkey.patch_all()
import asyncio
from re import I
import socketio
import time
from xaal.lib import Device,tools
from xaal.lib.asyncio import Engine
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.getLogger('socketio.client').setLevel(logging.WARNING)
logging.getLogger('engineio').setLevel(logging.WARNING)
sio = socketio.AsyncClient(engineio_logger=True,ssl_verify=False)
dev = Device('stupid.basic',tools.get_random_uuid())
@sio.event
async def connect():
print('connection established')
@sio.event
def installation(data, useBI):
#import pdb;pdb.set_trace()
alarms = data['alarms']
for k in alarms:
print(k)
print()
@sio.event
async def event_attributeChanges(data):
print('attributeChange evt:', data)
addr = tools.get_uuid(data['address'])
if addr != dev.address: # it's not my own message ?
dev.attributes[0].value = int(time.time())
def installation_new(data):
alarms = data['alarms']
for k in alarms:
print(k)
print()
def activity_on_fields(data):
#print(data)
pass
def fall_detected(*args):
#print("FALL")
print(args)
def alarms_detected(ff):
#print(args)
import pdb;pdb.set_trace()
sio.on('installation-new',installation_new)
sio.on('new-activity-on-fields',activity_on_fields)
#sio.on('falls-detected',fall_detected)
sio.on('alarms-detected',alarms_detected)
@sio.event
async def disconnect():
print('disconnected from server')
async def run_sio():
await sio.connect('http://floor1.enstb.org:8000/')#transports='polling')
#await sio.connect('http://localhost:9099/',transports='websocket')
await sio.wait()
async def run_xaal():
eng = Engine()
dev.new_attribute('last_msg')
eng.add_device(dev)
await eng.run()
if __name__ == '__main__':
tasks = [ asyncio.ensure_future(run_sio()), asyncio.ensure_future(run_xaal()), ]
#tasks = [ asyncio.ensure_future(run_sio()), ]
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(asyncio.wait(tasks))
except KeyboardInterrupt:
print('Bye')
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
#from .gw import setup
\ No newline at end of file
from . import gw
from xaal.lib import helpers
from xaal.lib.asyncio import AsyncEngine
#helpers.run_package(gw.PACKAGE_NAME,gw.setup)
helpers.setup_console_logger(gw.PACKAGE_NAME)
gw.run()
from xaal.lib import tools,Device
from xaal.lib.asyncio import AsyncEngine
from xaal.schemas import devices
import asyncio
import socketio
import atexit
import logging
logging.getLogger('socketio.client').setLevel(logging.WARNING)
logging.getLogger('engineio').setLevel(logging.WARNING)
PACKAGE_NAME = 'xaal.sensefloor'
logger = logging.getLogger(PACKAGE_NAME)
class MotionDev:
def __int__(self,idx,addr):
self.idx = idx
self.addr = addr
class FallDev:
def __int__(self,idx,addr):
self.idx = idx
self.addr = addr
class GW(object):
def __init__(self,engine):
self.engine = engine
self.devices = {}
atexit.register(self._exit)
self.config()
self.setup()
def config(self):
cfg = tools.load_cfg(PACKAGE_NAME)
if not cfg:
cfg= tools.new_cfg(PACKAGE_NAME)
cfg['config']['url']='http://floor1.enstb.org:8000/'
cfg['devices'] = {}
logger.warn("Created an empty config file")
cfg.write()
self.cfg = cfg
def setup(self):
# socketio config
self.sio = socketio.AsyncClient(engineio_logger=True,ssl_verify=False)
self.sio.on('alarms-detected',self.on_alarm)
# xaal gateway
addr = tools.get_uuid(self.cfg['config']['addr'])
self.gw = devices.gateway(addr)
self.engine.add_device(self.gw)
for k in self.cfg['devices']:
cfg = self.cfg['devices'][k]
dev = self.add_device(k,cfg['type'],tools.get_uuid(cfg['addr']))
self.engine.add_device(dev)
def add_device(self,idx,al_type,addr=None):
if not addr:
addr = tools.get_random_uuid()
dev = None
if al_type == 'fall':
dev = devices.falldetector(addr)
if al_type == 'presence':
dev = devices.motion(addr)
if dev==None:
return
logger.debug(f"New device {addr} {idx}")
dev.vendor_id = 'Future Shape'
dev.product_id='SenseFloor'
dev.info='zone index: %s' % idx
self.devices.update({idx:dev})
self.engine.add_device(dev)
return dev
def get_device(self,idx,al_type):
dev = self.devices.get(idx,None)
return dev
def on_alarm(self,data):
for k in data:
idx = str(k['index'])
al_type = k['type']
state = k['state']
dev = self.get_device(idx,al_type)
if dev == None:
dev = self.add_device(idx,al_type)
self.cfg['devices'][str(idx)] = {'addr':dev.address,'type':al_type}
if dev.dev_type=='motion.basic':
dev.attributes['presence'] = state
print("%s %s %s %s"%(dev.address,idx,al_type,state))
def _exit(self):
cfg = tools.load_cfg(PACKAGE_NAME)
if cfg != self.cfg:
logger.info('Saving configuration file')
self.cfg.write()
async def xaal_task(self):
await self.engine.run()
async def sio_task(self):
url = self.cfg['config']['url']
await self.sio.connect(url)#transports='polling')
await self.sio.wait()
def run():
eng = AsyncEngine()
gw = GW(eng)
tasks = [ asyncio.ensure_future(gw.xaal_task()), asyncio.ensure_future(gw.sio_task())]
loop = asyncio.get_event_loop()
try:
#loop.run_until_complete(asyncio.wait(tasks))
loop.run_forever()
except KeyboardInterrupt:
print('Bye')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment