syntaxe pour récupérer le contenu xml en xpath

Échangez ici vos astuces sur la gestion des règles eedomus

syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 04 Oct 2021 10:07

bonjour ,
j'ai besoin d'un coup de main pour avoir la syntaxe pour récupérer en xpath le conte d'un xml, je galère avec cela depuis quelque temps et avec les documentations je n'ai pas trouvé
le xml :
Code : Tout sélectionner
<root>
   <energyDetails>
      <timeUnit>DAY</timeUnit>
      <unit>Wh</unit>
      <meters>
         <meters>
            <type>Production</type>
            <values>
               <meters>
                  <date>2021-10-04 00:00:00</date>
                  <value>503</value>
               </meters>
            </values>
         </meters>
            <meters><type>SelfConsumption</type>
            <values><meters><date>2021-10-04 00:00:00</date>
            <value>497</value>
            </meters>
            </values>
            </meters>
            <meters><type>Purchased</type>
            <values><meters><date>2021-10-04 00:00:00</date>
            <value>9789</value>
            </meters>
            </values>
            </meters>
            <meters><type>FeedIn</type>
            <values><meters><date>2021-10-04 00:00:00</date>
            <value>6</value>
            </meters>
            </values>
            </meters>
            <meters><type>Consumption</type>
            <values><meters><date>2021-10-04 00:00:00</date>
            <value>10286</value>
            </meters>
            </values>
         </meters>
      </meters>
   </energyDetails>
</root>


et xpath doit récupérer la donnée :
value pour le type "Production"

j'ai tenté : //root/energyDetails/meters/meters[type='Production']/values/meters/value
le retour est : Erreur valeur lue vide

(j'ai tenté plein d'autres syntaxes, mais visiblement ce ne sont pas les bonnes)

merci à une grande âme de m'aider sur le coup.
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar merguez07 » 04 Oct 2021 10:45

Salut Jluc2808

utilise le site xmltoolbox

la réponse est
/root/energyDetails/meters/meters[1]/values/meters/value/
tuto 1 -->Programmation des scripts Eedomus
tuto 2 -->SmartDevice
tuto 3 -->Le déclenchement de règles
scripts -->Météo du jour | GH Thermostat | TotalWatt | Detecfire | smartbattery
Skype Eedomus -->lien vers le skype Eedomus
merguez07
 
Messages : 2346
Inscription : 15 Sep 2017
Localisation : Le Teil en Ardèche

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 04 Oct 2021 11:22

@merguez7
merci pour ce tools et la syntaxe
cependant je ne peux pas utiliser cela "meters[1]"
l'ordre de retour des "type" dans l'array meters est de temps en temps différent, ce qui m'oblige à tester type='Production' et pas meters[1] qui n'est pas toujours le bon

y a t il une solution ?
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar thrymartin » 04 Oct 2021 12:06

tu peux le tester directement avec eedomus avec ce lien
https://secure.eedomus.com/xpath/
et cocher la case "utiliser le résultat XML" pour y copier ton XML et tester ton XPath

du coup tu verras que ta syntaxe fonctionne fort bien, 'Production' donne 503, 'SelfConsumption' donne 497 etc.

//root/energyDetails/meters/meters[type='gnagnagna']/values/meters/value

heu... pas celle de merguez avec le [1] : "ERREUR: Expression xpath invalide"

SI ça te donne "valeur lue vide", soit ta valeur n'existe réellement pas à ce moment, à extraire le XML correspondant pour vérifier, soit tu as un doigt qui a dérapé quand tu as copié ton XPath et en tout cas pas il n'a pas dérapé dans ta question, puisque si je copie le XML de ton message et ton XPath de ton message, j'obtient bien 503 dans la page de test eedomus.
thrymartin
 
Messages : 922
Inscription : 03 Mars 2019
Localisation : La Réunion

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar merguez07 » 04 Oct 2021 13:15

thrymartin a écrit:heu... pas celle de merguez avec le [1] : "ERREUR: Expression xpath invalide"


effectivement, j'aurais du tester car je faisais une confiance aveugle à xmltoolbox :oops:

