Skip to content

Commit 6f2fb50

Browse files
load all rate history on first load
1 parent d9b33af commit 6f2fb50

File tree

1 file changed

+83
-16
lines changed

1 file changed

+83
-16
lines changed

octopus/load_agile_rates.py

Lines changed: 83 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import requests
22
from datetime import datetime
3+
import time
34
import sys
45
import json
56
import os
@@ -48,6 +49,8 @@
4849
feedid = feed['id']
4950
break
5051

52+
end_time = 0
53+
5154
# if feed not found, create a new feed
5255
# https://emoncms.org/feed/create.json?tag=Octopus&name=AGILE-23-12-06-D&engine=5&options={"interval":1800}
5356
if feedid is None:
@@ -62,26 +65,90 @@
6265

6366
if response.status_code == 200:
6467
feedid = response.json()['feedid']
68+
else:
69+
# If the feed exists get the last data point
70+
url = f"{host}/feed/getmeta.json?id={feedid}&apikey={apikey}"
71+
response = requests.get(url)
72+
if response.status_code == 200:
73+
meta = response.json()
74+
if meta['npoints'] > 0:
75+
end_time = meta['start_time'] + (meta['interval'] * meta['npoints'])
6576

66-
url = f"https://api.octopus.energy/v1/products/{tariff_name}/electricity-tariffs/E-1R-{tariff_name}-{gsp_id}/standard-unit-rates/"
67-
response = requests.get(url)
77+
# Calculate number of half hours since last data point
78+
now = time.time()
79+
diff = now - end_time
80+
half_hours = int(diff / 1800)
81+
page_size = half_hours
6882

69-
if response.status_code == 200:
70-
result = response.json()
83+
if page_size > 1500:
84+
page_size = 1500
85+
86+
if page_size < 100:
87+
page_size = 100
88+
89+
print (f"Number of half hours since last data point: {half_hours}, page size: {page_size}")
7190

72-
if result is not None and 'results' in result:
91+
data = []
92+
93+
# start from page 1 and go through all pages
94+
page = 1
95+
while True:
96+
97+
complete = False
98+
99+
print (f"Fetching page {page}")
100+
url = f"https://api.octopus.energy/v1/products/{tariff_name}/electricity-tariffs/E-1R-{tariff_name}-{gsp_id}/standard-unit-rates/?page={page}&page_size={page_size}"
101+
response = requests.get(url)
102+
103+
if response.status_code == 200:
104+
result = response.json()
73105

74-
data = []
75-
for row in result['results']:
76-
date = datetime.fromisoformat(row['valid_from'].replace('Z', '+00:00'))
77-
data.append([int(date.timestamp()), row['value_exc_vat']])
106+
if result is not None and 'results' in result:
78107

79-
# sort by timestamp asc
80-
data.sort(key=lambda x: x[0])
108+
print (f"Number of data points: {len(result['results'])}")
109+
if len(result['results']) == 0:
110+
complete = True
111+
break
81112

82-
# Send data to emoncms feed/post API
83-
url = f"{host}/feed/post.json?id={feedid}&apikey={apikey}&data={data}"
84-
response = requests.get(url)
113+
for row in result['results']:
114+
date = datetime.fromisoformat(row['valid_from'].replace('Z', '+00:00'))
115+
timestamp = int(date.timestamp())
116+
117+
if timestamp < end_time:
118+
complete = True
119+
break
120+
121+
data.append([int(date.timestamp()), row['value_exc_vat']])
122+
else:
123+
complete = True
124+
break
125+
else:
126+
complete = True
127+
break
128+
129+
if complete:
130+
break
131+
132+
page += 1
133+
134+
135+
136+
# print number of data points
137+
print(f"Number of data points: {len(data)}")
138+
139+
# sys.exit(0)
140+
141+
if len(data):
142+
# sort by timestamp asc
143+
data.sort(key=lambda x: x[0])
144+
145+
# Send data to emoncms feed/post API
146+
url = f"{host}/feed/post.json?id={feedid}&apikey={apikey}"
147+
response = requests.post(url, data={'data': json.dumps(data)})
148+
149+
if response.status_code == 200:
150+
print("Data uploaded successfully")
151+
else:
152+
print("Error uploading data")
153+
print(response.text)
85154

86-
if response.status_code == 200:
87-
print("Data uploaded successfully")

0 commit comments

Comments
 (0)