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