Du coup la question initiale contenait la bonne réponse :P
tuto 1 -->Programmation des scripts Eedomus
tuto 2 -->SmartDevice
tuto 3 -->Le déclenchement de règles
scripts -->Météo du jour | GH Thermostat | TotalWatt | Detecfire | smartbattery
Skype Eedomus -->lien vers le skype Eedomus
merguez07
 
Messages : 2346
Inscription : 15 Sep 2017
Localisation : Le Teil en Ardèche

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 04 Oct 2021 13:38

thrymartin a écrit:tu peux le tester directement avec eedomus avec ce lien
https://secure.eedomus.com/xpath/
et cocher la case "utiliser le résultat XML" pour y copier ton XML et tester ton XPath

du coup tu verras que ta syntaxe fonctionne fort bien, 'Production' donne 503, 'SelfConsumption' donne 497 etc.

//root/energyDetails/meters/meters[type='gnagnagna']/values/meters/value

heu... pas celle de merguez avec le [1] : "ERREUR: Expression xpath invalide"

SI ça te donne "valeur lue vide", soit ta valeur n'existe réellement pas à ce moment, à extraire le XML correspondant pour vérifier, soit tu as un doigt qui a dérapé quand tu as copié ton XPath et en tout cas pas il n'a pas dérapé dans ta question, puisque si je copie le XML de ton message et ton XPath de ton message, j'obtient bien 503 dans la page de test eedomus.


yep, my fault, j'avais laissé dans mon script php, un echo $url , qui venait perturber le retour de $response (jsontoxml) dans la partie xml test du xpath

effectivement si je vire la scorrie, ma syntaxe fonctionne parfaitement. boudiou ( :oops: j'ai paumé 3 heures pour cette conn....ie)

merci bien
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar opa95 » 04 Oct 2021 14:13

Sinon, si la production reste toujours en tête
//value
marche très bien et renvoie 503 (testé sur la box)
Xpath.png
Xpath.png (2.81 Kio) Consulté 6249 fois
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 731
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 04 Oct 2021 14:21

opa95 a écrit:Sinon, si la production reste toujours en tête
//value
marche très bien et renvoie 503 (testé sur la box)
Xpath.png

malheureusement et c'était bien le problème, l'ordre des "type" change en fonction de je ne sais pas quoi , mais ne reste pas dans le même ordre.
c'est la raison pour laquelle je dois qualifier le retour xpath à chaque fois.
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar opa95 » 04 Oct 2021 14:27

Si tu veux garder une simplicité d'écriture et la souplesse proposée par Thrymartin
tu peux aussi utiliser
//meters[type='Production']//value
ou
//meters[type='SelfConsumption']//value
et ça fonctionne bien
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 731
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 04 Oct 2021 14:45

opa95 a écrit:Si tu veux garder une simplicité d'écriture et la souplesse proposée par Thrymartin
tu peux aussi utiliser
//meters[type='Production']//value
ou
//meters[type='SelfConsumption']//value
et ça fonctionne bien

ah yes , ça ca me va bien

merci

question connexe:
j'ai 5 équipements qui sont liés (attachés au même)
dans chacun d'eux je suis obligé de mettre un lien url (sinon je ne peux pas sauver)
comme c'est le même pour tous, est-ce que ça va s’exécuter 5 fois ou 1 seule (toutes les 15 minutes) ou comment je peux mettre qu'un seul avec des xpath différents ?
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar opa95 » 04 Oct 2021 15:07

Bonjour jluc, ça dépend du php que tu appelles, s'il est astucieux il va garder en mémoire le résultat de ta première demande et l'heure de la demande. A l'appel suivant, si la première demande a moins de 15 minutes il va te renvoyer le résultat de la première demande sans appeler le serveur qui te renvoie les données, sinon il va réenvoyer une demande au serveur et la mémoriser avec l'heure de la nouvelle demande; il n'y aura qu'une demande toutes les 15 minutes. Si le php ne fait pas cela, il y aura une demande au serveur à chaque fois (donc 5 demandes).
Pour aller plus loin, il me faut le php et la manière dont tu fais tes appels.
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 731
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 04 Oct 2021 15:25

@opa95
merci de ce retour, je comprends que c'est directement dans le script PHP que va se jouer le cache, je pensais (naïvement) que le fait de lier des équipements allait permettre de n'envoyer qu'une seule requête (URL).
ce que je comprends c'est que chaque équipement envoi la requête attachée et que le script doit se débrouiller avec.

je vais reprendre mon php pour y mettre la fonction cache et le publie dès que c'est fait pour correction et avis.
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar thrymartin » 04 Oct 2021 15:49

la fonction "cache" est expliqué dans l'aide de merguez et reprise dans mes eedotrucs et utilisé en fonction primordiale dans le script du plugin mobile alerts (perso j'ai 16 capteurs pour un seul appel, mais on peut en mettre autant qu'on veut), y a quasi plus qu'à recopier...
thrymartin
 
Messages : 922
Inscription : 03 Mars 2019
Localisation : La Réunion

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 04 Oct 2021 16:03

mon php revu avec le cache:
Code : Tout sélectionner
<?php
/** ****************************************************************************
* JL Berno eedomus Script solaredge
********************************************************************************
* Plugin version : 1.0
* Author : JL BERNO
* solaredge API : janvier 2019 - https://www.solaredge.com/sites/default/files/se_monitoring_api.pdf
*******************************************************************************/

/** Utile en cours de dev uniquement */
// $eedomusScriptsEmulatorDatasetPath = "eedomusScriptsEmulator_dataset.json";
// require_once ("eedomusScriptsEmulator.php");

/** Initialisation de la réponse */
$response = null;

/** Lecture de la fonction */
$function = getArg('function');

/** Lecture des infos site et api_key */
$site = getArg('site');
$api_key = getArg('api_key');

/** ****************************************************************************
* Routeur de fonction
*/
switch($function) {
   case 'overview':
      sdk_callAPI('overview', $site, $api_key, "");
      break;
   case 'list':
      sdk_callAPI('list', $site, $api_key, "");
      break;
   case 'consommation_jour':
   case 'autoconsommation_jour':
      // calcul des bornes de récupération des données
      $tms = mktime() - 60 * 60;
      $today = date('Y-m-d', $tms);
      // on fixe arbitrairement les heures à 0h et 23h59 pour avoir toute la journée
      $params = "&startTime=".$today." 00:00:00&endTime=".$today." 23:59:59";   
      sdk_callAPI ('energyDetails', $site, $api_key, $params);
      break;
   case 'powerDetails':
      // calcul des bornes de récupération des données
      $tms = mktime() * 60;
      $tms_15min_before = mktime() - 15 * 60;
      $now = date('Y-m-d H:i:s', $tms);
      // si 15min avant on change de jour alors on mettra la date du jour à 00:00:00
         $today = date('Y-m-d', $tms);
         $today_15min_before = date('Y-m-d', $tms_15min_before);
         if ($today_15min_before != $today)   {$now_15min_before = $today." 00:00:00";}
         else {$now_15min_before = mktime() - 15 * 60;}
      $params = "&startTime=".$now_15min_before."&endTime=".$now;
      sdk_callAPI ('powerDetails', $site, $api_key, $params);
      break;   
   default:
      $response = '{ "success" : "false", "message" : "Unknown function '.$function.' " }';
}


/** ****************************************************************************
* Appeler l'API de solaredge
*
* @param $api_call la commande ciblé
* @param $site le site appelé
* @param $api_key la clé api
* @param $params complément à  envoyer sur la cible
* @return le résulat de l'appel au format Json
*/
function sdk_callAPI($api_call, $site, $api_key, $params) {
   global $response;   
   $url = "https://monitoringapi.solaredge.com/site/".$site."/".$api_call."?api_key=".$api_key.$params;
   
   // on contrôle si la même requête n'a pas déjà été executée depuis 15 minutes
   if ((loadVariable('last_response_success_'.$api_call) + 15*60) > time())
      // on est au delà des 15 minutes alors on envoi la requête au serveur distant et on stocke dans le cache
      {   
         $response = httpQuery($url);
         saveVariable('cached_response_'.$api_call, $response);
         saveVariable('last_response_success_'.$api_call, time());
   }
   // on est inférieur à 15 minutes alors on utilise le cache
   else {$response = loadVariable('cached_response_'.$api_call);}
   return $response;
}

/** ****************************************************************************
* Fin du script, affichage du résultat au format XML
*/
sdk_header('text/xml');
echo jsonToXML($response);
?>
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 07 Oct 2021 15:26

bonjour, puisque je suis dans les syntaxes

y a t il un moyen dans xpath de récupérer la dernière instance d'une array et pas la 1ère, sachant que je ne sais pas combien il va y en avoir.
exemple : dans ce xml
Code : Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1"?>
<root><cached>1</cached><powerDetails><timeUnit>QUARTER_OF_AN_HOUR</timeUnit>
<unit>W</unit>
<meters><meters><type>Purchased</type>
<values><meters><date>2021-10-07 12:45:00</date>
<value>832.8265</value>
</meters>
<meters><date>2021-10-07 13:00:00</date>
<value>0</value>
</meters>
</values>
</meters>
.....


je souhaite prendre la dernière valeur de value (celle à 13:00:00) et pas la première comme c'est le cas avec la syntaxe : //meters[type='Purchased']/values/meters/value

comme je l'ai dit je ne sais si je vais avoir 1 seule instance de value ou 2 ou même 3.
un truc du style //meters[type='Purchased']/values/meters/value[last]

si je ne peux pas il va falloir que je décortique ça dans le php, mais pour plein de raison, je ne souhaitais pas le faire, la 1ère était que je souhaitais garder les valeurs de retour jsontoxml intouchées pour pouvoir les exploiter de plusieurs manières avec les équipements associés.

merci
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar opa95 » 07 Oct 2021 16:25

Bonjour jluc
Essaie plutôt cela:
//meters[type='Purchased']/values/meters[last()]/value
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 731
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar jluc2808 » 07 Oct 2021 19:01

opa95 a écrit:Bonjour jluc
Essaie plutôt cela:
//meters[type='Purchased']/values/meters[last()]/value

génial ça fonctionne au poil
merci bien
jluc2808
 
Messages : 495
Inscription : 30 Jan 2021

Re: syntaxe pour récupérer le contenu xml en xpath

Messagepar thrymartin » 07 Oct 2021 19:21

yep, faut pas mettre ton last avec value, puisque le meters qui vient avant serait le premier s'il n'est pas identifié: il n'y a qu'une seul value après, donc le last() serait celle ci

comme c'est après la date ce qui t'importe, c'est le meters juste avant dont tu veux la dernière occurence, donc bien comme te le donne opa95

mais avec un exemple de xml fonctionnel évidemment, et sépare donc tes balises pour le rendre lisible et ça te facilitera largement tes recherches de syntaxe.
Ton exemple n'est pas exploitable, reprend ton xml de base et SI les balises de date puis value sont du type (inséré dans ton exemple, au lieu d'une série, ici 3)

