Les sondes qui se trouvent dans les chambres des enfants sont vraiment mal placées : elles se trouvent dans des armoires murales qu'elles subissent aussi des ponts thermiques avec les pièces d'à côté ... des greniers bien entendu non chauffés. Ci-dessous est décrit la manière avec laquelle j'ai tenté de compenser ses interférences.
J'ai à ma disposition 3 valeurs :
Pour que les mesures soient correctes, il est évident qu'il faut supprimer les plus de sources de perturbations possibles : l'idéal étant la mi-saison, avant que le chauffage ne soit allumé et lorsque le soleil à moins d'influences. On peut aussi le faire l'été mais durant la nuit pour éviter l'influence direct du soleil.
Je me retrouve avec près de 3000 mesures espacées de 5 minutes et dont j'ai supprimé les valeurs qui diffèrent trop des autres (environs 5 dans mon cas).
Pour y voir plus clair, rien ne vaut un bon graphique et LibreOffice a été mon ami sur ce coup. Traçons donc la courbe suivante avec
A première vue, on pourrait penser y voir une sorte de gaussienne ... mais si on demande à LibreOffice de tracer la tendance, on se rend compte qu'il n'en est rien : les valeurs proches de zéro sont peu nombreuses et donc non pertinentes. Bref et en conclusion, plus la différence entre la température du grenier et celle mesurée est grande, plus le delta entre la sonde et sa référence sera grande. Ouf, notre intuition était bonne !
On peut en déduire une régression linéaire statistique de la forme y = ax + b avec :
a=PENTE(C:C;E:E) b=ORDONNEE.ORIGINE(C:C;E:E)
La colonne C contenant la différence de température entre le grenier et la chambre, et la colonne E celle entre la sonde et la référence.
Résultat :
Appliquons la formule aux données récoltées.
Le nuage de points
Regardons de plus près la qualité des données :
Delta | Correction par la moyenne |
Correction par la formule |
|
---|---|---|---|
Moyenne | -1,1700459177 | -0,0003337784 | -0,0003337784 |
Erreur standard | 0,0020555772 | 0,0020789702 | 0,0016603058 |
Mode | -1,1041455505 | 0,0659003672 | 0,0492041728 |
Médiane | -1,1666455505 | 0,0034003672 | -0,0023303923 |
Premier quartile | -1,2291455505 | -0,0590996328 | -0,0622727838 |
Troisième quartile | -1,1041455505 | 0,0659003672 | 0,0601696077 |
Variance | 0,0126592913 | 0,0129490628 | 0,0082588194 |
Écart type | 0,1125135162 | 0,1137939487 | 0,0908780467 |
Kurtosis | -0,5651998739 | 0,8414018966 | 3,6024999033 |
Asymétrie | -0,2109962859 | -0,3800187218 | -0,4442912023 |
Plage | 0,5 | 1,1875 | 1,2201513044 |
Minimum | -1,4166455505 | -0,9340996328 | -0,9589586533 |
Maximum | -0,9166455505 | 0,2534003672 | 0,2611926511 |
Somme | -3505,457569298 | -0,9999999998 | -0,9999999998 |
Nombre | 2996 | 2996 | 2996 |
La plage de mesure du delta entre la mesure brute de la sonde et la référence est simplement ... bidon : la faible résolution de la sonde (1/8 de °C) face à la précision de nos calculs qui lisse cette plage. On oublie donc cette valeur.
Par contre, on remarque que la plage est légèrement augmentée lorsqu'on utilise une correction par notre formule, plutôt qu'une simplement prise en compte de la moyenne des delta. Normal, nous ajoutons un nouveau paramètre donc, par ricochet, les sources de perturbation.
On ne le répétera jamais assez : ce n'est pas parce que nous faisons des calculs avec 10 digits derrière la virgule que le résultat veut dire quelque chose. Entre la résolution des sondes et leur marge d'erreur, conserver 1/10°C sur le résultat final est déjà beaucoup.
Est-ce que ça signifie que notre formule crée plus d'erreurs qu'autre chose ? Et bien non, car si on regarde de plus très l'écart type, il s'est resserré : normal, le nuage s'est redressé vers une tendance nulle.
Cas beaucoup plus compliqué pour la seconde chambre : sa fenêtre est directement exposée au soleil l'après-midi et le grenier qui lui est adjacent est orienté plein sud.
S'ajoute aussi que j'ai dû faire les mesures avec le chauffage allumé ...
Delta | |
Moyenne | -0,8524277046 |
Erreur standard | 0,004698758 |
Mode | -0,6041455505 |
Médiane | -0,7291455505 |
Premier quartile | -0,9791455505 |
Troisième quartile | -0,6041455505 |
Variance | 0,1678835942 |
Écart type | 0,4097360055 |
Kurtosis | 2,8378236191 |
Asymétrie | -1,6351610225 |
Plage | 2,1875 |
Minimum | -2,4166455505 |
Maximum | -0,2291455505 |
Somme | -6481,860266002 |
Nombre | 7604 |
Bof, le résultat n'est pas terrible du tout.
J'y ai passé plusieurs semaines, essayant de déterminer LA règle qui me permettrait de retomber sur la valeur de référence.
Malheureusement (enfin, heureusement, ça signifie que le grenier n'est pas si mal isolé que ça), sans résultat probant, beaucoup d'autres facteurs extérieurs influent :
Alors, si dans certains cas, ça donne de grosses différences (les fameuses excroissances vers le bas qu'on voit sur le graphe ci-dessus), la majorité du temps, on oscille dans une fourchette de +/- 1°C ... pour laquelle il m'est impossible de déterminer les paramètres.
Bref, je vais donc rester avec l'application d'un offset qui est à peu près la seule chose que je peux déterminer correctement (et encore, il faudra que je fasse d'autres tests cet été).
Tout ceci n'a pas été qu'une perte de temps vu que cela a conduit à Marcel v6.07 et la possibilité de mettre des fonctions utilisateur à la lecture des FFV (flat file value). Ainsi, si on veut ajouter une fonction compensatrice à la lecture d'une température, on peut
*FFV=Grenier Sud
File=/var/lib/owfs/mnt/42.8B5247000000/temperature
Topic=maison/Temperature/Grenier Sud
Offset=-0.1610840373
Func=MemoriseTempGSud
*FFV=Chambre Oceane
File=/var/lib/owfs/mnt/28.FF3ED8001502/temperature
Topic=maison/Temperature/Chambre Oceane
Offset=+0.992605483722031
Func=CorrectChOceane
Les fonctions FFV reçoivent les paramètres suivants :
En retour, true indique à Marcel de soumettre la valeur compensée, alors qu'avec false, il ne soumettra rien du tout.
Une première fonction est utilisée pour mémoriser la température du grenier
function MemoriseTempRef(id, topic, val, compensated )
TRef=compensated
return true;
end
function CorrectChOceane(id, topic, val, compensated )
-- result : Probe - (( GrN - probe ) * gradient - org )
local GRADIAN = 0.368026227935636
local ORDONNE = -0.521081761772103
if not TGSud then
return true
else
if TGSud > 80 or val > 80 then -- a probe sent bulshit
return false
end
local v = val - (TGSud - val)*GRADIAN - ORDONNE
Marcel.MQTTPublish( topic, v )
return false -- we sent the result
end
end
Dans un premier temps, si nous n'avons pas reçu la température du grenier, nous envoyons la donnée compensée.
Si par contre, elle est reçue, nous calculons la formule de compensation et soumettons nous-même le résultat.
A noter aussi que je me suis aperçu que parfois les sondes renvoyaient n'importe quoi (température de 80°C) : j'ai donc rajouté un filtre.
Visitez : Nos sorties Ski et rando |
Copyright Laurent Faillie
2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso. |
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution. |
Visites durant les 7 derniers jours au total. |
Vous pouvez
laissez un commentaire
sur cette page.