Example #1
0
 def onAdaptorService(self, msg):
     self.cbLog("debug", "Service msg: " + str(msg))
     (services, serviceid) = self._parseServices(msg)
     self.cbLog("debug",
                "Service Id: " + str(serviceid) + " " + str(services))
     if services.has_key('binary_sensor'):
         if services.has_key('switch'):
             self.switchId = serviceid
             self._requestData(serviceid, ['connected'], [0])
             self.cbLog("info", "SWITCH FOUND: " + str(self.switchId))
         elif not services.has_key("gpio"):
             self.smokeId = serviceid
             self._requestData(serviceid,
                               ['binary_sensor', 'battery', 'connected'],
                               [0, 0, 0])
             self.cbLog("info",
                        "SMOKE DETECTOR FOUND: " + str(self.smokeId))
     if services.has_key('gpio'):
         self.gpioId = serviceid
         self._requestData(serviceid, ['gpio'], [0])
         self.cbLog("info", "GPIO FOUND: " + str(self.gpioId))
     if self.smokeId and self.switchId and self.gpioId and not self.km:
         # Only start KM after all the adaptors are connected
         self.km = CbKitchenMinder(self)
         # km.update not implemented yet & LoopingCall has been problematic. Commented-out.
         #t = task.LoopingCall(self.km.update)
         #t.start(1.0)
         self._setState('running')
         self.cbLog("info",
                    " ------- All devices connected. Started KM ---------")
Example #2
0
 def onAdaptorService(self, msg):
     self.cbLog("debug", "Service msg: " + str(msg))
     (services, serviceid) = self._parseServices(msg)
     self.cbLog("debug", "Service Id: " + str(serviceid) + " " + str(services))
     if services.has_key('binary_sensor'):
         if services.has_key('switch'):
             self.switchId = serviceid
             self._requestData(serviceid, ['connected'], [0])
             self.cbLog("info", "SWITCH FOUND: " + str(self.switchId))
         elif not services.has_key("gpio"):
             self.smokeId = serviceid
             self._requestData(serviceid, ['binary_sensor', 'battery', 'connected'], [0, 0, 0])
             self.cbLog("info", "SMOKE DETECTOR FOUND: " + str(self.smokeId))
     if services.has_key('gpio'):
         self.gpioId = serviceid
         self._requestData(serviceid, ['gpio'], [0])
         self.cbLog("info", "GPIO FOUND: " + str(self.gpioId))
     if self.smokeId and self.switchId and self.gpioId and not self.km:
         # Only start KM after all the adaptors are connected
         self.km = CbKitchenMinder(self)
         # km.update not implemented yet & LoopingCall has been problematic. Commented-out.
         #t = task.LoopingCall(self.km.update)
         #t.start(1.0)
         self._setState('running')
         self.cbLog("info", " ------- All devices connected. Started KM ---------")
