sensor.greenely
sensor.greenely copied to clipboard
Produktionsdata
Funktionen GreenelyAPI.get_usage returnerar inte hur mycket man använt - den returnerar hur mycket man köpt. Eftersom jag även har egen produktion av solel så ger interfacet mig inte vad jag vill ha (jag vill veta hur mycket jag förbrukat oavsett om det var egenproducerat eller köpt).
I greenelys app kan jag se hur mycket jag själv procuderat, använt, sålt och köpt. Har man tillgång till tre av de fyra så kan ju den sista enkelt beräknas från de andra, men som det är nu får jag bara köpt och sålt.
Antagligen finns det fler typer av data man kan läsa ut via Greenelys API, men jag hittar inte API-specen någonstans så jag kan inte dubbelkolla att det jag behöver är tillgängligt via API:et.
Har du tillgång till specen, eller har du möjlighet att lägga till ytterligare stöd för att läsa ut åtminstone en till av de fyra parametrarna?
Det finns säkert jättemycket mer man kan läsa ut från deras API, men jag har tyvärr inte tillgång till mer än någon annan...
Vad jag har gjort för att se de anrop jag behöver är att koppla in mobilen till dator och köra Android Studio medans jag navigerar i appen. Där skrivs anropen ut i logcat. Så om datan finns i appen och skrivs ut i loggen så kan jag absolut lägga till det i sensorn.
Det hade varit smidigt om du kunde få ut rätt anrop, då jag själv inte säljer el och inte har tillgång till det i appen.
Jag kan testa det vid tillfälle. Återkommer....
Jag har en kraftigt modifierad kod, men som i botten baseras på ditt jobb, kudos! Här kommer mina funktioner som returnerar köpt, såld, använd och producerad el. Hur den fungerar för den som inte producerar el är jag inte säker på, men om jag petar in gamla datum från innan jag var elproducent, då returnerar det fortfarande korrekta värden. Dock är formatet på det som är returnerat inte detsamma som i din ursprungliga kod. Hoppas ändå det här hjälper i att förbättra din redan fina kod! Så här ser mina funktioner ut:
def get_used(self, from_date_and_time, num_to_get=1, resolution="hourly"):
bought = self.get_bought(from_date_and_time, num_to_get, resolution)
sold = self.get_bought(from_date_and_time, num_to_get, resolution)
produced = self.get_bought(from_date_and_time, num_to_get, resolution)
used = dict()
for dat in bought:
b = bought[dat]
try:
p = produced[dat]
except:
p = 0
try:
s = sold[dat]
except:
s = 0
used[dat] = b + p - s
return used
def get_bought(self, from_date_and_time, num_to_get=1, resolution="hourly"):
return self.get_power_data("consumption", from_date_and_time, num_to_get, resolution)
def get_produced(self, from_date_and_time, num_to_get=1, resolution="hourly"):
return self.get_power_data("produced-electricity", from_date_and_time, num_to_get, resolution)
def get_sold(self, from_date_and_time, num_to_get=1, resolution="hourly"):
return self.get_power_data("sold-electricity", from_date_and_time, num_to_get, resolution)
def get_power_data(self, type_of_data, from_date_and_time, num_to_get=1, resolution="hourly"):
result = dict()
if not self.check_auth():
return result
"""Get sold/bought/consumed/produced data from the Greenely API."""
if resolution == "hourly":
to_date_and_time = from_date_and_time + datetime.timedelta(hours=num_to_get)
elif resolution == "daily":
to_date_and_time = from_date_and_time + datetime.timedelta(days=num_to_get)
elif resolution == "monthly":
to_date_and_time = from_date_and_time + datetime.timedelta(months=num_to_get)
else:
return result
if to_date_and_time > Misc.time_now():
to_date_and_time = Misc.time_now()
query_str = "?from=%s&to=%s&resolution=%s" % (from_date_and_time.strftime("%Y-%m-%d"), to_date_and_time.strftime("%Y-%m-%d"), resolution)
url = "%s%s/%s%s" % (self._url_sold, self._facility_id, type_of_data, query_str)
response = requests.get(url, headers=self._headers)
if response.status_code == requests.codes.ok:
data = response.json()
result = dict()
for x in data["data"]:
try:
amount = data["data"][x]["usage"] # consumption and sodl-electricity uses "usage"
except:
amount = None
if amount is None:
try:
amount = data["data"][x]["value"] # produced-electricity uses "value"
except:
amount = None
time = data["data"][x]["localtime"]
if amount is not None and time is not None:
date_and_time = datetime.datetime.strptime(time, "%Y-%m-%d %H:%M")
result[date_and_time] = amount
else:
self.log.error('Failed to fetch %s data from %s, %s', type_of_data, from_date_and_time.strftime("%Y-%m-%d"), response.text)
return result
Fräsigt! Vill du att jag ska peta in koden eller vill du göra en PR? :)
Du får äran att göra det ;-) Jag har ingen Home assistant och kan inte testa det hela vägen.