Page 2 sur 2

Re: [Contournement] Neo Coolcam Z-Wave - kWh parfois farfelus

Publié : 18 août 2020, 12:00
par Chrominator
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 :

Code : Tout sélectionner

and Meter_Calendar.DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547')
La procédure à lancer dans sqlite3, autant de fois que nécessaire (1 fois par jour devrait suffire).

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
avec l'effet produit :


Avant
Avant.png
Avant.png (15.35 Kio) Consulté 2726 fois

Après
Apres.PNG
Apres.PNG (13.26 Kio) Consulté 2726 fois

Re: [Contournement] Neo Coolcam Z-Wave - kWh parfois farfelus

Publié : 13 janv. 2021, 21:24
par Chrominator
Bonne nouvelle : Les valeurs farfelues issues des Neo Coolcam Z-Wave sont rejetées maintenant, nous n'auront plus ces valeurs parasites dans nos bases.

Voir ici, et la trace ci-dessous :
(C'est pas neuf mais je viens de le découvrir)

Screenshot_2021-01-13 Domoticz_dev.png
Screenshot_2021-01-13 Domoticz_dev.png (4.76 Kio) Consulté 2332 fois

Re: [Contournement] Neo Coolcam Z-Wave - kWh parfois farfelus

Publié : 18 janv. 2021, 20:25
par klarf
Bonsoir,
Je viens de voir le sujet alors que j'ai reçu 2 prises la semaine dernière, c'est cool car justement j'étais habitué au prise fibaro z wave où les mesures sont fiables, et là j'ai eu le bug avec une prise neo cool cam (une sur les 2). J'ai mis le script en place et je verrais à la prochaine utilisation si c'est OK.
Merci pour les recherches et les liens !

Re: [Contournement] Neo Coolcam Z-Wave - kWh parfois farfelus

Publié : 23 janv. 2021, 17:37
par Chrominator
GizMoCuz a filtré les valeurs négatives engendrées par les neo coolcam plugs dans domoticz le 7 janvier 2021.

Le comportement est un peu différent, et j'observe que mon précédent script sql ne résoud plus aussi bien le problème.

Donc nouveau script ci-dessous pour toute version de Domoticz postérieure à cette date.
Comme avant, vous remplacez les valeurs de l'ensemble DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547', '1565', '1671') par les valeurs d'idx de vos prises.

Code : Tout sélectionner

.open /home/pi/domoticz/domoticz.db

update Meter_Calendar
	set Value = 0
	where Value < 0
	and DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547', '1565', '1671')
;
update Meter_Calendar
	set Counter = 0
	where (Counter is NULL)
	and DeviceRowID in ('1156', '1451', '1453', '1520', '1530', '1539', '1547', '1565', '1671')
;
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', '1565', '1671')
				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', '1565', '1671')
				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
				);				
.exit