Example #3
0
class App(CbApp):
    def __init__(self, argv):
        self.smokeId = None
        self.switchId = None
        self.gpioId = None
        self.smokeConnected = True
        self.switchConnected = True
        self.km = None
        self.dm = None
        CbApp.__init__(self, argv)

    # Local helper functions
    def _setState(self, action):
        self.state = action
        msg = {"id": self.id,
               "status": "state",
               "state": self.state}
        self.sendManagerMessage(msg)

    def _parseServices(self, msg):
        services = {}
        for s in msg['service']:
            services[s['characteristic']] = s
        return (services, self._getId(msg))

    def _requestData(self, serviceid, services, intervals):
        if serviceid == None:
            self.cbLog("debug", "requestData, serviceid not set")
            return
        self.cbLog("debug", "<----- requestData: " + str(services) + " @ " + str(intervals))
        sreqs = []
        assert len(services) == len(intervals)
        for s, i in zip(services, intervals):
            sreqs.append({'characteristic': s, 'interval': i})
        req = {'id': self.id, 'request': 'service', 'service': sreqs}
        self.cbLog("debug", "requestData sending: " + json.dumps(req, indent=4))
        self.sendMessage(req, serviceid)

    def _getId(self, msg):
        return msg['id']

    def _getTS(self, msg):
        return msg['timeStamp']

    def _getData(self, msg, characteristic):
        if msg['characteristic'] == characteristic:
            return msg['data']
        else:
            return None

    def _sendData(self, serviceid, data):
        if serviceid == None:
            self.cbLog("debug", "sendData, serviceid not set")
            return
        self.cbLog("debug", "-----> sendData: " + str(data))
        cmd = {'id': self.id, 'request': 'command', 'data': data}
        self.sendMessage(cmd, serviceid)

    # Functions called automagically by CB framework
    def onAdaptorService(self, msg):
        self.cbLog("debug", "Service msg: " + str(msg))
        (services, serviceid) = self._parseServices(msg)
        self.cbLog("debug", "Service Id: " + str(serviceid) + " " + str(services))
        if services.has_key('binary_sensor'):
            if services.has_key('switch'):
                self.switchId = serviceid
                self._requestData(serviceid, ['connected'], [0])
                self.cbLog("info", "SWITCH FOUND: " + str(self.switchId))
            elif not services.has_key("gpio"):
                self.smokeId = serviceid
                self._requestData(serviceid, ['binary_sensor', 'battery', 'connected'], [0, 0, 0])
                self.cbLog("info", "SMOKE DETECTOR FOUND: " + str(self.smokeId))
        if services.has_key('gpio'):
            self.gpioId = serviceid
            self._requestData(serviceid, ['gpio'], [0])
            self.cbLog("info", "GPIO FOUND: " + str(self.gpioId))
        if self.smokeId and self.switchId and self.gpioId and not self.km:
            # Only start KM after all the adaptors are connected
            self.km = CbKitchenMinder(self)
            # km.update not implemented yet & LoopingCall has been problematic. Commented-out.
            #t = task.LoopingCall(self.km.update)
            #t.start(1.0)
            self._setState('running')
            self.cbLog("info", " ------- All devices connected. Started KM ---------")

    def onAdaptorData(self, msg):
        self.cbLog("debug", "onAdaptorData,  message: " + str(msg))
        event = "Smoke"
        if self.km:
            event = None
            if self._getId(msg) == self.smokeId:
                timeStamp = self._getTS(msg)
                sensor = self._getData(msg, 'binary_sensor')
                if sensor != None:
                    if sensor == 'on':
                        event = 'Smoke'
                    else:
                        event = 'NoSmoke'
                    self.km.addEvent(event)
                    self.dm.storeEvent(timeStamp, event)
                level = self._getData(msg, 'battery')
                if level != None:
                    self.dm.storeBattery(timeStamp, level)
                connected = self._getData(msg, 'connected')
                if connected != None:
                    changed = (self.smokeConnected != connected)
                    self.smokeConnected = connected
                    if changed:
                        if self.smokeConnected and self.switchConnected:
                            event = 'Connected'
                        else:
                            event = 'NotConnected'
                        self.km.addEvent(event)
                        self.dm.storeEvent(timeStamp, event)
            elif self._getId(msg) == self.switchId:
                timeStamp = self._getTS(msg)
                connected = self._getData(msg, 'connected')
                if connected != None:
                    changed = (self.switchConnected != connected)
                    self.switchConnected = connected
                    if changed:
                        if self.smokeConnected and self.switchConnected:
                            event = 'Connected'
                        else:
                            event = 'NotConnected'
                        self.km.addEvent(event)
                        self.dm.storeEvent(timeStamp, event)
            elif self._getId(msg) == self.gpioId:
                timeStamp = self._getTS(msg)
                gpio = self._getData(msg, 'gpio')
                if gpio != None:
                    if gpio == 'button':
                        event = 'SwitchPressed'
                    elif self._getData(msg, 'gpio') == 'movement':
                        event = 'Movement'
                    assert event != None
                    self.km.addEvent(event)
                    self.dm.storeEvent(timeStamp, event)
            else:
                self.cbLog("debug", "Unhandled data: " + str(msg))

    def onConfigureMessage(self, config):
        self.cbLog("debug", "onConfigureMessage, config: " + str(config))
        self.client = Client(self.id)
        self.client.sendMessage = self.sendMessage
        self.client.cbLog = self.cbLog
        self.dm = DataManager(self.bridge_id)
        self.dm.cbLog = self.cbLog
        self.dm.client = self.client
        self.dm.storeEvent(time.time(), 'Boot')
