|
|
@@ -0,0 +1,87 @@
|
|
|
+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.DEBUG)
|
|
|
+
|
|
|
+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 > 0:
|
|
|
+ log.debug('%s %s: %s' % (type, name, delta))
|
|
|
+ statsd.incr('domo.%s.power_usage' % name, delta)
|
|
|
+
|
|
|
+ OLD_VALUES[(name, type)] = value
|
|
|
+ return ''
|
|
|
+ except Exception:
|
|
|
+ log.exception('arror during api')
|
|
|
+
|
|
|
+@app.route("/")
|
|
|
+def index():
|
|
|
+ return '<br/>'.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)
|