Template sensor z pomocnika (input_number) - przy restarcie HA staje się 'unknown'

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! :slight_smile:

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ą :slight_smile: (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)

Clipboard02

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.