Aller au contenu

Messages recommandés

Bonjour

 

vous connaissez un outil qui permet de trouver la bonne syntaxe pour extraire la valeur qu'on souhaite d'un retour JSON ?

Comment fonctionne le Moteur d'expressions JSON ?

 

Mon but est de récupérer la valeur de temp_c dans ce flux json : http://api.wunderground.com/api/xxxxxxxxxxxxxxxxx/conditions/q/FR/Paris.json

 

krirkroff-plugin-temp_c.png

 

a+

Lien vers le commentaire
Partager sur d’autres sites

+BenjyNet merci je l'avais vu. Mais je fais cette intégration pour tester le plugin de Krikroff et comprendre son fonctionnement.

L'intérêt que j'y vois est qu'on peut intégrer son plugin àdes scènes facilement alors qu'avec le plugin virtuel il fait plus pour visualiser des informations.

Lien vers le commentaire
Partager sur d’autres sites

@trackingnewtech, pour utiliser la valeur temp_c dans ce json il faut simplement utiliser le chemin suivant dans le "Moteur d'expressions"

/current_observation/temp_c

Ici pas de pattern en particulier puisque le json retourne déjà  une valeur de type number ("temp_c": 12.3)

 

Quelques explications sur l'expression: Elle est composée de trois parties dont une obligatoire : Le chemin, puis ensuite en option un Pattern pour extraire une valeur et enfin une Opération pouvant servir d'offset et ainsi ajuster la valeur.

 

Le Chemin: Pour le trouver, il faut simplement suivre l'arborescence du "root" jusqu’à  la valeur visée. Le caractère / représente le passage vers une branche "enfant",

{
    "response": {  },
    "location": {  },
    "current_observation": {
        "display_location": {
            "elevation": "47.00000000"
        },
        "observation_location": {
            "elevation": "161 ft"
        },
        "estimated": { },
        "temperature_string": "54.1 F (12.3 C)",
        "temp_f": 54.1,
        "temp_c": 12.3,
        "relative_humidity": "84%"
    }
}

ainsi pour trouver la valeur temp_c il faut descendre du root (/)  puis current_observation, rentrer dans current_observation avec (/) puis temp_c soit : /current_observation/temp_c

 

Le Pattern: Dans l'expression un Pattern est représenté par un ensemble {(pattern)}, cf. http://www.lua.org/pil/20.2.html

 

Si la valeur visée est relative_humidity alors l'expression à  utiliser est la suivante: /current_observation/relative_humidity {(%d+%.?%d*)[%%]}

 

Une opération:  Dans l'expression un opération est représentée par un ensemble (math_func : operatior number) placé soit avant, soit après le Pattern mais toujours après le chemin. Il peut combiner une fonction mathématique (ceil, floor, abs) en plus de l'opération.

 

Des exemples:

 

(abs:+0.75) -> Retourne la valeur absolue du résultat du pattern ajuster par +0.75

(-1.5) -> Ajuste le résultat de -1.5

(floor) -> Retourne l'entier inférieur (ou égal le plus proche) du résultat du pattern

Lien vers le commentaire
Partager sur d’autres sites

Wow, que d'activité sur ce sujet !!  ;)

Après la lecture de tous les échanges, nickel, la récupération de la valeur présente dans un label fonctionne au poil ! Merci Krikroff.

 

StatsCombles T 10 OK

 

 

Pour répondre @BenjyNet, mon Vitual Device :

- Récupère la valeur de la température toutes les x minutes

