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')