Filtrage numérique de données pour eedomus

Discussion et échanges de scripts pour la box eedomus

Filtrage numérique de données pour eedomus

Messagepar dommarion » 12 Avr 2024 21:20

Bonjour à toutes et tous,
J'ai développé un Plugin de Filtrage numérique de données pour la box eedomus.

Ce plugin permet de filtrer un capteur numérique selon la méthode au choix parmi 2 méthodes.
Les 2 méthodes retenues sont la méthode des moyennes et la méthode FIR (Finite Impulse Response). J'ai testé 2 autres méthodes (Savitzky-Golay et Whittaker-Henderson) qui n'ont pas été convainquantes et donc pas retenues.

Pour installer le filtre, c'est assez simple, on sélectionne la donnée à filtrer dans la liste des capteurs eedomus, puis on sélectionne la méthode, et ensuite on indique la valeur du paramètre.
->Paramètre pour la méthode des moyennes: nombre de valeurs à moyenner (exemple: 5)
->Paramètre pour la méthode FIR: liste des valeurs à affecter (exemple: 0.1,0.2,0.4,0.2,0.1)
exemple.png
exemple de filtrage
exemple.png (33.76 Kio) Consulté 6291 fois

Bon tests et merci de votre feedback.
dommarion
Dernière édition par dommarion le 18 Avr 2024 20:37, édité 1 fois.
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|HTTP Auth. Digest|TV Philips|SmartThings|fonctions PHP|Tuya Smartlife|CozyTouch2|mySMS|TV Sony
dommarion
 
Messages : 679
Inscription : 28 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar opa95 » 13 Avr 2024 07:54

Bonjour dommarion
dommarion a écrit:Bonjour à toutes et tous,
J'ai développé un Plugin de Filtrage numérique de données pour la box eedomus.

Ce plugin permet de filtrer un capteur numérique selon la méthode au choix parmi 2 méthodes.
Les 2 méthodes retenues sont la méthode des moyennes et la méthode FIR (Finite Impulse Response). J'ai testé 2 autres méthodes (Savitzky-Golay et Whittaker-Henderson) qui n'ont pas été convainquantes et donc pas retenues.

Pour installer le filtre, c'est assez simple, on sélectionne la donnée à filtrer dans la liste des capteurs eedomus, puis on sélectionne la méthode, et ensuite on indique la valeur du paramètre.
->Paramètre pour la méthode des moyennes: nombre de valeurs à moyenner (exemple: 5)
->Paramètre pour la méthode FIR: liste des valeurs à affecter (exemple: 0.1,0.2,0.4,0.2,0.1)

Bon tests et merci de votre feedback.
dommarion

Merci pour cet outil que je n'ai pas encore essayé (problème de disponibilité), perso, j'utilise divers scripts moins facile à mettre en oeuvre.
Tu ne propose pas de filtre IIR (Ininite Impulse Response) qui nécessite moins de mémoires?
Bon week-end :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 871
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Filtrage numérique de données pour eedomus

Messagepar dommarion » 13 Avr 2024 10:07

Bonjour opa95,
Merci pour ta réponse. Bien sûr je peux developper le filtre RII, pour cela il suffit d'insérer dans le script la fonction équivalente et adapter le Json avec cette nouvelle sélection. Il peut y avoir une multitude de méthodes de filtrage.
Le filtre numérique RII est plus adapté à certains cas, et un peu moins à des signaux bruités.
Voilà un comparatif intéressant: RII vs RIF
Voilà le code si nous devions l'intégrer:
Code : Tout sélectionner
// définition des paramètres du filtre
$alpha = 0.1; // constante de temps
$sample_rate = 6000; // fréquence d'échantillonnage
$cutoff_frequency = 2000; // fréquence de coupure
$gain = 1; // gain du filtre

// calcul des coefficients du filtre
$a0 = 1 / (1 + $alpha / tan(M_PI * $cutoff_frequency / $sample_rate));
$a1 = $a0 - 1;
$b0 = $gain * $a0;
$b1 = $gain * $a1;

// initialisation des variables d'état
$x_prev = 0; // entrée précédente
$y_prev = 0; // sortie précédente

