PiotrMachowski / Home-Assistant-custom-components-Tauron-AMIplus

This sensor uses unofficial API to get energy usage and generation data from https://elicznik.tauron-dystrybucja.pl.
MIT License
131 stars 34 forks source link

Total consumption and generation support #65

Closed mariusz-schimke closed 1 year ago

mariusz-schimke commented 1 year ago

Adds support for reading the total consumption of the previous day.

mariusz-schimke commented 1 year ago

Zaimplementowałem scraping stanu licznika, korzystając z parsera HTML i regexa. Wydaje się, że wszystko działa spoko, ale na razie testuję.

Starałem się podporządkować obecnej strukturze implementacji, ale nie mam pewności, czy dobrze ustawiłem parametry dla TYPE_CONSUMPTION_TOTAL i TYPE_GENERATION_TOTAL. Niby działa ;). Gdybyś mógł spojrzeć jako autor, będę Ci wdzięczny. Dzięki!

Druga sprawa to ustawianie self.params w sensor.py. Nie mogłem zrozumieć, do czego to jest wykorzystywane. Np. zastanawiam się, czy dałoby się przekazywać do HA datę odczytu, bo ją też odczytuję z odpowiedzi z Tauronu.

Dzięki!

PiotrMachowski commented 1 year ago

Hej @mariusz-schimke!

Bardzo dziękuję za Twój wkład, niestety Tauron wczoraj wprowadził nową wersję systemu z całkowicie odświeżonymi interfejsem i API (#72).

Wrzuciłem na brancha dev zmiany dostosowujące integrację, jeśli masz ochotę, to możesz spróbować dostosować ją do obsługi generacji oraz wielu liczników (ja nie mam takich danych na swoim koncie).

mariusz-schimke commented 1 year ago

Hej @PiotrMachowski,

dzięki za informację. Postaram się na to spojrzeć w najbliższym czasie. Widzę, że już nie będzie trzeba uprawiać scrapingu HTML-a, bo zwracają ładnie dane z API, z podziałem na strefy. Jest to tablica wyników, ale widzę, że to dlatego, że to samo zapytanie jest po okres miesiąca i wtedy zwracają w tablicy dzień po dniu. Ciekawe tylko, skąd ta jednostka kWha – pierwszy raz widzę.

{
    "success": true,
    "data": [
        {
            "S1": "966",
            "Date": "07.01.2023 23:59:59",
            "S2": null,
            "S3": null,
            "C": 966,
            "JM": "kWha"
        }
    ]
}
PiotrMachowski commented 1 year ago

Tak, API jest teraz bardziej cywilizowane ;) na branchu dev dodałem już obsługę tych wartości. Z tego co rozumiem, to kWha można traktować normalnie jak kWh, także bym się tym nie przejmował.

image

mariusz-schimke commented 1 year ago

@PiotrMachowski, aa, czyli wszystko jest gotowe, nawet z bieżącymi odczytami, super! Właśnie to wrzuciłem do HA i działa fajnie.

Co do wielu liczników i produkcji energii, sam niestety nie mam do tego dostępu, ale może skorzystamy z uprzejmości @grest (https://github.com/PiotrMachowski/Home-Assistant-custom-components-Tauron-AMIplus/issues/54#issuecomment-1309887376)? :)

@grest, moglibyśmy Cię prosić o screenshot, jak wygląda u Ciebie interfejs i zwrotka z API w przeglądarce, gdy poprosisz o odczyt z konkretnego dnia? ;)

image image

mariusz-schimke commented 1 year ago

@PiotrMachowski, mam wrażenie, że pobiera mi odczyt sprzed dwóch dni. Spojrzałem na szybko na kod i tam pobierasz odczyty z dwóch dni za jednym zamachem, ale odczytujesz docelowo pierwszy z tablicy. Jeśli dobrze patrzę (nie weryfikuję tego dokładnie), tablica z API jest posortowana rosnąco, czyli raczej powinieneś wziąć ostatni element).

    def update_readings(self, json_data, tariff):
        reading = json_data["data"][0]
        self._state = reading["C"]
        partials = {s: reading[s] for s in ["S1", "S2", "S3"] if reading[s] is not None}
        self.params = {"date": reading["Date"], **partials}
        self.tariff = tariff
PiotrMachowski commented 1 year ago

@mariusz-schimke dane z 2 dni powinny być pobierane tylko dla dziennych odczytów, stan licznika powinien być pobierany dla jednego dnia. Rzucę okiem jak to wygląda, pisałem to w nocy, może coś mi się namieszało

mariusz-schimke commented 1 year ago

@PiotrMachowski , nie chcę się narzucać z rozwiązaniem – mam nadzieję, że nie masz mi za złe, ale zrobiłem od razu zmianę i PR.

Masz rację – pobierałeś go z jednego dnia. Na początku to źle zinterpretowałem. Zmieniłem kod tak, że pobiera od razu odczyty z dwóch dni, dzięki czemu nie będzie trzeba testować, czy odczyt z wczoraj już jest. Teraz po prostu w odpowiedzi dostaniemy 1-2 odczytów, gdzie ostatni będzie najnowszym dostępnym ;). Poprawiłem to i sprawdziłem – zdaje się działać.

PiotrMachowski commented 1 year ago

@mariusz-schimke jest git, dzięki ;)

PiotrMachowski commented 1 year ago

@mariusz-schimke dzięki za pomoc, zamknę teraz tego PRa, bo już jest nieaktualny