Aller au contenu
crazymonster999

[Virtual Device] Tendances D’Un Capteur De Température

Recommended Posts

Bonjour à  tous,

 

-- Introduction --

 

Partant du constat que les courbes de températures ne sont dispo qu’à  partir de la V4, et qu’on ne peut pas en tirer profit dans des scénarios, je me suis demandé comment mesurer les variations des relevés de température.

Voici un partage d’un petit développement que j’ai réalisé pour afficher une « image » de l’évolution de la température. C’est sous la forme d’un Virtual Device en attendant de peut-être le transformer en plugin un jour…

 

TempStatistics PanelView

TempStatistics FullView

 

-- Installation --

  1. Créer une variable globale (une pour chaque Virtual Device créé)
    >> exemple ici : Stats_Combles
     
  2. Connaitre l’ID de la sonde de température 
    >> Exemple ici : 30
     
  3. Importer le Virtual Device
    A télécharger ici : VD_StatsTemp_V1.0.vfib

    - Configurer l’@IP du VD avec le nom de la variable créée à  l’étape 1
    - Configurer le Port TCP avec l’ID de la sonde de température  identifié à  l’étape 2
    Exemple :

    TempStatistics Config


     
  4. Ajout d’une icône sur le bouton PushTemp + Virtual Device
    >> Téléchargement de l’icone post-237-0-64081400-1419680116_thumb.png
     
  5. C’est parti !

 

-- Description fonctionnelle --

 

Par défaut la remontée de la température se fait toutes les 5 minutes

La configuration est terminée, il ne reste plus qu’à  attendre afin qu’il y ai assez de données pour retourner une valeur de la tendance.

Pour forcer l’upload de la température courante, il suffit de cliquer sur le bouton « PushTemp ». Attention, cette action fausse les statistiques par rapport au temps.

 

 

Le plugin affiche la différence de température entre l’instant T et les relevés précédents.

Valeurs affichées :

  -          T° Actuelle  = Température actuelle

  -          Min/AVG/Max = Température mini/moyenne/max des 24 dernières heures

  -          Tendance H-10’ = Différence de température entre le dernier relevé et le relevé d’il y a 10 minutes

  -          Tendance H-30’ = Différence de température entre le dernier relevé et le relevé d’il y a 30 minutes

  -          Tendance H-1 = Différence de température entre le dernier relevé et le relevé d’il y a  1 heure

  -          Tendance H-2 = Différence de température entre le dernier relevé et le relevé d’il y a 2 heures

  -          Tendance J-1 = Différence de température entre le dernier relevé et le relevé d’il y a 1 jour

  -          Nb Records = Debug >> Nombre de données de température stockées dans la variable globale.

 

 

-- Description technique --

 

Le Main Loop déclenche un appui sur le bouton PushTemp toutes les 5 minutes.

 

Changement du délai entre deux remontées de température

