Forum eedomus
https://forum.eedomus.com/

MPVSUN
https://forum.eedomus.com/viewtopic.php?f=23&t=11776
Page 1 sur 4  Suivant »
Auteur:  flc85 [ 02 Fév 2023 18:02 ]
Sujet du message:  MPVSUN

Bonjour,
Je ne trouve pas la solution pour séléctionner une valeur dans une section
Code : Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1"?><xml>
<rtcc>17:43:22 JE</rtcc>
<paramSys>17:43:22;02/02/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00</paramSys>
<inAns>244,5;-23,5; 0; 0;220,0;0,0;0,0;0,0;20;20;20;20;20;20;20;20;</inAns><survMm>0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</survMm><cmdPos>0;0;0;0;0;0;0;0;</cmdPos><outStat>0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</outStat>
<cptVals>d80a;ffffffe9;ffff7623;ff445673;0;0;0;0;</cptVals>
<chOutVal>0;0;0;ff;:0,0;0,0;0,0;0,0;</chOutVal></xml>

je souhaite pouvoir extraire la 2ème valeurs de la section inAns, j'ai essayé /xml/inAns[2] mais cela ne fonctionne pas une idée??
Auteur:  opa95 [ 02 Fév 2023 19:05 ]
Sujet du message:  Re: Problème xpath

Bonjour flc85
flc85 a écrit:Bonjour,
Je ne trouve pas la solution pour séléctionner une valeur dans une section
Code : Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1"?><xml>
<rtcc>17:43:22 JE</rtcc>
<paramSys>17:43:22;02/02/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00</paramSys>
<inAns>244,5;-23,5; 0; 0;220,0;0,0;0,0;0,0;20;20;20;20;20;20;20;20;</inAns><survMm>0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</survMm><cmdPos>0;0;0;0;0;0;0;0;</cmdPos><outStat>0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</outStat>
<cptVals>d80a;ffffffe9;ffff7623;ff445673;0;0;0;0;</cptVals>
<chOutVal>0;0;0;ff;:0,0;0,0;0,0;0,0;</chOutVal></xml>

je souhaite pouvoir extraire la 2ème valeurs de la section inAns, j'ai essayé /xml/inAns[2] mais cela ne fonctionne pas une idée??

Ce n'est peut-être pas le plus simple, mais ça marche
substring-before(substring-after(//inAns,';'),';')
:)
Auteur:  flc85 [ 03 Fév 2023 07:37 ]
Sujet du message:  Re: Problème xpath

Oui ça fonctionne, merci, il n'y a pas plus simple? Le 2ème c'était un exemple mais c'est pas gagné pour extraire toutes les valeurs
Auteur:  merguez07 [ 03 Fév 2023 08:37 ]
Sujet du message:  Re: Problème xpath

Helas, le xpath n'offre pas beaucoup de possibilités avec la présentation de ce type d'xml.

L'idéal et de reformatter avec un script le xml pour faciliter l'extraction des valeurs.

Sans script, il n'y a que des formules tarasbicottées comme le propose OPA95 qui peuvent fonctionner
Auteur:  opa95 [ 03 Fév 2023 09:48 ]
Sujet du message:  Re: Problème xpath

Bonjour flc85
merguez07 a écrit:Helas, le xpath n'offre pas beaucoup de possibilités avec la présentation de ce type d'xml.

L'idéal et de reformatter avec un script le xml pour faciliter l'extraction des valeurs.

Sans script, il n'y a que des formules tarasbicottées comme le propose OPA95 qui peuvent fonctionner

Merguez07 (salut à toi) a raison.
Il n'est pas difficile de faire un script pour récupérer les données, mais il faudrait savoir à quoi correspondent tes données, lesquelles t'intéressent et ce que tu veux en faire; y a-t-il toujours autant de valeurs?
Bref quelques détails complémentaires, ensuite c'est moins d'une heure pour obtenir quelque chose d'utilisable.
:)
Auteur:  opa95 [ 03 Fév 2023 11:09 ]
Sujet du message:  Re: Problème xpath

