Ce Forum passera en lecture seule en janvier 2020
Image
Merci de vous rendre sur https://community.jeedom.com maintenant pour vos prochains postes ;)

Problèmes code PHP dans scénario

Réservé à la création de scénarios dans JEEDOM
Avatar de l’utilisateur
flowent59
Timide
Messages : 34
Inscription : 11 oct. 2015, 01:14
Localisation : Haute Normandie

Problèmes code PHP dans scénario

Message par flowent59 » 04 sept. 2019, 12:02

Bonjour,

Je me permet de vous solliciter sur un problème avec du code PHP.
Je vous prévient tout de suite, je suis débutant en PHP, j'ai commencé à chercher, mais je bloque un peu...

Voici la problématique:
Je pense que vous connaissez tous le plugin vigilance météo?!
C'est mon point de départ.
Je souhaite à partir de la commande d'info [Risque] du plugin (qui nous sort quelque chose comme ça: "orages jaune, vent violent orange, pluie-inondation rouge"), avoir une variable par risque avec sa couleur, pour avoir le niveau de vigilance de chacun des risques.
En gros, avoir ce genre de chose:
capture 1.JPG
capture 1.JPG (16.2 Kio) Consulté 244 fois
Dans un premier temps j'ai fait tout un bordel avec des blocs jeedom, mais plutot lourd... je me penche donc désormais sur la transposition en PHP.

Actuellement j'ai ce code:

Code : Tout sélectionner

$string = $scenario->getData(risques);