Code : Tout sélectionner
<root>
   <energyDetails>
      <timeUnit>DAY</timeUnit>
      <unit>Wh</unit>
      <meters>
         <meters>
            <type>Production</type>
            <values>
               <meters>
                  <date>2021-10-04 00:00:00</date>
                  <value>503</value>
               </meters>
            </values>
         </meters>
            <meters><type>SelfConsumption</type>
            <values><meters><date>2021-10-04 00:00:00</date>
            <value>497</value>
            </meters>
            </values>
            </meters>
            <meters><type>Purchased</type>
            <values>


<meters>
<date>2021-10-04 00:00:00</date>
<value>9789</value>
</meters>

<meters><date>2021-10-04 00:00:01</date>
<value>9790</value>
</meters>

<meters><date>2021-10-04 00:00:02</date>
<value>9791</value>
</meters>


            </values>
            </meters>
            <meters><type>FeedIn</type>
            <values><meters><date>2021-10-04 00:00:00</date>
            <value>6</value>
            </meters>
            </values>
            </meters>
            <meters><type>Consumption</type>
            <values><meters><date>2021-10-04 00:00:00</date>
            <value>10286</value>
            </meters>
            </values>
         </meters>
      </meters>
   </energyDetails>
</root>


alors ça fonctionnera : (pour Purchased) le premier par défaut,
...meters[1]/value ou simplement ...meters/value
le dernier avec last
...meters[last()]/value
le deuxième
...meters[2]/value
thrymartin
 
Messages : 922
Inscription : 03 Mars 2019
Localisation : La Réunion


Retour vers Règles et programmations

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 49 invité(s)