// fonction de filtrage
function iir_filter($input) {
  global $a0, $a1, $b0, $b1, $x_prev, $y_prev;
  $output = $b0 * $input + $b1 * $x_prev - $a1 * $y_prev;
  $x_prev = $input;
  $y_prev = $output;
  return $output;
}

// exemple d'utilisation du filtre
$input_signal = array(7.1,6.4,6.3,6.3,6.3,6.2,6.4,6.5,6.5,6.5,6.9,6.2,6.2,6.2,6.3,6.1,6.1,6.1,6.2,6.2,6.2,6.2,6,5.9,5.9,5.9,6,5.8,6.2,5.8,5.7,5.7,5.7,5.7,6.1,6.1,5.8,5.7,6,5.8,5.7,6,6.1,6.1,5.8,6.1,5.8,5.7,6.1,6,5.8,5.7,5.7,5.9,6,5.8,5.6,5.7,5.9,5.8,5.7,6.2,5.9,5.7,5.8,5.9,5.9,6,5.9,5.8,6,6.2,6,5.9);
$filtered_signal = array_map("iir_filter", $input_signal);
var_dump($filtered_signal);

Je te laisse commenter cela.
Bon weekend
dommarion
Dernière édition par dommarion le 13 Avr 2024 11:05, édité 3 fois.
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|HTTP Auth. Digest|TV Philips|SmartThings|fonctions PHP|Tuya Smartlife|CozyTouch2|mySMS|TV Sony
dommarion
 
Messages : 679
Inscription : 28 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar opa95 » 13 Avr 2024 10:45

Bonjour dommarion
dommarion a écrit:Bonjour opa95,
Merci pour ta réponse. Bien sûr je peux developper le filtre RII, pour cela il suffit d'insérer dans le script la fonction équivalente et adapter le Json avec cette nouvelle sélection. Il peut y avoir une multitude de méthodes de filtrage.
Le filtre numérique RII est plus adapté à certains cas, et un peu moins à des signaux bruités.
Voilà le code si nous devions l'intégrer:
Code : Tout sélectionner
// définition des paramètres du filtre
print_r($filtered_signal);

Je te laisse commenter cela.
Bon weekend
dommarion

