Example #1
0
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()),
            )
Example #2
0
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
Example #4
0
 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')