server.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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.DEBUG)
  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 > 0:
  57. log.debug('%s %s: %s' % (type, name, delta))
  58. statsd.incr('domo.%s.power_usage' % name, delta)
  59. OLD_VALUES[(name, type)] = value
  60. return ''
  61. except Exception:
  62. log.exception('arror during api')
  63. @app.route("/")
  64. def index():
  65. return '<br/>'.join('%s %s: %s' % (name, type, v) for (name, type), v in OLD_VALUES.items())
  66. if __name__ == '__main__':
  67. log.info('startup flask')
  68. app.run(debug=False, host='0.0.0.0', port=80)