Add Elpriser pr. time (Dynamisk farve)
598
Elpriser-pr.-time-%28Dynamisk-farve%29.md
Normal file
598
Elpriser-pr.-time-%28Dynamisk-farve%29.md
Normal file
@@ -0,0 +1,598 @@
|
|||||||
|
# Elpriser – ApexCharts
|
||||||
|
|
||||||
|
Dette dashboard-card viser elprisen time for time for de næste 48 timer.
|
||||||
|
|
||||||
|
Priserne vises med dynamiske farver baseret på gennemsnitsprisen:
|
||||||
|
|
||||||
|
| Prisniveau | Grænse | Farve |
|
||||||
|
|---|---:|---|
|
||||||
|
| Billig | < 80 % af gennemsnittet | 🟢 Grøn |
|
||||||
|
| Normal | 80–120 % af gennemsnittet | 🟡 Gul |
|
||||||
|
| Dyr | 120–150 % af gennemsnittet | 🟠 Orange |
|
||||||
|
| Meget dyr | ≥ 150 % af gennemsnittet | 🔴 Rød |
|
||||||
|
|
||||||
|
Derudover vises en blå linje med elprisen ekskl. afgifter.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Krav
|
||||||
|
|
||||||
|
Følgende skal være installeret i Home Assistant:
|
||||||
|
|
||||||
|
- Home Assistant
|
||||||
|
- HACS
|
||||||
|
- Energi Data Service
|
||||||
|
- ApexCharts Card
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 1. Installer Energi Data Service
|
||||||
|
|
||||||
|
## Via HACS
|
||||||
|
|
||||||
|
Energi Data Service er en Home Assistant-integration, som henter elpriser fra Energi Data Service API'et.
|
||||||
|
|
||||||
|
Åbn:
|
||||||
|
|
||||||
|
**Home Assistant → HACS → Integrations**
|
||||||
|
|
||||||
|
Søg efter:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Energi Data Service
|
||||||
|
```
|
||||||
|
|
||||||
|
Vælg:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Energi Data Service
|
||||||
|
MTrab
|
||||||
|
```
|
||||||
|
|
||||||
|
Tryk:
|
||||||
|
|
||||||
|
**Download**
|
||||||
|
|
||||||
|
Genstart derefter Home Assistant.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tilføj integrationen
|
||||||
|
|
||||||
|
Efter genstart:
|
||||||
|
|
||||||
|
**Settings → Devices & services → Add Integration**
|
||||||
|
|
||||||
|
Søg efter:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Energi Data Service
|
||||||
|
```
|
||||||
|
|
||||||
|
Vælg integrationen.
|
||||||
|
|
||||||
|
### Grundopsætning
|
||||||
|
|
||||||
|
Vælg de relevante indstillinger for installationen.
|
||||||
|
|
||||||
|
For Danmark skal der blandt andet vælges korrekt prisområde.
|
||||||
|
|
||||||
|
Typisk:
|
||||||
|
|
||||||
|
```text
|
||||||
|
DK1
|
||||||
|
```
|
||||||
|
|
||||||
|
eller
|
||||||
|
|
||||||
|
```text
|
||||||
|
DK2
|
||||||
|
```
|
||||||
|
|
||||||
|
afhængigt af installationens placering.
|
||||||
|
|
||||||
|
### Priser inkl. moms
|
||||||
|
|
||||||
|
Hvis priserne ønskes vist inkl. moms, skal:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Show prices in VAT
|
||||||
|
```
|
||||||
|
|
||||||
|
aktiveres.
|
||||||
|
|
||||||
|
Dette er vigtigt, da ApexCharts-card'et bruger den pris, som Energi Data Service-integrationen leverer.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2. Sensorer
|
||||||
|
|
||||||
|
Card'et bruger følgende sensorer:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sensor.energi_data_service
|
||||||
|
sensor.elpriser_excl_afgift
|
||||||
|
```
|
||||||
|
|
||||||
|
Den primære sensor er:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sensor.energi_data_service
|
||||||
|
```
|
||||||
|
|
||||||
|
Denne sensor indeholder blandt andet:
|
||||||
|
|
||||||
|
```text
|
||||||
|
today_mean
|
||||||
|
raw_today
|
||||||
|
raw_tomorrow
|
||||||
|
tomorrow_valid
|
||||||
|
```
|
||||||
|
|
||||||
|
Card'et bruger disse attributter til at generere grafen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 3. Installer ApexCharts Card
|
||||||
|
|
||||||
|
Card'et kræver:
|
||||||
|
|
||||||
|
```text
|
||||||
|
custom:apexcharts-card
|
||||||
|
```
|
||||||
|
|
||||||
|
Den anbefalede måde at installere custom cards på er via HACS.
|
||||||
|
|
||||||
|
Åbn:
|
||||||
|
|
||||||
|
**HACS → Frontend**
|
||||||
|
|
||||||
|
Søg efter:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ApexCharts Card
|
||||||
|
```
|
||||||
|
|
||||||
|
Installer:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ApexCharts Card
|
||||||
|
```
|
||||||
|
|
||||||
|
Genindlæs Home Assistant efter installationen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 4. Tilføj Card'et
|
||||||
|
|
||||||
|
Åbn det dashboard, hvor Card'et skal placeres.
|
||||||
|
|
||||||
|
Vælg:
|
||||||
|
|
||||||
|
**Edit Dashboard → Add Card → Manual**
|
||||||
|
|
||||||
|
Indsæt følgende YAML:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
type: grid
|
||||||
|
columns: 1
|
||||||
|
square: false
|
||||||
|
cards:
|
||||||
|
- type: grid
|
||||||
|
columns: 1
|
||||||
|
square: false
|
||||||
|
cards:
|
||||||
|
- type: custom:apexcharts-card
|
||||||
|
apex_config:
|
||||||
|
chart:
|
||||||
|
height: 350
|
||||||
|
header:
|
||||||
|
title: Elpriser pr. time (dynamiske farver)
|
||||||
|
show: true
|
||||||
|
show_states: false
|
||||||
|
graph_span: 48h
|
||||||
|
now:
|
||||||
|
show: true
|
||||||
|
label: Nu
|
||||||
|
span:
|
||||||
|
start: day
|
||||||
|
all_series_config:
|
||||||
|
unit: ' kr.'
|
||||||
|
yaxis:
|
||||||
|
- min: 0
|
||||||
|
apex_config:
|
||||||
|
tickAmount: 6
|
||||||
|
series:
|
||||||
|
- entity: sensor.energi_data_service
|
||||||
|
name: Billig
|
||||||
|
type: column
|
||||||
|
color: '#4CAF50'
|
||||||
|
show:
|
||||||
|
legend_value: false
|
||||||
|
data_generator: >
|
||||||
|
let data = [];
|
||||||
|
|
||||||
|
const avg = entity.attributes.today_mean;
|
||||||
|
|
||||||
|
const greenLimit = avg * 0.8;
|
||||||
|
|
||||||
|
let prices = entity.attributes.raw_today || [];
|
||||||
|
|
||||||
|
if (entity.attributes.tomorrow_valid &&
|
||||||
|
entity.attributes.raw_tomorrow) {
|
||||||
|
prices = prices.concat(entity.attributes.raw_tomorrow);
|
||||||
|
}
|
||||||
|
|
||||||
|
prices.forEach(item => {
|
||||||
|
const p = item.price;
|
||||||
|
|
||||||
|
data.push([
|
||||||
|
new Date(item.hour).getTime(),
|
||||||
|
p < greenLimit ? p : null
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
|
||||||
|
- entity: sensor.energi_data_service
|
||||||
|
name: Normal
|
||||||
|
type: column
|
||||||
|
color: '#FFEB3B'
|
||||||
|
show:
|
||||||
|
legend_value: false
|
||||||
|
data_generator: >
|
||||||
|
let data = [];
|
||||||
|
|
||||||
|
const avg = entity.attributes.today_mean;
|
||||||
|
|
||||||
|
const greenLimit = avg * 0.8;
|
||||||
|
const orangeLimit = avg * 1.2;
|
||||||
|
|
||||||
|
let prices = entity.attributes.raw_today || [];
|
||||||
|
|
||||||
|
if (entity.attributes.tomorrow_valid &&
|
||||||
|
entity.attributes.raw_tomorrow) {
|
||||||
|
prices = prices.concat(entity.attributes.raw_tomorrow);
|
||||||
|
}
|
||||||
|
|
||||||
|
prices.forEach(item => {
|
||||||
|
const p = item.price;
|
||||||
|
|
||||||
|
data.push([
|
||||||
|
new Date(item.hour).getTime(),
|
||||||
|
(p >= greenLimit && p < orangeLimit) ? p : null
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
|
||||||
|
- entity: sensor.energi_data_service
|
||||||
|
name: Dyr
|
||||||
|
type: column
|
||||||
|
color: '#FF9800'
|
||||||
|
show:
|
||||||
|
legend_value: false
|
||||||
|
data_generator: >
|
||||||
|
let data = [];
|
||||||
|
|
||||||
|
const avg = entity.attributes.today_mean;
|
||||||
|
|
||||||
|
const orangeLimit = avg * 1.2;
|
||||||
|
const redLimit = avg * 1.5;
|
||||||
|
|
||||||
|
let prices = entity.attributes.raw_today || [];
|
||||||
|
|
||||||
|
if (entity.attributes.tomorrow_valid &&
|
||||||
|
entity.attributes.raw_tomorrow) {
|
||||||
|
prices = prices.concat(entity.attributes.raw_tomorrow);
|
||||||
|
}
|
||||||
|
|
||||||
|
prices.forEach(item => {
|
||||||
|
const p = item.price;
|
||||||
|
|
||||||
|
data.push([
|
||||||
|
new Date(item.hour).getTime(),
|
||||||
|
(p >= orangeLimit && p < redLimit) ? p : null
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
|
||||||
|
- entity: sensor.energi_data_service
|
||||||
|
name: Meget dyr
|
||||||
|
type: column
|
||||||
|
color: '#F44336'
|
||||||
|
show:
|
||||||
|
legend_value: false
|
||||||
|
data_generator: >
|
||||||
|
let data = [];
|
||||||
|
|
||||||
|
const avg = entity.attributes.today_mean;
|
||||||
|
|
||||||
|
const redLimit = avg * 1.5;
|
||||||
|
|
||||||
|
let prices = entity.attributes.raw_today || [];
|
||||||
|
|
||||||
|
if (entity.attributes.tomorrow_valid &&
|
||||||
|
entity.attributes.raw_tomorrow) {
|
||||||
|
prices = prices.concat(entity.attributes.raw_tomorrow);
|
||||||
|
}
|
||||||
|
|
||||||
|
prices.forEach(item => {
|
||||||
|
const p = item.price;
|
||||||
|
|
||||||
|
data.push([
|
||||||
|
new Date(item.hour).getTime(),
|
||||||
|
p >= redLimit ? p : null
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
|
||||||
|
- entity: sensor.elpriser_excl_afgift
|
||||||
|
name: Excl. afgifter
|
||||||
|
type: line
|
||||||
|
color: '#03A9F4'
|
||||||
|
stroke_width: 4
|
||||||
|
extend_to: false
|
||||||
|
show:
|
||||||
|
extremas: true
|
||||||
|
legend_value: false
|
||||||
|
data_generator: |
|
||||||
|
let data = [];
|
||||||
|
|
||||||
|
if (entity.attributes.raw_today) {
|
||||||
|
data = entity.attributes.raw_today.map((item) => [
|
||||||
|
new Date(item.hour).getTime(),
|
||||||
|
item.price
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entity.attributes.tomorrow_valid &&
|
||||||
|
entity.attributes.raw_tomorrow) {
|
||||||
|
data = data.concat(
|
||||||
|
entity.attributes.raw_tomorrow.map((item) => [
|
||||||
|
new Date(item.hour).getTime(),
|
||||||
|
item.price
|
||||||
|
])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
grid_options:
|
||||||
|
rows: auto
|
||||||
|
columns: full
|
||||||
|
grid_options:
|
||||||
|
rows: auto
|
||||||
|
columns: full
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 5. Sådan fungerer Card'et
|
||||||
|
|
||||||
|
Card'et viser data for:
|
||||||
|
|
||||||
|
```text
|
||||||
|
48 timer
|
||||||
|
```
|
||||||
|
|
||||||
|
Det starter ved begyndelsen af den aktuelle dag:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
span:
|
||||||
|
start: day
|
||||||
|
```
|
||||||
|
|
||||||
|
Der vises desuden en markering for det aktuelle tidspunkt:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
now:
|
||||||
|
show: true
|
||||||
|
label: Nu
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prisberegning
|
||||||
|
|
||||||
|
Card'et bruger gennemsnitsprisen fra:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
entity.attributes.today_mean
|
||||||
|
```
|
||||||
|
|
||||||
|
Gennemsnitsprisen bruges til at beregne tre grænser.
|
||||||
|
|
||||||
|
### Grøn grænse
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const greenLimit = avg * 0.8;
|
||||||
|
```
|
||||||
|
|
||||||
|
Priser under 80 % af gennemsnittet vises som grønne.
|
||||||
|
|
||||||
|
### Orange grænse
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const orangeLimit = avg * 1.2;
|
||||||
|
```
|
||||||
|
|
||||||
|
Priser mellem 120 % og 150 % af gennemsnittet vises som orange.
|
||||||
|
|
||||||
|
### Rød grænse
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const redLimit = avg * 1.5;
|
||||||
|
```
|
||||||
|
|
||||||
|
Priser på eller over 150 % af gennemsnittet vises som røde.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 6. I dag og i morgen
|
||||||
|
|
||||||
|
Card'et henter først priserne for i dag:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
entity.attributes.raw_today
|
||||||
|
```
|
||||||
|
|
||||||
|
Hvis morgendagens priser er tilgængelige, tilføjes de automatisk:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
if (entity.attributes.tomorrow_valid &&
|
||||||
|
entity.attributes.raw_tomorrow) {
|
||||||
|
```
|
||||||
|
|
||||||
|
Dermed kan grafen vise både:
|
||||||
|
|
||||||
|
```text
|
||||||
|
I dag
|
||||||
|
+
|
||||||
|
I morgen
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 7. Blå linje – pris ekskl. afgifter
|
||||||
|
|
||||||
|
Den blå linje kommer fra:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sensor.elpriser_excl_afgift
|
||||||
|
```
|
||||||
|
|
||||||
|
Den vises som en linjegraf:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
type: line
|
||||||
|
color: '#03A9F4'
|
||||||
|
stroke_width: 4
|
||||||
|
```
|
||||||
|
|
||||||
|
Denne serie viser den rå elpris uden afgifter.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 8. Hvis grafen ikke viser data
|
||||||
|
|
||||||
|
Hvis Card'et viser:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Loading...
|
||||||
|
```
|
||||||
|
|
||||||
|
eller ingen priser, kontroller først:
|
||||||
|
|
||||||
|
### Kontroller sensoren
|
||||||
|
|
||||||
|
Gå til:
|
||||||
|
|
||||||
|
**Developer Tools → States**
|
||||||
|
|
||||||
|
Søg efter:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sensor.energi_data_service
|
||||||
|
```
|
||||||
|
|
||||||
|
Kontroller at sensoren eksisterer.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Kontroller attributterne
|
||||||
|
|
||||||
|
Sensoren skal blandt andet have:
|
||||||
|
|
||||||
|
```text
|
||||||
|
today_mean
|
||||||
|
raw_today
|
||||||
|
```
|
||||||
|
|
||||||
|
Hvis morgendagens priser er tilgængelige, skal den også have:
|
||||||
|
|
||||||
|
```text
|
||||||
|
tomorrow_valid
|
||||||
|
raw_tomorrow
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Kontroller ApexCharts
|
||||||
|
|
||||||
|
Kontroller at:
|
||||||
|
|
||||||
|
```text
|
||||||
|
custom:apexcharts-card
|
||||||
|
```
|
||||||
|
|
||||||
|
er installeret via HACS.
|
||||||
|
|
||||||
|
Prøv eventuelt at genindlæse browseren med:
|
||||||
|
|
||||||
|
```text
|
||||||
|
CTRL + F5
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 9. Afhængigheder
|
||||||
|
|
||||||
|
| Komponent | Funktion |
|
||||||
|
|---|---|
|
||||||
|
| Home Assistant | Platform |
|
||||||
|
| HACS | Installation af custom integrationer/cards |
|
||||||
|
| Energi Data Service | Leverer elpriser |
|
||||||
|
| ApexCharts Card | Viser grafen |
|
||||||
|
| `sensor.energi_data_service` | Primær prisdata |
|
||||||
|
| `sensor.elpriser_excl_afgift` | Pris uden afgifter |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 10. Kort installation
|
||||||
|
|
||||||
|
Hvis Home Assistant allerede har HACS installeret:
|
||||||
|
|
||||||
|
```text
|
||||||
|
1. HACS
|
||||||
|
2. Integrations
|
||||||
|
3. Energi Data Service
|
||||||
|
4. Download
|
||||||
|
5. Genstart Home Assistant
|
||||||
|
6. Settings → Devices & services
|
||||||
|
7. Add Integration
|
||||||
|
8. Energi Data Service
|
||||||
|
9. Vælg prisområde
|
||||||
|
10. Installer ApexCharts Card via HACS → Frontend
|
||||||
|
11. Tilføj Card'et til dashboardet
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 11. Filer
|
||||||
|
|
||||||
|
Hvis Card'et gemmes som en separat YAML-fil, kan det eksempelvis gemmes som:
|
||||||
|
|
||||||
|
```text
|
||||||
|
elpriser.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
eller:
|
||||||
|
|
||||||
|
```text
|
||||||
|
elpriser_apexcharts.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Selve Card'et er YAML, mens `data_generator`-sektionerne indeholder JavaScript, som ApexCharts bruger til at beregne og sortere datapunkterne.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kilder
|
||||||
|
|
||||||
|
- Energi Data Service – GitHub:
|
||||||
|
https://github.com/MTrab/energidataservice
|
||||||
|
- HACS:
|
||||||
|
https://www.hacs.xyz/
|
||||||
|
- ApexCharts Card:
|
||||||
|
https://github.com/RomRider/apexcharts-card
|
||||||
Reference in New Issue
Block a user