class ArdyhClient(TornadoWebSocketClient): """ Web Socket client to connect to ardyh on start up. Data is passed back and forth using a message object. the message object is a JSON Object with the following keywords - message -- name -- from -- channel -- message -- command -- ardyh_timestamp - May not be present """ def __init__(self, protocols, uri='ws://173.255.213.55:9093/ws?'): rs = super(ArdyhClient, self).__init__(uri, protocols) self.ARDYH_URI = uri self.LOG_DTFORMAT = "%H:%M:%S" self.CTENOPHORE = CTENOPHORE self.channel = settings['bot_name'] # set the name to MAC address if not found. self.bot_name = settings['bot_name'] self.bot_roles = settings['bot_roles'] self.core = Core() self.router = Router() def opened(self): print "Connection to ardh is open" message = {'bot_name':self.bot_name, 'bot_roles':self.bot_roles, 'mac':get_mac_address(), 'handshake':True, 'subscriptions':settings['subscriptions'] } self.send(message) if ["jjbot", "grovebot"] and settings["bot_packages"]: print "Registering IO Loop callback" sensors = tornado.ioloop.PeriodicCallback(self.loopCallback, LOOP_CALLBACK_DT*1000) sensors.start() def received_message(self, message): self.router.received_message(message) def send(self, message): """ Message should be of the form {MESSAGE_OBJ} - message -- bot_name -- from -- message -- command -- channel -- ardyh_timestamp - May not be present """ channel = settings['bot_name'] message.update({ "bot_name":self.bot_name, "channel":self.channel }) message = json.dumps(message) if VERBOSE: print "[ArdyhClient.send] Send message:\n\n%s" %(message) try: super(ArdyhClient, self).send(message) except: print "[ERROR] Message not send() failed." print sys.exc_info()[0] def closed(self, code, reason=None): print "Closed down", code, reason ioloop.IOLoop.instance().stop() def log(self, message): now = dt.now().strftime(self.LOG_DTFORMAT) message = "[%s] %s" %(now, message) print message self.send(message) def loopCallback(self): if "jjbot" in settings["bot_packages"]: sensor_values = self.get_sensors_values('jjbot') # This is where to sensor values get sent to ardyh out = {"message": {"sensor_values":sensor_values, "sensor_package":"jjbot"} } if "grovebot" in settings["bot_packages"]: sensor_values = self.get_sensors_values('grovebot') # This is where to sensor values get sent to ardyh out = {"message": {"sensor_values":sensor_values, "sensor_package":"grovebot"} } self.send(out) def get_sensors_values(self, bot_package): if bot_package == 'jjbot': out = [ ['PORT_1', BrickPi.Sensor[PORT_1]], ['PORT_2', BrickPi.Sensor[PORT_2]], ['PORT_3', BrickPi.Sensor[PORT_3]], ['PORT_4', BrickPi.Sensor[PORT_4]], ] if bot_package == 'grovebot': out = grovePiSensorValues.toDict() return out
class ArdyhClient(TornadoWebSocketClient): """ Web Socket client to connect to ardyh on start up. Data is passed back and forth using a message object. the message object is a JSON Object with the following keywords - message -- name -- from -- channel -- message -- command -- ardyh_timestamp - May not be present """ def __init__(self, protocols, uri='ws://173.255.213.55:9093/ws?'): super(ArdyhClient, self).__init__(uri, protocols) self.ARDYH_URI = uri self.LOG_DTFORMAT = "%Y-%m-%dT%H:%M:%SZ" self.channel = settings['bot_name'] self.bot_name = settings['bot_name'] self.bot_roles = settings['bot_roles'] self.router = Router(self) def send_handshake(self): local_ip = commands.getoutput("hostname -I") message = { 'bot_name': self.bot_name, 'bot_roles': self.bot_roles, 'mac': get_mac_address(), 'handshake': True, 'subscriptions': settings['subscriptions'], 'sensors': SENSORS, 'local_ip': local_ip } print "Sending handshake" self.send(message) def opened(self): print "Connection to ardh is open" self.send_handshake() if ["jjbot", "grovebot"] and settings["bot_packages"]: print "Registering IO Loop callback" sensors = tornado.ioloop.PeriodicCallback(self.loopCallback, LOOP_CALLBACK_DT * 1000) sensors.start() def received_message(self, message): self.router.received_message(message) def send(self, message): """ Messages should be of the form data : { timestamp : "", bot_name : "", message : { command kwargs } } """ if VERBOSE: print "[ArdyhClient.send] Trying to send message:\n\n%s" %(message) timestamp = now = dt.now().strftime(self.LOG_DTFORMAT) message.update({ "bot_name":self.bot_name, "timestamp": timestamp }) message = json.dumps(message) if VERBOSE: print "[ArdyhClient.send] Send message:\n\n%s" %(message) try: super(ArdyhClient, self).send(message) except: print "[ERROR] Message not send() failed." print sys.exc_info()[0] def closed(self, code, reason=None): print "Closed down" #import pdb; pdb.set_trace() #self.connect() ioloop.IOLoop.instance().stop() #ioloop.IOLoop.instance().start() def log(self, message): now = dt.now().strftime(self.LOG_DTFORMAT) message = "[%s] %s" %(now, message) print message #self.send(message) def loopCallback(self): out = {} if "jjbot" in settings["bot_packages"]: sensor_values = self.get_sensors_values('jjbot') # This is where to sensor values get sent to ardyh sensor_values.update({'bot_package':'jjbot'}) out = {"message": {"command":"sensor_values", "kwargs":sensor_values }} if out: self.send(out) if "grovebot" in settings["bot_packages"]: self.router.grovebot.read_sensors({}) # sensor_values = self.get_sensors_values('grovebot') # This is where to sensor values get sent to ardyh # sensor_values.update({'bot_package':'grovebot'}) def get_sensors_values(self, bot_package): """ Returns a dict with sensors values. """ if bot_package == 'jjbot': out = { 'PORT_1': BrickPi.Sensor[PORT_1], 'PORT_2': BrickPi.Sensor[PORT_2], 'PORT_3': BrickPi.Sensor[PORT_3], 'PORT_4': BrickPi.Sensor[PORT_4], } if bot_package == 'grovebot': out = grovePiSensorValues.toDict() return out
class SkynetClient(object): """ Web Socket client to connect to ardyh on start up. Data is passed back and forth using a message object. the message object is a JSON Object with the following keywords - message -- name -- from -- channel -- message -- command -- ardyh_timestamp - May not be present """ def __init__(self, uri, port): self.LOG_DTFORMAT = "%H:%M:%S" self.channel = settings['bot_name'] self.uuid = SKYNET_UUID self.token = SKYNET_TOKEN # set the name to MAC address if not found. self.bot_name = settings['bot_name'] self.bot_roles = settings['bot_roles'] self.core = Core() self.router = Router() self.connect(uri, port) print "[__init__()] Finished connecting" def connect(self, uri, port): global socketIO with SocketIO(uri, port) as socketIO: print ('Connecting') socketIO.on('identify',self.opened) socketIO.wait(4) #wait 4 seconds to be sure you get an identify back print "[connect()] Sending identify request" socketIO.emit('identity',{'uuid':self.uuid,'token':self.token,'socketid':self.socketId}) socketIO.on('ready',self.on_ready) socketIO.wait(4) #wait 4 seconds to be sure you get an identify back def opened(self, *args): print "Connection to skynet is open" self.socketId = args[0]['socketid'] # message = {'bot_name':self.bot_name, # 'bot_roles':self.bot_roles, # 'mac':get_mac_address(), # 'handshake':True, # 'subscriptions':settings['subscriptions'] # } # self.send(message) # if ["jjbot", "grovebot"] and settings["bot_packages"]: # print "Registering IO Loop callback" # sensors = tornado.ioloop.PeriodicCallback(self.loopCallback, LOOP_CALLBACK_DT*1000) # sensors.start() def on_ready(self, *args): print('we are ready') res = args[0] if res['status'] == 201: while True: socketIO.wait(1) self.loopCallback() else: print "[on_ready()] Could not establish ready state." def received_message(self, message): self.router.received_message(message) def send(self, message): """ Message should be of the form {MESSAGE_OBJ} - message -- bot_name -- from -- message -- command -- channel -- ardyh_timestamp - May not be present """ channel = settings['bot_name'] message.update({ "bot_name":self.bot_name, "channel":self.channel }) message = json.dumps(message) if VERBOSE: print "[ArdyhClient.send] Send message:\n\n%s" %(message) try: super(ArdyhClient, self).send(message) except: print "[ERROR] Message not send() failed." print sys.exc_info()[0] def closed(self, code, reason=None): print "Closed down", code, reason ioloop.IOLoop.instance().stop() def log(self, message): now = dt.now().strftime(self.LOG_DTFORMAT) message = "[%s] %s" %(now, message) print message self.send(message) def loopCallback(self): if "jjbot" in settings["bot_packages"]: sensor_values = self.get_sensors_values('jjbot') # This is where to sensor values get sent to ardyh out = {"message": {"sensor_values":sensor_values, "sensor_package":"jjbot"} } if "grovebot" in settings["bot_packages"]: sensor_values = self.get_sensors_values('grovebot') # This is where to sensor values get sent to ardyh out = {"message": {"sensor_values":sensor_values, "sensor_package":"grovebot"} } print out def get_sensors_values(self, bot_package): if bot_package == 'jjbot': out = [ ['PORT_1', BrickPi.Sensor[PORT_1]], ['PORT_2', BrickPi.Sensor[PORT_2]], ['PORT_3', BrickPi.Sensor[PORT_3]], ['PORT_4', BrickPi.Sensor[PORT_4]], ] if bot_package == 'grovebot': out = grovePiSensorValues.toDict() return out