Et diagram som viser ugeforbrug. Bemærk at hvis du skal have mere end 10 dages historik, så skal du bruge løsning med sætte purge_keep_days, https://www.home-assistant.io/integrations/recorder/. Standard i HA er 10 dages historik.
"Tilføj kort" til din brugergrænseflade/dashboard, og vælg apexcharts-card. Så kopier du koden ind vinduet til venstre, så skulle diagrammet komme til syne i højre vindue. Diagrammet bruger grøn, gul og rød farve for at markere forskelle i forbrugt kWh, hvor grøn er lavest og rød højest.
Hvis der står "Loading" i diagram, så mangler der data. Enten er koden formateret forkert eller så mangler der kode. På github ville jeg bruge knappen "Copy raw contents", og i apexchart Ctrl+a i venstre vindue (for vælg al kode) og Ctrl+v for at indsætte/erstatte med ny kode.
For mere historik på diagrammet ændres "graph_span", fx 10d. Af ukendte årsager mister man til tider yderste højre dato, dog kan det løses ved lægge tid til, fx et sekund -> 10d1s
Datoen passer ikke, og det skyldes at HA bruger last_updated frem for den korrekte metering_date på sensor.eloverblik_energy_total. Får at få fat på den korrekt dato(metering_date), så er en løsning på dette:
- at entity_id faktisk er sensor.eloverblik_energy_total (nogen hedder fx sensor.eloverblik_energy_total_2)
- at lave en SQL integration
- at lave en data_generator på apexcharts-card
Ad 1
Der skal tilføjes en SQL-integration - Indstillinger > Enheder og tjenester > Tilføj integration (nedre højre hjørne) og søg på SQL.
Jeg har valgt navnet "eloverblik historik", hvilket betyder jeg får en sensor som hedder: sensor.eloverblik_historik. Hvis du ikke ved hvilken database du bruger, så er HA født med sqlite.
Query skal være følgende:Sqlite kender ikke nøgleordet: "separator", så det skal ersattes med et komma.
Efter databaseændringerne april 2023:
SELECT group_concat(Dato || ': ' || state, ',') AS Data, state from (SELECT substr(shared_attrs, instr(shared_attrs, '":"') + 3, instr(shared_attrs, '","') - instr(shared_attrs, '":"') - 3) AS Dato, state FROM states s, state_attributes a, states_meta m WHERE m.metadata_id = s.metadata_id AND m.entity_id = 'sensor.eloverblik_energy_total' AND state NOT IN ('unavailable','unknown','none') AND s.attributes_id = a.attributes_id GROUP BY s.attributes_id ORDER BY state_id ASC) b;
Før databaseændringerne april 2023:
SELECT group_concat(Dato || ': ' || state, ',') AS Data, state from (SELECT substr(shared_attrs, instr(shared_attrs, '":"') + 3, instr(shared_attrs, '","') - instr(shared_attrs, '":"') - 3) AS Dato, state FROM states s, state_attributes a WHERE entity_id = 'sensor.eloverblik_energy_total' AND state NOT IN ('unavailable','unknown','none') AND s.attributes_id = a.attributes_id GROUP BY s.attributes_id ORDER BY state_id ASC) b;
Efter databaseændringerne april 2023:
SELECT GROUP_CONCAT(Dato, ': ', state SEPARATOR ',') AS Data, state FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(shared_attrs, '","', 1), '":"', -1) AS Dato, state FROM states s, state_attributes a, states_meta m WHERE m.metadata_id = s.metadata_id AND m.entity_id = 'sensor.eloverblik_energy_total' AND state NOT IN ('unavailable','unknown','none') AND s.attributes_id = a.attributes_id GROUP BY s.attributes_id ORDER BY state_id ASC) b;
Før databaseændringerne april 2023:
SELECT GROUP_CONCAT(Dato, ': ', state SEPARATOR ',') AS Data, state FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(shared_attrs, '","', 1), '":"', -1) AS Dato, state FROM states s, state_attributes a WHERE entity_id = 'sensor.eloverblik_energy_total' AND state NOT IN ('unavailable','unknown','none') AND s.attributes_id = a.attributes_id GROUP BY s.attributes_id ORDER BY state_id ASC) b;
og husk at angive "state" for "Column"
Hvis du har valgt at bruge anden database end sqlite, så skal Database URL udfyldes. Eksempelvis
Når det lykkes vil sensoren hedde det samme som det navn du gav den ifm. SQL-integrationen. Egenskaben "Data:" er historikken.
Ad 2
På kortet skal data formateres korrekt og således:
data_generator: |
var new_data = entity.attributes.Data.split(',');
if (isNaN(new_data[new_data.length - 1][0]))
new_data.pop();
var hist = new_data.map((start) => {
var element = start.split(': ');
return [new Date(element[0]).getTime(), parseFloat(element[1])];
});
return hist;
Et komplet eksempel og formateret korrekt findes her: https://github.com/MaximusClavius/eloverblikugeforbrug/blob/main/Ugeoversigt%20med%20korrekte%20datoer