Bloc code scenario et affectation valeurs dans variables

Bonjour à tous,

Je commence à me familiariser avec Jeedom pour migrer tout mon système actuellement sous eedomus.
J’ai récemment installé une PAC Air-Air Panasonic et avant de démarrer la migration de tout le reste, j’essaye d’intégrer cette PAC dans Jeedom (j’aime commencer par le plus compliqué :joy: )

En fouillant les méandres d’internet, je suis tombé sur ce sujet qui s’appuie sur le plugin script et des scénarios: Plugin Panasonic Comfort Cloud

J’ai suivi le tutoriel et il est presque totalement fonctionnel à un détail près (et évidemment ce détail est très important).
Le scénario s’appuie sur un bloc code que voici:

$cmdinfo = "#[Salon][PAC Salon][INFO]#";
$RetourInfo = cmd::byString($cmdinfo)->execCmd();
//scinde l'info
list($val1, $val2, $val3, $val4, $val5, $val6, $val7, $val8, $val9, $val10, $val11, $val12) = explode(" ", $RetourInfo);
//mise en variable
$scenario->setData("valeurTempExt_Salon", "$val5");
$scenario->setData("valeurConsigne_Salon", "$val6");
$scenario->setData("valeurPower_Salon", "$val7");
$scenario->setData("valeurMode_Salon", "$val8");
$scenario->setData("valeurFanSpeed_Salon", "$val9");
$scenario->setData("valeurAirSwingLR_Salon", "$val10");
$scenario->setData("valeurAirSwingUD_Salon", "$val11");
$scenario->setData("valeurEco_Salon", "$val12");

$myVar = $scenario->getData('valeurTempExt_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurTempExt_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][TempExt]#')->event("$val2");

$myVar = $scenario->getData('valeurConsigne_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurConsigne_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][Etat Consigne]#')->event("$val2");

$myVar = $scenario->getData('valeurPower_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurPower_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][Etat Power]#')->event("$val2");

$myVar = $scenario->getData('valeurMode_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurMode_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][Etat Mode]#')->event("$val2");

$myVar = $scenario->getData('valeurFanSpeed_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurFanSpeed_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][Etat Fan]#')->event("$val2");

$myVar = $scenario->getData('valeurAirSwingLR_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurAirSwingLR_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][Etat Volet Horizontal]#')->event("$val2");

$myVar = $scenario->getData('valeurAirSwingUD_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurAirSwingUD_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][Etat Volet Ventilation]#')->event("$val2");

$myVar = $scenario->getData('valeurEco_Salon');
list($val1, $val2) = explode(" : ",$myVar);
$scenario->setData("valeurEco_Salon", "$val2");
cmd::byString('#[Salon][PAC Salon][Etat Eco]#')->event("$val2");

Le cmdinfo est un appel au script et fonctionne bien, j’ai bien un retour de la commande et du résultat associé.
Là où le problème se pose est sur la suite, le résultat semble bien stocké mais j’ai l’impression que c’est l’explosion en différentes variables qui pose problème.
Pour le test, j’ai forcé les valeurs de variables à 0, et lorsque je déclenche le scénario, les variables deviennent vides.
Et j’ai beau voir et revoir le bloc code je n’arrive pas à mettre le doigt sur ce qui cloche.
Le résultat de la commande INFO semble avoir un retour avec beaucoup d’espaces, du coup dans mon code j’ai testé d’ajouter juste après la ligne $RetourInfo la ligne suivante:

$RetourInfo2 = preg_replace('/\s\s+/', ' ',$RetourInfo);

Et de mettre ma ligne list comme suit:

list($val1, $val2, $val3, $val4, $val5, $val6, $val7, $val8, $val9, $val10, $val11, $val12) = explode(" ", $RetourInfo2);

L’exécution se passe toujours bien, pas d’erreur mais des variables désespérément vides
Dans les logs event, je vois que c’est vide également:

0453|[2023-11-17 12:01:03][INFO] : Exécution du scénario [Gestion Chauffage][Salon][Scenario PAC Salon] déclenché par : user
0454|[2023-11-17 12:01:03][INFO] : Evènement sur la commande [Salon][PAC Salon][TempExt] valeur : °C
0455|[2023-11-17 12:01:03][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Power] valeur :
0456|[2023-11-17 12:01:03][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Mode] valeur :
0457|[2023-11-17 12:01:03][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Fan] valeur :
0458|[2023-11-17 12:01:03][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Volet Horizontal] valeur :
0459|[2023-11-17 12:01:03][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Volet Ventilation] valeur :
0460|[2023-11-17 12:01:03][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Eco] valeur :

Alors que toujours dans ce même log event j’ai bien le retour de la commande INFO:

[2023-11-24 10:45:05][INFO] : Evènement sur la commande [Salon][PAC Salon][INFO] valeur : reading from device 'Salon' (XXX) id                       : XXX parameters     temperatureInside    : 18     temperatureOutside   : 11     temperature          : 16     power                : On     mode                 : Heat     fanSpeed             : Auto     airSwingHorizontal   : Auto     airSwingVertical     : Auto     eco                  : Auto     nanoe                : On

Mais toujours avec ces multiples espaces que je pensais solutionner avec la modification du code.

Si quelqu’un pouvait me donner son avis ou son aide, ce serait vraiment top, parce qu’à force de regarder, reregarder j’ai les yeux qui se croisent et je ne comprends pas d’où pourrait provenir le souci (sachant que le code c’est vraiment pas mon fort en plus).

Merci!

tu peux mettre une chaine de caractère brute de ce que retourne la commande avant explode stp ?

J’avais testé ça en m’appuyant sur le retour de la commande INFO:

$RetourInfo = "reading from device 'Salon' XXX id : XXX parameters temperatureInside : 17 temperatureOutside   : 11 temperature : 16 power : On mode : Heat fanSpeed : Auto airSwingHorizontal : Auto airSwingVertical : Auto eco : Auto nanoe : On";

Mais pas de changement a priori, valeurs dans les variables toujours vides :frowning:

Edit:
Je viens de le refaire, et voilà un screenshot des variables

Bonjour,
Je ne suis pas spécialiste mais si tu mets un ltrim() au moins à $val2 tu supprime le premier espace puis un rtrim pour suprimer les espaces à la fin.

A quels niveaux les ltrim et rtrim? (oui je suis absolument pas spécialiste :joy: )

ok, donc çà explode en fonction des espaces, donc le 17 par exemple c’est le 17ème élément, le 11 le 20, etc… essaie de décompacter dans un tableau et d’afficher le tableau ça te donnera les indices à récupérer. c’est beaucoup plus simple que d’utiliser les listes !

voilà le résultat d’un output vers un tableau :

[2023-11-24 15:30:33][SCENARIO] Exécution d'un bloc code 
[2023-11-24 15:30:33][SCENARIO] parametre 0=reading
[2023-11-24 15:30:33][SCENARIO] parametre 1=from
[2023-11-24 15:30:33][SCENARIO] parametre 2=device
[2023-11-24 15:30:33][SCENARIO] parametre 3='Salon'
[2023-11-24 15:30:33][SCENARIO] parametre 4=XXX
[2023-11-24 15:30:33][SCENARIO] parametre 5=id
[2023-11-24 15:30:33][SCENARIO] parametre 6=:
[2023-11-24 15:30:33][SCENARIO] parametre 7=XXX
[2023-11-24 15:30:33][SCENARIO] parametre 8=parameters
[2023-11-24 15:30:33][SCENARIO] parametre 9=temperatureInside
[2023-11-24 15:30:33][SCENARIO] parametre 10=:
[2023-11-24 15:30:33][SCENARIO] parametre 11=17
[2023-11-24 15:30:33][SCENARIO] parametre 12=temperatureOutside
[2023-11-24 15:30:33][SCENARIO] parametre 13=
[2023-11-24 15:30:33][SCENARIO] parametre 14=
[2023-11-24 15:30:33][SCENARIO] parametre 15=:
[2023-11-24 15:30:33][SCENARIO] parametre 16=11
[2023-11-24 15:30:33][SCENARIO] parametre 17=temperature
[2023-11-24 15:30:33][SCENARIO] parametre 18=:
[2023-11-24 15:30:33][SCENARIO] parametre 19=16
[2023-11-24 15:30:33][SCENARIO] parametre 20=power
[2023-11-24 15:30:33][SCENARIO] parametre 21=:
[2023-11-24 15:30:33][SCENARIO] parametre 22=On
[2023-11-24 15:30:33][SCENARIO] parametre 23=mode
[2023-11-24 15:30:33][SCENARIO] parametre 24=:
[2023-11-24 15:30:33][SCENARIO] parametre 25=Heat
[2023-11-24 15:30:33][SCENARIO] parametre 26=fanSpeed
[2023-11-24 15:30:33][SCENARIO] parametre 27=:
[2023-11-24 15:30:33][SCENARIO] parametre 28=Auto
[2023-11-24 15:30:33][SCENARIO] parametre 29=airSwingHorizontal
[2023-11-24 15:30:33][SCENARIO] parametre 30=:
[2023-11-24 15:30:33][SCENARIO] parametre 31=Auto
[2023-11-24 15:30:33][SCENARIO] parametre 32=airSwingVertical
[2023-11-24 15:30:33][SCENARIO] parametre 33=:
[2023-11-24 15:30:33][SCENARIO] parametre 34=Auto
[2023-11-24 15:30:33][SCENARIO] parametre 35=eco
[2023-11-24 15:30:33][SCENARIO] parametre 36=:
[2023-11-24 15:30:33][SCENARIO] parametre 37=Auto
[2023-11-24 15:30:33][SCENARIO] parametre 38=nanoe
[2023-11-24 15:30:33][SCENARIO] parametre 39=:
[2023-11-24 15:30:33][SCENARIO] parametre 40=On
[2023-11-24 15:30:33][SCENARIO] Fin correcte du scénario

donc tu peux envoyer to explode vers un tableau et utiliser ses indices, voilà le code du scénario ci-dessus:

$RetourInfo = "reading from device 'Salon' XXX id : XXX parameters temperatureInside : 17 temperatureOutside   : 11 temperature : 16 power : On mode : Heat fanSpeed : Auto airSwingHorizontal : Auto airSwingVertical : Auto eco : Auto nanoe : On";
$ret = explode(" ",$RetourInfo);
$i=0;
foreach($ret as $v) {
	$scenario->setlog("parametre $i=$v");
  	$i++;
}

Je suis en train de tester, le résultat de l’exécution je suis censé le voir dans les logs event? Scenario Execution?

oui c’est ça

Ah. Donc je vois rien a priori:

Dans scenario execution j’ai ça:

reading from device 'Salon' (XXX)
id : XXX
parameters temperatureInside : 17 temperatureOutside : 13 temperature : 16 power : On mode : Heat fanSpeed : Auto airSwingHorizontal : Auto airSwingVertical : Auto eco : Auto nanoe : On
reading from device 'Salon' (XXX)
id : XXX
parameters temperatureInside : 18 temperatureOutside : 11 temperature : 16 power : On mode : Heat fanSpeed : Auto airSwingHorizontal : Auto airSwingVertical : Auto eco : Auto nanoe : Onreading from device 'Salon' (XXX)
id : XXX
parameters temperatureInside : 18 temperatureOutside : 12 temperature : 16 power : On mode : Heat fanSpeed : Auto airSwingHorizontal : Auto airSwingVertical : Auto eco : Auto nanoe : On

Et dans les logs event:

[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][INFO] valeur : reading from device 'Salon' (XXX) id                       : XXX parameters     temperatureInside    : 17     temperatureOutside   : 8     temperature          : 16     power                : On     mode                 : Heat     fanSpeed             : Auto     airSwingHorizontal   : Auto     airSwingVertical     : Auto     eco                  : Auto     nanoe                : On
[2023-11-24 16:35:05][INFO] : Exécution du scénario [Gestion Chauffage][Salon][Scenario PAC Salon] déclenché par : [Salon][PAC Salon][INFO]
[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][TempExt] valeur : °C
[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Power] valeur : 
[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Mode] valeur : 
[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Fan] valeur : 
[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Volet Horizontal] valeur : 
[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Volet Ventilation] valeur : 
[2023-11-24 16:35:05][INFO] : Evènement sur la commande [Salon][PAC Salon][Etat Eco] valeur : 

Après, j’ai juste ajouté le bout de code avant la liste.

tu dois décompacter ce champ : [Salon][PAC Salon][INFO]

donc ajoute en début de scénario :

$cmdinfo = "#[Salon][PAC Salon][INFO]#";
$RetourInfo = cmd::byString($cmdinfo)->execCmd();
/* ------ ajout */
$ret = explode(" ",$RetourInfo);
$i=0;
foreach($ret as $v) {
	$scenario->setlog("parametre $i=$v");
  	$i++;
}
...la suite 

Oui c’est bien ce que j’ai fait, par contre j’ai laissé le list juste après:

$cmdinfo = "#[Salon][PAC Salon][INFO]#";
$RetourInfo = cmd::byString($cmdinfo)->execCmd();
//$RetourInfo = "reading from device 'Salon' (XXX) id : XXX parameters temperatureInside : 17 temperatureOutside   : 11 temperature : 16 power : On mode : Heat fanSpeed : Auto airSwingHorizontal : Auto airSwingVertical : Auto eco : Auto nanoe : On";
//$RetourInfo2 = preg_replace('/\s\s+/', ' ',$RetourInfo);
//scinde l'info
$ret = explode(" ",$RetourInfo);
$i=0;
foreach($ret as $v) {
	$scenario->setlog("parametre $i=$v");
  	$i++;
}
list($val1, $val2, $val3, $val4, $val5, $val6, $val7, $val8, $val9, $val10, $val11, $val12) = explode(" ", $RetourInfo);
//mise en variable
$scenario->setData("valeurTempExt_Salon", "$val5");
$scenario->setData("valeurConsigne_Salon", "$val6");
$scenario->setData("valeurPower_Salon", "$val7");
$scenario->setData("valeurMode_Salon", "$val8");
$scenario->setData("valeurFanSpeed_Salon", "$val9");
$scenario->setData("valeurAirSwingLR_Salon", "$val10");
$scenario->setData("valeurAirSwingUD_Salon", "$val11");
$scenario->setData("valeurEco_Salon", "$val12");

Et du coup, le retour que j’ai c’est ce que j’ai mis dans le post juste avant ta réponse.
J’ai vidé les logs event et scenario execution, le dernier est désormais vide.
Ca me rend fou :joy:

Edit: j’ai fait le test en commentant le list mais ça ne change rien.
Edit2: j’ai également fait le test en commentant le $RetourInfo pour le remplacer par celui qui injecte les valeurs en dur, pareil.

le but c’est de lister juste les retours du tableau et d’utiliser ses indices à la place des valeurs $val quelque chose. tu peux commenter tout le reste pour isoler le fonctionnement et limiter à dépiler le tableau et voir quoi prendre pour mettre où !

Bonsoir,

Effectivement, l’info a traiter est très mal formatter !

Autre potentielle solution a tester dans un autre bloc code :

$cmdinfo = "#[Salon][PAC Salon][INFO]#";
$RetourInfo = cmd::byString($cmdinfo)->execCmd();

// Nettoyage de l'info
$RetourInfo = str_replace(array("reading from device 'Salon' (XXX)","parameters"), '', $RetourInfo); // suppression des infos
$RetourInfo = rtrim(ltrim(preg_replace ("/\s+/", " ", $RetourInfo))); // suppression des espaces multiples
$ret = explode(" ",$RetourInfo); // création d'un tableau

/* Traitement du tableau */
$ii=1; $array = array(); $key = '';
foreach($ret as $v) {
  if ($v == ':') continue;
  if ($ii == 1) { $key = $v; $ii++; }
  else if ($ii == 2 && !empty($key)) { $array[$key] = $v; $ii=1; }
}

/* Pour debug */
$scenario->setlog(json_encode($array));

/* Enregistrement des infos */
foreach($array as $key => $value) {
  switch ($key) {
      case 'temperatureOutside':
        $scenario->setlog($key . ' -> ' . $value); // pour debug
        cmd::byString('#[Salon][PAC Salon][TempExt]#')->event("$value");
        break;
      case 'power':
        $scenario->setlog($key . ' -> ' . $value); // pour debug
        cmd::byString('#[Salon][PAC Salon][Etat Power]#')->event("$value");
        break;
      /* ... */
  }
}
1 « J'aime »

@Phpvarious il semblerait que ton code fonctionne. Je l’ai testé en remplaçant tout le code initial (que j’ai mis de côté) par celui que tu m’as donné, et j’ai la valeur de température extérieure et d’état de l’alim qui remontent :heart_eyes:

PAC

Si j’ai bien compris, je n’ai plus qu’à dupliquer les blocs de case à break pour toutes les infos dont j’ai besoin, c’est bien ça?
(et ensuite rendre un peu plus présentable la présentation :joy: )

J’ai dupliqué tous les cases, corrigé une petite erreur côté script (une histoire de permissions) et ça marche! :heart_eyes: :heart_eyes: :heart_eyes:
Je récupère les infos, elles se mettent dans le widget, et j’interagis avec la PAC depuis Jeedom avec mise à jour côté appli Panasonic :smiling_face_with_three_hearts:
Un immense merci!!!

Pense a mettre a petit message sur ce sujet, ca évitera qu’un helpeur passe du temps sur un truc qui est déja résolut :wink:

Oui je vais mettre un lien vers ce sujet

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.