Donc ce n'est pas une solution complète.
Le mieux serait un nouveau firmware pour ces prises, mais ne rêvons pas.
J'ai donc pris le parti d'une correction automatique à base de SQL.
Le principe est de mettre à jour soit la valeur du jour, soit le total lorsqu'il est faux, tout en évitant d'écraser les valeurs pertinentes.
Évidemment je recommande de faire une sauvegarde de la base de Domoticz avant de lancer cette procédure.
Pour limiter les éventuels dégâts qu'elle pourrait occasionner, il faut spécifier les IDX des NEO Coolcam qui seront mis à jour dans cette ligne :
Code : Tout sélectionner
and Meter_Calendar.DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547')
Code : Tout sélectionner
.open /home/pi/domoticz/domoticz.db
update Meter_Calendar
set Counter = 0
where Counter < 0
and DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547')
;
update Meter_Calendar
set Value = (select b.Counter-a.Counter
from Meter_Calendar a join Meter_Calendar b on a.DeviceRowID = b.DeviceRowID
where Meter_Calendar.DeviceRowID = a.DeviceRowID
and julianday(a.date) = julianday(b.date) - 1
and Meter_Calendar.Date = b.Date
order by b.Date
)
where exists (
select *
from Meter_Calendar a join Meter_Calendar b on a.DeviceRowID = b.DeviceRowID
where a.DeviceRowID = Meter_Calendar.DeviceRowID
and Meter_Calendar.DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547')
and julianday(a.date) = julianday(b.date) - 1
and Meter_Calendar.DeviceRowID = b.DeviceRowID
and Meter_Calendar.Date = b.Date
and b.Counter >= a.Counter
);
update Meter_Calendar
set Counter = (select a.Counter+b.Value
from Meter_Calendar a join Meter_Calendar b on a.DeviceRowID = b.DeviceRowID
where Meter_Calendar.DeviceRowID = a.DeviceRowID
and julianday(a.date) = julianday(b.date) - 1
and Meter_Calendar.Date = b.Date
and b.Value between 0 and 500000
)
where exists (
select *
from Meter_Calendar a join Meter_Calendar b on a.DeviceRowID = b.DeviceRowID
where a.DeviceRowID = Meter_Calendar.DeviceRowID
and Meter_Calendar.DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547')
and julianday(a.date) = julianday(b.date) - 1
and Meter_Calendar.DeviceRowID = b.DeviceRowID
and Meter_Calendar.Date = b.Date
and b.Value < 500000
);
update Meter_Calendar
set Value = (select b.Counter-a.Counter
from Meter_Calendar a join Meter_Calendar b on a.DeviceRowID = b.DeviceRowID
where Meter_Calendar.DeviceRowID = a.DeviceRowID
and julianday(a.date) = julianday(b.date) - 1
and Meter_Calendar.Date = b.Date
order by b.Date
)
where exists (
select *
from Meter_Calendar a join Meter_Calendar b on a.DeviceRowID = b.DeviceRowID
where a.DeviceRowID = Meter_Calendar.DeviceRowID
and Meter_Calendar.DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547')
and julianday(a.date) = julianday(b.date) - 1
and Meter_Calendar.DeviceRowID = b.DeviceRowID
and Meter_Calendar.Date = b.Date
and b.Counter >= a.Counter
);
.quit
Avant
Après