import logging, os from functools import wraps from flask import Flask, request app = Flask(__name__) log = logging.getLogger('werkzeug') #~ log.setLevel(logging.ERROR) app.logger.disabled = True log.disabled = True log = logging.getLogger() log.setLevel(logging.INFO) streamhandler = logging.StreamHandler() streamhandler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s",'%Y-%m-%d %X')) log.addHandler(streamhandler) from statsd import StatsClient statsd_host = os.environ.get('STATSD_HOST', 'host.docker.internal') log.info('using statsd at %s:%s' % (statsd_host, 8125)) statsd = StatsClient(statsd_host, 8125) def login_required(f): @wraps(f) def wrapped_view(**kwargs): auth = request.authorization if not (auth and auth.username == 'xxx' and auth.password == '123'): return ('Unauthorized', 401, { 'WWW-Authenticate': 'Basic realm="Login Required"' }) return f(**kwargs) return wrapped_view OLD_VALUES = {} @app.route("/api") @login_required def api(): try: args = request.args name = args['name'].lower() # XXX: domoticz doesnt send spaced named (is buggy) # this was only a failed hack, but let's keep it name = name.replace(' ', '-') # ugly fugly name = name.replace('ü', 'ue').replace('ä', 'ae').replace('ö', 'oe') name = name.replace('ã¼', 'ue').replace('ã¶', 'oe').replace('ã¤', 'ae') type = args['type'] value = args['value'] #~ log.info('%r' % args) if type == 'power_instant': v = int(float(value)) log.debug('%s %s: %s' % (type, name, v)) statsd.gauge('domo.%s.power_instant' % name, v) elif type == 'temp': v = float(value) log.debug('%s %s: %s' % (type, name, v)) statsd.gauge('domo.%s.temp' % name, v) elif type == 'power_usage': v = int(float(value)) old_v = int(float(OLD_VALUES.get((name, type), v))) delta = v - old_v if delta > 100: log.warn('ignore: %s %s: %s' % (type, name, delta)) elif delta > 0: log.debug('%s %s: %s' % (type, name, delta)) statsd.incr('domo.%s.power_usage.count' % name, delta) OLD_VALUES[(name, type)] = value return '' except Exception: log.exception('arror during api') @app.route("/") def index(): return '
'.join('%s %s: %s' % (name, type, v) for (name, type), v in OLD_VALUES.items()) if __name__ == '__main__': log.info('startup flask') app.run(debug=False, host='0.0.0.0', port=80)