Où sommes nous ?

Retour

Correction des interférences venant du grenier

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.

Les mesures

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).

La correction

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 :

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 mesures

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.

L'écart type

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.

Seconde chambre, plus compliquée

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.

Résultat

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é).

Fonction utilisateur pour les FFV dans Marcel

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

Configuration

*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

Fonctions Lua

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 :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2017
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 Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.