From ee4e67667c0b5643be9f2f7f9b985e6b2fce502e Mon Sep 17 00:00:00 2001 From: vuko Date: Fri, 12 Oct 2018 17:32:59 +0200 Subject: [PATCH] add meter object --- meters.py | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/meters.py b/meters.py index b16d3c6..39d70bb 100644 --- a/meters.py +++ b/meters.py @@ -6,23 +6,20 @@ import copy con = mqtt.Client() con.connect('10.8.1.16') - -lock = threading.Lock() -measurements = {} - con.subscribe('iot/+/+/energy') -class Measurements: +class Meters: class Meter: - def __init__(self, _id): + def __init__(self, _id, history_size = 10): self.id = _id self.energy = [] + self.history_size = 10 - def add_energy_measurement(energy): + def add_energy_measurement(self, energy): self.energy.append((datetime.datetime.now(), energy)) - self.energy = self.energy[-10:] + self.energy = self.energy[-self.history_size:] - def get_metrics(): + def get_metrics(self): if len(self.energy) > 0: last = self.energy[-1] s = ('energy{{node="esp8266-{mid:s}"}} {energy:f} ' @@ -32,18 +29,27 @@ class Measurements: else: return '' def __init__(self): - self._meters = [] + self._meters = {} self._lock = threading.Lock() def _get_meter_by_id(self, _id): if _id not in self._meters: - self._meters[_id] = Meter(_id) + self._meters[_id] = self.Meter(_id) return self._meters[_id] - def add_energy_measurement(meter_id, energy): + def add_energy_measurement(self, meter_id, energy): with self._lock: meter = self._get_meter_by_id(meter_id) - meter.energy.append((datetime.datetime.now(), energy)) + meter.add_energy_measurement(energy) + + def get_metrics(self): + with self._lock: + s = '' + for meter in self._meters.values(): + s += meter.get_metrics() + return s + +meters = Meters() def on_message(client, userdata, message): m = re.match('iot/(?P[^/]+)/[^/]+/energy', message.topic) @@ -55,12 +61,7 @@ def on_message(client, userdata, message): else: if message.retain == 0: mid = m.group('id') - with lock: - if mid not in measurements: - measurements[mid] = [] - ms = measurements[mid] - ms.append((datetime.datetime.now(), energy)) - measurements[mid] = ms[-10:] + meters.add_energy_measurement(mid, energy) con.on_message = on_message con.loop_start() @@ -73,14 +74,7 @@ def metrics(): r = "" r += "# HELP energy energy in joules\n" r += "# TYPE energy counter\n" - with lock: - m = copy.deepcopy(measurements) - for mid in m: - ms = [m[mid][-1]] - for s in ms: - r += 'energy{{node="esp8266-{mid:s}"}} {energy:f} {epoch:d}\n'.format(mid=mid, energy=s[1], epoch=int(s[0].timestamp() * 1000) ) + r += meters.get_metrics() return flask.Response(r, mimetype='text/plain; version=0.0.4') app.run('0.0.0.0') - -