Bonjour
C'est résolu, si tu me donnes les infos complémentaires.
En supposant que le XPATH de ton device actuel soit
Code : Tout sélectionner
concat('rtcc=',//rtcc,'@paramSys=',//paramSys,'@inAns=',//inAns)

ou ce que tu veux d'équivalent
ou que tu as le lien http qui te renvoie le fichier xml
Tu crée un device http et tu mets dans VAR1 le,code api du premier device et tu lance un script adapté de celui qui suit
Code : Tout sélectionner
<?php

// V1.0 : opa95 2023-02-03

//$periphs  = getArg('periphId');
//$response = getValue($periphId,$text = false);
//$response = 'rtcc=17:43:22 JE@paramSys=17:43:22;02/02/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00@inAns=244,5;-23,5; 0; 0;220,0;0,0;0,0;0,0;20;20;20;20;20;20;20;20';
$response = str_replace(',','.',$response);
$arr_response = explode('@',$response);
foreach ($arr_response as $field) {
  list($key,$values) = explode('=',$field);
  $arrValue = array();
  $arr_values = explode(';',$values);
  foreach ($arr_values as $value){
    $result[$key][] = $value;
  }
}

//var_dump($result);
$xml = '<inAns ';
foreach ($result['inAns'] as $key => $value){
  $xml .= 'v'.$key.'="'.$value.'" ';
}
$xml .= '/>';
echo $xml;
?>

Ca donne
Code : Tout sélectionner
array(3) {
  ["rtcc"]=>
  array(1) {
    [0]=>
    string(11) "17:43:22 JE"
  }
  ["paramSys"]=>
  array(12) {
    [0]=>
    string(8) "17:43:22"
    [1]=>
    string(10) "02/02/2023"
    [2]=>
    string(2) "On"
    [3]=>
    string(5) "01:00"
    [4]=>
    string(3) "0.0"
    [5]=>
    string(8) "MS_PV2_2"
    [6]=>
    string(5) "5.0.1"
    [7]=>
    string(7) "0000220"
    [8]=>
    string(4) "102e"
    [9]=>
    string(4) "102c"
    [10]=>
    string(5) "00:00"
    [11]=>
    string(5) "00:00"
  }
  ["inAns"]=>
  array(16) {
    [0]=>
    string(5) "244.5"
    [1]=>
    string(5) "-23.5"
    [2]=>
    string(2) " 0"
    [3]=>
    string(2) " 0"
    [4]=>
    string(5) "220.0"
    [5]=>
    string(3) "0.0"
    [6]=>
    string(3) "0.0"
    [7]=>
    string(3) "0.0"
    [8]=>
    string(2) "20"
    [9]=>
    string(2) "20"
    [10]=>
    string(2) "20"
    [11]=>
    string(2) "20"
    [12]=>
    string(2) "20"
    [13]=>
    string(2) "20"
    [14]=>
    string(2) "20"
    [15]=>
    string(2) "20"
  }
}

Il n'y a plus qu'à fabriquer le XML qui t'intéresse, par exemple
Code : Tout sélectionner
<inAns v0="244.5" v1="-23.5" v2=" 0" v3=" 0" v4="220.0" v5="0.0" v6="0.0" v7="0.0" v8="20" v9="20" v10="20" v11="20" v12="20" v13="20" v14="20" v15="20" />

et demander //inAns/@v1 pour obtenir -23.5
Auteur:  flc85 [ 03 Fév 2023 11:31 ]
Sujet du message:  Re: Problème xpath

Merci je regarde ça cet après midi et je te tiens au courant
Auteur:  opa95 [ 03 Fév 2023 12:06 ]
Sujet du message:  Re: Problème xpath

OK
flc85 a écrit:Merci je regarde ça cet après midi et je te tiens au courant

en mettant dans le XPATH
Code : Tout sélectionner
concat('rtcc=',//rtcc,'@paramSys=',//paramSys,'@inAns=',//inAns,'@survMm=',//survMm,'@cmdPos=',//cmdPos,'@outStat=',//outStat,'@cptVals=',//cptVals,'@chOutVal=',//chOutVal)

on peur obtenir avec le script
Code : Tout sélectionner
 :)
<?xml version="1.0" encoding="UTF-8"?>
 <root>
   <rtcc v0="17:43:22 JE" />
   <paramSys v0="17:43:22" v1="02/02/2023" v2="On" v3="01:00" v4="0.0" v5="MS_PV2_2" v6="5.0.1" v7="0000220" v8="102e" v9="102c" v10="00:00" v11="00:00" />
   <inAns v0="244.5" v1="-23.5" v2=" 0" v3=" 0" v4="220.0" v5="0.0" v6="0.0" v7="0.0" v8="20" v9="20" v10="20" v11="20" v12="20" v13="20" v14="20" v15="20" />
   <survMm v0="0" v1="0" v2="0" v3="0" v4="0" v5="0" v6="0" v7="0" v8="0" v9="0" v10="0" v11="0" v12="0" v13="0" v14="0" v15="0" />
   <cmdPos v0="0" v1="0" v2="0" v3="0" v4="0" v5="0" v6="0" v7="0" />
   <outStat v0="0" v1="0" v2="0" v3="0" v4="0" v5="0" v6="0" v7="0" v8="0" v9="0" v10="0" v11="0" v12="0" v13="0" v14="0" v15="0" />
   <cptVals v0="d80a" v1="ffffffe9" v2="ffff7623" v3="ff445673" v4="0" v5="0" v6="0" v7="0" />
   <chOutVal v0="0" v1="0" v2="0" v3="ff" v4=":0.0" v5="0.0" v6="0.0" v7="0.0" />
 <root/>

et donc récupérer n'importe quelle info par //champ/@vi
Auteur:  flc85 [ 03 Fév 2023 15:36 ]
Sujet du message:  Re: Problème xpath

Le but est d'obtenir les infos d'un optimiseur solaire qui génère un fichier xml à l'adresse suivante 192.168.1.247/status.xml les infos qui m'intéresse le plus sont les 5 premières valeurs de inans.
1-puissance consommée
2-puissance produite
3-% routage 1
4-% routage 2
5-Tension réseau
J'avoue être perdu avec toutes les infos que tu me donnes

Voici le fichier status.xml
Code : Tout sélectionner
<xml>
<rtcc>15:58:45 VE</rtcc>
<paramSys>
15:58:45;03/02/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00
</paramSys>
<inAns>
0,1;-565,3;25; 0;227,1;0,0;0,0;0,0; 0; 0; 0; 0; 0; 0; 0; 0;
</inAns>
<survMm>0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</survMm>
<cmdPos>0;0;0;0;0;0;0;0;</cmdPos>
<outStat>6;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</outStat>
<cptVals>10bee;ffffffec;ffffa2f3;ff43f90a;0;0;0;0;</cptVals>
<chOutVal>0;0;0;ff;:0,0;0,0;0,0;0,0;</chOutVal>
</xml>
Auteur:  opa95 [ 03 Fév 2023 17:33 ]
Sujet du message:  Re: Problème xpath

Bonjour flc85
flc85 a écrit:Le but est d'obtenir les infos d'un optimiseur solaire qui génère un fichier xml à l'adresse suivante 192.168.1.247/status.xml les infos qui m'intéresse le plus sont les 5 premières valeurs de inans.
1-puissance consommée
2-puissance produite
3-% routage 1
4-% routage 2
5-Tension réseau
J'avoue être perdu avec toutes les infos que tu me donnes

Y a-t-il moyen de récupérer le fichier json plutôt que le fichier XML? peut-être avec une indication de format dans la commande 192.168.1.247/status.xml
:)
Auteur:  flc85 [ 03 Fév 2023 17:41 ]
Sujet du message:  Re: Problème xpath

