Comment fonctionne les tag

Bonjour,

Je suis emprunté , car cela marchait :grinning:

Dans mon scénarion, j’ai un déclancheur.
J’avais fait un petit code PHP qui va

  • récupérer l’ID du déclancheur
  • Si ce n’est pas déclancher par une action de l’utilisateur, continue
  • crée un permier log
  • log l’ID du devise

Jusqu’à la tout va bien

Puis je sauve dans des tag des valeurs. Dans le tag ‹ station › je sauve la valeur dev_id.
Dans le log, je vois bien sa valeur, mais dans le tag, il m’affiche rien du tout.

Pourtant ‹ $arrayValue[‹ dev_id ›] › a bien la valeur de st-13

Puis je crée des tags, ce qui fonctionnait avant

$cmdID = $scenario->getRealTrigger();

log::add("SmartBud","info",$cmdID."=> has been triggered");

if($cmdID != "user") // The sclnario has not been trigger by an user
{
	$value = cmd::byString('#'.$cmdID.'#')->execCmd();
	log::add("SmartBud","info",$cmdID." : ".$value);
	$arrayValue = json_decode($value, true);
        log::add("SmartBud","info",$cmdID." : ".$arrayValue['dev_id']);

        $tags = $scenario->getTags();
  	$tags['#station#'] = $arrayValue['dev_id'];
 	log::add("SmartBud","info",$cmdID." : ".$tags['station']);
  	$tags['#field#'] = 0;
  	$tags['#alarm#'] = 0;
}
$scenario->setTags($tags);

Voici mon code au complet

$cmdID = $scenario->getRealTrigger();

log::add("SmartBud","info",$cmdID."=> has been triggered");

if($cmdID != "user") // The sclnario has not been trigger by an user
{
	$value = cmd::byString('#'.$cmdID.'#')->execCmd();
	log::add("SmartBud","info",$cmdID." : ".$value);
	$arrayValue = json_decode($value, true);
  	log::add("SmartBud","info",$cmdID." : ".$arrayValue['dev_id']);
  
  	//echo $scenario->setData($arrayValue['dev_id'], '0');
  		
  	$tags = $scenario->getTags();
  	$tags['#station#'] = $arrayValue['dev_id'];
 	log::add("SmartBud","info",$cmdID." : ".$tags['station']);
  	$tags['#field#'] = 0;
  	$tags['#alarm#'] = 0;

	foreach($arrayValue['payload_fields'] as $key => $val){
		log::add("SmartBud","info",$cmdID."=> key : ".$key);
      	if($key == "ba") 
    	{
          	log::add("SmartBud","info",$cmdID."=> ba : ".$val);
      		$val = $val/100;
          	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Batterie]#')->event($val);
          	$tags['#'.$key.'#'] = $val;
          	log::add("SmartBud","info",$cmdID."=> ".$key." : ".$val);
    	}
     	if($key == "b1" || $key == "b2" || $key == "b3" || $key == "b4")
    	{
          	log::add("SmartBud","info",$cmdID."=> Température : ".$val);
			$val = $val/10;
          	$tags['#'.$key.'#'] = $val;
          	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].']['.$key.']#')->event($val);
          
          	// Thershold
          	if($val < 2)
            {
             	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(1);
          		$tags['#alarm#'] = 1;
            }
            else
            {
              	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(0);
            	$tags['#alarm#'] = 0;
            }
          log::add("SmartBud","info",$cmdID."=> ".$key." : ".$val);
    	}	
    }
  
  	$scenario->setTags($tags);
}

Voyez-vous quelque chose que j’aurais omis de faire???

Par exemple, dans le foreach, il ne rendre jamais dans la $key quand elle est égal à ‹ ba ›

Hello.
C’est logique que ça n’affiche rien :

  • 1ère ligne le tag utilise les # : #station#
  • 2ème ligne c’est station sans #

Donc c’est pas le même tag…

Là aussi, c’est logique il n’y a que 2 cas où ça fait quelque chose :

  • ba
  • b1 b2 b3 b4

st-13 c’est pas un cas identifié dans le code

Bonjour Nabeolo,

Merci pour ces réponses. En effet, j’avais bien fait une erreur. Mais il y a un truc qui ne tourne pas rond et je ne comprends pas ce que j’ai fait, car ca marchait…

Selon ce code,


$cmdID = $scenario->getRealTrigger();

log::add("SmartBud","info",$cmdID."=> has been triggered");

