Mam template sensory, które biorą wartości z input_number. Przy restarcie HA, wartość sensorów zmienia się na chwilę na ‘unknown’, a potem z powrotem na poprzednią. Przez to tworzą się zduplikowane wartość w bazie oraz timestamp ostatniej zmiany jest nieprawidłowy.
Definicja przykładowego sensora:
- name: Bieżnia dystans w km
unique_id: bieznia_dystans_w_km
availability: "{{ is_number(states('input_number.bieznia_dystans')) }}"
state: >-
{{ (states('input_number.bieznia_dystans')|float(0) / 1000)|round(2) }}
unit_of_measurement: "km"
W bazie danych tworzy się para nowych rekordów:
Pewnie ma to związek z tym, co widzę w logu po restarcie (czas ten sam co w bazie, godzina różnicy przez czas lokalny). Rekord ‘unknown’ w bazie pojawia się tuż po tych wpisach w logu.
2023-02-03 22:14:39.858 WARNING (MainThread) [homeassistant.components.sensor] Setup of sensor platform command_line is taking over 10 seconds.
2023-02-03 22:14:39.874 WARNING (MainThread) [homeassistant.components.sensor] Setup of sensor platform command_line is taking over 10 seconds.
2023-02-03 22:14:39.877 WARNING (MainThread) [homeassistant.setup] Setup of input_select is taking over 10 seconds.
2023-02-03 22:14:39.880 WARNING (MainThread) [homeassistant.setup] Setup of input_datetime is taking over 10 seconds.
2023-02-03 22:14:39.882 WARNING (MainThread) [homeassistant.setup] Setup of input_text is taking over 10 seconds.
2023-02-03 22:14:39.883 WARNING (MainThread) [homeassistant.setup] Setup of counter is taking over 10 seconds.
2023-02-03 22:14:39.885 WARNING (MainThread) [homeassistant.setup] Setup of zone is taking over 10 seconds.
2023-02-03 22:14:39.887 WARNING (MainThread) [homeassistant.setup] Setup of input_boolean is taking over 10 seconds.
2023-02-03 22:14:39.889 WARNING (MainThread) [homeassistant.setup] Setup of input_button is taking over 10 seconds.
2023-02-03 22:14:39.891 WARNING (MainThread) [homeassistant.setup] Setup of input_number is taking over 10 seconds.
Help!
EDIT:
Po różnych testach, wiem już coś więcej. Przede wszystkim: powtarzanie wartości stanów jest cechą HA, a nie bugiem, więc trzeba nauczyć się z tym żyć. Szybkość włączania się systemu nic do tego nie ma. Ja połączyłem bieżnię z HA (przez ESP32 i MQTT) i chciałem mieć podsumowania np. tygodniowe pokonanego dystansu, gdzie te powtórki przeszkadzały.
W przypadku niektórych encji, powtórki da się odróżnić od rzeczywistego nowego stanu, gdyż poprzedza ją zawsze rekord ze stanem unknown/unavailable, będący “parentem” (pole “old_state_id”). Tak jest przy sensorach MQTT i template. Można więc odfiltrować powtórzone stany; np. taki kod, po wklejeniu do integracji SQL (MariaDB), zwróci stany z historii template sensora, bez powtórek, pogrupowane tygodniami, jako 1 wiersz w formie tablicy:
select now() state, x.json_arr from (
with
my_entity as (select * from states where entity_id = 'sensor.bieznia_dystans_w_km'),
entity_bad as (
select state_id from my_entity where state in ('unavailable', 'unknown')
),
entity_good as (
select FROM_UNIXTIME(e.last_updated_ts) adate, state
from my_entity e
# wykluczam bad oraz te z parentem bad
left join entity_bad eb on e.state_id = eb.state_id or e.old_state_id = eb.state_id
where eb.state_id is null
),
entity_groupped as (
select round(sum(state),2) st, Date(max(adate)) dt
from entity_good
# grupowanie tygodniami
group by extract(week from adate)
# max 6 ostatnich tygodni
order by dt desc limit 6
),
arr_element as (
# zamiana 2 kolumn na 1: [data, stan], plus data obok do posortowania
select json_array(dt, st) el, dt
from entity_groupped
)
# agregacja w jedną tablicę tablic, kolejność wg dat/tygodni w roku
select json_arrayagg(el order by dt) json_arr from arr_element
) x;
Wynik (1 wiersz, 2 kolumny):
2023-02-14 11:05:44.000 [["2023-01-14", 50.67],["2023-01-21", 50.06],["2023-01-28", 50.89],["2023-02-04", 49.39],["2023-02-11", 52.46],["2023-02-12", 7.76]]
SQL jest długachny, ale CTE i komentarze trochę ratują (mój faktyczny kod jest 2x dłuższy, ale integracja spoko to akceptuje). Zwracaną tablicę ładuję jako atrybut sensora SQL (brak ograniczenia ilości znaków), a kolumna state trafia do stanu sensora. Taki sensor nie potrzebuje już swojej historii, on tylko wyciąga dane. Potem w apexcharts:
series:
- entity: sensor.bieznia_dystans_wg_tygodni_sql
data_generator: |
return JSON.parse(entity.attributes.json_arr)
Aha, jeszcze jedno: trzeba zwrócić uwagę na pierwszy liczbowy stan template sensora, po jego utworzeniu. W bazie zapisywana jest wówczas też para rekordów (bo sensor powstaje po restarcie HA/przeładowaniu template): rekord uknown/unavailable + pierwszy liczbowy stan. Więc albo akceptujemy pominięcie pierwszego stanu (przez kod SQL) albo - jeśli ten inicjujący stan liczbowy ma być wliczany - trzeba wyedytować zupełnie pierwszy rekord i zmienić unavailable/unknown na 0.