Je ne pense pas, mais je vais aller voir sur le forum de msunpv
Auteur:  flc85 [ 03 Fév 2023 18:03 ]
Sujet du message:  Re: Problème xpath

Je n'ai rien trouvé concernant json, il y a bien un script mais pour jeedom, il ne fonctionne pas à cause de fonctions non autorisés sur eedomus
Auteur:  opa95 [ 03 Fév 2023 18:17 ]
Sujet du message:  Re: Problème xpath

Bonjour flc85
flc85 a écrit:Le but est d'obtenir les infos d'un optimiseur solaire qui génère un fichier xml à l'adresse suivante 192.168.1.247/status.xml les infos qui m'intéresse le plus sont les 5 premières valeurs de inans.
1-puissance consommée
2-puissance produite
3-% routage 1
4-% routage 2
5-Tension réseau
J'avoue être perdu avec toutes les infos que tu me donnes

Pas de problème
Tu sauves le script joint plus bas sur ton disque : solaire.php (par exemple)
Tu crée un capteur http "configuration" "Ajouter ou supprimer un périphérique" "Ajouter un autre type de périphérique" "HTTP Capteur" (réseau) "Créer"
Tu complètes comme sur l'image jointe (n'oublie pas la pièce).
Solaire.png
Solaire.png (34.43 Kio) Consulté 4322 fois