Sur ma box (eedomus+) la fonction "print_r()"ne fonctionne pas
renvoi : "La fonction print_r() n'est pas autorisée"
En toute rigueur, il faudrait adapter les fréquences d'échantillonnage et de coupure : ce n'est pas catastrophique, car seul le rapport compte.
L'échantillonnage sur la box ressemble plutôt à 1/60 qu'à 44100 Hz (filtrage audio).
D'autre part, il me semble que les méthodes utilisées supposent un échantillonnage régulier, alors que la box ne renvoie pas de valeur si deux valeurs successives sont identiques : pour un capteur de température lu toutes les minutes, cette nuit, l'écart des valeurs renvoyées allait de 2 à 31 minutes (les valeurs à 31 minutes sont en fait forcées par la box pour informer qu'elle est toujours vivante, et peut alors renvoyer une valeur identique à la précédente).
Je pense qu'il faudrait faire un sur-échantillonnage (interpolation toutes les minutes) avant de filtrer les valeurs obtenues) :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 871
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Filtrage numérique de données pour eedomus

Messagepar dommarion » 13 Avr 2024 11:00

opa95 a écrit:Sur ma box (eedomus+) la fonction "print_r()"ne fonctionne pas
renvoi : "La fonction print_r() n'est pas autorisée".

Oui en effet, ce script était déstiné à un émulateur de PHP, j'ai remplacé la fonction print_r() par var_dump() pour la box eedomus.
opa95 a écrit:D'autre part, il me semble que les méthodes utilisées supposent un échantillonnage régulier, alors que la box ne renvoie pas de valeur si deux valeurs successives sont identiques : pour un capteur de température lu toutes les minutes, cette nuit, l'écart des valeurs renvoyées allait de 2 à 31 minutes (les valeurs à 31 minutes sont en fait forcées par la box pour informer qu'elle est toujours vivante, et peut alors renvoyer une valeur identique à la précédente).
Je pense qu'il faudrait faire un sur-échantillonnage (interpolation toutes les minutes) avant de filtrer les valeurs obtenues) :)

J'ai ajusté en effet dans le code les fréquences d'echantillonage (6000Hz) et la fréquence de coupure (2000Hz).
J'utilise la fonction getValue() d'eedomus pour éviter de récupérer l'historique, mais tu as tout à fait raison, lorsque la valeur est inchangée, alors la fonction getValue de la box eedomus ne renvoie pas de données. Par contre si l'on questionne l'API de la box eedomus avec la fonction httpQuery() en GET et utilisant l'url:
https://api.eedomus.com/get?action=peri ... show_all=1";
Alors on récupère tout l'historique entre 2 dates et on peut conserver les dernières valeurs correspondantes à l'échantillonnage paramétré.
Pour l'instant, je ne suis pas entré dans ce détail de programmation (ce que j'ai fait dans le Plugin Intégrale). :ugeek:
Regardons comment se comporte le filtrage numérique et on ajustera en fonction des retours.
Merci beaucoup pour tes contributions.
Bon weekend
dommarion
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|HTTP Auth. Digest|TV Philips|SmartThings|fonctions PHP|Tuya Smartlife|CozyTouch2|mySMS|TV Sony
dommarion
 
Messages : 679
Inscription : 28 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar opa95 » 13 Avr 2024 14:03

dommarion a écrit:Oui en effet, ce script était déstiné à un émulateur de PHP, j'ai remplacé la fonction print_r() par var_dump() pour la box eedomus.

C'est le défaut des simulateurs, généralement je teste certaines fonctions en local, puis je passe sur la box dès que les interactions sont importantes.
dommarion a écrit:J'ai ajusté en effet dans le code les fréquences d'echantillonage (6000Hz) et la fréquence de coupure (2000Hz).
J'utilise la fonction getValue() d'eedomus pour éviter de récupérer l'historique, mais tu as tout à fait raison, lorsque la valeur est inchangée, alors la fonction getValue de la box eedomus ne renvoie pas de données. Par contre si l'on questionne l'API de la box eedomus avec la fonction httpQuery() en GET et utilisant l'url:
https://api.eedomus.com/get?action=peri ... show_all=1";
Alors on récupère tout l'historique entre 2 dates et on peut conserver les dernières valeurs correspondantes à l'échantillonnage paramétré.

je ne récupère pas plus de données en interrogeant directement l'historique depuis mon navigateur https://api.eedomus.com/get?....
Toutefois, si on ne reçoit pas de données, c'est généralement que la dernière donnée n'a pas changé (sauf problème de communication) et l'on peut donc entrer directement la dernière valeur dans le filtre : dans ton exemple, pour une donnée lue toutes les minutes et un FIR à 5 coefficients, la sortie deviendrait égale à l'entrée au bout de 5 minutes sans réception de nouvelle valeur.
Je rencontre de temps en temps un autre problème qui ressemble aux "clics" des repiquage sur disque vinyle (poussières, rayures), mes capteurs 433 MHz ne sont pas assez fiables et on récupère une donnée avec un digit erroné ou 0, et un envoi correct la minute suivante : par exemple 19.5;1.5;19.5 (avec une durée de l'état 1.5 d'environ 60 secondes). Pour éviter les perturbations, il ne faut pas entrer cette valeur dans le filtre et mettre la dernière valeur valide.
Dans le cas d'un capteur lent (variation de température max de mes thermomètres d'environ 0.05° par minute) on peut repérer cette valeur aberrante, mais avec certitude seulement après l'arrivée de la valeur suivant la valeur fausse (donc avec une minute de décalage). On pourrait tester l'écart de valeur et de temps entre les mesures 1 et 2, mais la mesure 1 peut être inchangée depuis 30 minutes ou plus en cas de problème de communication, ce qui autoriserait une variation de 1.5°(19.5;18;19.5); ça permettrait toutefois de détecter les plus grosses erreurs. :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 871
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Filtrage numérique de données pour eedomus

Messagepar dommarion » 13 Avr 2024 15:26

Ok merci opa95,
Je te propose de tester la fonction et d'ajuster les paramètres.
Quand tu seras OK, alors j'intègre la méthode de filtrage IIR à mon plugin. Ceci permettra de tester sur eedomus sur plusieurs jours.
Bon weekend,
dommarion
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|HTTP Auth. Digest|TV Philips|SmartThings|fonctions PHP|Tuya Smartlife|CozyTouch2|mySMS|TV Sony
dommarion
 