- La stock dans une liste (que j'archive dans une variable globale du genre temp1;temp2;temp3

- Affiche la température min/avg/max de la liste + la variation de température entre le moment présent et -10min, -30min, -1h et -2h

- RAZ des valeurs tous les jours à  minuit

 

StatsCombles VDevice

 

à‡a me permet d'avoir une idée de la courbe de température (une espèce de dérivée grossière) comme on en avait pas encore sur la HC2. A terme, je voudrais l'utiliser pour la gestion de mon chauffage.

Exemple, si la température descend dans les combles depuis 1h, je vais pouvoir anticiper l'inertie de la maison, et affiner le temps de chauffe.

Lien vers le commentaire
Partager sur d’autres sites

Sur le module "enfant" température ou directement dans l'expression dans la configuration du module principale ? Pour le moment tous les modules "enfants" c'est du 100% Fibaro, impossible de corriger un bug pour moi a ce niveau

Envoyé de mon iPhone àl'aide de Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Ouais sur le module enfant, mais bon ça doit venir du buguage de la v4 :)

Par contre j'ai constaté un truc grâce àce plugin, c'est que mes putains de radiateurs qui coûtent un bras régulent vachement la température (précision à+/-0,1°). Grâce aux courbent je peux voir aussi l'inertie de la maison et prévoir les seuils de déclenchement du chauffage.

Sais-tu par contre s'il est possible d'avoir une variable globale sous forme d'array ?

Lien vers le commentaire
Partager sur d’autres sites

Hello,

 

D'après mes recherches, impossible de stocker un array en variable globale.

Du coup, j'ai bricolé une fonction pour stocker le contenu d'un array sous forme d'une ligne de caractères, séparés par un caractère au choix. 

 

C'est à  déclarer avant ton main.

--Generate an string from an array, where each value is separated by a "Separator"
function recordTableToString(Table,Separator)
  --fibaro:debug("Separator :"..Separator)
  local OutputString = Table[1] --init with the first value
  for i=2,table.getn(Table) do
    OutputString = OutputString..Separator..Table[i]
  end
  fibaro:debug(OutputString)
  return OutputString
end

Evidemment, j'ai aussi une fonction pour extraire l'info de la variable globale.

 
-- Split a string depending of a character, and return an array
function string:split( inSplitPattern, outResults )
  if not outResults then
    outResults = { }
  end
  local theStart = 1
  local theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  while theSplitStart do
    table.insert( outResults, string.sub( self, theStart, theSplitStart-1 ) )
    theStart = theSplitEnd + 1
    theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  end
  table.insert( outResults, string.sub( self, theStart ) )
  return outResults
end
 
Utilisation pour enregistrer dans une variable globale :
-- Record to Global Var for backup
fibaro:setGlobal(GlobalVariableForRecord, recordTableToString(TempTodayArray,";"))
Et pour en extraire les données :
--Get temp values from Global Var
local GlobalVariableForRecord = "Stats_TempCombles"
local TempTodayArray  --Array of temp values

ValueGetFromGlobalVar = fibaro:getGlobalValue(GlobalVariableForRecord)
TempTodayArray = ValueGetFromGlobalVar:split(";") --Split data in an array
nbReleveTemp  = table.getn(TempTodayArray) --Count number of data in the array
fibaro:debug(">> ".. nbReleveTemp .." données restorées")

Attention cependant, la capacité d'une variable globale est limitée. Je suis allé jusqu'à  ~1600 relevés de température enregistrés. Après ça plante...

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

C'est pour ça, tu devrais gérer l'offset dans le module principale au niveau de l'expression pour être certain que la valeur prise en compte partout est la valeur corrigée

Envoyé de mon iPhone àl'aide de Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Ça c'est sur mais bon en même temps pas certain que ma femme ou la tienne décide un jour de créer une sonde virtuelle !

Envoyé de mon iPhone àl'aide de Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Par contre j'ai constaté un truc grâce àce plugin, c'est que mes putains de radiateurs qui coûtent un bras régulent vachement la température (précision à+/-0,1°). Grâce aux courbent je peux voir aussi l'inertie de la maison et prévoir les seuils de déclenchement du chauffage.

Tu n'avais pas mis en place les graphs de température sur ton NAS ?

On apprend plein de trucs avec les courbes de T°.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...