diff --git a/hue2influx.py b/hue2influx.py new file mode 100644 index 0000000000000000000000000000000000000000..01797c513bcc3d7ee7fa5dc3daeaaadb93734262 --- /dev/null +++ b/hue2influx.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# coding=utf8 + +import os +import signal +import time +import datetime +from influxdb import InfluxDBClient +from phue import Bridge + +HUE_BRIDGE = os.getenv('HUE_BRIDGE', None) +INFLUXDB_SERVER = os.getenv('INFLUXDB_SERVER', None) +INFLUXDB_PORT = os.getenv('INFLUXDB_PORT', 8086) +INFLUXDB_UDP = (os.getenv('INFLUXDB_UDP', "0") == "1") +INFLUXDB_DB = os.getenv('INFLUXDB_DB', None) +INFLUXDB_USER = os.getenv('INFLUXDB_USER', None) +INFLUXDB_PASS = os.getenv('INFLUXDB_PASS', None) + +class Hue2Influx: + def __init__(self): + if HUE_BRIDGE == None or HUE_BRIDGE == '': + print('Please set the environment variable HUE_BRIDGE to the IP/hostname of your Hue Bridge!') + exit(-1) + + self._hue = Bridge(HUE_BRIDGE) + self._data_sensors = [] + + self._influxdb = None + self._data_influx = [] + + if INFLUXDB_SERVER == None or INFLUXDB_SERVER == "" or INFLUXDB_DB == None or INFLUXDB_DB == "": + print("Please set at least the environment variables INFLUXDB_SERVER and INFLUXDB_DB!") + exit(-1) + + if INFLUXDB_UDP == False: + self._influxdb = InfluxDBClient(host=INFLUXDB_SERVER, port=INFLUXDB_PORT, database=INFLUXDB_DB, username=INFLUXDB_USER, password=INFLUXDB_PASS) + else: + self._influxdb = InfluxDBClient(host=INFLUXDB_SERVER, use_udp=True, udp_port=INFLUXDB_PORT, database=INFLUXDB_DB, username=INFLUXDB_USER, password=INFLUXDB_PASS) + + + def run(self): + print("hue2influx running ...") + while True: + self.sync_sensors() + time.sleep(60) + + def _get_sensors(self): + self._sensors = self._hue.get_sensor_objects('id') + return True + + def _convert_sensors_to_influx(self): + for sensor_key in self._sensors: + sensor = self._sensors[sensor_key]._get(None) + + measurement = { + "measurement": "hue-sensors", + "tags": { + "name": sensor['name'], + "type": sensor['type'], + "modelid": sensor['modelid'], + "manufacturername": sensor['manufacturername'], + "productname": sensor['productname'] if 'productname' in sensor else '', + "on": sensor['config']['on'] if 'config' in sensor and 'on' in sensor['config'] else True + }, + "time": datetime.datetime.now(datetime.timezone.utc).astimezone().isoformat(), + "fields": { + "reachable": sensor['config']['reachable'] if 'config' in sensor and 'reachable' in sensor['config'] else True, + "battery": sensor['config']['battery'] if 'config' in sensor and 'battery' in sensor['config'] else -1, + "sensitivity": sensor['config']['sensitivity'] if 'config' in sensor and 'sensitivity' in sensor['config'] else -1, + "sensitivitymax": sensor['config']['sensitivitymax'] if 'config' in sensor and 'sensitivitymax' in sensor['config'] else -1, + "tholddark": sensor['config']['tholddark'] if 'config' in sensor and 'tholddark' in sensor['config'] else -1, + "tholdoffset": sensor['config']['tholdoffset'] if 'config' in sensor and 'tholdoffset' in sensor['config'] else -1, + } + } + + for state_key in sensor['state']: + state_value = sensor['state'][state_key] + + if state_key == 'lastupdated': + continue + + measurement['fields'][state_key] = state_value + + self._data_influx.append(measurement) + return self._data_influx + + def _put_influx(self): + success = self._influxdb.write_points(self._data_influx) + + if success == True: + self._data_influx = [] + + return success + + def sync_sensors(self): + self._get_sensors() + self._convert_sensors_to_influx() + return self._put_influx() + +def quit(signum, frame): + signal.signal(signal.SIGINT, original_sigint) + print("Goodbye!") + exit(0) + +if __name__ == '__main__': + original_sigint = signal.getsignal(signal.SIGINT) + signal.signal(signal.SIGINT, quit) + + hue2influx = Hue2Influx() + hue2influx.run() +