Example #4
0
class App(CbApp):
    def __init__(self, argv):
        self.smokeId = None
        self.switchId = None
        self.gpioId = None
        self.smokeConnected = True
        self.switchConnected = True
        self.km = None
        self.dm = None
        CbApp.__init__(self, argv)

    # Local helper functions
    def _setState(self, action):
        self.state = action
        msg = {"id": self.id, "status": "state", "state": self.state}
        self.sendManagerMessage(msg)

    def _parseServices(self, msg):
        services = {}
        for s in msg['service']:
            services[s['characteristic']] = s
        return (services, self._getId(msg))

    def _requestData(self, serviceid, services, intervals):
        if serviceid == None:
            self.cbLog("debug", "requestData, serviceid not set")
            return
        self.cbLog(
            "debug",
            "<----- requestData: " + str(services) + " @ " + str(intervals))
        sreqs = []
        assert len(services) == len(intervals)
        for s, i in zip(services, intervals):
            sreqs.append({'characteristic': s, 'interval': i})
        req = {'id': self.id, 'request': 'service', 'service': sreqs}
        self.cbLog("debug",
                   "requestData sending: " + json.dumps(req, indent=4))
        self.sendMessage(req, serviceid)

    def _getId(self, msg):
        return msg['id']

    def _getTS(self, msg):
        return msg['timeStamp']

    def _getData(self, msg, characteristic):
        if msg['characteristic'] == characteristic:
            return msg['data']
        else:
            return None

    def _sendData(self, serviceid, data):
        if serviceid == None:
            self.cbLog("debug", "sendData, serviceid not set")
            return
        self.cbLog("debug", "-----> sendData: " + str(data))
        cmd = {'id': self.id, 'request': 'command', 'data': data}
        self.sendMessage(cmd, serviceid)

    # Functions called automagically by CB framework
    def onAdaptorService(self, msg):
        self.cbLog("debug", "Service msg: " + str(msg))
        (services, serviceid) = self._parseServices(msg)
        self.cbLog("debug",
                   "Service Id: " + str(serviceid) + " " + str(services))
        if services.has_key('binary_sensor'):
            if services.has_key('switch'):
                self.switchId = serviceid
                self._requestData(serviceid, ['connected'], [0])
                self.cbLog("info", "SWITCH FOUND: " + str(self.switchId))
            elif not services.has_key("gpio"):
                self.smokeId = serviceid
                self._requestData(serviceid,
                                  ['binary_sensor', 'battery', 'connected'],
                                  [0, 0, 0])
                self.cbLog("info",
                           "SMOKE DETECTOR FOUND: " + str(self.smokeId))
        if services.has_key('gpio'):
            self.gpioId = serviceid
            self._requestData(serviceid, ['gpio'], [0])
            self.cbLog("info", "GPIO FOUND: " + str(self.gpioId))
        if self.smokeId and self.switchId and self.gpioId and not self.km:
            # Only start KM after all the adaptors are connected
            self.km = CbKitchenMinder(self)
            # km.update not implemented yet & LoopingCall has been problematic. Commented-out.
            #t = task.LoopingCall(self.km.update)
            #t.start(1.0)
            self._setState('running')
            self.cbLog("info",
                       " ------- All devices connected. Started KM ---------")

    def onAdaptorData(self, msg):
        self.cbLog("debug", "onAdaptorData,  message: " + str(msg))
        event = "Smoke"
        if self.km:
            event = None
            if self._getId(msg) == self.smokeId:
                timeStamp = self._getTS(msg)
                sensor = self._getData(msg, 'binary_sensor')
                if sensor != None:
                    if sensor == 'on':
                        event = 'Smoke'
                    else:
                        event = 'NoSmoke'
                    self.km.addEvent(event)
                    self.dm.storeEvent(timeStamp, event)
                level = self._getData(msg, 'battery')
                if level != None:
                    self.dm.storeBattery(timeStamp, level)
                connected = self._getData(msg, 'connected')
                if connected != None:
                    changed = (self.smokeConnected != connected)
                    self.smokeConnected = connected
                    if changed:
                        if self.smokeConnected and self.switchConnected:
                            event = 'Connected'
                        else:
                            event = 'NotConnected'
                        self.km.addEvent(event)
                        self.dm.storeEvent(timeStamp, event)
            elif self._getId(msg) == self.switchId:
                timeStamp = self._getTS(msg)
                connected = self._getData(msg, 'connected')
                if connected != None:
                    changed = (self.switchConnected != connected)
                    self.switchConnected = connected
                    if changed:
                        if self.smokeConnected and self.switchConnected:
                            event = 'Connected'
                        else:
                            event = 'NotConnected'
                        self.km.addEvent(event)
                        self.dm.storeEvent(timeStamp, event)
            elif self._getId(msg) == self.gpioId:
                timeStamp = self._getTS(msg)
                gpio = self._getData(msg, 'gpio')
                if gpio != None:
                    if gpio == 'button':
                        event = 'SwitchPressed'
                    elif self._getData(msg, 'gpio') == 'movement':
                        event = 'Movement'
                    assert event != None
                    self.km.addEvent(event)
                    self.dm.storeEvent(timeStamp, event)
            else:
                self.cbLog("debug", "Unhandled data: " + str(msg))

    def onConfigureMessage(self, config):
        self.cbLog("debug", "onConfigureMessage, config: " + str(config))
        self.client = Client(self.id)
        self.client.sendMessage = self.sendMessage
        self.client.cbLog = self.cbLog
        self.dm = DataManager(self.bridge_id)
        self.dm.cbLog = self.cbLog
        self.dm.client = self.client
        self.dm.storeEvent(time.time(), 'Boot')