Initial version

This commit is contained in:
Ben Roberts
2020-09-06 00:10:50 +01:00
commit 2b5c99e0cd
7 changed files with 263 additions and 0 deletions

84
energy_usage/sep.py Normal file
View File

@@ -0,0 +1,84 @@
""" SEP protocol parser
"""
import datetime
import json
def parse_sep(topic, payload_str):
"""
Credit to https://gist.github.com/ndfred/b373eeafc4f5b0870c1b8857041289a9
:param topic: str Topic SEP payload was received from
:param payload_str: str SEP payload message as a string
:return:
"""
payload = json.loads(payload_str)
timestamp = datetime.datetime.fromtimestamp(payload["gmtime"], tz=datetime.timezone.utc)
electricity_consumption = int(payload["elecMtr"]["0702"]["04"]["00"], 16)
electricity_daily_consumption = int(payload["elecMtr"]["0702"]["04"]["01"], 16)
electricity_weekly_consumption = int(payload["elecMtr"]["0702"]["04"]["30"], 16)
electricity_monthly_consumption = int(payload["elecMtr"]["0702"]["04"]["40"], 16)
electricity_multiplier = int(payload["elecMtr"]["0702"]["03"]["01"], 16)
electricity_divisor = int(payload["elecMtr"]["0702"]["03"]["02"], 16)
electricity_meter = int(payload["elecMtr"]["0702"]["00"]["00"], 16)
electricity_mpan = payload["elecMtr"]["0702"]["03"]["07"]
gas_daily_consumption = int(payload["gasMtr"]["0702"]["0C"]["01"], 16)
gas_weekly_consumption = int(payload["gasMtr"]["0702"]["0C"]["30"], 16)
gas_monthly_consumption = int(payload["gasMtr"]["0702"]["0C"]["40"], 16)
gas_multiplier = int(payload["gasMtr"]["0702"]["03"]["01"], 16)
gas_divisor = int(payload["gasMtr"]["0702"]["03"]["02"], 16)
gas_meter = int(payload["gasMtr"]["0702"]["00"]["00"], 16)
gas_mpan = payload["gasMtr"]["0702"]["03"]["07"]
device_gid = payload["gid"]
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 = {
'timestamp': timestamp,
'tags': {
'topic': topic,
'gid': device_gid,
},
'electricity': {
'tags': {
'mpan': electricity_mpan,
},
'metrics': {
'draw': electricity_consumption * electricity_multiplier / electricity_divisor,
'consumption_daily': electricity_daily_consumption * electricity_multiplier / electricity_divisor,
'consumption_weekly': electricity_weekly_consumption * electricity_multiplier / electricity_divisor,
'consumption_monthly': electricity_monthly_consumption * electricity_multiplier / electricity_divisor,
'meter_reading': electricity_meter * electricity_multiplier / electricity_divisor,
},
},
'gas': {
'tags': {
'mpan': gas_mpan,
},
'metrics': {
'consumption_daily': gas_daily_consumption * gas_multiplier / gas_divisor,
'consumption_weekly': gas_weekly_consumption * gas_multiplier / gas_divisor,
'consumption_monthly': gas_monthly_consumption * gas_multiplier / gas_divisor,
'meter_reading': gas_meter * gas_multiplier / gas_divisor,
},
},
}
return data
def usage_to_datapoints(usage):
datapoints = []
for utility in ['electricity', 'gas']:
datapoints.append({
"measurement": utility,
"tags": {**usage['tags'], **usage[utility]['tags']},
"time": usage['timestamp'].isoformat(),
"fields": usage[utility]['metrics'],
})
return datapoints