Handle missing metrics in SEP payload

This commit is contained in:
Ben Roberts
2020-09-06 11:35:07 +01:00
parent 72cf336947
commit c1cc54436c
3 changed files with 18 additions and 6 deletions

View File

@@ -1,6 +1,7 @@
--- ---
ca_certs: /etc/ssl/certs/ca-certificates.crt ca_certs: /etc/ssl/certs/ca-certificates.crt
debug: false debug: false
noop: False
mqtt: mqtt:
server: glowmqtt.energyhive.com server: glowmqtt.energyhive.com
port: 8883 port: 8883

View File

@@ -97,7 +97,9 @@ def main():
msg = msg_q.get() msg = msg_q.get()
logger.debug(msg.topic + " " + str(msg.payload)) logger.debug(msg.topic + " " + str(msg.payload))
usage = parse_sep(msg.topic, msg.payload) usage = parse_sep(msg.topic, msg.payload)
if usage:
usage_datapoints = usage_to_datapoints(usage) usage_datapoints = usage_to_datapoints(usage)
if not config["noop"].get(bool):
influx_client.write_points(usage_datapoints) influx_client.write_points(usage_datapoints)
except KeyboardInterrupt: except KeyboardInterrupt:
break break

View File

@@ -2,6 +2,7 @@
""" """
import datetime import datetime
import json import json
import logging
def parse_sep(topic, payload_str): def parse_sep(topic, payload_str):
@@ -13,6 +14,8 @@ def parse_sep(topic, payload_str):
:param payload_str: str SEP payload message as a string :param payload_str: str SEP payload message as a string
:return: :return:
""" """
logger = logging.getLogger(__name__)
def _get_metric(path, type=int): def _get_metric(path, type=int):
value = payload value = payload
try: try:
@@ -23,9 +26,19 @@ def parse_sep(topic, payload_str):
else: else:
return type(value) return type(value)
except KeyError: except KeyError:
logger.debug("Ignoring payload missing metric: %s", ".".join(path))
return None return None
payload = json.loads(payload_str) payload = json.loads(payload_str)
try:
assert(_get_metric(["elecMtr", "0702", "03", "00"]) == 0) # kWh
assert(_get_metric(["gasMtr", "0702", "03", "01"]) == 1) # m3
assert(_get_metric(["gasMtr", "0702", "03", "12"]) == 0) # kWh
except AssertionError:
logger.warning("Received a payload without expected data")
return None
timestamp = datetime.datetime.fromtimestamp(payload["gmtime"], tz=datetime.timezone.utc) timestamp = datetime.datetime.fromtimestamp(payload["gmtime"], tz=datetime.timezone.utc)
electricity_consumption = _get_metric(["elecMtr", "0702", "04", "00"]) electricity_consumption = _get_metric(["elecMtr", "0702", "04", "00"])
electricity_daily_consumption = _get_metric(["elecMtr", "0702", "04", "01"]) electricity_daily_consumption = _get_metric(["elecMtr", "0702", "04", "01"])
@@ -44,10 +57,6 @@ def parse_sep(topic, payload_str):
gas_mpan = _get_metric(["gasMtr", "0702", "03", "07"], str) gas_mpan = _get_metric(["gasMtr", "0702", "03", "07"], str)
device_gid = _get_metric(["gid"], str) device_gid = _get_metric(["gid"], str)
assert(int(payload["elecMtr"]["0702"]["03"]["00"], 16) == 0) # kWh
assert(int(payload["gasMtr"]["0702"]["03"]["01"], 16) == 1) # m3
assert(int(payload["gasMtr"]["0702"]["03"]["12"], 16) == 0) # kWh
data = { data = {
'timestamp': timestamp, 'timestamp': timestamp,
'tags': { 'tags': {