Valeurs possibles entre 2 et 10 minutes (en dessous trop de valeurs à  stocker dans la variable globale / En dessus la tendance h-10' ne fonctionnera pas).

 

  - Main Loop :

local TimeToWait = 5 --en minutes - Minimum = 2 ; Max = 10

- Bouton PushTemp

local TimeToWait = 5 --en minutes >> Minimum = 2 ; Max = 10

La sauvegarde et restauration de l’historique des données dans la variable globale est faite à  l’aide de la fonction json.encode() et json.decode(). Certaines versions V4 Beta avaient un pb avec cette fonction, corrigée depuis les dernières versions (V4.020B).

Le stockage d’une chaine de caractère dans une variable globale est limité en taille. D’après mes tests, il semblerait que ça soit aux alentours de 1600 caractères.

Attention, les valeurs > ou = à  0 sont précédés du caractère « + ».

 

--Bug connus--

  • Lors de la modification d’une variable globale par l’interface web, la sauvegarde écrase les données contenues dans la variable globale qui stock l’historique des relevés de température.
     
  • Une variable globale est limitée en nombre de caractères qui peuvent y être stockés. Il semblerait que cette valeur soit d’environ 1600 caractères. Le VD est configuré pour

-- Roadmap --

  • Affichage des données statistiques des 7 derniers jours (min/avg/max)
  • Transformation en plugin
  • Des idées ?

 

 

  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

 

Moi j'ai plutôt une question : Cela sert à  quoi exactement ?

L'utilisation que j'aimerai voir venir avec, c'est une régulation PID du panneau de chauffage Fibaro... Mais je l'accorde, ce n'est pas chose aisée à  faire :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Concernant la longueur maxi d'une variable global, j'avais cru comprendre que c'etait bien plus si elle etait alimentée par un json.encode (8000 je crois d'apres Krikroff. )

As tu bien testé avec le json.encode?

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

@fdp2 : Non, je n'ai pas retesté avec le json.encode. A l'origine, j'avais écris une fonction qui écrivait en dur les données séparées par un ";". Si c'est 8K caractères, je me suis peut être trompé dans le descriptif, et non pas 1600 caractères mais 1600 valeurs. A raison de 5 caractères écrits pour une valeur "-3.45;" ça fait 8000. Je referai quelques tests, pour vérifier.

 

@Nico : L'idée est en effet de mesurer l'inertie d'une pièce, en comparant par exemple avec la température extérieure.

De même, il est possible d'imaginer des scénarios qui déclenchent le chauffage en anticipé si on détecte une baisse importante de la température, ou repérer l'ouverture d'une fenêtre...

à‡a sera une prochaine étape. Cela dit ça m'amuse bien de voir l'évolution des températures (sans graphiques pour le moment) et de pouvoir les utiliser dans les scénarios plus tard. Essayes, tu verras  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

@Crazymonster999, merci d'avoir partagé ton vd , j'aime bien l'idée je vais l'installer ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

Il faut apparement initialiser la variable globale avec la valeur "NaN" pour que cela fonctionne.

 

J'ai remplacé le code :

  --Get temp values from Global Var
  ValueGetFromGlobalVar = fibaro:getGlobalValue(GlobalVariableForRecord)

par

  --Get temp values from Global Var
  ValueGetFromGlobalVar = fibaro:getGlobalValue(GlobalVariableForRecord)
  if tostring(ValueGetFromGlobalVar) == "0"  then
    ValueGetFromGlobalVar = "NaN"
  end

Cela fonctionne parfaitement!

 

Merci pour le partage.

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello fdp2,

 

En effet, c'est une bonne remarque. J'avais rajouté le check suivant dans le cas ou la sauvegarde des variables écrase les données générés par le json.encode par un "NaN". Mais je n'ai pas pris en compte l'initialisation de la valeur qui est par défaut 0.

 

 -- Check NaN Value...
  fibaro:debug("Content of ValueGetFromGlobalVar : "..ValueGetFromGlobalVar)
  if (ValueGetFromGlobalVar == "NaN") then
   fibaro:debug("NaN Value detected - Wrong value get from global VAR")
   TempTodayArray = {}
    nbReleveTemp = 0
  else
    TempTodayArray = json.decode(ValueGetFromGlobalVar) --json data recorded to an array
    nbReleveTemp  = table.getn(TempTodayArray)
  end
 
Merci pour ce correctif, je vais mettre à  jour en V1.1  :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

c'est toujours la 1.0 en DL non ? je vais rajouter le code à  la mano car pour le moment ça ne marche pas

 

edit : avec la modif de fdp2 ca fontionne (en tout cas pour le push temp)

 

merci pour le module

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

Yep, dsl, j'ai pas eu le temps de push la version 1.1.

En faite, je voulais juste faire un check, dans la cas ou la variable globale ne contiens pas les caractères "[" et "]", ça initialise le tableau à  vide.

 

Du coup, n'ayant pas encore une fonction qui marche, je n'ai pas publiée de version 1.1  :(

Bref, si quelqu'un a la solution pour jouer avec les paterns, je prends  :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

×