Example #1
0
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
Example #2
0
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
Example #3
0
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