Ensuite tu cliques sur "sauver puis continuer à éditer".
Tu cliques sur "script", puis tout en bas sur "parcourir" et tu sélectionne solaire.php puis "ouvrir" et enfin "envoyer".
Si on te dit de te connecter sur le site de secours, tu acceptes et tu recommences l'opération depuis le page script.
Tu remets le lien dans URL de la Requête.
Ensuite tu cliques sur "sauver puis continuer à éditer" et tu cliques sur "tester".
Dans la fenêtre de test, tu cliques encore sur "tester" et tu vérifies que ça fonctionne.
Ensuite, tu reviens sur la fenêtre de ton périphérique et tu cliques sur "dupliquer", tu changes le nom, les unités éventuellement et le XPATH tu peux aussi lier le nouveau périphérique au premier ("Paramètres expert" "rattacher à")
et tu refais la même chose pour tous tes périphs.
Normalement, tout doit marcher
:)
Code : Tout sélectionner
<?php
// optimisateur de production solaire
// V1.0 : opa95 2023-02-03
//Récupération des valeurs par //champ/@vi
$url  = getArg('url');
$url  = $url.'/sensors.xml';
$response = httpQuery($url, 'GET', '','', $header);
/*
$response = '<xml>
<rtcc>15:58:45 VE</rtcc>
<paramSys>
15:58:45;03/02/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00
</paramSys>
<inAns>
0,1;-565,3;25; 0;227,1;0,0;0,0;0,0; 0; 0; 0; 0; 0; 0; 0; 0;
</inAns>
<survMm>0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</survMm>
<cmdPos>0;0;0;0;0;0;0;0;</cmdPos>
<outStat>6;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</outStat>
<cptVals>10bee;ffffffec;ffffa2f3;ff43f90a;0;0;0;0;</cptVals>
<chOutVal>0;0;0;ff;:0,0;0,0;0,0;0,0;</chOutVal>
</xml>';
*/
$response = xpath($response,"concat('rtcc=',//rtcc,'@paramSys=',//paramSys,'@inAns=',//inAns,'@survMm=',//survMm,'@cmdPos=',//cmdPos,'@outStat=',//outStat,'@cptVals=',//cptVals,'@chOutVal=',//chOutVal)");
$response = trim(str_replace(';@','@',$response));
$response = str_replace(',','.',$response);
$arr_response = explode('@',$response);
foreach ($arr_response as $field) {
  list($key,$values) = explode('=',$field);
  $arrValue = array();
  $arr_values = explode(';',$values);
  foreach ($arr_values as $value){
    if ($value != '') $result[$key][] = trim($value);
  }
}
@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= ' <root>'.PHP_EOL;
  $key = 'inAns';
  $xml .= '   <current>'.PHP_EOL; 
  $xml .= '     <conso>'.$result[$key][0].'</conso> ';
  $xml .= '<production>'.$result[$key][1].'</production> ';
  $xml .= '<routage_1>'.$result[$key][2].'</routage_1> ';
  $xml .= '<routage_2>'.$result[$key][3].'</routage_2> ';
  $xml .= '<tension>'.$result[$key][4].'</tension> ';
  $xml .= PHP_EOL.'   </current>'.PHP_EOL;
foreach ($result as $key => $value){
    $xml .= '   <'.$key.' ';
    foreach ($result[$key] as $key1 => $value1){
      $xml .= 'v'.$key1.'="'.$value1.'" ';
    }
    $xml .= '/>'.PHP_EOL;
  }
$xml .= ' </root>'.PHP_EOL;
echo $xml;
?>
Auteur:  flc85 [ 03 Fév 2023 18:34 ]
Sujet du message:  Re: Problème xpath

quand je fais tester j'ai une fenêtre qui s'ouvre mais l'URL est différente avec &eedomus_controller_module_id=2956267 en plus
http://localhost/script/?exec=MSUNPV.ph ... id=2956267
Auteur:  opa95 [ 03 Fév 2023 18:40 ]
Sujet du message:  Re: Problème xpath

C(est bon
flc85 a écrit:Je n'ai rien trouvé concernant json, il y a bien un script mais pour jeedom, il ne fonctionne pas à cause de fonctions non autorisés sur eedomus

Je suis reparti du XML :)
Auteur:  flc85 [ 04 Fév 2023 07:50 ]
Sujet du message:  Re: Problème xpath

Ça ne fonctionne pas j'ai une erreur:
Code : Tout sélectionner
<b> Error: </b> Por favor, especifique el valor del argumento <b>url</b>  para llamar a<a href='/script/editor/?src=MSUNPV.php' target='_blank'>este script <img src='/img/Pencil.png' align='absmiddle' alt='Editer' width='16' height='16' /></a>.<br><br>Ejemplo: <i>http://localhost/script/?exec=MSUNPV.php&adresse=192.168.1.247&eedomus_controller_module_id=2956267&<b>url=xxx</b></i>


J'ai du modifié la ligne 5 et 6 pour ne plus avoir d'erreur et que cela fonctionne
Code : Tout sélectionner
$url  = "192.168.1.247";

