Quand on joue un peu avec la téléinfo, on se rend vite compte que c'est à la fois verbeux, mais que ça manque aussi d'informations utiles.
Elles ont sans doute été omises pour ne pas permettre de mettre en défaut le dispositif de comptage.
Que ça soit sur CBE ou Linky, l'information de puissance n'est disponible QUE pour la puissance apparente.
Cette dernière pose 2 problèmes :
* elle ne tient pas compte du cos-phi donc est souvent supérieur à la puissance en WATT
* elle ne tient pas compte du cos-phi donc... ne tient pas compte du sens du courant.
Sur un CBE monté à l'envers, pour mesurer l'injection par exemple, l'information remonte la puissance apparente sous-tirée.. OU injectée. Or, on aurait bien voulu n'avoir QUE l'information injectée.
C'est d'autant plus rageant, qu'un CBE affiche l'information en VA en W et en A.. (contrairement au Linky qui ne fait qu'afficher des VA, on nous explique que c'est une révolution qui va sauver le monde )
Alors, on fait comment.. bah, pas trop le choix, il faut calculer.
Pour ma part, j'ai du modifier une intégration Home Assistant pour permettre d'ajouter la valeur en W.
Cette intégration relève la téléinfo toutes les 5 secondes par défaut.
L'idée s'est de se baser sur l'index de consommation qui est exprimé en Wh.
Un incrément de l'index de 1 sur 1h, indique qu'on a laissé branché un appareil consommant 1W pendant 1H.
Un incrément de l'index de 3600 sur 1h, indique qu'on a laissé branché un appareil consommant 3600W pendant 1H. Logique
Un incrément de l'index de 1 sur 1s, indique qu'on a également laissé branché un appareil consommant 3600W pendant 1s. Vous me suivez ?
On note, qu'on est pas super précis. (Un trait d'une épaisseur de 3600W sur un abonnement de 6kVA... )
Plus on agrandi le pas d’échantillonnage, plus on devient précis : le trait devient de plus en plus fin.
En laissant filer 5s, on a un pas de 720w.
EN laissant filer 10s, c'est 360w
En laissant filer 30s, c'est 120w
On se rend compte que le pas de 5s.. pour calculer la consommation va faire faire des yoyos à la valeur retournée, on va donc calmer le jeu... et partir sur 30s ou plus.
L'algorithme est le suivant :
On récupère l'index à t+0s on stocke l'index et le timestamp
On récupère l'index à t+Ns
Si l'index n'a pas bougé, on ne fait rien. On retourne l'ancienne valeur de puissance.
Si l'index a changé et que le timestamp courant est plus vieux d'au moins 30 secondes à celui stocké , alors on fait le calcul
Le calcul est le suivant : Valeur en W = 3600 * (différence d'index / différence de timestamp)
On stocke le nouvel index et le timestamp, et on retourne la nouvelle valeur de puissance
En python ça donne ça :
Code : Tout sélectionner
t1w_ts = datetime.now()
t1w_base = int(self.coordinator.data["T1_BASE"])
if self.base == 0:
self.ts = t1w_ts
self.base = t1w_base
d_ts = t1w_ts - self.ts
d_base = t1w_base - self.base
if d_base > 0 and d_ts.seconds >= 30:
self.watt = 3600 * (d_base / d_ts.seconds)
self.ts = t1w_ts
self.base = t1w_base
return int(self.watt)