Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.18 KB | None | 0 0
  1. MANUAL_MODE_NAME = "manual"
  2. AUTO_MODE_NAME = "auto"
  3.  
  4.  
  5. def check_prometheus_ready():
  6.     try:
  7.         r = requests.get(settings.PROMETHEUS_URL)
  8.         r.raise_for_status()
  9.     except requests.HTTPError:
  10.         logging.error("Got HTTP error, probably Prometheus is not yet ready, throwing exception and exiting...")
  11.         raise
  12.     logging.info("Prometheus responded with HTTP OK, probably ready to serve requests")
  13.  
  14.  
  15. def get_prometheus_value(query):  # TODO: copied form mqtt-importer-prometheus, probably should be extracted to separate module
  16.     r = requests.get("{}/api/v1/query?query={}".format(settings.PROMETHEUS_URL, query))
  17.     if r.status_code == requests.codes.ok:
  18.         try:
  19.             timestamp, query_result = r.json()['data']['result'][0]['value']
  20.             logging.info("Got values from Prometheus: [{}] {}".format(timestamp, query_result))
  21.         except (KeyError, ValueError):
  22.             logging.error("Got unexpected response from Prometheus (HTTP {}): {}".format(r.status_code, r.text))
  23.             return
  24.         except IndexError:
  25.             logging.error("There are no values for query {}".format(query))
  26.             return
  27.     else:
  28.         logging.error("HTTP error {} when querying Prometheus".format(r.status_code))
  29.         return
  30.     return query_result
  31.  
  32.  
  33. @app.route('/')
  34. def hello():
  35.     try:
  36.         current_value_low = get_prometheus_value(settings.LOW_TEMP_METRIC)
  37.         current_value_high = get_prometheus_value(settings.HIGH_TEMP_METRIC)
  38.         current_value_mode = int(get_prometheus_value(settings.MODE_METRIC))
  39.         current_engine_mode = int(get_prometheus_value(settings.ENGINE_MODE_METRIC))
  40.     except Exception:  # TODO: catch more meaningful exception, not all
  41.         return "ERROR: Prometheus returned unexpected value!"
  42.  
  43.     # TODO: Move next lines to a template (i zjebana ifologia xD, ogolnie to jest chujowo napisane w huj xD)
  44.     return f"""
  45.            <form action="/set_params" method="GET">
  46.                <div>
  47.                    <label for="value_low">Low</label>
  48.                    <input name="value_low" id="value_low" value="{current_value_low}">
  49.                </div>
  50.                <div>
  51.                    <label for="value_high">High</label>
  52.                    <input name="value_high" id="value_high" value="{current_value_high}">
  53.                </div>
  54.                <div>
  55.                    <label for="mode">Mode</label>
  56.                    <select name="mode">
  57.                        <option value="manual" {'selected' if current_value_mode == 0 else ''}>Manual</option>
  58.                        <option value="auto" {'selected' if current_value_mode == 1 else ''}>Auto</option>
  59.                    </select>
  60.                </div>
  61.                <div>
  62.                    <label for="engine_mode">Engine mode</label>
  63.                    <select name="engine_mode">
  64.                        <option value="0" {'selected' if current_engine_mode == 0 else ''}>Closed</pption>
  65.                        <option value="1" {'selected' if current_engine_mode == 1 else ''}>Open</option>
  66.                    </select>
  67.                </div>
  68.                <div>
  69.                    <button>Send</button>
  70.                </div>
  71.            </form>
  72.        """
  73.  
  74.  
  75. def set_mode(mode):
  76.     if mode not in (MANUAL_MODE_NAME, AUTO_MODE_NAME):
  77.         return f"Mode must be '{MANUAL_MODE_NAME}' or '{AUTO_MODE_NAME}'"
  78.     automat = 0 if mode == MANUAL_MODE_NAME else 1
  79.     publish.single(settings.MODE_TOPIC, automat, hostname=settings.MQTT_BROKER_HOST, port=settings.MQTT_BROKER_PORT)
  80.     return
  81.  
  82.  
  83. def set_temp(value, topic):
  84.     if not value:
  85.         return "Temp value invalid"
  86.     try:
  87.         float(value)
  88.     except ValueError:
  89.         return "Value must be a number!"
  90.     publish.single(topic, value, hostname=settings.MQTT_BROKER_HOST, port=settings.MQTT_BROKER_PORT)
  91.     return
  92.  
  93.  
  94. def set_engine_mode(mode, desired_mode):
  95.     error_message = "Engine mode must be 0 or 1!"
  96.     try:
  97.         desired_mode = int(desired_mode)
  98.     except ValueError:
  99.         return error_message
  100.     if not desired_mode in (0, 1):
  101.         return error_message
  102.     if mode == MANUAL_MODE_NAME:
  103.         publish.single(settings.ENGINE_MODE_TOPIC, desired_mode, hostname=settings.MQTT_BROKER_HOST, port=settings.MQTT_BROKER_PORT)
  104.  
  105. @app.route('/set_params')
  106. def set_params():    
  107.     # TODO: refactor this function!
  108.     mode_set = set_mode(request.args.get("mode").lower())
  109.     if mode_set:
  110.         return mode_set
  111.  
  112.     low_temp_set = set_temp(request.args.get("value_low"), settings.LOW_TEMP_PROMETHEUS)
  113.     if low_temp_set:
  114.         return low_temp_set
  115.  
  116.     high_temp_set = set_temp(request.args.get("value_high"), settings.HIGH_TEMP_PROMETHEUS)
  117.     if high_temp_set:
  118.         return high_temp_set
  119.    
  120.     engine_mode_set = set_engine_mode(request.args.get("mode").lower(), request.args.get("engine_mode"))
  121.     if engine_mode_set:
  122.         return engine_mode_set
  123.  
  124.     return "OK</br><a href='/'>Powrot</a>"
  125.  
  126.  
  127. if __name__ == "__main__":
  128.     check_prometheus_ready()
  129.     logging.info(f"Starting flask server on {settings.FLASK_IP}:{settings.FLASK_PORT}")
  130.     app.run(host=settings.FLASK_IP, port=settings.FLASK_PORT)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement