IPX800V3 sans plugin, problème push

Bonsoir,

J’ai mis en place la solution de Seb82 pour la récupération des états de mes IPX800V3 avec succès sur un gros site (8 IPXV3 avec chacun entre 1 et 3 extension X880).
La version jeedom est 3.3.59.
Le firmware de l’IPX est 3.05.42.

Tout fonctionne sauf la récupération des push sur 2 IPX.

J’ai tout contrôlé mais je n’arrive pas à trouver d’où vient le problème, lorsque le scénario reçoit un push de la part de l’IPX associé, les entrées digitales du virtuel associé passent toutes à 0 alors que les logs du scénario sont correct.

Voici un extrait du virtuel:

Le scénario associé:

ttre à jour un objet virtuel représentant l'IPX800 de deux manières :
- Soit par lecture du fichier globalstatus.xml sur l'IPX
- Soit par lancement par le push de l'IPX de ce scénario en transmettant un tag nommé push (permet d'avoir un retour immédiat)

Plus d'informations ici : https://www.jeedom.com/forum/viewtopic.php?f=133&t=47112

*/

/* Configuration */

$IP_IPX800 = "192.168.60.206";	  // Changer par l'IP de l'IPX800
$PORT_IPX800 = "80"; 		  // Port de l'IPX800 si modifié, sinon laisser 80
$IDENTIFIANT = "";			  // Identifiant s'il y a en a un, sinon vide
$MOT_DE_PASSE = "";			  // Mot de passe s'il y a en a un, sinon vide

/* Pour le push, dans la configuration de l'IPX aller dans M2M > Push, mettre l'IP de Jeedom dans Server et dans Path mettre /core/api/jeeApi.php?apikey=CLE_API&type=scenario&id=XX&action=start&tags=push%3De$O$I
 CLE_API est à remplacer par le clé API de Jeedom (roue crantée en haut à droite > Configuration > API > Clef API )
 XX est à remplacer par l'ID de ce scénario
 $O contient l'état des 32 relais (8 de l'IPX800 et les éventuelles extensions)
 $I contient l'état des 32 entrées digitales (8 de l'IPX800 et les éventuelles extensions)
*/

// On récupère les tags du scénario
$tags = $scenario->getTags();
// On extrait l'éventuel tag push
$push = $tags['#push#'];

// S'il n'y a pas de tag "push", on lit le fichier xml de l'IPX800

if (!$push) {
  
  $scenario->setLog("Pas de tag push, lecture du fichier globalstatus.xml sur l'IPX800");

  // Url du fichier globalstatus.xml de l'IPX800
  $Url = "http://".(($IDENTIFIANT == "")?"":($IDENTIFIANT.":".$MOT_DE_PASSE."@")).$IP_IPX800.":".$PORT_IPX800."/globalstatus.xml";
  $scenario->setLog("Url du fichier : ".$Url);

  // Récupération du fichier avec curl
  $InitPage = curl_init();
  curl_setopt($InitPage, CURLOPT_URL, $Url);
  curl_setopt($InitPage, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($InitPage, CURLOPT_USERAGENT, 'Jeedom');
  $resultat = curl_exec ($InitPage);
  $scenario->setLog($resultat); // Décommenter cette ligne pour vérifier dans le log du scénario le contenu récupéré 
  $response_code = curl_getinfo($InitPage,CURLINFO_RESPONSE_CODE); // Récupération du statut de réponse de la requête http
  curl_close($InitPage);
  
  if ($response_code == 200) { // Vérifie si la récupération s'est bien passée
    
    // Conversion du XML en objet PHP 
    $xml = simplexml_load_string($resultat);
    
    // Extraction de la version pour voir si le fichier est valide
    $version = (string)$xml->version;
    $scenario->setLog("Version : ".$version);
    
	if ($version == "") {
      $scenario->setLog("Fichier globalstatus.xml non valide");
      log::add('ipx800','error',"Fichier globalstatus.xml non valide");
    } else {

      // Extraction des valeurs analogiques depuis XML
      //$scenario->setLog("Mise à jour des valeurs analogiques depuis XML");
      //cmd::byString("#[IPX800][IPX800_virtuel][AN1]#")->event((string)$xml->analog0);
      //cmd::byString("#[IPX800][IPX800_virtuel][AN2]#")->event((string)$xml->analog1);
      //cmd::byString("#[IPX800][IPX800_virtuel][AN3]#")->event((string)$xml->analog2);
      //cmd::byString("#[IPX800][IPX800_virtuel][AN4]#")->event((string)$xml->analog3);

      // Extraction des compteurs depuis XML
      //$scenario->setLog("Mise à jour des compteurs depuis XML");
      //cmd::byString("#[IPX800][IPX800_virtuel][C1]#")->event((string)$xml->count0);
      //cmd::byString("#[IPX800][IPX800_virtuel][C2]#")->event((string)$xml->count1);
      //cmd::byString("#[IPX800][IPX800_virtuel][C3]#")->event((string)$xml->count2);
      //cmd::byString("#[IPX800][IPX800_virtuel][C4]#")->event((string)$xml->count3);

      // Extraction des états des relais depuis XML
      $scenario->setLog("Mise à jour de l'état des relais depuis XML");
      cmd::byString("#[IPX800][IPX800_R+1][R1 Commande Ch 101]#")->event((string)$xml->led0);
      cmd::byString("#[IPX800][IPX800_R+1][R2 Commande Ch 102]#")->event((string)$xml->led1);
      cmd::byString("#[IPX800][IPX800_R+1][R3 Commande Ch 103]#")->event((string)$xml->led2);
      cmd::byString("#[IPX800][IPX800_R+1][R4 Commande Ch 104]#")->event((string)$xml->led3);
      cmd::byString("#[IPX800][IPX800_R+1][R5 Commande Ch 105]#")->event((string)$xml->led4);
      cmd::byString("#[IPX800][IPX800_R+1][R6 Commande Ch 106]#")->event((string)$xml->led5);
      cmd::byString("#[IPX800][IPX800_R+1][R7 Commande Ch 107]#")->event((string)$xml->led6);
      cmd::byString("#[IPX800][IPX800_R+1][R8 Commande Ch 108]#")->event((string)$xml->led7);
      cmd::byString("#[IPX800][IPX800_R+1][R9 Commande Ch 109]#")->event((string)$xml->led8);
      cmd::byString("#[IPX800][IPX800_R+1][R10 Commande Ch 110111]#")->event((string)$xml->led9);
      cmd::byString("#[IPX800][IPX800_R+1][R12 occupation Ch 111]#")->event((string)$xml->led11);

      // Extraction des entrées digitales depuis XML
      $scenario->setLog("Mise à jour des entrées digitales depuis XML");
      cmd::byString("#[IPX800][IPX800_R+1][I1 occupation Ch 101]#")->event(((string)$xml->btn0=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I2 occupation Ch 102]#")->event(((string)$xml->btn1=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I3 occupation Ch 103]#")->event(((string)$xml->btn2=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I4 occupation Ch 104]#")->event(((string)$xml->btn3=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I5 occupation Ch 105]#")->event(((string)$xml->btn4=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I6 occupation Ch 106]#")->event(((string)$xml->btn5=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I7 occupation Ch 107]#")->event(((string)$xml->btn6=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I8 occupation Ch 108]#")->event(((string)$xml->btn7=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I9 occupation Ch 109]#")->event(((string)$xml->btn8=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I10 occupation Ch 110]#")->event(((string)$xml->btn9=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I11 SD ch 101]#")->event(((string)$xml->btn10=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I12 SD Ch 102]#")->event(((string)$xml->btn11=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I13 SD Ch 103]#")->event(((string)$xml->btn12=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I14 Sd Ch 104]#")->event(((string)$xml->btn13=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I15 SD Ch 105]#")->event(((string)$xml->btn14=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I16 SD Ch 106]#")->event(((string)$xml->btn15=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I17 SD Ch 107]#")->event(((string)$xml->btn16=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I18 SD Ch 108]#")->event(((string)$xml->btn17=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I19 SD Ch 109]#")->event(((string)$xml->btn18=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I20 SD Ch 110111]#")->event(((string)$xml->btn19=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I21 CCF 7]#")->event(((string)$xml->btn20=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I22 CCF 8]#")->event(((string)$xml->btn21=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I23 CCF 9]#")->event(((string)$xml->btn22=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I24 CCF 10]#")->event(((string)$xml->btn23=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I25 CCF 11]#")->event(((string)$xml->btn24=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I26 CCF 12]#")->event(((string)$xml->btn25=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I27 CCF 13]#")->event(((string)$xml->btn26=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I28 CCF 14]#")->event(((string)$xml->btn27=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I29 CCF 15]#")->event(((string)$xml->btn28=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I30 CCF 16]#")->event(((string)$xml->btn29=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I31 SD divers]#")->event(((string)$xml->btn30=="up")?0:1);
      cmd::byString("#[IPX800][IPX800_R+1][I32 SD ventil]#")->event(((string)$xml->btn31=="up")?0:1);
    }
    
  } else {
    $scenario->setLog("Erreur lors de la récupération du fichier globalstatus.xml");
    log::add('ipx800','error',"Erreur lors de la récupération du fichier globalstatus.xml");
  }

} else {
  
  $scenario->setLog("Tag push détecté, information reçue : ".$push);
  
  if (substr($push,0,1) == 'e') {  // On vérifie que le tag push commence par un 'e' pour être sûr d'avoir une bonne information 
    
    // Extraction des états des relais depuis tag push - 
    $scenario->setLog("Mise à jour de l'état des relais depuis tag");
    cmd::byString("#[IPX800][IPX800_R+1][R1 Commande Ch 101]#")->event(substr($push,1,1));
    cmd::byString("#[IPX800][IPX800_R+1][R2 Commande Ch 102]#")->event(substr($push,2,1));
    cmd::byString("#[IPX800][IPX800_R+1][R3 Commande Ch 103]#")->event(substr($push,3,1));
    cmd::byString("#[IPX800][IPX800_R+1][R4 Commande Ch 104]#")->event(substr($push,4,1));
    cmd::byString("#[IPX800][IPX800_R+1][R5 Commande Ch 105]#")->event(substr($push,5,1));
    cmd::byString("#[IPX800][IPX800_R+1][R6 Commande Ch 106]#")->event(substr($push,6,1));
    cmd::byString("#[IPX800][IPX800_R+1][R7 Commande Ch 107]#")->event(substr($push,7,1));
    cmd::byString("#[IPX800][IPX800_R+1][R8 Commande Ch 108]#")->event(substr($push,8,1));
    cmd::byString("#[IPX800][IPX800_R+1][R9 Commande Ch 109]#")->event(substr($push,9,1));
    cmd::byString("#[IPX800][IPX800_R+1][R10 Commande Ch 110111]#")->event(substr($push,10,1));
    cmd::byString("#[IPX800][IPX800_R+1][R12 occupation Ch 111]#")->event(substr($push,12,1));

    // Extraction des entrées digitales depuis tag push
    $scenario->setLog("Mise à jour des entrées digitales depuis tag");
    cmd::byString("#[IPX800][IPX800_R+1][I1 occupation Ch 101]#")->event(substr($push,32+1,1));
    cmd::byString("#[IPX800][IPX800_R+1][I2 occupation Ch 102]#")->event(substr($push,32+2,1));
    cmd::byString("#[IPX800][IPX800_R+1][I3 occupation Ch 103]#")->event(substr($push,32+3,1));
    cmd::byString("#[IPX800][IPX800_R+1][I4 occupation Ch 104]#")->event(substr($push,32+4,1));
    cmd::byString("#[IPX800][IPX800_R+1][I5 occupation Ch 105]#")->event(substr($push,32+5,1));
    cmd::byString("#[IPX800][IPX800_R+1][I6 occupation Ch 106]#")->event(substr($push,32+6,1));
    cmd::byString("#[IPX800][IPX800_R+1][I7 occupation Ch 107]#")->event(substr($push,32+7,1));
    cmd::byString("#[IPX800][IPX800_R+1][I8 occupation Ch 108]#")->event(substr($push,32+8,1));
    cmd::byString("#[IPX800][IPX800_R+1][I9 occupation Ch 109]#")->event(substr($push,32+9,1));
    cmd::byString("#[IPX800][IPX800_R+1][I10 occupation Ch 110]#")->event(substr($push,32+10,1));
    cmd::byString("#[IPX800][IPX800_R+1][I11 SD ch 101]#")->event(substr($push,32+11,1));
    cmd::byString("#[IPX800][IPX800_R+1][I12 SD Ch 102]#")->event(substr($push,32+12,1));
    cmd::byString("#[IPX800][IPX800_R+1][I13 SD Ch 103]#")->event(substr($push,32+13,1));
    cmd::byString("#[IPX800][IPX800_R+1][I14 Sd Ch 104]#")->event(substr($push,32+14,1));
    cmd::byString("#[IPX800][IPX800_R+1][I15 SD Ch 105]#")->event(substr($push,32+15,1));
    cmd::byString("#[IPX800][IPX800_R+1][I16 SD Ch 106]#")->event(substr($push,32+16,1));
    cmd::byString("#[IPX800][IPX800_R+1][I17 SD Ch 107]#")->event(substr($push,32+17,1));
    cmd::byString("#[IPX800][IPX800_R+1][I18 SD Ch 108]#")->event(substr($push,32+18,1));
    cmd::byString("#[IPX800][IPX800_R+1][I19 SD Ch 109]#")->event(substr($push,32+19,1));
    cmd::byString("#[IPX800][IPX800_R+1][I20 SD Ch 110111]#")->event(substr($push,32+20,1));
    cmd::byString("#[IPX800][IPX800_R+1][I21 CCF 7]#")->event(substr($push,32+21,1));
    cmd::byString("#[IPX800][IPX800_R+1][I22 CCF 8]#")->event(substr($push,32+22,1));
    cmd::byString("#[IPX800][IPX800_R+1][I23 CCF 9]#")->event(substr($push,32+23,1));
    cmd::byString("#[IPX800][IPX800_R+1][I24 CCF 10]#")->event(substr($push,32+24,1));
    cmd::byString("#[IPX800][IPX800_R+1][I25 CCF 11]#")->event(substr($push,32+25,1));
    cmd::byString("#[IPX800][IPX800_R+1][I26 CCF 12]#")->event(substr($push,32+26,1));
    cmd::byString("#[IPX800][IPX800_R+1][I27 CCF 13]#")->event(substr($push,32+27,1));
    cmd::byString("#[IPX800][IPX800_R+1][I28 CCF 14]#")->event(substr($push,32+28,1));
    cmd::byString("#[IPX800][IPX800_R+1][I29 CCF 15]#")->event(substr($push,32+29,1));
    cmd::byString("#[IPX800][IPX800_R+1][I30 CCF 16]#")->event(substr($push,32+30,1));
    cmd::byString("#[IPX800][IPX800_R+1][I31 SD divers]#")->event(substr($push,32+31,1));
    cmd::byString("#[IPX800][IPX800_R+1][I32 SD ventil]#")->event(substr($push,32+32,1));
    
  }

}

Le push dans la configuration de l’IPX est configuré comme décrit sur le forum

/core/api/jeeApi.php?apikey=CLE_API&type=scenario&id=XX&action=start&tags=push%3De$O$I

Est ce quelqu’un a déjà eu ce problème? J’ai passé tellement de temps à configurer tout ça que je ne sais plus où chercher. Si quelqu’un peut m’aider!

Bonne soirée

Bonjour,

Alors moi j’ai arrêté de travailler avec ce scénario, car j’avais des soucis lors de plusieurs déclenchement en même temps.
j’ai plutôt mis dans l’IPX pour chaque entrée l’URL de push d’un virtuel et ça fonctionne très bien.

Sinon essais de regarder dans le fichier globalstatut de ton IPX vérifier que les entrées bouge bien

http://##IDENTIFIANTIPX##:##PASSWORDIPX##@##IP_IPX800##:##PORTIPX##/globalstatus.xml";

Bonjour,
Le fichier globalstatus est correct, les entrées bougent comme il faut. C’est comme ci le scénario n’arrivait pas à interpréter les entrées digitales… Pour les états des relais il n’y a pas de problème.
Au lancement suivant du scénario, les entrées digitales reprennent leurs états correctement.
Si je ne trouve pas d’ou vient le problème je ferai comme toi, mais avec presque 256 ED, c’est du boulot…

Essai d’enlever les 2 tags $O$I

Salut,
Même approche de mon coté. En version épurée qui fonctionne parfaitement.

  • un script avec des commandes HTTP on / off pour chaque relais, utilisant l’API de l’IPX
  • un virtuel avec l’état des entrées / sorties de l’IPX 800, et des actions on/off pour chaque relais qui utilisent les commandes du script mentionné au dessus
  • et dans l’IPX, des push sur changement sur les états d’entrées / sorties qui utilisent l’url des infos virtuelles dans le virtuel IPX800.
  • toutes mes commandes, scénarios, widgets, etc …de l’IPX dans Jeedom utilisent le virtuel IPX800

C’est parfait, réactif, propre, stable et fiable

hello j’ai le même problème de valuers qui passent toutes à 0 quand l’IPX fait un push. Tu as trouvé une solution?
merci

tu pourrais détailler stp? merci

Salut,
Dans la config de chaque entrée sortie de l’IPX, tu as un lien « Push settings »
C’est là qu’il faut configurer avec qui ton IPX devra communiquer lors d’un changement d’état.
Exemple pour mon Relais 1 de l’IPX:

Et voila dans mon exemple comment est configuré le push :

Dans mon cas, 8060 est l’ID du Relais 1 dans le virtuel representant mon IPX dans Jeedom, qui est mis à 1 ou à 0 selon les changements d’état du relais physique de l’IPX800.
image

Tu as donc dans Jeedom un IPX 800 virtuel, avec ses entrées et ses sorties, dont l’état est mis à jour en temps réel par les push des entrées / sorties physiques de ton IPX800.

J’espère que c’est plus clair pour toi

1 « J'aime »

hello merci de tes explications! mais ça ne marche pas chez moi je ne comprends pas. Apikey tu mets celle de jeedom ou du plugin virtuel? enfin ds les 2 cas ça ne marche pas pour moi. je suis en https j’ai essayé l’ip locale ou celle externe: ne marche pas. (note : j’essaie pour une entrée numérique donc ds les inputs)

Hello, désolé pour la réponse tardive, je ne me suis pas connecté depuis un moment.
Pour les Input c’est exactement pareil, que pour les Output.
La clé API est celle du plugin Virtuel.
Si ta clé API est correcte, ainsi que la syntaxe de la commande et le numéro de la commande dans le virtuel, cela vient surement de la partie HTTPS. Là, je ne peux pas t’aider. Peut-être le port à modifier ?

attention avec la v4 a raccourcire la clef api générée sinon ça pose problème dans l’IPX…

Que veux tu dire ? Je suis en V4, j’utilise la clé API autogénérée sans problème

4.2

  • Renforcement des sessions : Passage en sha256 avec 64 caractères en mode strict.

Mais pour le plugin Virtual la clé API est + courte (32 car). En tout cas chez moi.

oui car tu ne l’as pas actualisé mais si pouyr une raison ou une autre elle vient a être régénéré, elle passe à 64.
J’ai eu le soucis lors du passage à la 4.2 , entre sa et les changements d’url pour appel les virtuels ya beaucou d’erreur possible

Et dans ce cas tu fais comment pour la raccourcir ? car je ne vois que la possibilité de la régénérer, sans option apparente de personnalisation

j’avais utilisé un scénario avec un bloc code. surtout pour avoir la même et pas rechanger dans les 100 voies de l’ipx

@cddu33 @tous
Je dispose également d’une grosse config IPX800v3 qui tournait avec le mécanisme de push global. J’ai rencontré aussi le souci de multiples déclenchement, et maintenant j’ai des erreurs en continu dans les logs sur deux des six IPX800 !

J’ai posté en //, on essaie de comprendre. Mais si je m’en sors pas, mon plan B sera de passer en mode « push individuel ».

Du coup j’ai quelques questions là-dessus :

  1. As-tu paramétré via l’interface graphique de l’IPX, ou via un script ?
    → Si tu as automatisé, je serai preneur de la méthode stp.

  2. Comment sont gérés les entrées analogiques ?
    → Push individuel aussi ? Pas de risque de surcharger Jeedom ?

  3. Comment sont gérés les compteurs ?
    → Push individuel aussi, ou polling via Jeedom ?

  4. Au final, comment utiliser la nouvelle clé API ?
    → Pour ne pas être bloqué si jamais on doit la régénérer.

Cela fait beaucoup de questions, mais important de vérifier que tout est bordé avant de me lancer.

Merci !

Depuis l’interface… C’est long

Faut passer par un scénario pour régénérer de la bonne longueurs

Je n’avais que des entrée numériques mais je pense que le principe est le même sur analogique et compteur

1 « J'aime »

Aïe ! Le plugin avait automatisé ça, sans doute via des requêtes http.
Si je ne trouve pas, je ferai à la main, pas le choix !

Je n’ai pas bien compris le mécanisme (pour ne pas avoir à récréer la clé) mais je vais relire attentivement le post.

C’est ce que j’imaginais, je testerai sur une entrée.

@+