Handle missing metrics in SEP payload
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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': {
|
||||||
|
|||||||
Reference in New Issue
Block a user