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é 116 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 : 595
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 : 731
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 : 595
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 : 731
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 : 595
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 : 731
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 : 595
Inscription : 28 Déc 2020


Retour vers Scripts & Périphériques du store

Qui est en ligne ?

Utilisateurs parcourant ce forum : Fab_Rice et 3 invité(s)