ondrejvysek / HomeAssistant-CEZDistribuce-PND

11 stars 2 forks source link

Home Assistant ČEZ Distribuce Portál Naměřených Dat

:exclamation::exclamation::exclamation: Stávající uživatelé pozor, 16.4.2024 byla vydána nová verze modulu Numpy, která není kompatibilní s aktuální verzí AppDaemon (resp Pandas). Do nastavení AppDaemon je nutné přidat modul numpy==1.26.4 viz zde: https://github.com/ondrejvysek/HomeAssistant-CEZDistribuce-PND/issues/42#issuecomment-2174487719. Problém se projeví po restartu AppDaemon, tj např při aktualizaci HA. Pro nové instalace je dokumentace aktualizovaná :exclamation::exclamation::exclamation:

Script a nastavení Home Assistant slouží pro vyčítání dat o spotřebě a výrobě elektřiny z distribučního portálu https://www.cezdistribuce.cz/ v denních úhrnech

Pokud se vám řešení líbí, můžete mne podpořit v další tvorbě a rozvoji - za což vám předem děkuji :)

"Buy Me A Coffee"

Po správném nastavení a spuštění scripu vznikou v Home Assistant tyto senzory:

Výsledkem pak může být například takovýto dashboard (návod na jeho výrobu je popsán níže)

POZOR: Pokud již používáte AppDaemon nebo máte ve svém HA výše uvedené entity, návod je potřeba odpovídajícím způsobem upravit, abyste zachovali to co již používáte. Takové úpravy nejsou v návodu uvedeny.

Co je potřeba

  1. Přihlášení do Distribučního Portálu
  2. HomeAssistant
  3. Tvorba Dashboardu
  4. Nápady a plány
  5. Změny (Changelog)

Distribuční portál

Zažádejte si o přihlášení do Distribučního Portálu na webu https://dip.cezdistribuce.cz/irj/portal/ obvykle vyřízeno do druhého dne.

Po přihlášení ověřte, že máte k dispozici váš elektroměr v sekci "Množina zařízení". V tuto chvíli script stahuje všechna data, tedy pokud máte více elektroměrů, nemusí script fungovat správně.

Pozn.: Skript prozatím neumí správně pracovat s uživatelskými sestavami a více elektroměry. Zvolte v portále "Rychlá sestava" a "Všechny EANy" nebo odpovídající elektroměr a odhlaste se z portálu.

HomeAssistant

Pokud toto čtete, více k čemu je HomeAssistant dobrý, pokud přeci ne, více na stránkách projektu.Kromě funkčního HomeAssistanta je nutné mít také k dispozici přihlašovací token, který snadno vytvoříte:

  1. Klikněte na vaše jméno vlevo dole
  2. Klikněte na záložku "Zabezpečení" nahoře
  3. V dolní části stránky klikněte na "Vytvořit token"
  4. Token pojmenujte např. "AppDaemon" (bez uvozovek) a klikněte na OK
  5. zobrazený token si zkopírujte, budete jej za chvíli potřebovat. POZOR: Token se zobrazí pouze zde a pouze jednou, pokud si jej nezkopírujete, nebude již přístupný a bude nutné vytvořit nový

AppDaemon

AppDaemon je volně spojené, vícevláknové, sandboxované prostředí pro spouštění Pythonu, určené pro psaní automačních aplikací pro software domácí automatizace Home Assistant. Více o AppDaemon naleznete na GitHubu autora

Instalace a nastavení AppDaemon

  1. V nastavení HA zvolte "Doplňky" a dále pak "Obchod s doplňky"
  2. Vyhledejte AppDaemon, zvolte jej a klikněte na "Nainstalovat". Instalace dle rychlosti vašeho HW a internetu je hotova do několika minut.
  3. Po instalaci přejděte do nastavení AppDaemon
    • v části "System Packages" přidejte chromium-chromedriver a chromium. Pozn.: pokaždé vložte jeden název a stiskněte enter, je nutné přidávat postupně
    • v části "Python packages" přidejte selenium, pandas, numpy==1.26.4 a bs4. Pozn.: pokaždé vložte jeden název a stiskněte enter, je nutné přidávat postupně
    • Klikněte na "Uložit". Konfigurace by měla odpovídat obrázku níže
  4. Spusťte doplněk AppDaemon