//cmd::byString('#[Hutins][st-1][Alarm]#')->event(200);
//#[Hutins][st-1][Alarm]#

if($cmdID != "user") // The sclnario has not been trigger by an user
{
	$value = cmd::byString('#'.$cmdID.'#')->execCmd();
	log::add("SmartBud","info",$cmdID." : ".$value);
	$arrayValue = json_decode($value, true);
  	log::add("SmartBud","info",$cmdID." : ".$arrayValue['dev_id']);
  
  	//echo $scenario->setData($arrayValue['dev_id'], '0');
  		
  	$tags = $scenario->getTags();
  	$tags['#station#'] = $arrayValue['dev_id'];
 	log::add("SmartBud","info",$cmdID." : ".$tags['#station#']." - ".$arrayValue['dev_id']);
  	$tags['#field#'] = 0;
  	$tags['#alarm#'] = 0;

	foreach($arrayValue['payload_fields'] as $key => $val){
		log::add("SmartBud","info",$cmdID."=> key : ".$key);
      	if($key == "ba") 
    	{
          	log::add("SmartBud","info",$cmdID."=> ba : ".$val);
      		$val = $val/100;
          	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Batterie]#')->event($val);
          	$tags['#'.$key.'#'] = $val;
          	log::add("SmartBud","info",$cmdID."=> ".$key." : ".$val);
    	}
     	if($key == "b1" || $key == "b2" || $key == "b3" || $key == "b4")
    	{
          	
			$val = $val/10;
          	log::add("SmartBud","info",$cmdID."=> Température : ".$val);
          	$tags['#'.$key.'#'] = $val;
          	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].']['.$key.']#')->event($val);
          
          	// Thershold
          	if($val < 2)
            {
             	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(1);
          		$tags['#alarm#'] = 1;
            }
            else
            {
              	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(0);
            	$tags['#alarm#'] = 0;
            }
          log::add("SmartBud","info",$cmdID."=> ".$key." : ".$val);
    	}	
    }
  
  	$scenario->setTags($tags);
}

Une mesure vient juste d’être envoyée. JMQTT récipère la donnée. Un déclenchement est déclancher. Dans le log j’ai

[2021-02-14 22:56:55][INFO] : #391#=> has been triggered
[2021-02-14 22:56:55][INFO] : #391# : {« app_id »:« leshutins »,« dev_id »:« st-7 »,« hardware_serial »:« 0000000000000007 »,« port »:1,« counter »:46,« payload_raw »:« azQwN »,« payload_fields »:{« b1 »:« -47 »,« b4 »:« -47 »,« ba »:« 404 »},« metadata »:{« time »:« 2021-02-14T21:56:54.937298362Z »,« frequency »:867.9,« modulation »:« LORA »,« data_rate »:« SF7BW125 »,« airtime »:61696000,« coding_rate »:« 4/5 »,« gateways »:[{« gtw_id »:« eui-58a0cb »,« timestamp »:4204471556,« time »:« 2021-02-14T21:56:54.799448966Z »,« channel »:0,« rssi »:-111,« snr »:3.5,« rf_chain »:0}]}}
[2021-02-14 22:56:55][INFO] : #391# : st-7
[2021-02-14 22:56:55][INFO] : #391# : st-7 - st-7
[2021-02-14 22:56:55][INFO] : #391#=> key : b1
[2021-02-14 22:56:55][INFO] : #391#=> Température : -4.7

On voit

log::add("SmartBud","info",$cmdID." : ".$arrayValue['dev_id']);

Affiche bien st-7

que


log::add("SmartBud","info",$cmdID." : ".$tags['#station#']." - ".$arrayValue['dev_id']);

affiche bien

[2021-02-14 22:56:55][INFO] : #391# : st-7 - st-7

Donc pourquoi

$tags['#station#'] = $arrayValue['dev_id'];

ne prend pas de valuer.

PLus bas, dans mon scénario J’ai créé ceci

Les messages que je recois sur télégramme est

Station
batterie LOW: V

Il n’y a aucune valeur.

De plus, il semble que le foreach