Messages : 679
Inscription : 28 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar dommarion » 22 Mai 2024 17:12

Bonjour à toutes et tous,
Un grand merci à opa95 qui a fait évoluer le plugin filtrage numérique de manière très significative.
Plusieurs méthodes sont disponibles, mais surtout il existe un prétraitement qui permet de stabiliser la méthode de filtrage et de l'adapter au type de capteur...
Nous sommes au top avec ce Plugin, vive la communauté eedomus :ugeek:
Cette version avec sa documentation est publiée sur le Store eedomus en V1.1
Bon tests
dommarion
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|HTTP Auth. Digest|TV Philips|SmartThings|fonctions PHP|Tuya Smartlife|CozyTouch2|mySMS|TV Sony
dommarion
 
Messages : 679
Inscription : 28 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar Fab_Rice » 22 Mai 2024 18:17

Bonsoir et merci les gars :thumbup:
Je testerai probablement cela sur l'entrée analogique Redox de l'eedomus de la piscine ;)
Dire que l'on ne sait pas est une preuve d'intelligence
Eedomus+, Zigate V2, volets Somfy & Bubbendorf, radiateurs en Tado° & fil pilote, gestion chaudière bois/fioul, gestion borne IRVE, gestion piscine, PAC & Climatisation Mitsubishi ...
Fab_Rice
 
Messages : 927
Inscription : 27 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar opa95 » 22 Mai 2024 21:29

Bonsoir Fabrice
Fab_Rice a écrit:Bonsoir et merci les gars :thumbup:
Je testerai probablement cela sur l'entrée analogique Redox de l'eedomus de la piscine ;)

Ne te précipité pas trop, ou dis moi exactement ce que tu veux faire, il y a encore un ajustement à finaliser demain entre le script et la procédure de création du plugin.
Tu peux installer le plugin, et ensuite je te dirai quoi modifier dans la fenêtre pour que la version en ligne tourne correctement, sinon, il faut encore attendre quelques heures.
Pour avancer les choses, tu peux me donner la cadence actuelle des mesures et la période du bruit que tu veux atténuer.
Bonne soirée
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 871
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Filtrage numérique de données pour eedomus

Messagepar opa95 » 24 Mai 2024 13:41

Bonjour
Voici le simple effet du préfiltrage du signal avec le Plugin mis à jour par Dommarion aujourd'hui :
Préfiltre.jpg
Signal préfiltré par filtrage.php
Préfiltre.jpg (14.22 Kio) Consulté 5783 fois

La dernière version est sur le store.
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 871
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Filtrage numérique de données pour eedomus

Messagepar Fab_Rice » 01 Sep 2024 09:21

Bonjour opa95,

Alors je me penche de plus près sur ce filtre numérique et plus particulièrement sur ma mesure de redox (ORP) de la piscine.
Pour faire cette mesure j'ai installé une carte de mesure voltmétrique analogique dont la plage est de 0-3Vdc avec sa sonde dédiée.
C'est une mesure analogique en millivolts où j'applique des calculs liés à l'étalonnage pour obtenir une plage de lecture entre disons 450 et 850mV.
Ma mesure de base est elle comprise entre 1500 et 1100mV, soit donc 400mV de plage de mesure.
La période de mesure de l'eedomus est au minimum de 2 min.

Hors bien évidemment, dans ces plages de mesures assez basses, de multiples raisons font qu'il y a des parasitages et variations liés aux autres composants du système (pompe, stérilisateur, réseau Enedis en lui même ...)

Je cherche donc à filtrer des crêtes de mesures, de mon point de vue, d'une mesure à une autre, soit en 2 min, il ne peut pas y avoir une variation de plus 5%, je donne ce chiffre de manière empirique, mais on peut je pense dire que c'est moins car une production de chlore en gramme/heure dans un volume de 22m3 d'eau ne peut pas varier très rapidement.

Saurait tu donc, s'il te plait, me dire si ce filtre numérique est paramétrable dans mon cas, car j'avoue avoir lu sa documentation très "mathématicienne" mais n'en avoir pigé que le dixième :?

