: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 :)
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.
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.
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:
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
ha_url: http://ip-adresa-nebo-url-vaseho-ha:8123
token: vas-token-ktery-jste-si-vytvorili-vyse
app_dir: /homeassistant/appdaemon/apps
logs:
pnd:
name: pnd
filename: /homeassistant/appdaemon/pnd.log
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
---
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"
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:
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í.
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
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í):
Postup instalalce je uvedený na stránkách projektu
Postup instalace je uvedený na stránkách projektu
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.
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
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
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
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)
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
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
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
Pokud máte nějaké přání, nápad na vylepšení - vytvořte požadavek zde na GitHubu