Aller au contenu

Recommended Posts

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+

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, j'espère qu'aujourd'hui on a cette 4.018...

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

J'ai un petit problème pour configurer un device virtuel.

Une fois le plugin ajouté et un device ajouté et quand je vais dans avancé pour essayer de le parametrer, je n'ai rien ( que nom piece et genre)

Merci de ton aide

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

@Mulderonline, tu dois très certainement être en remote ? ou port forwarding ? La configuration est visible uniquement en local sur la bêta ;)

  • Upvote 1

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oh lala c'est exactement ce que j'étais en train de coder pour trouver l'inertie de ma maison. Si tu pouvais ouvrir un thread pour ton VD, ce serait sympa et permettrait de montrer ce qu'il est possible de faire.

Partager ce message


Lien à poster
Partager sur d’autres sites

Okay, pas de soucis, j'ai encore quelques petits points à  corriger, mais je vais publier ça (bien que le code ne soit pas des plus propre...  :15:).

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

@Krikroff

Hier soir j'ai changé l'offset sur le module pour rajouter +0.4 et j'ai la box qui arrivait plus àenvoyer les ordres zwave. Obligé de PowerReboot. Après ça, tout est ok, offset pris en compte.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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 ?

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

... et avec un json.encode vous pouvez stoker jusqu' a 8000 caractères en gros ;) elle est pas belle la vie :D.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Remarque :

L'offset est bien compté sur l'affichage dans le home mais pas dans le suivi des températures sur les courbes ! Not good :)

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Vivivi mr je vais faire ça.... but is not WAF :D

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Surtout si c'est pour notifié ta capacité à  la combler

 

hors_de_la_jauge_de_carburant_de_biere_a

:98:

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais tu es un grand malade :lol:... :77:

  • Upvote 2

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

×