11import requests
22from datetime import datetime
3+ import time
34import sys
45import json
56import os
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}
5356if feedid is None :
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