Par avance, merci à toi ;)
Dire que l'on ne sait pas est une preuve d'intelligence
Eedomus+, Zigate V2, volets Somfy & Bubbendorf, radiateurs en Tado° & fil pilote, gestion chaudière bois/fioul, gestion borne IRVE, gestion piscine, PAC & Climatisation Mitsubishi ...
Fab_Rice
 
Messages : 927
Inscription : 27 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar opa95 » 01 Sep 2024 11:08

Bonjour Fabrice
Le "traitement de signal" est effectivement assez mathématique.
Pour pouvoir le faire, il faut observer les variations du signal de base pour pouvoir séparer la valeur "physique" de base et les divers "parasitages".
S'il apparait du "bruit" en général de fréquence élevée : dans ton cas, correspondant à des variations aléatoires de période comprises entre 2 minutes et probablement environ 20 minutes (je n'ai pas d'idée sur la variation naturelle du rédox en fonction du temps); on pourrait alors désirer filtrer toutes les fluctuations de durées inférieures à 20 minutes et faire un "lissage" avec une période de l'ordre de 20 minutes, soit 10 échantillonnages toutes les 2 minutes.
Tu pourrais donc dans un premier temps tester un filtre passe bas avec une période de coupure de environ10 : par exemple un Butterworh d'ordre 5. Il devrait réduire les fréquences supérieures à la fréquence de coupure, donc les périodes inférieures à 10*2 minutes.
VAR1 -> id du capteur, VAR2 -> butt,10,5
Compare les courbes avant filtrage et après.
Tu peux créer plusieurs plugin avec diverses valeurs de période et d'ordre (ordre inférieure à la période).
S'il apparaît des valeurs aberrantes dans ton signal, le lissage risque de ne pas suffire : elles seront atténuées, mais amèneront quand même des variations du signal de sortie.
On pourrait utiliser une limitation des valeurs ou de la vitesse de variation de ces valeurs : j'ai un plugin, dérivé de "calculator" (V1.3) en cours de finalisation, ou utiliser le préfiltre du plugin "lissage".
Essaie déjà sans préfiltre et dis-moi ce que ça donne. :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 871
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Filtrage numérique de données pour eedomus

Messagepar Fab_Rice » 05 Sep 2024 17:48

Alors comme écrit à opa95, l'amélioration du signal est très sensible :
Le signal non filtré
Image

Le signal filtré
Image

Encore un GRAND MERCI ;)
Dire que l'on ne sait pas est une preuve d'intelligence
Eedomus+, Zigate V2, volets Somfy & Bubbendorf, radiateurs en Tado° & fil pilote, gestion chaudière bois/fioul, gestion borne IRVE, gestion piscine, PAC & Climatisation Mitsubishi ...
Fab_Rice
 
Messages : 927
Inscription : 27 Déc 2020

Re: Filtrage numérique de données pour eedomus

Messagepar opa95 » 06 Sep 2024 14:32

Bonjour
Fab_Rice a écrit:Alors comme écrit à opa95, l'amélioration du signal est très sensible :
Le signal non filtré
Image

Le signal filtré
Image

Encore un GRAND MERCI ;)

On peut tester des valeurs plus fortes en doublant les valeurs : butt,20,8 ou même butt,50,8
ou bien conserver butt,10,5 et faire un préfiltrage :
VAR3 -> moy:5 (moyenne de 5 entrées successives -> une valeur moyenne transmise toutes les 10 minutes (5*2)) :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 871
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Filtrage numérique de données pour eedomus

Messagepar Fab_Rice » 06 Sep 2024 14:52

Bonjour,
J'ai testé le "butt,30,10" et j'avais plus d'amplitude qu'avec le "butt,10,5", je vais testé le préfiltrage avec la moyenne ;)
Dire que l'on ne sait pas est une preuve d'intelligence
Eedomus+, Zigate V2, volets Somfy & Bubbendorf, radiateurs en Tado° & fil pilote, gestion chaudière bois/fioul, gestion borne IRVE, gestion piscine, PAC & Climatisation Mitsubishi ...
Fab_Rice
 
Messages : 927
Inscription : 27 Déc 2020


Retour vers Scripts & Périphériques du store

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 33 invité(s)

cron