foreach($arrayValue['payload_fields'] as $key => $val){
		log::add("SmartBud","info",$cmdID."=> key : ".$key);
      	if($key == "ba") 
    	{
          	log::add("SmartBud","info",$cmdID."=> ba : ".$val);
      		$val = $val/100;
          	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Batterie]#')->event($val);
          	$tags['#'.$key.'#'] = $val;
          	log::add("SmartBud","info",$cmdID."=> ".$key." : ".$val);
    	}
     	if($key == "b1" || $key == "b2" || $key == "b3" || $key == "b4")
    	{
          	
			$val = $val/10;
          	log::add("SmartBud","info",$cmdID."=> Température : ".$val);
          	$tags['#'.$key.'#'] = $val;
          	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].']['.$key.']#')->event($val);
          
          	// Thershold
          	if($val < 2)
            {
             	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(1);
          		$tags['#alarm#'] = 1;
            }
            else
            {
              	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(0);
            	$tags['#alarm#'] = 0;
            }
          log::add("SmartBud","info",$cmdID."=> ".$key." : ".$val);
    	}	
    }

ne fait qu’une boucle, alors que l’ion voit que le payload a 4 valeurs:

"payload_fields":{"b1":"-47","b4":"-47","ba":"404"}

Dans mon log, je devrais voir au moin un truc du genre

[2021-02-14 22:56:29][INFO] : #393#=> key : b1
[2021-02-14 22:56:29][INFO] : #393#=> Température : -4.7
[2021-02-14 22:56:29][INFO] : #393#=> key : b4
[2021-02-14 22:56:29][INFO] : #393#=> Température : -4.7
[2021-02-14 22:56:29][INFO] : #393#=> key : ba
[2021-02-14 22:56:29][INFO] : #393#=> Température : 4.04

non?

Avec Jeedom, comment puis-je debuger une array

$arrayValue

dans mon log, ou autrement. Peut-on utiliser print_r()?

Bon là sur le téléphone, lire ton code c’est pas simple… Tu peux mettre aussi du texte différent en fonction des lignes de debug parce que au moins on sait où c’est… Là par exemple deux fois ‹ #393# => › c’est bof.

Pour les array regarde les fonctions php : explose/implode ou var_dump

Je compte 3… Pas 4.
Affiche une ligne que permet de voir le début d’un tour de ta boucle.
Par ailleurs si ta boucle plante, elle doit produire une ligne dans les logs globaux (cmd scénario cron http)

Hello Naboleo

Je compte 3… Pas 4

Oui ne effet :grinning:

J’ai modifié mon code pour le log soit plus comprehensible en commentant une partie.
On voit que là, en effet, mon code ne plante plus.

cmdID = $scenario->getRealTrigger();

log::add("SmartBud","info",$cmdID."=> has been triggered");

//cmd::byString('#[Hutins][st-1][Alarm]#')->event(200);
//#[Hutins][st-1][Alarm]#

if($cmdID != "user") // The sclnario has not been trigger by an user
{
	$value = cmd::byString('#'.$cmdID.'#')->execCmd();
	log::add("SmartBud","info",$cmdID." : ".$value);
	$arrayValue = json_decode($value, true);
  	log::add("SmartBud","info","dev_id : ".$arrayValue['dev_id']);
  
  	//echo $scenario->setData($arrayValue['dev_id'], '0');
  		
  	$tags = $scenario->getTags();
  	$tags['#station#'] = $arrayValue['dev_id'];
 	log::add("SmartBud","info","Tag Station : ".$tags['#station#']);
  	$tags['#field#'] = 0;
  	$tags['#alarm#'] = 0;

	foreach($arrayValue['payload_fields'] as $key => $val){
		log::add("SmartBud","info","DEBUG => Sensor : ".$key);
      	if($key == "ba") 
    	{
      		$val = $val/100;
          	log::add("SmartBud","info","DEBUG => batterie : ".$val);
          	cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Batterie]#')->event($val);
          	$tags['#'.$key.'#'] = $val;
    	}
      
     	if($key == "b1" || $key == "b2" || $key == "b3" || $key == "b4")
    	{
          	
			$val = $val/10;
          	log::add("SmartBud","info","DEBUG => Température : ".$key.'=>'.$val);
          	$tags['#'.$key.'#'] = $val;
          	#cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].']['.$key.']#')->event($val);
          
          	// Thershold
          	if($val < 2)
            {
             	#cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(1);
          		$tags['#alarm#'] = 1;
              	log::add("SmartBud","info","DEBUG => #alarm# 1");
            }
            else
            {
              	#cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(0);
            	$tags['#alarm#'] = 0;
              	log::add("SmartBud","info","DEBUG => #alarm# 0");
            }
          #log::add("SmartBud","info",$cmdID."=> ".$key." : ".$val);
    	}	
    }
  
  	$scenario->setTags($tags);
}

