sensor.greenely icon indicating copy to clipboard operation
sensor.greenely copied to clipboard

Produktionsdata

Open Sudlav opened this issue 2 years ago • 5 comments

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?

Sudlav avatar Apr 08 '22 12:04 Sudlav

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.

linsvensson avatar Apr 08 '22 13:04 linsvensson

Jag kan testa det vid tillfälle. Återkommer....

Sudlav avatar Apr 08 '22 13:04 Sudlav

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

Sudlav avatar Apr 08 '22 19:04 Sudlav

Fräsigt! Vill du att jag ska peta in koden eller vill du göra en PR? :)

linsvensson avatar Apr 08 '22 20:04 linsvensson

Du får äran att göra det ;-) Jag har ingen Home assistant och kan inte testa det hela vägen.

Sudlav avatar Apr 08 '22 20:04 Sudlav