Re: [Contournement] Neo Coolcam Z-Wave - kWh parfois farfelus
Publié : 18 août 2020, 12:00
Le script fonctionne bien, mais n'empêche pas Domoticz d'enregistrer certaines valeurs erronées qui passent au travers.
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 :
La procédure à lancer dans sqlite3, autant de fois que nécessaire (1 fois par jour devrait suffire).
avec l'effet produit :
Avant
Après
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
);
.quitAvant
Après