class WebCameraControl(LoopTask): """ Heroku CloundMQTTを購読し、Web Cameraを操作する """ def __init__(self): super(WebCameraControl, self).__init__() def setup(self): try: self.proxy = appservice.ServiceProxy() proxy = appservice.ServiceProxy() url = proxy.get_account("heroku")["CLOUDMQTT_URL"] url = urlparse.urlparse(url) self.mqttc = MqttClient(url.hostname, url.port) self.mqttc.client.username_pw_set(url.username, url.password) self.mqttc.subscribe("automation/camera/+", self.callback) self.cmdq = Queue() logger.info("setup: done.") except: logger.critical("unhandled exception") raise def loop(self): try: self.mqttc.secure_connection() cmd = self.cmdq.get() if cmd == "send": self.send_mail() self.cmdq.task_done() logger.info("loop: cmd={} done.".format(cmd)) except: logger.error("unhandled exception") def callback(self, topic, payload): try: logger.info("callback: topic={}, payload={}".format(topic, payload)) self.cmdq.put(topic.split("/")[-1]) except: logger.error("unhandled exception") def send_mail(self): with tempfile.NamedTemporaryFile(suffix=".png") as imgfile: cam = webcam.OpenCVCamera() # must be initialized in main thread cam.capture_to_file(imgfile.name) self.proxy.sendmail_with_media( self.proxy.get_account("personal")["email"], "Live Image by Web Camera", str(datetime.datetime.now()), xmlrpclib.Binary(imgfile.read()), )
class SolarReciever(LoopTask): ''' Xbee UDP経由で、ソーラ発電コントローラから送られてくる利用状況を、MQTTにブリッジする。 MQTT topic: solar/values MQTT payload: 電圧、電流、電力のjsonデータ ''' DEFAULT_PORT = 5007 DEFAULT_TIMEOUT = 10 def __init__(self, port=DEFAULT_PORT, timeout=DEFAULT_TIMEOUT): super(SolarReciever, self).__init__() self.port = port self.timeout = timeout self.mqttc = MqttClient() self.socket = None def setup(self): try: logger.info('setup: Port={}'.format(self.port)) self.bind() logger.info('setup: done.') except: logger.critical('unhandled exception') raise def loop(self): try: msg, addr = self.sock.recvfrom(8192) self.publish(msg) except socket.timeout: pass except: logger.error('unhandled exception') time.sleep(10) self.bind() def bind(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.sock.bind(('', self.port)) self.sock.settimeout(self.timeout) logger.info('bind: done.') def publish(self, msg): values = json.loads(msg) values['Time'] = time.time() self.mqttc.publish('solar/values', json.dumps(values))
def setup(self): try: self.mqttc = MqttClient() logger.info('setup done.') except: logger.critical('unhandled exception') raise
def setup(self): try: self.last_access = {} self.mqttc = MqttClient() self.mqttc.subscribe('sensors/+/+', self.callback) self.rs = redis.StrictRedis(host=config.raspi2, port=6379, db=0) proxy = appservice.ServiceProxy() self.heroku = proxy.get_account('heroku')['URL'] logger.info('setup: done.') except: logger.critical('unhandled exception') raise
class LocalSensorMonitor(LoopTask): INTERVAL = 60 ''' RPiに直結されている温度センサの値を定期的にMQTTにパブリッシュする ''' def __init__(self): super(LocalSensorMonitor,self).__init__(self.INTERVAL) def setup(self): try: self.mqttc = MqttClient() logger.info('setup done.') except: logger.critical('unhandled exception') raise def loop(self): try: values = localsensor.getvalues() for k, v in values.items(): self.mqttc.publish('sensors/{}/temperature'.format(k), '%2.2f' % v) except: logger.error('unhandled exception')