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

Added discovery protocol. not really usefull because we still have to wait for token

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/branches/0.7@2381 b32b6428-25c9-4566-ad07-03861ab6144f
parent 00ce996f
Branches
No related tags found
No related merge requests found
......@@ -76,6 +76,8 @@ class AqaraDev(object):
self.on_report(data)
if cmd == 'heartbeat':
self.on_heartbeat(data)
elif cmd in ['iam']:
self.on_iam(pkt)
else:
logger.info(pkt)
......@@ -85,6 +87,9 @@ class AqaraDev(object):
def on_heartbeat(self,data):
#logger.info('Unhandled heartbeat %s' % data)
self.on_report(data)
def on_iam(self,data):
logging.info('Unhandled iam %s' % data)
class Switch(AqaraDev):
......@@ -380,6 +385,12 @@ class Gateway(AqaraDev):
#========================================================================
## GW Mutlicast messages handlers
#========================================================================
def search_ip(self,data):
ip = data.get('ip',None)
if ip and ip != self.ip:
self.ip = ip
logger.warning(f"GW IP found: {ip}")
def parse(self,pkt):
# extract the token before normal parsing
token = pkt.get('token',None)
......@@ -388,11 +399,7 @@ class Gateway(AqaraDev):
AqaraDev.parse(self,pkt)
def on_heartbeat(self,data):
ip = data.get('ip',None)
if ip and ip != self.ip:
self.ip = ip
logger.warning(f"GW IP found: {ip}")
self.search_ip(data)
if not self.ready :
if self.token and self.ip:
self.ready = True
......@@ -404,3 +411,6 @@ class Gateway(AqaraDev):
rgb = int(rgb)
if rgb != 0:
self.rgb = rgb
def on_iam(self,data):
self.search_ip(data)
\ No newline at end of file
......@@ -2,7 +2,7 @@ from gevent import monkey; monkey.patch_all()
import gevent
from xaal.lib import tools,Device
from .network import AqaraConnector
from .network import AqaraConnector,AqaraDiscovery
from . import devices
import inspect
......@@ -13,9 +13,8 @@ PACKAGE_NAME = 'xaal.aqara'
logger = logging.getLogger(PACKAGE_NAME)
class GW(gevent.Greenlet):
class GW(object):
def __init__(self,engine):
gevent.Greenlet.__init__(self)
self.engine = engine
self.devices = {}
atexit.register(self._exit)
......@@ -45,7 +44,10 @@ class GW(gevent.Greenlet):
def setup(self):
"""Start Aqara mutlicast receiver"""
self.aqara = AqaraConnector()
#self.aqara = AqaraConnector()
self.aqara = AqaraConnector.spawn(self)
self.discovery = AqaraDiscovery.spawn(self)
def get_device(self,sid,model):
cfg = self.cfg['devices']
......@@ -75,14 +77,8 @@ class GW(gevent.Greenlet):
self.cfg['devices'].update({sid:cfg})
return dev
def _run(self):
logger.info("GW ready, waiting for Aqara Hubs...")
while 1:
pkt = self.aqara.receive()
if pkt:
self.on_receive(pkt)
def on_receive(self,pkt):
""" Message callback, check network"""
sid = pkt.get('sid',None)
if not sid: return
model = pkt.get('model',None)
......@@ -98,5 +94,6 @@ class GW(gevent.Greenlet):
def setup(eng):
logger.info('Starting %s' % PACKAGE_NAME)
GW.spawn(eng)
#GW.spawn(eng)
gw = GW(eng)
return True
# xaal use multicast cnx too, so reuse it here.
# TODO : drop this
# xaal use multicast cnx too, so reuse it here. TODO : drop this
from xaal.lib import network
import logging
import json
import gevent
logger = logging.getLogger(__name__)
class AqaraConnector(object):
class AqaraConnector(gevent.Greenlet):
"""
Aqara Device Report/Heartbeat connector, used only to receive event, if you want to send a command,
you must send a unicast datagram to the right Aqara GW.
"""
def __init__(self):
def __init__(self,gw):
gevent.Greenlet.__init__(self)
self.gw = gw
self.nc = network.NetworkConnector('224.0.0.50',9898,10)
self.nc.connect()
......@@ -29,11 +28,20 @@ class AqaraConnector(object):
logger.debug('JSON decoder Error %s' % buf)
return None
def _run(self):
logger.info("AqaraConnector ready, waiting for hubs.")
while 1:
pkt = self.receive()
if pkt:
self.gw.on_receive(pkt)
class AqaraDiscovery:
""" Aqara Hubs discovery, not used right now"""
class AqaraDiscovery(gevent.Greenlet):
""" Aqara Hubs discovery."""
def __init__(self):
def __init__(self,gw):
gevent.Greenlet.__init__(self)
self.gw = gw
self.nc = network.NetworkConnector('224.0.0.50',4321,10)
self.nc.connect()
......@@ -41,7 +49,6 @@ class AqaraDiscovery:
buf = self.nc.receive()
if buf:
try:
#logger.warning(buf)
return json.loads(buf)
except ValueError:
logger.debug('JSON decoder Error %s' % buf)
......@@ -50,3 +57,11 @@ class AqaraDiscovery:
def discover(self):
h = {"cmd":"whois"}
self.nc.send(json.dumps(h).encode('utf-8'))
def _run(self):
logger.info("AqaraDiscovery ready, let's discover")
self.discover()
while 1:
pkt = self.receive()
if pkt:
self.gw.on_receive(pkt)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment