Initial version
This commit is contained in:
84
energy_usage/sep.py
Normal file
84
energy_usage/sep.py
Normal 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
|
||||
Reference in New Issue
Block a user