Dans mon log, j’ai ceci

[2021-02-15 00:32:14][INFO] : #390#=> has been triggered
[2021-02-15 00:32:14][INFO] : #390# : {« app_id »:« leshutins »,« dev_id »:« st-5 »,« hardware_serial »:« 0000000000000005 »,« port »:1,« counter »:53,« payload_raw »:« AtNThzLTU0 »,« payload_fields »:{« b1 »:« -58 »,« b4 »:« -54 »,« ba »:« 398 »},« metadata »:{« time »:« 2021-02-14T23:32:13.448830269Z »,« frequency »:868.3,« modulation »:« LORA »,« data_rate »:« SF7BW125 »,« airtime »:61696000,« coding_rate »:« 4/5 »,« gateways »:[{« gtw_id »:« eui-58a0cb »,« timestamp »:1333147547,« time »:« 2021-02-14T23:32:13.435311079Z »,« channel »:0,« rssi »:-113,« snr »:-0.25,« rf_chain »:0}]}}
[2021-02-15 00:32:14][INFO] : dev_id : st-5
[2021-02-15 00:32:14][INFO] : Tag Station : st-5
[2021-02-15 00:32:14][INFO] : DEBUG => Sensor : b1
[2021-02-15 00:32:14][INFO] : DEBUG => Température : b1=>-5.8
[2021-02-15 00:32:14][INFO] : DEBUG => #alarm# 1
[2021-02-15 00:32:14][INFO] : DEBUG => Sensor : b4
[2021-02-15 00:32:14][INFO] : DEBUG => Température : b4=>-5.4
[2021-02-15 00:32:14][INFO] : DEBUG => #alarm# 1
[2021-02-15 00:32:14][INFO] : DEBUG => Sensor : ba
[2021-02-15 00:32:14][INFO] : DEBUG => batterie : 3.98

Ce qui m’interpelle, c’est que le tag Station a bien une valeur, mais dans les messages Télégram que je recois est toujours sans valeurs

Station
batterie LOW: V

N’est-ce pas ceci

$scenario->setTags($tags);

qui doit enregistrer les tag???

Maintenant, je pense que ceci

cmd::byString('#[SmartBud]['.$arrayValue["dev_id"].'][Alarm]#')->event(1);
(je ne connais pas trop cette commande)

doit être la source du plantage, mais qu’est-ce qu’il y a de faux???
Merci

Je crois avoir compris.

J’ai créé des equipements virtuels ou je deéfini des commandes, dont Alarm qui sera a 1 ou 0
un des equipements est nommé st-7. L’objet parent était SmartBud. Etant donné que j’ai une quinzaine d’équipement pour différents terrains, j’ai crée des objets enfants
SmartBud->Hutins->st-2. Je crois alors que la commande devrait être modifiée ainsi