$array_risques = array("vent violent","pluie-inondation","orages","inondation","neige-verglas","canicule","grand-froid","vagues-submersion");
//$array_couleur = array("jaune","orange","rouge");

	foreach ($array_risques as $risque){
		if (preg_match("/\b$risque\b/i", $string)) {
  			$value = "Le mot a été trouvé";
		 } else {
   			 $value = "vert";
			}
$scenario->setData($risque, $value);
}
Et en fait ça fonctionne presque...
Sauf que ça me trouve le risque "inondation" dans le risque "pluie-inondation", alors que d'après ce que j'ai pu lire, les "\b" permettent de faire la recherche du mot strict. (peut-être n'ai-je pas eu la bonne source...)

En revanche, comme vous pourrez le voir j'ai préparé le tableau avec les couleurs que je veux tester. Sauf qu'au final je ne pense pas que je puisse arriver au résultat escompté...

Je ne vous demande pas de me donner la réponse, mais de m'aiguiller afin que je puisse me trouver sur la bonne voie. J'avance à tâtons dans ce nouveau monde que j'ai envie d'apprendre pour aller plus loin dans ma domotique.

Si les explications ne sont pas vraiment claires, n'hésitez pas à me demander d'éclaircir ma demande.

Par avance merci pour votre aide!
Raspberry pi 3 avec Razberry
Jeedom 3.3.31 sur disque dur USB

Avatar de l’utilisateur
flowent59
Timide
Messages : 34
Inscription : 11 oct. 2015, 01:14
Localisation : Haute Normandie

Re: Problèmes code PHP dans scénario

Message par flowent59 » 05 sept. 2019, 17:39

Bon je fais un petit point d'avancement.

J'ai creusé et j'ai modifié le code de sorte qu'il ressemble à ça maintenant:

Code : Tout sélectionner

$string = $scenario->getData(risques);
$tableau1 = explode(", ",$string);
$array_risques = array('vent violent','pluie-inondation','orages','inondation','neige-verglas','canicule','grand-froid','vagues-submersion');
$array_couleur = array('jaune','orange','rouge');

foreach ($tableau1 as $test){
	foreach ($array_risques as $risque){

		if (stripos($test,$risque) === 0) {
   			foreach ($array_couleur as $couleur_test){
   				if (preg_match("/$couleur_test/", $test)) {
   					print_r($risque.' : '.$couleur_test.' | ');	 
            	  	$scenario->setData($risque, $couleur_test);
    				}    
   				} 
		} else {
   			$scenario->setData($risque, 'vert');
   			}
	} 
}
Du coup c'est "presque" bon!
En fait si le commente le else j'ai bien les bon risques avec les bonnes couleurs, sauf que je n'ai pas les risques qui sont en vert.
Et si je le dé-commente, j'ai tous les risques en vert, sauf le dernier qui est trouvé qui lui a la bonne couleur.
Alors que le print_r me donne bien les risques concernés avec les bonnes couleurs.

J'en déduis donc que le else ne doit pas être à la bonne place... sauf que j'ai essayé de le remonter ou de le descendre et alors dans ces cas la plus rien ne fonctionne...

je suis un peu perdu la.
Raspberry pi 3 avec Razberry
Jeedom 3.3.31 sur disque dur USB

Avatar de l’utilisateur
flowent59
Timide
Messages : 34
Inscription : 11 oct. 2015, 01:14
Localisation : Haute Normandie

Re: Problèmes code PHP dans scénario

Message par flowent59 » 06 sept. 2019, 13:29

Bon voici le code que j'ai au final, je pense que pas ce soit le plus propre mais en tout cas c'est la seule façon que j'ai trouvé pour que ça fonctionne.

Code : Tout sélectionner

//DEBUG ON
$cmd = cmd::byString("#[maison][76][Risque]#");
$string = $cmd -> execCmd();
//$string = $scenario -> getData(risques);
$tableau1 = explode(", ", $string);
$array_risques = array('vent violent', 'pluie-inondation', 'orages', 'inondation', 'neige-verglas', 'canicule', 'grand-froid', 'vagues-submersion');
$array_couleur = array('jaune', 'orange', 'rouge');
//print_r($tableau1);
foreach($tableau1 as $test) {

    foreach($array_risques as $risque) {

        if (stripos($test, $risque) === 0) {

            foreach($array_couleur as $couleur_test) {

                if (preg_match("/$couleur_test/", $test)) {

                    $scenario -> setData($risque, $couleur_test);
                }
            }
         } else {
                    $scenario -> setData($risque, 'vert');
                }
    }
}

foreach($tableau1 as $test) {

    foreach($array_risques as $risque) {

        if (stripos($test, $risque) === 0) {

            foreach($array_couleur as $couleur_test) {

                if (preg_match("/$couleur_test/", $test)) {

                    $scenario -> setData($risque, $couleur_test);
                }
            }
        }
    }
}
Si quelqu'un passant par ici avait de quoi le rendre plus propre je suis preneur...

Et si ça peut servir à d'autres personnes, ben tant mieux!
Raspberry pi 3 avec Razberry
Jeedom 3.3.31 sur disque dur USB

winhex
Actif
Messages : 3793
Inscription : 23 janv. 2015, 01:41

Re: Problèmes code PHP dans scénario

Message par winhex » 06 sept. 2019, 17:50

bonjour
je regardais hier (mon niveau n'est pas plus haut)
moi je suis partis
par créé un tableau avec les keys (condition)
les valeurs pour les couleurs

tu utilises les conditions en valeurs
et clefs 0,1,2,..
avec pour soucis de se lancé (plein de foreach) par le nombre de risque, risque, couleur,..

exemple ton script en remplacement 3 conditions de risques

Code : Tout sélectionner

$string = 'orages jaune, vent violent orange, pluie-inondation rouge';
et enregistrement log

Code : Tout sélectionner

                  $scenario->setLog($risque." : ".$couleur_test);
[2019-09-06 17:49:35][SCENARIO] Start : Scenario lance manuellement.
[2019-09-06 17:49:35][SCENARIO] Exécution du sous-élément de type [action] : code
[2019-09-06 17:49:35][SCENARIO] Exécution d'un bloc code
[2019-09-06 17:49:35][SCENARIO] vent violent : vert
[2019-09-06 17:49:35][SCENARIO] pluie-inondation : vert
[2019-09-06 17:49:35][SCENARIO] orages : jaune
[2019-09-06 17:49:35][SCENARIO] inondation : vert
[2019-09-06 17:49:35][SCENARIO] neige-verglas : vert
[2019-09-06 17:49:35][SCENARIO] canicule : vert
[2019-09-06 17:49:35][SCENARIO] grand-froid : vert
[2019-09-06 17:49:35][SCENARIO] vagues-submersion : vert
[2019-09-06 17:49:35][SCENARIO] vent violent : orange
[2019-09-06 17:49:35][SCENARIO] pluie-inondation : vert
[2019-09-06 17:49:35][SCENARIO] orages : vert
[2019-09-06 17:49:35][SCENARIO] inondation : vert
[2019-09-06 17:49:35][SCENARIO] neige-verglas : vert
[2019-09-06 17:49:35][SCENARIO] canicule : vert
[2019-09-06 17:49:36][SCENARIO] grand-froid : vert
[2019-09-06 17:49:36][SCENARIO] vagues-submersion : vert
[2019-09-06 17:49:36][SCENARIO] vent violent : vert
[2019-09-06 17:49:36][SCENARIO] pluie-inondation : rouge
[2019-09-06 17:49:36][SCENARIO] orages : vert
[2019-09-06 17:49:36][SCENARIO] inondation : vert
[2019-09-06 17:49:36][SCENARIO] neige-verglas : vert
[2019-09-06 17:49:36][SCENARIO] canicule : vert
[2019-09-06 17:49:36][SCENARIO] grand-froid : vert
[2019-09-06 17:49:36][SCENARIO] vagues-submersion : vert
[2019-09-06 17:49:36][SCENARIO] orages : jaune
[2019-09-06 17:49:36][SCENARIO] vent violent : orange
[2019-09-06 17:49:36][SCENARIO] pluie-inondation : rouge
[2019-09-06 17:49:36][SCENARIO] Fin correcte du scénario
donc tu enregistres 3 fois tes variables + 1 fois pour le risque
autant tous mettre au vert
et boucle sur risque
ça t'evitera 2 fois pour rien

ps tu devrais faire directement un Event
une variable c'est plus long

donc pour moi
1 sur le retour inscrire le tableau
key, valeur
orages,rouge
2 sur l'intégralité
si la condition n'est pas répertoriés
l'ajouter en key avec la valeur vert

2 étant le seul foreach

les fonctions tableau regorge de possibilités
https://www.php.net/manual/fr/book.array.php
ça me permet de les découvrir avec un exemple

Avatar de l’utilisateur
flowent59
Timide
Messages : 34
Inscription : 11 oct. 2015, 01:14
Localisation : Haute Normandie

Re: Problèmes code PHP dans scénario

Message par flowent59 » 06 sept. 2019, 19:34

Bonjour winhex!

Déjà merci de prendre le temps de me répondre!
donc tu enregistres 3 fois tes variables + 1 fois pour le risque
autant tous mettre au vert
et boucle sur risque
ça t'evitera 2 fois pour rien
Je suis entièrement d'accord! je m'en été rendu compte lors de mes test, si je commentais le else qui mets en vert alors j'avais bien tous les risques présent avec la bonne couleur, mais du coup je n'avais pas les risques en vert. Et si je commentais le alors mais pas le else, dans ce cas j'avais tous les risques en vert, sauf le dernier risque présent dans $string qui lui avait la bonne couleur. c'est avec ça et en faisant des sorties dans le log 'scenario_execution' que je l'ai remarqué.
moi je suis partis
par créé un tableau avec les keys (condition)
les valeurs pour les couleurs
Cette option la j'y ai pensé également hier quand je me suis rendu donc de ce que j'explique juste au dessus. Dans les bouts de code que j'ai mis j'ai retiré des trucs pour ne garder que l'essentielle, sinon il y avait aussi des $i = 0 et $i++. sauf que je visualisais bien la finalité, mais j'ai eu du mal à la mettre en oeuvre... du coup c'est pour ça que j'ai simplement dupliqué tout le code en retirant le else dans la deuxième partie. J'avoue, par simplicité! Néanmoins je ne m'interdit pas d'y revenir pour l'optimiser.

Que sont les Event dont tu parles? je ne connais pas et je ne vois pas bien le but de cette fonction dans le cas présent?!
Raspberry pi 3 avec Razberry
Jeedom 3.3.31 sur disque dur USB

winhex
Actif
Messages : 3793
Inscription : 23 janv. 2015, 01:41

Re: Problèmes code PHP dans scénario

Message par winhex » 06 sept. 2019, 20:03

on peux faire des whiles aussi
regarde les exemples
https://www.php.net/manual/fr/function.key.php
--
tous les risques en key et pour valeur vert

Code : Tout sélectionner

$result=array_fill_keys($array_risques,"vert");
foreach ($result as $results => $value ){
      $scenario->setLog($results." : ".$value); 
   }
--'
tu assignes une valeur à une variable
et ensuite j'imagine (vu ton rendu voulu) une cmd info avec ta variable

un event assigne directement
cmd info avec ton info
tu peux tres bien comme pour ta variable
[objet][equipement][$risque]

Pour modifier une valeur
viewtopic.php?f=32&t=20037&hilit=tuto+code#p356753

Avatar de l’utilisateur
flowent59
Timide
Messages : 34
Inscription : 11 oct. 2015, 01:14
Localisation : Haute Normandie

Re: Problèmes code PHP dans scénario

Message par flowent59 » 06 sept. 2019, 20:27

on peux faire des whiles aussi
Effectivement, le while me plait bien aussi!
Pour le moment je vais garder ce que j'ai fais, mais je pense revenir dessus assez vite. (je prépare mon déménagement en parallèle)
tu assignes une valeur à une variable
et ensuite j'imagine (vu ton rendu voulu) une cmd info avec ta variable
En fait, l'idée derrière n'est pas de faire de l'affichage, le widget vigilance météo le fait très bien.
C'est plutôt d'avoir le niveau de vigilance de chaque risque pour avoir un suivi de l'évolution et recevoir des notifications adaptées.
J'ai par exemple à terme l'idée de notifier par mail, les membres du foyer (et pourquoi pas de la famille dans le département) informations propres à chaque risques que l'on peut retrouver ici.
Raspberry pi 3 avec Razberry
Jeedom 3.3.31 sur disque dur USB

winhex
Actif
Messages : 3793
Inscription : 23 janv. 2015, 01:41

Re: Problèmes code PHP dans scénario

Message par winhex » 06 sept. 2019, 23:52

je m'arrête là

même si je pige pas tous (exemple value qui se réinitialise bien "vert", alors que pour moi il ne devrait pas et devoir faire un sinon)
baste
vu que ça fait le taf

Code : Tout sélectionner

$string = 'neige-verglas jaune, vent violent orange, pluie-inondation rouge, grand-froid jaune';
$tableau1 = explode(", ",$string);

$array_risques = array('vent violent','pluie-inondation','orages','inondation','neige-verglas','canicule','grand-froid','vagues-submersion');
$result=array_fill_keys($array_risques,"vert");

	foreach ($result as $results => $value ){
      foreach ($tableau1 as $test){
$str =strval($test);
 $derniermot=substr($str,strrpos($str,' ')+1);
$texte=str_replace(' '.$derniermot,"", $str);

//$scenario->setLog($texte.' : '.$derniermot);
          if ($results == $texte) {
                $value=$derniermot;}    
              } 
  
      $scenario->setLog($results." : ".$value); 
   }
[2019-09-06 23:49:29][SCENARIO] Start : Scenario lance manuellement.
[2019-09-06 23:49:29][SCENARIO] Exécution du sous-élément de type [action] : code
[2019-09-06 23:49:29][SCENARIO] Exécution d'un bloc code
[2019-09-06 23:49:29][SCENARIO] vent violent : orange
[2019-09-06 23:49:29][SCENARIO] pluie-inondation : rouge
[2019-09-06 23:49:29][SCENARIO] orages : vert
[2019-09-06 23:49:29][SCENARIO] inondation : vert
[2019-09-06 23:49:29][SCENARIO] neige-verglas : jaune
[2019-09-06 23:49:29][SCENARIO] canicule : vert
[2019-09-06 23:49:29][SCENARIO] grand-froid : jaune
[2019-09-06 23:49:29][SCENARIO] vagues-submersion : vert
[2019-09-06 23:49:29][SCENARIO] Fin correcte du scénario

Répondre

Revenir vers « Scénarios »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités