alexylem / jarvis

Jarvis.sh is a simple configurable multi-lang assistant.
http://openjarvis.com
MIT License
807 stars 197 forks source link

Parser JSON avec Jarvis #182

Closed brakc closed 7 years ago

brakc commented 7 years ago

Bonjour et merci pour cet excellent programme.

Voilà j'ai un petit souci. J'utilise Jarvis à la perfection couplé avec mon Domoticz. Les ordres Switch ON/OFF en json fonctionnent au top! Mais j'aimerais aller plus loin et récupérer des valeurs de certains capteurs pour les faire lire à Jarvis.

Malheuresement, il n'est pas possible en json de remonter par exemple juste que la température de la sonde. Le json remonte toutes les informations du capteur (température, humidité, statut, heure ...)

J'ai donc créer un petit script PHP qui ne me retourne que la température:

#!/usr/bin/php
<?php
$json_string = file_get_contents("http://192.168.0.252:8080/json.htm?type=devices&rid=182");
$parsed_json = json_decode($json_string, true);
$test_link = "/home/pi/jarvis/scripts/test_1.txt";
$test_data = fopen ($test_link, "w+");
fwrite ($test_data, print_R($parsed_json, TRUE));
fclose ($test_data);
$parsed_json = $parsed_json['result'][0];
$temp = $parsed_json['Temp'];
echo $temp."\n";
?>

J'execute dans le terminal : "/usr/bin/php /home/pi/jarvis/scripts/temp.php" et j'ai bien ma valeur, top!

jarvis-commands configuré comme tel: *TEMPERATURE*==say "la température extérieur est,/usr/bin/php /home/pi/jarvis/scripts/temp.phpdegrés"

mais visiblement, cela ne fonctionne pas. Auriez-vous un petite idée svp?

Merci.

Fabrice.

alexylem commented 7 years ago

Tu peux me donner le JSON tel que tu le reçois? Il y a une fonction intégrée à Jarvis que je n'ai pas encore documentée qui pourrais faire exactement ce que tu cherches.

brakc commented 7 years ago

Le voici:

{
ActTime: 1476629250,
ServerTime: "2016-10-16 16:47:30",
Sunrise: "07:47",
Sunset: "18:43",
result: [
{
AddjMulti: 1,
AddjMulti2: 1,
AddjValue: 0,
AddjValue2: 0,
BatteryLevel: 255,
CustomImage: 0,
Data: "23.3 C, 72 %",
Description: "",
DewPoint: "17.97",
Favorite: 0,
HardwareID: 13,
HardwareName: "Netatmo",
HardwareType: "Netatmo",
HardwareTypeVal: 54,
HaveTimeout: false,
Humidity: 72,
HumidityStatus: "Wet",
ID: "7EB2",
LastUpdate: "2016-10-16 16:33:05",
Name: "NETATMO - Extérieur T°",
Notifications: "false",
PlanID: "0",
PlanIDs: [
0
],
Protected: false,
ShowNotifications: true,
SignalLevel: "-",
SubType: "WTGR800",
Temp: 23.3,
Timers: "false",
Type: "Temp + Humidity",
TypeImg: "temperature",
Unit: 0,
Used: 1,
XOffset: "0",
YOffset: "0",
idx: "182"
}
],
status: "OK",
title: "Devices"
}
alexylem commented 7 years ago

Ce n'est pas un json valide les clés devraient aussi être entre guillemets. J'essaye quand même avec ca...

alexylem commented 7 years ago

Malheureusement l'outil pour parser le JSON ne fonctionne pas à cause des guillements manquants sur les clés. En les rajoutant ca marcherait: image

Tu peux corriger la source?

brakc commented 7 years ago

malheureusement non, c'est le format standard en sortie de Domoticz

brakc commented 7 years ago

Ou alors peut-être récupérer la données dans "Data"? puis reparser?

alexylem commented 7 years ago

Bon sinon t'as la version quick & dirty, mais ca marche:

$> echo "$json" | sed -n 's#Temp: \([^,]*\),#\1#p'
23.3

Donc en gros:

*TEMPERATURE*==say "La température est de $(curl -s http://192.168.0.252:8080/json.htm?type=devices&rid=182 | sed -n 's#Temp: \([^,]*\),#\1#p') degrés"
alexylem commented 7 years ago

Si tu parviens à faire corriger le JSON source, ou pour ceux qui tombent sur ce post et souhaitent parser proprement, utiliser jq (dépendence de Jarvis):

*TEMPERATURE*==say "La température est de $(curl -s http://192.168.0.252:8080/json.htm?type=devices&rid=182 | jq -r ".result[0].Temp") degrés"
brakc commented 7 years ago

hummm presque: j'ai cette erreur

...
...
         "Type" : "General",
         "TypeImg" : "current",
         "Unit" : 1,
         "Usage" : "0.0 Watt",
         "Used" : 0,
         "XOffset" : "0",
         "YOffset" : "0",
         "idx" : "681"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
} degrés
tts_engines/svox_pico/main.sh: ligne 23: /usr/bin/pico2wave: Liste d'arguments trop longue
alexylem commented 7 years ago

Comment ca se fait que maintenant tu as des guillemets autour des clés 😄 pb de copier coller? Essayes donc la version jq dans ce cas:

*TEMPERATURE*==say "La température est de $(curl -s http://192.168.0.252:8080/json.htm?type=devices&rid=182 | jq -r ".result[0].Temp") degrés"

Tu peux la valider ici: https://jqplay.org/ Filter: .result[0].Temp JSON: ton JSON

brakc commented 7 years ago

Tu as raison, je t'ai renvoyé la 1ère fois le retour du browser. Via curl dans mon terminal tous est bon !!! merci pour le lien https://jqplay.org/, je vais pouvoir m'éclater ;-)

...et merci pour la soluce

A bientôt