Probleme cmd::byString en V4

Bonjour, j’utilise un script lisant un fichier XML et mettant à jour mes virtuels. Ca fonctionne en V3. Je viens de passer en V4 (à nouveau) et mes virtuels ne sont plus mis à jour.
Tous mes plugins sont à jour.

ai inséré une commande log add ( sur « nb sondes cave » )pour vérifier que le xml est bien lu. Le log affiche bien le nb de sondes, mais le virtuel « nb sonde cave » reste à 0.
Quelqu’un aurait il une piste.Merci
-----------------------------------------

Salut,

Comme évoqué dans le thread à coté, c’est pas cmd::byString qui pose problème…
Et sans quelques informations supplémentaires : le script, le fichier xml et les traces d’exécution, c’est impossible de voir ce qu’il se passe.

<?php
require_once dirname(__FILE__) . '/../../../core/php/core.inc.php';

// Liste des ids de capteurs et des variables Jeedom associées

  
  $aEqui = array("3F000802939A4510" => "#[Chauffage][ChauffageSol][T°BallonRetour]#",
				"470008027D4AF910" => "#[Chauffage][ChauffageSol][T°DepartPAC]#",
				"1D0008027D26DD10" => "#[Chauffage][ChauffageSol][T°BallonDepart]#",
				"F00008027D41BF10" => "#[Chauffage][ChauffageSol][T°RetourPAC]#",
				"370008027D2F7A10" => "#[Chauffage][ChauffageSol][T°Cuisine1Retour]#",
				"13000802937F4A10" => "#[Chauffage][ChauffageSol][T°CellierRetour]#",
				"0B0008027D197510" => "#[Chauffage][ChauffageSol][T°SAM1Retour]#",
				"E900080297538C10" => "#[Chauffage][ChauffageSol][T°SalonRetour]#",
               	"6E000802939C5C10" => "#[Chauffage][ChauffageSol][T°Cuisine2Retour]#",
              	"A50008027449B410" => "#[Chauffage][ChauffageSol][T°SAM2Retour]#",
				"C5000802746CB910" => "#[Chauffage][ChauffageSol][T°VerandaRetour]#",
				"B80008027D628110" => "#[Chauffage][ChauffageSol][T°ChbVergerRetour]#",
				"2F0008027D1D1E10" => "#[Chauffage][ChauffageSol][T°PallierRetour]#",
				"3F00080293A03D10" => "#[Chauffage][ChauffageSol][T°SdBEtageRetour]#",
				"4A0008027D18BB10" => "#[Chauffage][ChauffageSol][T°RadiateurEtageSdBRetour]#",
				"8F00000510179028" => "#[Chauffage][ChauffageSol][T°SdBRDCRetour]#",
				"FB0000050FEFBB28" => "#[Chauffage][ChauffageSol][T°DressingRetour]#",
				"6F000005100F0E28" => "#[Chauffage][ChauffageSol][T°SalleTVRetour]#",
				"1A00000510091828" => "#[Chauffage][ChauffageSol][T°ChbRDCRetour]#",
				"590000050FFD9E28" => "#[Chauffage][ChauffageSol][T°CollecteurSalleTVDepart]#",
				"7E000006A3444E28" => "#[Chauffage][ChauffageSol][T°RadiateurSdBRDCRetour]#",
             	"720008027D647E10" => "#[Chauffage][ChauffageSol][T°ChbCourRetour]#", 
				"9A00080293985910" => "#[Chauffage][ChauffagePieces][T°ChbCour]#",
				"8D0008027472B010" => "#[Chauffage][ChauffagePieces][T°ChbVerger]#",
				"48000802937F5A10" => "#[Chauffage][ChauffagePieces][T°Exterieur]#",
				"650008029742D210" => "#[Chauffage][ChauffagePieces][T°SaM]#",
				"E50000051017B428" => "#[Chauffage][ChauffagePieces][T°Dressing]#",
				"0A0000050FF41328" => "#[Chauffage][ChauffagePieces][T°SalleTV]#",
				"03011464E5DFFF28" => "#[Chauffage][ChauffagePieces][T°ChbRDC]#",
				"83000006A3294E28" =>"#[Chauffage][ChauffagePieces][T°Bureau]#",
				"6E00010000339C7E" =>"#[Chauffage][ChauffagePieces][T°SdBBureau]#",
				"CB0010000025087E" =>"#[Chauffage][ChauffagePieces][T°SdBRDC]#",
				"140010000031777E" =>"#[Chauffage][ChauffagePieces][T°Cuisine]#",
				"35000002124E8726" => "#[Chauffage][ChauffagePieces][T°Cave]#"); 

$url = "http://192.168.5.12/details.xml";
		$xml = simplexml_load_file($url);
		// erreur
		if($xml === false)
		{
		  exit();
		}
		$string = $xml->DevicesConnected;
		var_dump($string);
		cmd::byString("#[Chauffage][ChauffagePieces][nb sondes Cave]#")->event(($string));

