| @@ -16,6 +16,7 @@ from hardware import * | |||
| import time | |||
| import uuid | |||
| import logging | |||
| class NotificationAPI(object): | |||
| @@ -85,6 +86,8 @@ class SensorAPI(object): | |||
| :return: | |||
| ''' | |||
| self.logger = logging.getLogger(__name__) | |||
| self.app.logger.info("Init Sensors") | |||
| t = self.cache.get("sensor_types") | |||
| @@ -144,41 +147,48 @@ class SensorAPI(object): | |||
| def receive_sensor_value(self, id, value): | |||
| self.emit("SENSOR_UPDATE", self.cache.get("sensors")[id]) | |||
| self.save_to_file(id, value) | |||
| self.save_to_file(id, value, "sensor") | |||
| def save_to_file(self, id, value, prefix="sensor"): | |||
| def save_to_file(self, id, value, prefix): | |||
| sensor_name = "%s_%s" % (prefix, str(id)) | |||
| use_kairosdb = (self.cache["config"]["kairos_db"].__dict__["value"] == "YES") | |||
| if use_kairosdb: | |||
| kairosdb_server = "http://127.0.0.1:" + self.cache["config"]["kairos_db_port"].__dict__["value"] | |||
| data = [ | |||
| dict(name="cbpi." + sensor_name, datapoints=[ | |||
| [int(round(time.time() * 1000)), value] | |||
| ], tags={ | |||
| "cbpi": prefix, | |||
| "brew": self.cache["active_brew"] | |||
| }) | |||
| ] | |||
| response = requests.post(kairosdb_server + "/api/v1/datapoints", json.dumps(data)) | |||
| self.write_to_tsdb(prefix, sensor_name, value) | |||
| else: | |||
| filename = "./logs/%s.log" % sensor_name | |||
| formatted_time = strftime("%Y-%m-%d %H:%M:%S", localtime()) | |||
| msg = str(formatted_time) + "," +str(value) + "\n" | |||
| self.write_to_logfile(sensor_name, value) | |||
| def write_to_logfile(self, sensor_name, value): | |||
| filename = "./logs/%s.log" % sensor_name | |||
| formatted_time = strftime("%Y-%m-%d %H:%M:%S", localtime()) | |||
| msg = str(formatted_time) + "," + str(value) + "\n" | |||
| with open(filename, "a") as file: | |||
| file.write(msg) | |||
| with open(filename, "a") as file: | |||
| file.write(msg) | |||
| def write_to_tsdb(self, prefix, sensor_name, value): | |||
| kairosdb_server = "http://127.0.0.1:" + self.cache["config"]["kairos_db_port"].__dict__["value"] | |||
| data = [ | |||
| dict(name="cbpi." + sensor_name, datapoints=[ | |||
| [int(round(time.time() * 1000)), value] | |||
| ], tags={ | |||
| "cbpi": prefix, | |||
| "brew": self.cache["active_brew"] | |||
| }) | |||
| ] | |||
| response = requests.post(kairosdb_server + "/api/v1/datapoints", json.dumps(data)) | |||
| if not response.ok: | |||
| self.logger.warning("Failed to write time series entry for [%s]. Response [%s]", sensor_name, response) | |||
| def log_action(self, text): | |||
| filename = "./logs/action.log" | |||
| formatted_time = strftime("%Y-%m-%d %H:%M:%S", localtime()) | |||
| with open(filename, "a") as file: | |||
| text = text.encode("utf-8") | |||
| file.write("%s,%s\n" % (formatted_time, text)) | |||
| use_kairosdb = (self.cache["config"]["kairos_db"].__dict__["value"] == "YES") | |||
| if use_kairosdb: | |||
| self.write_to_tsdb("action", "action", text) | |||
| else: | |||
| self.write_to_logfile("action", text) | |||
| def shutdown_sensor(self, id): | |||
| self.cache.get("sensors")[id].stop() | |||
| @@ -1,6 +1,5 @@ | |||
| import datetime | |||
| import os | |||
| import time | |||
| import requests | |||
| import logging | |||
| from flask import request, send_from_directory, json | |||
| @@ -22,11 +21,8 @@ class LogView(FlaskView): | |||
| @route('/actions') | |||
| def actions(self): | |||
| filename = "./logs/action.log" | |||
| array = self.query_log(filename, "string") | |||
| array = self.read_log_as_json("action") | |||
| json_dumps = json.dumps(array) | |||
| self.logger.debug("Loaded action.log [%s]", json_dumps) | |||
| return json_dumps | |||
| @@ -48,13 +44,13 @@ class LogView(FlaskView): | |||
| cbpi.notify("Failed to delete log", "", type="danger") | |||
| return ('', 204) | |||
| def query_tsdb(self, type, id): | |||
| def query_tsdb(self, sensor_name): | |||
| kairosdb_server = "http://127.0.0.1:" + cbpi.cache["config"]["kairos_db_port"].__dict__["value"] | |||
| data = dict(metrics=[ | |||
| { | |||
| "tags": {}, | |||
| "name": "cbpi.%s_%s" % (type, id), | |||
| "name": "cbpi.%s" % sensor_name, | |||
| "aggregators": [ | |||
| { | |||
| "name": "avg", | |||
| @@ -81,11 +77,11 @@ class LogView(FlaskView): | |||
| response = requests.post(kairosdb_server + "/api/v1/datapoints/query", json.dumps(data)) | |||
| if response.ok: | |||
| self.logger.debug("Fetching time series for [%s_%s] took [%s]", type, id, response.elapsed) | |||
| self.logger.debug("Time series for [%s_%s] is [%s]", type, id, response.json()) | |||
| self.logger.debug("Fetching time series for [%s] took [%s]", sensor_name, response.elapsed) | |||
| self.logger.debug("Time series for [%s] is [%s]", sensor_name, response.json()) | |||
| return response.json()["queries"][0]["results"][0]["values"] | |||
| else: | |||
| self.logger.warning("Failed to fetch time series for [%s_%s]. Response [%s]", type, id, response) | |||
| self.logger.warning("Failed to fetch time series for [%s]. Response [%s]", sensor_name, response) | |||
| def query_log(self, filename, value_type): | |||
| array = [] | |||
| @@ -114,19 +110,19 @@ class LogView(FlaskView): | |||
| pass | |||
| return array | |||
| def read_log_as_json(self, type, id): | |||
| def read_log_as_json(self, sensor_name): | |||
| use_kairosdb = (cbpi.cache["config"]["kairos_db"].__dict__["value"] == "YES") | |||
| if use_kairosdb: | |||
| return self.query_tsdb(type, id) | |||
| return self.query_tsdb(sensor_name) | |||
| else: | |||
| filename = "./logs/%s_%s.log" % (type, id) | |||
| filename = "./logs/%s.log" % sensor_name | |||
| return self.query_log(filename, "float") | |||
| def convert_chart_data_to_json(self, chart_data): | |||
| return {"name": chart_data["name"], | |||
| "data": self.read_log_as_json(chart_data["data_type"], chart_data["data_id"])} | |||
| "data": self.read_log_as_json(chart_data["data_type"] + "_" + str(chart_data["data_id"]))} | |||
| @route('/<t>/<int:id>', methods=["POST"]) | |||
| def get_logs_as_json(self, t, id): | |||
| @@ -134,7 +130,8 @@ class LogView(FlaskView): | |||
| result = [] | |||
| if t == "s": | |||
| name = cbpi.cache.get("sensors").get(id).name | |||
| result.append({"name": name, "data": self.read_log_as_json("sensor", id)}) | |||
| sensor_name = "%s_%s" % ("sensor", str(id)) | |||
| result.append({"name": name, "data": self.read_log_as_json(sensor_name)}) | |||
| if t == "k": | |||
| kettle = cbpi.cache.get("kettle").get(id) | |||