server.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import logging, os
  2. from functools import wraps
  3. from flask import Flask, request
  4. app = Flask(__name__)
  5. log = logging.getLogger('werkzeug')
  6. #~ log.setLevel(logging.ERROR)
  7. app.logger.disabled = True
  8. log.disabled = True
  9. log = logging.getLogger()
  10. log.setLevel(logging.INFO)
  11. streamhandler = logging.StreamHandler()
  12. streamhandler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s",'%Y-%m-%d %X'))
  13. log.addHandler(streamhandler)
  14. from statsd import StatsClient
  15. statsd_host = os.environ.get('STATSD_HOST', 'host.docker.internal')
  16. log.info('using statsd at %s:%s' % (statsd_host, 8125))
  17. statsd = StatsClient(statsd_host, 8125)
  18. def login_required(f):
  19. @wraps(f)
  20. def wrapped_view(**kwargs):
  21. auth = request.authorization
  22. if not (auth and auth.username == 'xxx' and auth.password == '123'):
  23. return ('Unauthorized', 401, {
  24. 'WWW-Authenticate': 'Basic realm="Login Required"'
  25. })
  26. return f(**kwargs)
  27. return wrapped_view
  28. OLD_VALUES = {}
  29. @app.route("/api")
  30. @login_required
  31. def api():
  32. try:
  33. args = request.args
  34. name = args['name'].lower()
  35. # XXX: domoticz doesnt send spaced named (is buggy)
  36. # this was only a failed hack, but let's keep it
  37. name = name.replace(' ', '-')
  38. # ugly fugly
  39. name = name.replace('ü', 'ue').replace('ä', 'ae').replace('ö', 'oe')
  40. name = name.replace('ã¼', 'ue').replace('ã¶', 'oe').replace('ã¤', 'ae')
  41. type = args['type']
  42. value = args['value']
  43. #~ log.info('%r' % args)
  44. if type == 'power_instant':
  45. v = int(float(value))
  46. log.debug('%s %s: %s' % (type, name, v))
  47. statsd.gauge('domo.%s.power_instant' % name, v)
  48. elif type == 'temp':
  49. v = float(value)
  50. log.debug('%s %s: %s' % (type, name, v))
  51. statsd.gauge('domo.%s.temp' % name, v)
  52. elif type == 'power_usage':
  53. v = int(float(value))
  54. old_v = int(float(OLD_VALUES.get((name, type), v)))
  55. delta = v - old_v
  56. if delta > 100:
  57. log.warn('ignore: %s %s: %s' % (type, name, delta))
  58. elif delta > 0:
  59. log.debug('%s %s: %s' % (type, name, delta))
  60. statsd.incr('domo.%s.power_usage.count' % name, delta)
  61. OLD_VALUES[(name, type)] = value
  62. return ''
  63. except Exception:
  64. log.exception('arror during api')
  65. @app.route("/")
  66. def index():
  67. return '<br/>'.join('%s %s: %s' % (name, type, v) for (name, type), v in OLD_VALUES.items())
  68. if __name__ == '__main__':
  69. log.info('startup flask')
  70. app.run(debug=False, host='0.0.0.0', port=80)