log::add('script','debug',$string );

		foreach($xml->owd_DS18B20 as $uneSonde)
			{
				 $id = trim($uneSonde->ROMId);

				 if(isset($aEqui[$id]))
				 {
			cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
                   str_replace(".", ",", $unesonde);
				 }
			} 
		foreach($xml->owd_DS18S20 as $uneSonde)
			{
				 $id = trim($uneSonde->ROMId);

				 if(isset($aEqui[$id]))
				 {
			cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
				str_replace(".", ",", $unesonde);
                 }
			} 
		foreach($xml->owd_EDS0065 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 
		foreach($xml->owd_DS2438 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 		

$url = "http://192.168.5.11/details.xml";
		$xml = simplexml_load_file($url);
		// erreur
		if($xml === false)
		{
		  exit();
		}
		$string = $xml->DevicesConnected;
		var_dump($string);
		cmd::byString("#[Chauffage][ChauffageSol][nb sondes ChauffageSol]#")->event(($string));
log::add('script','debug',$string);
			foreach($xml->owd_DS18S20 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 
			foreach($xml->owd_DS18B20 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					 }
				} 
			foreach($xml->owd_EDS0065 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 
			foreach($xml->owd_DS2438 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 		

$url = "http://192.168.5.13/details.xml";
		$xml = simplexml_load_file($url);
		// erreur
		if($xml === false)
		{
		  exit();
		}
		$string = $xml->DevicesConnected;
		var_dump($string);
		cmd::byString("#[Chauffage][ChauffagePieces][nb sondes Chauffage]#")->event(($string));
log::add('script','debug',$string);
			foreach($xml->owd_DS18B20 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 
			foreach($xml->owd_DS18S20 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 
			foreach($xml->owd_EDS0065 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 
			foreach($xml->owd_DS2438 as $uneSonde)
				{
					 $id = trim($uneSonde->ROMId);

					 if(isset($aEqui[$id]))
					 {
				cmd::byString($aEqui[$id])->event($uneSonde->Temperature);
					str_replace(".", ",", $unesonde);
                     }
				} 		
//echo $xml->asXML();


?>

Voici mon script original en V3.
et attaché, xml.txt (5,9 Ko) mon xml.

Bonjour, j’ai également un problème avec cette commande. En V3 ok, passage en v4, pas d’erreur mais commande qui ne met pas à jour mon virtuel.

Avez vous résolu ce problème?
Merci

Salut…

cmd::byString ne fait pas de mise à jour. Aussi bien V3 ou V4… ça ne permet QUE de récupérer l’objet commande…

Bonjour @naboleo,
Je suis circonspect…
En V3 ce script fonctionne et à part cette commande ,je ne vouis pas ce qui met à jour mon virtuel.

Si je fais ceci
foreach($xml->owd_DS18B20 as $uneSonde)
{
$id = trim($uneSonde->ROMId);
$id1 = trim($uneSonde->Temperature);

      if(isset($aEqui[$id]))
       
          {   
         // str_replace(".",",",$id1);
        log::add('script','debug',$id);
       log::add('script','debug',$id1);
      log::add('script','debug',$aEqui[$id]);

         cmd::byString($aEqui[$id])->event($id1);
        str_replace(".", ",", $unesonde);
      	 }
       } 

Je vois bien mes valeurs ( romid,temperature et nom du virtuel) en log.
Et mon widget affiche bien la température avec cmd::bystring.

Salut,

En fait, ça enchaine 2 opérations à la suite :

  • byString qui retourne une commande
  • event qui met à jour la commande

ça revient en gros à faire ça

         $cmd=cmd::byString($aEqui[$id]);
         $cmd->event($id1);

Par ailleurs, en fin de boucle pourquoi faire ça ?

La variable n’est plus utilisée ensuite… donc pas besoin de changer les point en virgules

Que donne les logs ?

Ah je comprends mieux la commande. le str replace vient du script V3, il remplaçait le point de la valeur Temperature par une virgule. Mais à vrai dire je ne me souviens plus si ce remplacement se faisait ou non?!!

J’ai remis mon script original et le log donne l’erreur:

Erreur exécution de la commande [Chauffage][SondesChauffage][SondTemp] : Erreur sur php /var/www/html/plugins/script/data/LectureSondesTempV3.php 2>&1 valeur retournée : 255. Détails : object(SimpleXMLElement)#4 (1) { [0]=> string(1) « 4 » } PHP Fatal error: Uncaught Exception: La commande n’a pas pu être trouvée : #[Chauffage][ChauffagePieces][T°Bureau]# => #[Chauffage][ChauffagePieces][T°Bureau]# in /var/www/html/core/class/cmd.class.php:544 Stack trace: #0 /var/www/html/plugins/script/data/LectureSondesTempV3.php(61): cmd::byString(’#[Chauffage][Ch…’) #1 {main} thrown in /var/www/html/core/class/cmd.class.php on line 544

J’ai cru à un problème de noms ou de syntaxe de mes noms de valeurs virtuelles, mais ça ne semble pas ça…
J’ai bricolé ma première routine for each et là je n’ai plus l’erreur du dessus.
Le log donne bien le romid,la temp, le nom de la valeur virtuelle, mon widget affiche bien la temp, mais la routine ne met à jour que la première sonde (le premier Romid trouvé, alors que j’ai plusieurs sondes de ce type)

foreach($xml->owd_DS18B20 as $uneSonde)
{
$id = trim($uneSonde->ROMId);
$id1 = trim($uneSonde->Temperature);

      if(isset($aEqui[$id]))
       
          {   
       
        log::add('script','debug',$id);
       log::add('script','debug',$id1);
      log::add('script','debug',$aEqui[$id]);

         cmd::byString($aEqui[$id])->event($id1);
       
      	 }
       }

si ça ne va pas jusqu’au bout, c’est qu’une erreur (du même genre se produit)… et stoppe les mise à jour
il y a beaucoup de boucles ‹ for each › à verifier 1 à 1

$url = "http://192.168.5.12/details.xml";
		foreach($xml->owd_DS18B20 as $uneSonde)
		foreach($xml->owd_DS18S20 as $uneSonde)
		foreach($xml->owd_EDS0065 as $uneSonde)

$url = "http://192.168.5.11/details.xml";
			foreach($xml->owd_DS18S20 as $uneSonde)
			foreach($xml->owd_DS18B20 as $uneSonde)
			foreach($xml->owd_EDS0065 as $uneSonde)
			
$url = "http://192.168.5.13/details.xml";
			foreach($xml->owd_DS18B20 as $uneSonde)
			foreach($xml->owd_DS18S20 as $uneSonde)
			foreach($xml->owd_EDS0065 as $uneSonde)
			foreach($xml->owd_DS2438 as $uneSonde)

J’ai inséré dans chaque boucle foreach :
log::add(‹ script ›,‹ debug ›,$id);
log::add(‹ script ›,‹ debug ›,$aEqui[$id]);

J’ai dans le log la totalité des sondes qui s’affichent ( romid et nom de la valeur)

Le script sort donc bien de chaque boucle for each.
Mais le résultat du script est à 0.

Et avec la suppression systématique de ça ?

Pour être un peu plus sur, il est possible de faire

      if(isset($aEqui[$id]))
		{   
        log::add('script','debug','ID à chercher :'.$id);
		log::add('script','debug','ID1 à chercher :'.$id1);
		log::add('script','debug',$aEqui[$id]);
		$cmd=cmd::byString($aEqui[$id]);
		log::add('script','debug','ID récupéré :'.$cmd->getId());
		$cmd->event($id1);
		log::add('script','debug','Mise à jour ok avec valeur :'.$id1);
		}

La dernière étape d’une boucle est forcement de l’affichage dans les logs…

Bonjour
Le log donne l’erreur quand même la : la commande n’est pas trouvé… En v4 les caractères spéciaux sont supprimés des noms de commande. As tu vérifié cela ?

La réponse est pour moi ou pour @Philippe1155 ?
J’ai pas vu l’erreur dans la copie d’écran des logs …
Le seul caractère spécial dans la commande c’est le ‹ ° ›… Si la mise à jour est faite dans la première boucle, c’est pas ce qui gène… Mais c’est pas forcement à négliger

Mais avec les 2 sujets en // c’est le b***

YEEEEES!!!

J’ai supprimé le ° et appliqué la routine de @naboleo.
Le widget affiche bien les températures!
Je vais réintroduire le ° pour voir si c’est ça.

Immense Merci, je vais pouvoir basculer définitivement en V4.

Réintroduit le ° sur une valeur virtuelle… pas de souci avec ça
image

En revanche, le nb de mes sondes , s’il est ok dans le log, ne s’affiche pas.
J’ai segmenté la commande ainsi
$string = $xml->DevicesConnected;
var_dump($string);
$cmd=cmd::byString(« #[Chauffage][ChauffagePieces][nb sondes Cave]# »);
$cmd->event($string);
log::add(‹ script ›,‹ debug ›,'[Chauffage][ChauffagePieces][nb sondes Cave] : '.$string);
image

Ai je mal retranscris?J’ai beau relire…

Tu as un vrai XML ? Si oui le core ne gère plus la conversion des objet en string c’est a toi de le gérer en faisant un cast

Je mesure tout ce qui me reste à apprendre …
Pour un novice comme moi… qu’en mots simples tu veux dire?

@Loic, parles tu du fichier xml de mon boitier sondes? oui c’est un XML
image .
Mais en l’occurence, le script en V4 lis bien l’ensemble de mon fichier XML.
Sauf pour le paramêtre « devicesconnected ». Ce paramêtre est bien lu et affiché dans le log, c’est l’affichage dans la valeur virtuelle qui n’est pas ok.

Il n’y pas une paire de parenthèses en trop ?

Il faut faire un essai avec

cmd::byString("#[Chauffage][ChauffagePieces][nb sondes Cave]#")->event(($string));

en

cmd::byString("#[Chauffage][ChauffagePieces][nb sondes Cave]#")->event($string);