Ik ben aan het migreren van:
- pi3b met SSD, HAOS
- USB P1 readout
- USB rs485 modbus SDM120/sdm630 readout
- hoop shelly's met oem firmware/mqtt
- sonoff 4ch pro met tasmota/mqtt
naar:
Freebsd bhyve VM met HAOS
- esphome/esp32 met RS485 SDM120/sdm630 readout
- smart-stuff esp32-c4 met DSMR/P1
- shelly's met esphome
- sonoff met esphome
Weg MQTT, weg nodered, weg tasmota.
Een hoop werk waar ik betere onderhoudbaarheid, stabiliteit en minder stroomverbruik voor terug hoop te krijgen. (single click esphome firmware updates, yay!).
De hele config draait als test al op de HAOS VM, maar ik moet mijn database nog overzetten. Dat is de laatste stap en dan ben ik over.
Ik heb in de nieuwe esphome oplossing reader andere sensornamen aangehouden, en je voelt em al aankomen. Ik wil de oude sensordata graag mergen met de nieuwe sensoren. Het gaat me alleen om de long term statistics die in je energy dashboard terechtkomen.
Ik realiseer me dat je ook de 'hernoem de sensor' truuk kunt doen, maar dat is lelijk, en te laat. Liever nu 1x fatsoenlijk fixen.
Alle betreffende sensoren zijn state_class 'total_increasing', dus een constant oplopende 'total xxx' sensor.
Er is geen overlap, oude sensor is afgekoppeld voordat nieuwe sensor toegevoegd is.
Volgens mij moet dat dan als volgt:
1. recorder.disable, want we willen geen updates als we de DB om aant bouwen zijn.
2. oudste 'state' in statistics tabel opzoeken voor sensor.old, sum eraf trekken, dat is oudste waarde in je DB voor sensor.old. 'State' is hier de daadwerkelijk uitgelezen sensor waarde.
3. update 'sum' statistics_short_term voor sensor.new door oudste waarde sensor.old erbij op te tellen
4. update 'sum' in statistics(_long_term) voor sensor.new door oudste state sensor.old erbij op te tellen
5. update id voor alle records in statistics van sensor.old naar sensor.new
6. recorder.enable
Nu in SQL via SQLite add-on (ik doe nooit wat met rDB's, commentaar welkom):
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| -- zoek de eerste record van je sensor.old (harmless, geeft inzicht):
SELECT DATETIME(created_ts, 'auto'), *
FROM statistics
WHERE metadata_id = (SELECT id FROM statistics_meta WHERE statistic_id = 'sensor.old')
ORDER BY DATETIME(created_ts, 'auto')
ASC
-- update statistics_short_term voor sensor.new: hoog sum op met oudste (state-sum) waarde voor alle records
UPDATE statistics_short_term
SET sum = sum + (SELECT MIN(state)FROM statistics
WHERE metadata_id = (SELECT id FROM statistics_meta WHERE statistic_id = 'sensor.old'))
+ (SELECT sum FROM statistics
WHERE sum = (SELECT min(sum) FROM statistics
WHERE metadata_id = (SELECT id FROM statistics_meta WHERE statistic_id = 'sensor.old'))
WHERE metadata_id = (SELECT id
FROM statistics_meta
WHERE statistic_id = 'sensor.new')
-- update statistics long term voor sensor.new: hoog sum op met oudste (state-sum) waarde voor alle records
UPDATE statistics
SET sum = sum + (SELECT MIN(state)FROM statistics
WHERE metadata_id = (SELECT id FROM statistics_meta WHERE statistic_id = 'sensor.old'))
+ (SELECT sum FROM statistics
WHERE sum = (SELECT min(sum) FROM statistics
WHERE metadata_id = (SELECT id FROM statistics_meta WHERE statistic_id = 'sensor.old'))
WHERE metadata_id = (SELECT id
FROM statistics_meta
WHERE statistic_id = 'sensor.new')
-- update statistics long term van sensor.old naar sensor.new
UPDATE statistics
SET metadata_id = (SELECT id --Set the new entity name
FROM statistics_meta
WHERE statistic_id = 'sensor.heat_pump_total')
WHERE metadata_id = (SELECT id -- Old entity name
FROM statistics_meta
WHERE statistic_id = 'sensor.modbus_hp_tot') |
Ik ga dit vanavond even testen in de vm. Leuk klusje, maar ik ga dit hopelijk maar 1x doen in mijn home assistant carriere
Mochten mensen fouten vinden of een makkelijkere weg weten, dan graag. Ik kan me voorstellen dat ik niet de eerste ben die hiermee aan de slag gaat of wil, maar ik kon zo snel niets vinden in de historiie van deze draad.
edit:
min(sum) query aangepast, c/p oopsie