Code : Tout sélectionner
$url  = $url.'/status.xml';
Auteur:  opa95 [ 04 Fév 2023 08:37 ]
Sujet du message:  Re: Problème xpath

Bonjour flc85
Désolé :(
En fait l'erreur était dans la ligne de commande :
incohérence entre le script qui attend "url" et la commande qui en voie "adresse".
Je n'avais testé que depuis la fenêtre de test.
Les lignes peuvent être maintenues à
$url = getArg('url');
$url = $url.'/sensors.xml';
si la commande est
&url=192.168.1.247 au lieu de &commande=192.168.1.247
ou alors changer
$url = getArg('url'); en $url = getArg('commande');
Est-ce que ça marche maintenant?
:)
Auteur:  flc85 [ 04 Fév 2023 08:45 ]
Sujet du message:  Re: Problème xpath

Super ça fonctionne, merci énormément pour ton aide
Auteur:  flc85 [ 04 Fév 2023 09:12 ]
Sujet du message:  Re: Problème xpath

Tu peux le mettre sur le store comme module de connexion au routeur solaire MSUNPV?
La problématique était de pouvoir consulter les données du routeur sans avoir à ouvrir les ports vers l'extérieur car ce il n'est pas sécurisé.
Auteur:  opa95 [ 04 Fév 2023 09:14 ]
Sujet du message:  Re: Problème xpath

Bonjour
Pas de problème.
Donc pour d'autres utilisateurs éventuels, au final on obtient
Sauver le script sous le nom MSUNPV.php
Créer les devices selon le modèle suivant (capteurs HTTP)
MSUNPV.png
MSUNPV.png (34.97 Kio) Consulté 4288 fois

Script
Code : Tout sélectionner
<?php
// optimisateur de production solaire MSUNPV.php
// V1.0 : opa95 2023-02-03
//ligne decommande http://localhost/script/?exec=MSUNPV.php&adresse=192.168.1.247
//Récupération des valeurs par //champ/@vi
$url  = getArg('url');
$url  = $url.'/sensors.xml';
$response = httpQuery($url, 'GET', '','', $header);
/*
$response = '<xml>
<rtcc>15:58:45 VE</rtcc>
<paramSys>
15:58:45;03/02/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00
</paramSys>
<inAns>
0,1;-565,3;25; 0;227,1;0,0;0,0;0,0; 0; 0; 0; 0; 0; 0; 0; 0;
</inAns>
<survMm>0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</survMm>
<cmdPos>0;0;0;0;0;0;0;0;</cmdPos>
<outStat>6;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;</outStat>
<cptVals>10bee;ffffffec;ffffa2f3;ff43f90a;0;0;0;0;</cptVals>
<chOutVal>0;0;0;ff;:0,0;0,0;0,0;0,0;</chOutVal>
</xml>';
*/
$response = xpath($response,"concat('rtcc=',//rtcc,'@paramSys=',//paramSys,'@inAns=',//inAns,'@survMm=',//survMm,'@cmdPos=',//cmdPos,'@outStat=',//outStat,'@cptVals=',//cptVals,'@chOutVal=',//chOutVal)");
$response = trim(str_replace(';@','@',$response));
$response = str_replace(',','.',$response);
$arr_response = explode('@',$response);
foreach ($arr_response as $field) {
  list($key,$values) = explode('=',$field);
  $arrValue = array();
  $arr_values = explode(';',$values);
  foreach ($arr_values as $value){
    if ($value != '') $result[$key][] = trim($value);
  }
}
@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= ' <root>'.PHP_EOL;
  $key = 'inAns';
  $xml .= '   <current>'.PHP_EOL; 
  $xml .= '     <conso>'.$result[$key][0].'</conso> ';
  $xml .= '<production>'.$result[$key][1].'</production> ';
  $xml .= '<routage_1>'.$result[$key][2].'</routage_1> ';
  $xml .= '<routage_2>'.$result[$key][3].'</routage_2> ';
  $xml .= '<tension>'.$result[$key][4].'</tension> ';
  $xml .= PHP_EOL.'   </current>'.PHP_EOL;
foreach ($result as $key => $value){
    $xml .= '   <'.$key.' ';
    foreach ($result[$key] as $key1 => $value1){
      $xml .= 'v'.$key1.'="'.$value1.'" ';
    }
    $xml .= '/>'.PHP_EOL;
  }
$xml .= ' </root>'.PHP_EOL;
echo $xml;
?>
 :)
Page 1 sur 4 Le fuseau horaire est UTC+1 heure