cmd::byString(‹ #[SmartBud][Hutins][ ›.$arrayValue[« dev_id »].‹ ][Alarm]# ›)->event(1);

Le petit problème qui se pose, étant donné que j’ai maintenant des objets enfants sans avoir deux fois le même nom d’équipment, et que je souhaite gérer qu’un sécnario pour tous les clients, est-ce possible de cibler un équipement par son ID. Je suppose que sous Jeedom, chaque équipement a un ID unique?

Je pense que je vais résoudre mon premier problème, mais cela n’explique pas pourquoi les tag ne sont pas enregistrés

1 « J'aime »

Hello

Pourquoi vouloir repasser par les id jeedom ? Là tu arrives très bien à recomposer le nom complet… Si tu normalises les commandes Alarm etc, ça sera toujours le même debut de nom.
Le début de ton payload contient toutes infos : « app_id »:« leshutins »,« dev_id »:« st-5 »,

Attention également en fonction du temps de réalisation du scénario, deux appels peuvent se téléscoper et comme tags est global au scénario en question, ça crée des soucis.
Le plus simple c’est de faire un var_dump dans une ligne de logs… Au passage, ça sert à rien de transférer le contenu du payload dans les tags si c’est pour pas les utiliser ensuite (par exemple le tag alarm… Si tu fais la commande en question …)

Oui en effet, j’avais aussi pensé à reconstruire comme cela.

Au passage, ça sert à rien de transférer le contenu du payload dans les tags si c’est pour pas les utiliser ensuite (par exemple le tag alarm… Si tu fais la commande en question …)

Alors je les utilise tous sauf $tags[‹ #field# ›] = 0; que j’ai supprimé

Si le tag alarm est à 1, j’envoi les mesures de b1 et b4 en indiquant le nom de la station avec le tag Stationn

Si le tag batterie est inférieur à quelque chose, j’envoi un message avec le niveau de la batterie et le nom de la station

Je vais réfléchir a ce nommage d’équipement virtuel, mais meme si je le laisse commenter mes tag de sont pas sauvés

Ce n’est pas ceci

$scenario->setTags($tags);

qui doit les sauver pour les utilisés plus tard, dans un bloque?

C’est pareil si tu viens à recréer un objet/une commande et que l’id change… Donc en plus de devoir gérer les noms dans tes capteurs, tu dois aussi gérer les id dans jeedom et il n’y a aucun rapport.
Au moins dans un bloc code, tu peux tout à fait détecter que le nom n’est pas le bon (try/catch) et t’envoyer un message…

Si c’est bien ça
$tags = $scenario->getTags(); au début pour récupérer le contenu existant
$scenario->setTags($tags); à la fin pour le propager à la sortie du bloc code

Bref, fait une trace avec var_dump… ça sera déjà plus clair

Bonjour,
J’aimerais corriger mes écris.

En fait ca ne sert strictement à rien de cibler les ID, cas dans ma chaine json je récupère ces infirmation

« app_id »:« leshutins »,« dev_id »:« st-11 »
payload_fields":{« b1 »:« 50 »,« b4 »:« 59 »,« ba »:« 411 »}

Donc quelque soit l’ID de mon équipement, le nom de l’équipement doit correspondre à st-11, ou st-7, etc

C’est marrant parce que maintenant le nom de ma station est bien envoyé sur mon smartphone

Station st-7
Batterie LOW: 4.03V
(On est d’accord que 4.03, ce n’est pas low :grinning:)

Le problème que je dois réosudre, c’est bien cibler mon équipment st-7, par exemple.

J’ai créé un objet SmartBud
J’ai créé un obejet enfant à SmartBud leshutins
J’ai créé un équipement st-7 et comme objet parent, j’ai sélectionné leshutins

Sachant que
$arrayValue[« app_id » ] est égal à leshutins
$arrayValue[« dev_id »] est égal à st-7
$key est égal à b1, ou b4 (ou b2 ou b3)
J’ai donc essayé ceci

cmd::byString('#['.$arrayValue["app_id"].']['.$arrayValue["dev_id"].']['.$key.']#')->event($val)
cmd::byString('#[SmartBud]['.$arrayValue["app_id"].']['.$arrayValue["dev_id"].']['.$key.']#')->event($val)

Mais ca plante encore.
Comment puis-je alors bien cibler un euqipement virtuel, avec son nom (st-7) qui a pour objet parent ‹ leshutins › et donc ‹ leshutins › est enfant à l’objet ‹ SmartBud › ?

1 « J'aime »

C’est quoi son nom ?
Passe par le testeur d’expression et compare avec la chaine produite dans le scénario…


Pour moi il peut pas y avoir 4 niveaux juste 3 : objet/eqlogic/cmd
Donc ça cmd::byString('#[SmartBud]['.$arrayValue["app_id"].']['.$arrayValue["dev_id"].']['.$key.']#')->event($val) c’est pas bon

OK, j’ai trouvé!!!

Pour moi il peut pas y avoir 4 niveaux juste 3 : objet/eqlogic/cmd
Donc ça cmd::byString('#[SmartBud]['.$arrayValue["app_id"].']['.$arrayValue["dev_id"].']['.$key.']#')->event($val) c’est pas bon

Oui en effet, c’est juste, ma commande doit correspondre à, par exemple
#[leshutins][st-7][b1]#

Mon erreur était là, dans une de mes commande

cmd::byString('[#'.$arrayValue["app_id"].']['.$arrayValue["dev_id"].']['.$key.']#')->event($val);

alors que la ligne devait être écrite

cmd::byString('#['.$arrayValue["app_id"].']['.$arrayValue["dev_id"].']['.$key.']#')->event($val);
Le #

Je ne sais pas si c’est la que ça peut se jouer (jamais tester) ni comment ça fonctionne.

Capture d’écran du 2021-02-15 11-46-24