class SwitchOffAllDevicesAgent(AbstractAgentClass): exposed = True def __init__(self, serviceName, logLevel): super(SwitchOffAllDevicesAgent, self).__init__(serviceName, logLevel) self.myhome = self.retriveHomeSettings() self.brokerUri = self.myhome["homeMessageBroker"]["address"] self.brokerPort = self.myhome["homeMessageBroker"]["port"] def getMountPoint(self): return '/rest/switchoffall' def start (self): self.mqtt = MyMQTTClass(self.serviceName, self.logger, self) self.mqtt.connect(self.brokerUri, self.brokerPort) self.logger.info("Started") def stop(self): if (hasattr (self, "mqtt")): try: self.mqtt.disconnect() except Exception, e: self.logger.error("Error on stop(): %s" % (e)) self.logger.info("Ended") sys.exit(0)
class AmazonDashSevice(AbstractServiceClass): def __init__(self, serviceName, logLevel, arguments): super(AmazonDashSevice, self).__init__(serviceName, logLevel) self.arguments = arguments self.checkSudoer() def checkSudoer(self): user = os.getenv("SUDO_USER") if user is None: self.logger.error("This program needs 'sudo' presmissions") self.stop() def start(self): if ("--scan" in sys.argv): self.logger.info("Scanning...") while (True): try: print sniff(prn=self.scan_arp_display, filter="arp", store=0, count=0) except: pass time.sleep(0.1) elif ("--help" in sys.argv): self.logger.info(man) elif (len(sys.argv) == 1): self.logger.info("%s started" % self.serviceName) self.retrieveHomeSettings() self.brokerUri = self.myhome["homeMessageBroker"]["address"] self.brokerPort = self.myhome["homeMessageBroker"]["port"] self.mqtt = MyMQTTClass(self.serviceName, self.logger, self) self.mqtt.connect(self.brokerUri, self.brokerPort) self.homeUpdateThread = Thread(target=self.homeUpdate) self.homeUpdateThread.start() while (self.isRunning): try: print sniff(prn=self.arp_display, filter="arp", store=0, count=0) except: pass time.sleep(0.1) else: self.logger.error(argumentsError) def stop(self): if (hasattr(self, "mqtt")): try: self.mqtt.disconnect() except Exception, e: self.logger.error("Error on stop(): %s" % (e)) super(AmazonDashSevice, self).stop()
class AmazonDashSevice(AbstractServiceClass): def __init__(self, serviceName, logLevel, arguments): super(AmazonDashSevice, self).__init__(serviceName, logLevel) self.arguments = arguments self.checkSudoer() def checkSudoer(self): user = os.getenv("SUDO_USER") if user is None: self.logger.error("This program needs 'sudo' presmissions") self.stop() def start (self): if ("--scan" in sys.argv): self.logger.info("Scanning...") while (True): try: print sniff(prn=self.scan_arp_display, filter="arp", store=0, count=0) except: pass time.sleep(0.1) elif ("--help" in sys.argv): self.logger.info(man) elif (len(sys.argv) == 1): self.logger.info("%s started" % self.serviceName) self.retrieveHomeSettings() self.brokerUri = self.myhome["homeMessageBroker"]["address"] self.brokerPort = self.myhome["homeMessageBroker"]["port"] self.mqtt = MyMQTTClass(self.serviceName, self.logger, self) self.mqtt.connect(self.brokerUri, self.brokerPort) self.homeUpdateThread = Thread (target = self.homeUpdate) self.homeUpdateThread.start() while (self.isRunning): try: print sniff(prn=self.arp_display, filter="arp", store=0, count=0) except: pass time.sleep(0.1) else: self.logger.error(argumentsError) def stop(self): if (hasattr (self, "mqtt")): try: self.mqtt.disconnect() except Exception, e: self.logger.error("Error on stop(): %s" % (e)) super(AmazonDashSevice, self).stop()
class HomeAgent(AbstractAgentClass): exposed = True def __init__(self, serviceName, logLevel): super(HomeAgent, self).__init__(serviceName, logLevel) def getMountPoint(self): return '/rest/home' def start (self): self.copyDefaultFile() myhome = json.loads(self.getConfiguration()) self.brokerUri = myhome["homeMessageBroker"]["address"] self.brokerPort = myhome["homeMessageBroker"]["port"] if (self.brokerUri is None and self.brokerUri == "") and (self.brokerPort is None and self.brokerPort == ""): self.brokerUri = DEFAULT_BROKER_URI self.brokerPort = DEFAULT_BROKER_PORT self.mqtt = MyMQTTClass(self.serviceName, self.logger, self) self.mqtt.connect(self.brokerUri, self.brokerPort) self.logger.info("Started") def stop(self): self.logger.info("Ended") sys.exit(0) def copyDefaultFile(self): newtFile = os.path.join(os.getcwd(), "../conf") if not os.path.exists(newtFile): try: os.makedirs(newtFile) except Exception, e: self.logger.error("unable to make \"conf\" directory: %s" % (e)) newtFile = os.path.join(newtFile, "home_structure.json") if not os.path.isfile(newtFile): try: defaultFile = os.path.join(os.getcwd(), "home/home_structure.json") shutil.copy2(defaultFile, newtFile) except Exception, e: self.logger.error("error in copying the defalut \"home_structure.json\" file: %s" % (e))
class ThingspeakSubscriber (AbstractSubscriber): def __init__ (self): super(ThingspeakSubscriber, self).__init__(subscriberName, "", logLevel) self.msgQueue = [] self.__lock = threading.Lock() self.eventChannelMap = {} self.timer = 15 # sleep due to thingspeak limitations def mekeTopic(self, device, measureType): return EventTopics.getSensorMeasurementEvent() + "/" + str(device) + "/" + str(measureType).lower() def start (self): # method overrided resp, isOk = self.invokeWebService(self.homeWSUri) while (not isOk): self.logger.error ("Unable to find the home proxy. I will try again in a while...") resp, isOk = self.invokeWebService(self.homeWSUri) time.sleep(10) #sleep 10 seconds myhome = json.loads(resp) brokerUri = myhome["homeMessageBroker"]["address"] brokerPort = myhome["homeMessageBroker"]["port"] if (brokerUri != None and brokerUri != "") and (brokerPort != None and brokerPort != ""): self.mqttc = MyMQTTClass(self.subscriberName, self.logger, self) self.mqttc.connect(brokerUri,brokerPort) for a, room in enumerate(myhome["rooms"]): for b, device in enumerate(room["devices"]): for c, channel in enumerate(device['thingspeakChannels']): topic = self.mekeTopic(device["deviceID"], channel['measureType']) self.eventChannelMap[topic] = channel['feed'] event = self.mqttc.subscribeEvent(None, topic) self.subscribedEventList += event else: self.logger.error ("The message broker address is not valid") self.uploadThread = Thread (target = self.upload) self.uploadThread.start() self.loop() def stop (self): if (hasattr(self, "uploadThread")): if self.uploadThread.isAlive(): try: self.uploadThread._Thread__stop() except: self.logger.error(str(self.uploadThread.getName()) + ' (upload value thread) could not terminated') super(ThingspeakSubscriber, self).stop() def upload(self): while (True): try: if (len(self.msgQueue) > 0): resp, isOk = self.invokeWebService(self.msgQueue[0]) if isOk and resp is not "0": self.__lock.acquire() deleted = self.msgQueue[0] del self.msgQueue[0] self.__lock.release() time.sleep(self.timer) # sleep due to thingspeak limitations else: self.logger.error ("Unable to upload new value: %s" % (resp)) time.sleep(1) except Exception, e: self.logger.error("Error on ThingspeakSubscriber.upload() %s: " % e)
class ThingspeakSubscriber(AbstractSubscriber): def __init__(self): super(ThingspeakSubscriber, self).__init__(subscriberName, "", logLevel) self.msgQueue = [] self.__lock = threading.Lock() self.eventChannelMap = {} self.timer = 15 # sleep due to thingspeak limitations def mekeTopic(self, device, measureType): return EventTopics.getSensorMeasurementEvent() + "/" + str( device) + "/" + str(measureType).lower() def start(self): # method overrided resp, isOk = self.invokeWebService(self.homeWSUri) while (not isOk): self.logger.error( "Unable to find the home proxy. I will try again in a while..." ) resp, isOk = self.invokeWebService(self.homeWSUri) time.sleep(10) #sleep 10 seconds myhome = json.loads(resp) brokerUri = myhome["homeMessageBroker"]["address"] brokerPort = myhome["homeMessageBroker"]["port"] if (brokerUri != None and brokerUri != "") and (brokerPort != None and brokerPort != ""): self.mqttc = MyMQTTClass(self.subscriberName, self.logger, self) self.mqttc.connect(brokerUri, brokerPort) for a, room in enumerate(myhome["rooms"]): for b, device in enumerate(room["devices"]): for c, channel in enumerate(device['thingspeakChannels']): topic = self.mekeTopic(device["deviceID"], channel['measureType']) self.eventChannelMap[topic] = channel['feed'] event = self.mqttc.subscribeEvent(None, topic) self.subscribedEventList += event else: self.logger.error("The message broker address is not valid") self.uploadThread = Thread(target=self.upload) self.uploadThread.start() self.loop() def stop(self): if (hasattr(self, "uploadThread")): if self.uploadThread.isAlive(): try: self.uploadThread._Thread__stop() except: self.logger.error( str(self.uploadThread.getName()) + ' (upload value thread) could not terminated') super(ThingspeakSubscriber, self).stop() def upload(self): while (True): try: if (len(self.msgQueue) > 0): resp, isOk = self.invokeWebService(self.msgQueue[0]) if isOk and resp is not "0": self.__lock.acquire() deleted = self.msgQueue[0] del self.msgQueue[0] self.__lock.release() time.sleep( self.timer) # sleep due to thingspeak limitations else: self.logger.error("Unable to upload new value: %s" % (resp)) time.sleep(1) except Exception, e: self.logger.error( "Error on ThingspeakSubscriber.upload() %s: " % e)
class RaspberryAgent(AbstractAgentClass): exposed = True def __init__(self, serviceName, logLevel): super(RaspberryAgent, self).__init__(serviceName, logLevel) #About DHT sensor self.dhtPin = 18 self.isDHTInstalled = False self.dhtType = Adafruit_DHT.DHT22 #About PIR sensor self.isPirInstalled = False self.pirPin = 7 self.WSUri = ( "http://%s:%s%s" % (self.getIpAddress(), str(httpPort), self.getMountPoint())) self.myhome = self.retriveHomeSettings() self.brokerUri = self.myhome["homeMessageBroker"]["address"] self.brokerPort = self.myhome["homeMessageBroker"]["port"] def getMountPoint(self): return '/rest/raspberry' def setDHTPin(self, dhtPin): self.dhtPin = dhtPin def setDHTType(self, dhtType): if (dhtType == 11): self.dhtType = Adafruit_DHT.DHT11 elif (dhtType == 22): self.dhtType = Adafruit_DHT.DHT22 elif (dhtType == 2302): self.dhtType = Adafruit_DHT.Adafruit_DHT.AM2302 def setDHTInstalled(self, isDHTInstalled): self.isDHTInstalled = isDHTInstalled def setPirPin(self, pirPin): self.pirPin = pirPin def setPirInstalled(self, isPirInstalled): self.isPirInstalled = isPirInstalled def start(self): self.mqtt = MyMQTTClass(self.serviceName, self.logger, self) self.mqtt.connect(self.brokerUri, self.brokerPort) if self.isPirInstalled: gpio.setmode(gpio.BOARD) gpio.setup(self.pirPin, gpio.IN) gpio.add_event_detect(self.pirPin, gpio.BOTH, callback=self.pirCallback, bouncetime=200) if self.isDHTInstalled: self.dhtThread = Thread(target=self.loop) self.dhtThread.start() self.logger.info("Started") def loop(self): while (True): humVal, tempVal = self.getDHTValues() if humVal is not "0.0": topic, payload = self.makeEvent("humidity", humVal) self.mqtt.syncPublish(topic, payload, 2) if tempVal is not "0.0": topic, payload = self.makeEvent("temperature", tempVal) self.mqtt.syncPublish(topic, payload, 2) time.sleep(timer) def getDHTValues(self): humidity = None temperature = None if self.isDHTInstalled: humidity, temperature = Adafruit_DHT.read_retry( self.dhtType, self.dhtPin) if humidity is None: humidity = 0.0 if temperature is None: temperature = 0.0 return str(round(humidity, 2)), str(round(temperature, 2)) def pirCallback(self, pin): if gpio.input(self.pirPin): topic, payload = self.makeEvent("motion", "True") self.mqtt.syncPublish(topic, payload, 2) time.sleep(30) else: topic, payload = self.makeEvent("motion", "False") self.mqtt.syncPublish(topic, payload, 2) def stop(self): if (hasattr(self, "dhtThread")): if self.dhtThread.isAlive(): try: self.dhtThread._Thread__stop() except: self.logger.error( str(self.dhtThread.getName()) + ' (dht send event thread) could not terminated') if (hasattr(self, "mqtt")): try: self.mqtt.disconnect() except Exception, e: self.logger.error("Error on stop(): %s" % (e)) self.logger.info("Ended") sys.exit(0)
class RaspberryAgent(AbstractAgentClass): exposed = True def __init__(self, serviceName, logLevel): super(RaspberryAgent, self).__init__(serviceName, logLevel) #About DHT sensor self.dhtPin = 18 self.isDHTInstalled = False self.dhtType = Adafruit_DHT.DHT22 #About PIR sensor self.isPirInstalled = False self.pirPin = 7 self.WSUri = ("http://%s:%s%s" % (self.getIpAddress(), str(httpPort), self.getMountPoint())) self.myhome = self.retriveHomeSettings() self.brokerUri = self.myhome["homeMessageBroker"]["address"] self.brokerPort = self.myhome["homeMessageBroker"]["port"] def getMountPoint(self): return '/rest/raspberry' def setDHTPin(self, dhtPin): self.dhtPin = dhtPin def setDHTType (self, dhtType): if (dhtType == 11): self.dhtType = Adafruit_DHT.DHT11 elif (dhtType == 22): self.dhtType = Adafruit_DHT.DHT22 elif (dhtType == 2302): self.dhtType = Adafruit_DHT.Adafruit_DHT.AM2302 def setDHTInstalled (self, isDHTInstalled): self.isDHTInstalled = isDHTInstalled def setPirPin (self, pirPin): self.pirPin = pirPin def setPirInstalled (self, isPirInstalled): self.isPirInstalled = isPirInstalled def start (self): self.mqtt = MyMQTTClass(self.serviceName, self.logger, self) self.mqtt.connect(self.brokerUri, self.brokerPort) if self.isPirInstalled: gpio.setmode(gpio.BOARD) gpio.setup(self.pirPin, gpio.IN) gpio.add_event_detect(self.pirPin, gpio.BOTH, callback=self.pirCallback, bouncetime=200) if self.isDHTInstalled: self.dhtThread = Thread (target = self.loop) self.dhtThread.start() self.logger.info("Started") def loop (self): while (True): humVal, tempVal = self.getDHTValues() if humVal is not "0.0": topic, payload = self.makeEvent("humidity", humVal) self.mqtt.syncPublish(topic, payload, 2) if tempVal is not "0.0": topic, payload = self.makeEvent("temperature", tempVal) self.mqtt.syncPublish(topic, payload, 2) time.sleep(timer) def getDHTValues (self): humidity = None temperature = None if self.isDHTInstalled: humidity, temperature = Adafruit_DHT.read_retry(self.dhtType, self.dhtPin) if humidity is None: humidity = 0.0 if temperature is None: temperature = 0.0 return str(round(humidity, 2)), str(round(temperature, 2)) def pirCallback (self, pin): if gpio.input(self.pirPin): topic, payload = self.makeEvent("motion", "True") self.mqtt.syncPublish(topic, payload, 2) time.sleep(30) else: topic, payload = self.makeEvent("motion", "False") self.mqtt.syncPublish(topic, payload, 2) def stop(self): if (hasattr(self, "dhtThread")): if self.dhtThread.isAlive(): try: self.dhtThread._Thread__stop() except: self.logger.error(str(self.dhtThread.getName()) + ' (dht send event thread) could not terminated') if (hasattr (self, "mqtt")): try: self.mqtt.disconnect() except Exception, e: self.logger.error("Error on stop(): %s" % (e)) self.logger.info("Ended") sys.exit(0)