Beispiel #1
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))
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')