image

Konfigurace prostředí AppDaemon

  1. V nastavení File editoru vypněte možnost "Enforce Basepath" a zvolte "Uložit" (doplněk se restartuje)
  2. Spusťte File File Editor a otevřete soubor _addon_configs/a0d7b954appdaemon/appdaemon.yaml. (pozor je nutné ve File Editoru přejít do kořenové složky, proto se nastavovala volba výše.
  3. v části plugins>HASS doplňte
    ha_url: http://ip-adresa-nebo-url-vaseho-ha:8123
    token: vas-token-ktery-jste-si-vytvorili-vyse
  4. v části appdaemon doplňte app_dir: /homeassistant/appdaemon/apps
  5. přidejte část:
    logs:
    pnd:
    name: pnd
    filename: /homeassistant/appdaemon/pnd.log
  6. soubor uložte a restartujte doplněk AppDaemon

Celý appdaemon.yaml vypadá nějak takto:

---
appdaemon:
  latitude: 52.379189
  longitude: 4.899431
  elevation: 2
  time_zone: Europe/Amsterdam
  thread_duration_warning_threshold: 60
  plugins:
    HASS:
      type: hass
      ha_url: http://192.168.1.100:8123
      token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
  app_dir: /homeassistant/appdaemon/apps
http:
  url: http://127.0.0.1:5050
admin:
api:
hadashboard:
logs:
  pnd:
    name: pnd
    filename: /homeassistant/appdaemon/pnd.log

Vytvoření aplikace PND v AppDaemon

  1. ve File Editor přejdět do složky homeassistant/
  2. vytvořte složku appdaemon a přejděte do ní
  3. vytvořte složku apps a přejděte do ní
  4. vytvořte složku pnd
  5. ve složce apps vytvořte soubor apps.yaml s obsahem:
    • parametr PNDUserName je váš email s přihlášením do portálu
    • parametr PNDUserPassword je heslo pro přihláše
    • parametr DataInterval je interval dat, které budete chtít stahovat - například období fixace smlouvy. Nedoporučuji víc jak rok, mohlo by zahltit databázi.
    • parametr ELM je číslo (pouze číslo, nikoliv ELM 3000000000) vašeho elektroměru, který chcete sledovat v HA. zjistíte jej v Portále - viz obrázek níže

---
pnd:
  module: pnd
  class: pnd
  log: pnd
  PNDUserName: "vas email s prihlasenim do portalu distribuce"
  PNDUserPassword: "vase heslo do portalu distribuce"
  DataInterval: "27.10.2023 00:00 - 27.10.2024 00:00"
  ELM: "3000012345"
  DownloadFolder: "/homeassistant/appdaemon/apps/pnd"
  1. soubor uložte
  2. do složky apps nahrajte soubor pnd.py
  3. restartujte doplněk AppDaemon. Pozn.: při aktualizaci souboru pnd.py za novější, není nutné doplněk restartovat

POZOR: Data se neaktualizují sama od sebe, ale pouze automatickým nebo ručním spuštěním automatizace (viz níže) případně ručním vyvoláním události run_pnd v nástrojích pro vývojáře.

Při úspěšném chodu skriptu:

Nastavení automatické aktualizace dat

Skript, který získává data vyčkává na událost _runpnd v rámci Home Assistant. Nejsnazší cestou je vytvoření automatizace, která v pravidelném čase stažení dat spustí.

  1. V Home Assistant zvolit "Nastavení" > "Automatizace a scény"
  2. Vytvořit novou automatizaci
    • parametr "Když" > "Přidat spouštěč" zvolit "Čas" a zvolte čas, ve kterém se má spouštět. Data na portále jsou dostupná několik minut po půlnoci, můžete nastavit např. 00:30:00 AM tedy 30 minut po půlnoci se spustí.
    • parametr "Pak provést" zvolit "Ruční událost" do "Typ události" zadat _runpnd
  3. Uložit automatizaci - zvolte jméno automatizace, které si přejete

Ověřte funkčnost nastavení (AppDaemon, skript a automatizace) > vpravo nahoře tři tečky > "Spustit"

Chod skriptu trvá cca 50vteřin, poté byste měli vidět odpovídající entity v HA.

YAML kód automatizace

alias: Run PND
description: ""
trigger:
  - platform: time
    at: "00:30:00"
condition: []
action:
  - event: run_pnd
    event_data: {}
mode: single

Řešení problémů se skriptem

Nejprve zkuste spustit znovu, skript simuluje pohyb na webové stránce a není garantováno, že stránka bude vždy stejná a skript doběhne úspěšně dokonce, případně restartujte AppDaemon a spusťe skript znovu.

Pokud se vyskytne problém (např data se nestahují):

Časté problémy

Instalace HACS

Postup instalalce je uvedený na stránkách projektu

Instalace ApexCharts Card

Postup instalace je uvedený na stránkách projektu

Tvorba Dashboardu

Cílem návodu není do detailu popisovat jak v Home Assistant vytvářet dashboardy, níže uvádím ukázky grafů, které lze s výše získaných dat vytvořit. Pokud vytvoříte nějaký super graf, přidejte kód zde na Gitu.

Pokud jste postupovali dle návodu a máte data v Home Assistantu, pak stačí vytvořit novou "Manuální kartu" a do ní zkopírovat kód jednotlivých karet níže.

PND Včerejší stav spotřeby/výroby

Využívá senzory _sensor.pndconsumption a _sensor.pndproduction které obsahují denní spotřebu resp výrobu za předchozí den. Senzory jsou třídy (device_class) energy a jsou tedy automaticky ukládány do dlouhodobých dat v HomeAssistant

type: custom:apexcharts-card
stacked: true
graph_span: 7d
span:
  end: day
header:
  show: true
  title: PND Včerejší stav
series:
  - entity: sensor.pnd_consumption
    name: Spotřeba
    color: var(--error-color)
    opacity: 0.8
    invert: true
    type: column
    group_by:
      func: last
      duration: 1d
  - entity: sensor.pnd_production
    name: Výroba
    color: var(--success-color)
    opacity: 0.8
    type: column
    group_by:
      func: last
      duration: 1d

Přehled celkové výroby / spotřeby

Používá kartu rychlý náhled. Jsou využita data ze senzorů _sensor.pnd_total_intervalconsumption resp _sensor.pnd_total_intervalproduction

show_name: true
show_icon: true
show_state: true
type: glance
entities:
  - entity: sensor.pnd_total_interval_consumption
    name: Spotřeba za Období
  - entity: sensor.pnd_total_interval_production
    name: Výroba za Období
  - entity: sensor.pnd_production2consumption
    name: Využití VB
  - entity: sensor.pnd_production2consumptionfull
    name: Výroba/Spotřeba
  - entity: sensor.pnd_production2consumptionfloor
    name: Rezerva VB
state_color: false
title: Celkový přehled

Stav využití Virtuální Baterie

Jedná se o poměr mezi výrobou a spotřebou, maximální hodnota je 100 (tj pokud je výroba větší nežli spotřeba, bude hodnota 100%). Využívá standardní kartu Home Assistanta

type: gauge
entity: sensor.pnd_production2consumption
name: Využití Virtuální Baterie
min: 0
max: 100
needle: false

Přehled celkové výroby / spotřeby v koláčovém grafu

Jsou využita data ze senzorů _sensor.pnd_total_intervalconsumption resp _sensor.pnd_total_intervalproduction

type: custom:apexcharts-card
chart_type: donut
header:
  show: true
  title: PND Shrnutí Období
apex_config:
  plotOptions:
    pie:
      donut:
        total:
          show: true
          showAlways: true
series:
  - entity: sensor.pnd_total_interval_production
    name: Výroba
    color: var(--success-color)
  - entity: sensor.pnd_total_interval_consumption
    name: Spotřeba
    color: var(--error-color)

Přehled výroby / spotřeby za posledních 10 dní

Využívá data _sensor.pnddata

type: custom:apexcharts-card
stacked: true
graph_span: 10d
span:
  end: day
header:
  show: true
  title: PND Posledních 10 dní
series:
  - entity: sensor.pnd_data
    name: Výroba
    attribute: production
    data_generator: |
      return entity.attributes.pnddate.map((pnd, index) => {
        return [new Date(pnd).getTime(), entity.attributes.production[index]];
      });
    color: var(--success-color)
    opacity: 0.8
    invert: false
    type: column
  - entity: sensor.pnd_data
    name: Spotřeba
    attribute: consumption
    data_generator: |
      return entity.attributes.pnddate.map((pnd, index) => {
        return [new Date(pnd).getTime(), entity.attributes.consumption[index]];
      });
    color: var(--error-color)
    opacity: 0.8
    invert: true
    type: column

Všechna data výroby / spotřeby z intervalu, agregace po týdnech

type: custom:apexcharts-card
stacked: true
graph_span: 1y
span:
  end: week
header:
  show: true
  title: PND Historická Data (Týdenní agregace)
series:
  - entity: sensor.pnd_data
    name: Výroba
    attribute: production
    data_generator: |
      return entity.attributes.pnddate.map((pnd, index) => {
        return [new Date(pnd).getTime(), entity.attributes.production[index]];
      });
    color: var(--success-color)
    opacity: 0.8
    invert: false
    type: column
    group_by:
      func: sum
      duration: 7d
  - entity: sensor.pnd_data
    name: Spotřeba
    attribute: consumption
    data_generator: |
      return entity.attributes.pnddate.map((pnd, index) => {
        return [new Date(pnd).getTime(), entity.attributes.consumption[index]];
      });
    color: var(--error-color)
    opacity: 0.8
    invert: true
    type: column
    group_by:
      func: sum
      duration: 7d

Všechna data výroby / spotřeby z intervalu, agregace po měsících

type: custom:apexcharts-card
stacked: true
graph_span: 1y
span:
  end: day
header:
  show: true
  title: PND Historická Data (Měsíční agregace)
series:
  - entity: sensor.pnd_data
    name: Výroba
    attribute: production
    data_generator: |
      return entity.attributes.pnddate.map((pnd, index) => {
        return [new Date(pnd).getTime(), entity.attributes.production[index]];
      });
    color: var(--success-color)
    opacity: 0.8
    invert: false
    type: column
    group_by:
      func: sum
      duration: 1month
  - entity: sensor.pnd_data
    name: Spotřeba
    attribute: consumption
    data_generator: |
      return entity.attributes.pnddate.map((pnd, index) => {
        return [new Date(pnd).getTime(), entity.attributes.consumption[index]];
      });
    color: var(--error-color)
    opacity: 0.8
    invert: true
    type: column
    group_by:
      func: sum
      duration: 1month

Plány a nápady

Pokud máte nějaké přání, nápad na vylepšení - vytvořte požadavek zde na GitHubu

Změny

19.6.2024 - 0.9.9

4.6.2024 - 0.9.7

28.5.2024 - 0.9.6

20.5.2024 - 0.9.5

9.5.2024 - 0.9.4.5

9.5.2024 - 0.9.4.4

8.5.2024 - 0.9.4

6.5.2024 - 0.9.3

5.5.2024 - 0.9.2