Ogarnąłem to
Jak usunąć niepoprawny zapis temperatury w bazie danych?
Przykładowe przekłamanie wygląda na wykresie w taki sposób:
Widzimy, że z czujnika TH16_1_CWU poszedł zapis do bazy z wartością -1000 stopni C.
ROZWIĄZANIE:
0. UWAGA!!! Przed modyfikacją bazy danych WYKONAJ KOPIĘ ZAPASOWĄ i pobierz ją sobie na komputer
-
Instalujemy i uruchamiamy dodatek SQLite Web (Home Assistant Community Add-on: SQLite Web - Home Assistant OS - Home Assistant Community)
-
Z menu po lewej wybieramy “states” i przechodzimy do zakładki “Query”
- Domyślnie mamy wpisane zapytanie (Query) które pokaże nam wszystkie rekordy w tej tabeli.
SELECT *
FROM “states”
Kliknięcie przycisku “Execute” wyświetli nam rekordy z tej tabeli.
- Możemy przeglądać zapisy ale nas interesują konkretne encje i konkretne zakresy wartości więc wpisujemy:
SELECT * FROM “states” where entity_id like “%th16%” and state between “-%” and “30”
Zapis ten mniej więcej oznacza:
Wyświetl (SELECT) wszystko () z tabeli “states” (FROM “states”) gdzie kolumna o nazwie “entity_id” (where entity_id) zawiera słowo w którym występuje ciąg th16 przed i za którym może być dowolny ciąg znakó (“%th16%”) a wartość w kolumnie “state” (and state) mieści się pomiędzy “-dowolny_ciąg_znaków” a “30”.
Znak “%” oznacza dowolny ciąg znaków. Wrzuciłem go też do “state” gdyż podanie np. od -2000 do 30 nie wyświetlało mi wartości -1000. Sry ale z SQL miałem styczność dość dawno i nie będę zagłębiał się dlaczego to nie działa
Wartość “30” czy też “th16” (bo moje encje od czujników to np.: sensor.th16_4_temp, switch.sonoff_th16_3, sensor.sonoff_th16_2_temp można dowolnie zmieniać.
Np zmiana z
%th16%
na
%th16%temp
wyświetli mi encje które zawierają th16 ale bezwzględnie kończą się na “temp”
Efekt tego zapytania wygląda tak:
- Woda nie może mieć zero lub -1000 stopni więc usuńmy te rekordy:
DELETE FROM “states” where entity_id like “%th16_temp” and state between “-%” and “2”
Usunąłem tutaj WSZYSTKIE zapisy które w tabeli “states” w kolumnie “entity_id” zaczynały się dowolnym ciągiem znaków ALE kończyły się dokładnie na “th16_temp” a ich wartość w kolumnie “state” wynosiła między “minus dowolny ciąg znaków” a “2”.
Otrzymałem komunikat
Rows modified: 2
- Sprawdzam sobie za pomocą
SELECT * FROM “states” where entity_id like “%th16%” and state between “-%” and “30”
i widzę wynik
Empty result set.
a mój wykres nie zawiera już przekłamanych wartości