[Tuto code] : Des conseils vocaux selon la météo

Réservé à la création de scénarios dans JEEDOM
Avatar de l’utilisateur
Tauks
Actif
Messages : 621
Inscription : 04 avr. 2015, 19:57
Localisation : Strasbourg

[Tuto code] : Des conseils vocaux selon la météo

Message par Tauks » 23 août 2016, 20:57

Hello les codeurs en folie,

Vous le savez, Jeedom est une mère pour moi. Elle me réveille, prépare le café avant que je me lève, me rappelle de prendre mes médocs selon mon heure de réveil etc. Bref, dit autrement, j'essaie d'éradiquer au maximum les boutons/interrupteurs et que la domotique anticipe mes besoins ou comble mes lacunes.
Depuis que j'ai réussi à faire fonctionner le plugin PlayTTS de text-to-speach (TTS) de @lunarok, je retrouve les joies de me replonger dans les commandes vocales. Même si je les ai aussi implémentées, j'essaie d'aller plus loin que les commandes qui me disent "la porte de la maison est ouverte". Par exemple, on pourrait être tenté de se créer un bulletin météo mais ce serait tout de même mieux si la box donnait des conseils en fonction de cette météo. C'est ce que je vous propose dans ce tuto.
Pour cela il nous faut "un seul" scénario.

Déclenchement
Une première pirouette se trouve dans son déclenchement. En effet, je souhaite que la box me parle mais pas dès que je passe devant un Sauron, sinon ma femme va me l'envoyer à la tête. Je souhaite que la box me parle, certes, mais une fois le matin. Mais comme elle ne sait pas quand je vais passer devant un Sauron et que je ne veux pas qu'elle se déclenche à 3h du mat' quand je vais filer son bib' au bébé, je déclare certes ce scénario en déclenché il mais n'est activé qu'à 6h et désactivé par lui-même après exécution. Donc le scénario se déclenchera bien la première fois que je passe devant un capteur mais pas avant 6h. Pour celà, j'ai un scénario maître qui est le grand horloger de ma journée (calcul du réveil, des bornes de soleil de la journée pour activer les scénarios de lumière, etc). Dans ce scénario, j'ai donc un bloc de type "A:" ou j'ai pour seule commande d'activer mon scénario de bulletin météo à 6h. Au risque de me répéter, je ne fais ici que l'activer, il pourra très bien se déclencher à 6h20 selon quand je passe devant le capteur.

Construction de conseils
J'ai assez bien commenté le code ci-dessous donc je ne vais énoncer ici que les grands principes : récupération de deux commandes : la condition (beau, pluvieux, averses) et la température maximale de la journée. Je laisse à votre imagination le soin de faire mieux avec d'autres commandes. En attendant que le plugin Weather soit un peu plus fourni, j'utilise l'excellent plugin forecast.io de @lunarok (et oui, encore lui !). Après avoir créé mon objet météo, je relève les ID des deux commandes susmentionnées. Dans mon code ce sont les 3060 et 3061. Je vais alors décortiquer les textes et les chiffres pour en tirer des conseils de deux types : ce qu'il faut prendre avec soi et ce qu'il faut éviter de faire. la encore, faites vous plais' à enrichir. Le but ultime de ce premier bloc du scénario (bloc code) est de constituer une phrase flexible et bien construite puis la stocker dans une variable. Voici le code

Code : Tout sélectionner

// Récupération des valeurs de condition et température
// ====================================================
$cmd = cmd::byId(3061);
$condition_jour = $cmd->execCmd();
$cmd = cmd::byId(3060);
$temperature_max_jour = $cmd->execCmd();
//
// Déclaration des tableaux de conseils
// ====================================
$conseils_prendre = array();
$conseils_eviter = array();
//
// Construction d'un début de phrase différent selon que la condition soit un nom ou un adjectif
// =============================================================================================
$phrase_conseils = "... Bonjour, aujourd'hui ";
if (preg_match("/^([A-z]*)s\s/i",trim($condition_jour))) {
	$phrase_conseils .= "la météo sera constituée de ";
} else {
	$phrase_conseils .= "le temps sera ";
}
//
// Ajout de la condition du jour et de la température à la phrase
// ==============================================================
$phrase_conseils .= $condition_jour;
$phrase_conseils .= ", avec des températures allant jusqu'à ".round($temperature_max_jour,0)." degrés. ";
//
// Analyse de la condition du jour par expressions régulières
// ==========================================================
if (preg_match("/pluie|bruine|précipitation/i",$condition_jour)) {
 	 $type_condition = "pluie";
} elseif (preg_match("/soleil|beau/i",$condition_jour)) {
 	 $type_condition = "soleil";  
} elseif (preg_match("/eige/i",$condition_jour)) {
 	 $type_condition = "neige";  
} elseif (preg_match("/nuage|couvert/i",$condition_jour)) {
 	 $type_condition = "nuageux";  
}
//
// Analyse de la température max par tranches
// ==========================================
if ($temperature_max_jour <= 0) {
 	 $type_temperature = "grand_froid";
} elseif ($temperature_max_jour <= 10) { 
 	 $type_temperature = "froid";  
} elseif ($temperature_max_jour <= 20) {
 	 $type_temperature = "pas chaud";   
} elseif ($temperature_max_jour <= 25) {
  	 $type_temperature = "bon";    
} elseif ($temperature_max_jour <= 30) {
  	 $type_temperature = "chaud";    
} elseif ($temperature_max_jour <= 35) {
   	 $type_temperature = "très chaud";  
} else {
   	 $type_temperature = "canicule";   
}
//
// Construction des conseils selon les types définis ci-dessus
// ===========================================================
if ($type_temperature == "grand froid" || $type_condition == "neige") {
	$conseils_prendre[] = "des gants";
	$conseils_prendre[] = "un gros manteau"; 
	$conseils_eviter[] = "les plaques de verglas"; 
}
if ($type_condition == "pluie") {
	$conseils_prendre[] = "un parapluie";
  	$conseils_prendre[] = "des chaussures imperméables";
	$conseils_eviter[] = "les flaques d'eau"; 
	$conseils_eviter[] = "l'aquaplanning"; 
}
if ($type_condition == "soleil") {
	$conseils_prendre[] = "des lunettes de soleil";
}
if ($type_temperature == "chaud" || $type_temperature == "très chaud" || $type_temperature == "canicule") {
	$conseils_prendre[] = "à boire";
  	$conseils_prendre[] = "de la crême solaire";
}
if ($type_temperature == "très chaud" || $type_temperature == "canicule") {
	$conseils_eviter[] = "le soleil aux heures dangereuses";  
}
if ($type_condition == "nuageux") {
	$conseils_prendre[] = "un antidépresseur";  
}
// Transformation des tableaux en éléments de phrases
// ==================================================
$nb_conseils_prendre = sizeof($conseils_prendre);
if ($nb_conseils_prendre>0) {
  $phrase_conseils .= "Pensez à prendre ";
  foreach ($conseils_prendre as $key=>$conseil) {
    if ($key !== $nb_conseils_prendre - 1 || $nb_conseils_prendre == 1) {
      	// si un seul conseil ou pas le dernier, on concatène le conseil et une virgule
		$phrase_conseils .= "$conseil, ";
    } else {
      	// en cas de dernier élément du tableau, on vire la virgule et on lie par un 'et'
      	$phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
		$phrase_conseils .= " et $conseil.";     
    }
  }
  // on vire toute virgule finale qui trainterait
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} else {
	$phrase_conseils = "";
}
// Rebelote avec les choses à éviter
$nb_conseils_eviter = sizeof($conseils_eviter);          
if ($nb_conseils_prendre > 0) {
  	if ($nb_conseils_eviter > 0) {
		$phrase_conseils .= "En revanche, pensez à éviter ";
    } 
} elseif ($nb_conseils_eviter>0) {
     $phrase_conseils .= "Pensez à éviter ";
}
if ($nb_conseils_eviter>0) {
  foreach ($conseils_eviter as $key=>$conseil) {
    if ($key !== $nb_conseils_eviter - 1 || $nb_conseils_eviter == 1) {
		$phrase_conseils .= "$conseil, ";
    } else {
        $phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
		$phrase_conseils .= " et $conseil.";     
    }
  }
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} 
// Stockage dans une variable qu'on utilisera avec le TTS
// ======================================================        
$scenario->setData("meteo_conseiljour",$phrase_conseils);
Construction de l'alerte
L'alerte est très simple puisqu'elle consiste à ajouter une commande TTS dans un bloc Action et de lui faire dire variable(meteo_conseiljour,0) . Il suffit enfin d'ajouter une commande de type scénario à ce bloc et dans cette commande dire que le scénario se désactive. Il sera réactivé par le grand horloger de votre nuit. Chez moi ce dernier s’exécute à 1h du mat' et réactive ce scénario de bulletin météo à... Quelle heure ? Ceux qui suivent ? Six heures !
Capture du 2016-08-23 20-54-45.png
Capture du 2016-08-23 20-54-45.png (28.23 Kio) Consulté 2016 fois
On peut, en complément, imaginer un autre scénario au déclenchement similaire qui renvoie l’essentiel mais en notification push (plugin pushbullet) sur smartphone à l'ouverture de la porte pour partir. "Avez-vous le parapluie ?".

Voilou, à vous de jouer, be creative !
Dernière édition par Tauks le 27 août 2016, 18:33, édité 2 fois.
Box: RPi3 ZW+/RFXCom
Mon matériel: ici
Mes tutos: ici

Avatar de l’utilisateur
bobeponge14
Timide
Messages : 292
Inscription : 15 mai 2015, 17:25
Localisation : Calvados Caen

Re: [Tuto code] : Des conseils selon la météo

Message par bobeponge14 » 23 août 2016, 21:38

Sympa le partage

ce soir canicule penser à prendre bière, éviter moustique !
Production : Jeedom Diy VM sur Proxmox
Dev/test: Jeedom Diy VM sur Virtual Box
Plugin : wifismartplug

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

Re: Re : [Tuto code] : Des conseils selon la météo

Message par winhex » 23 août 2016, 22:49

lu mis de côté pour quand j'aurai un hp ou pour inspiration.
et j'etais déjà repartis ailleurs, mais j'ai omis une chose.

merci pour le partage.

Avatar de l’utilisateur
Tauks
Actif
Messages : 621
Inscription : 04 avr. 2015, 19:57
Localisation : Strasbourg

Re: [Tuto code] : Des conseils selon la météo

Message par Tauks » 24 août 2016, 07:32

Comme dit, on peut remplacer le tts par du push :)

Envoyé de mon YOGA Tablet 2-830L en utilisant Tapatalk
Box: RPi3 ZW+/RFXCom
Mon matériel: ici
Mes tutos: ici

totovaauski
Actif
Messages : 4301
Inscription : 05 juil. 2014, 11:21

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par totovaauski » 24 août 2016, 11:29

Encore un tuto plein d'info, merci beaucoup !!

Juste une variante :
tu fais appel au ID pour les commandes,

Code : Tout sélectionner

// Récupération des valeurs de condition et température
// ====================================================
$cmd = cmd::byId(3061);
$condition_jour = $cmd->execCmd();
y'a aussi cette syntaxe qui reste , a mon avis, plus "compréhensible"

Code : Tout sélectionner

$Item1 = '#[INFO LOCAL][CHEZ MOI][Condition]#';
$CMD_Item1 = cmd::byString($Item1);
$S_Item1 = $CMD_Item1->execCmd();
Mais ca marche tout aussi bien !!
RPI3 + Dongle Aeon
Jeedom sur : Raspberry Pi + Raspberry compute
Mysensors , z-wave, xiaomi ...

https://www.youtube.com/watch?v=-bjbUg9d64g
https://www.youtube.com/watch?v=GPj1ozB ... _b-Toq47NQ

Avatar de l’utilisateur
pascal
Actif
Messages : 637
Inscription : 19 août 2014, 20:57
Contact :

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par pascal » 24 août 2016, 13:49

Très bon partage merci.
Effectivement la syntaxe avec les ## est meilleur car il me semble qu'en cas de renommage de la commande les ids suivront tout seul
En tout cas je vais sûrement tester
Merci encore

écrit avec mes doigts et tapatra

Avatar de l’utilisateur
pascal
Actif
Messages : 637
Inscription : 19 août 2014, 20:57
Contact :

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par pascal » 24 août 2016, 14:26

Je viens de tester, ca marche nickel, et il me recommande de boire et de prendre de la creme solaire :)

j'ai bien remplacé le code

Code : Tout sélectionner

$cmd = cmd::byId(3061);
$condition_jour = $cmd->execCmd();
$cmd = cmd::byId(3060);
$temperature_max_jour = $cmd->execCmd();
Par

Code : Tout sélectionner

$cmd = cmd::byString('#[Domicile][Meteo][Condition]#');
$condition_jour = $cmd->execCmd();
$cmd = cmd::byString('#[Domicile][Meteo][Température Maximum Apparente]#');
$temperature_max_jour = $cmd->execCmd();
Merci

chris6783
Timide
Messages : 161
Inscription : 07 juin 2016, 22:42
Localisation : Var

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par chris6783 » 24 août 2016, 15:08

Cool le partage
Pas encore de tts mais je bookmark
Merci

Avatar de l’utilisateur
Sshafi
Actif
Messages : 5055
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par Sshafi » 24 août 2016, 17:03

Merci pour le partage et hop dans le post trucs et astuces ;)
ßêta-Testeur Jeedom
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...

Charte du Forum | Règles | Présentez vous | Trucs & Astuces

Avatar de l’utilisateur
Tauks
Actif
Messages : 621
Inscription : 04 avr. 2015, 19:57
Localisation : Strasbourg

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par Tauks » 24 août 2016, 17:22

pascal a écrit :Très bon partage merci.
Effectivement la syntaxe avec les ## est meilleur car il me semble qu'en cas de renommage de la commande les ids suivront tout seul
En tout cas je vais sûrement tester
Merci encore

écrit avec mes doigts et tapatra
En fait c'est le contraire. Si tu changes le nom de ta commande dans l'objet, mon script marchera encore. Par contre, ceux qui se basent sur un ByString ne marcheront plus :). Pour ça que je prends toujours les ID même si c'est moins parlant à la lecture.
Box: RPi3 ZW+/RFXCom
Mon matériel: ici
Mes tutos: ici

romanais
Actif
Messages : 1083
Inscription : 21 août 2014, 21:36
Localisation : Drôme

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par romanais » 24 août 2016, 17:25

Super intéressant, merci pour le partage !
Merci à toute l'équipe pour le taf

Mon matériel

fred59190
Timide
Messages : 239
Inscription : 26 janv. 2016, 10:13

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par fred59190 » 25 août 2016, 22:22

Bonjour @Tauks

je seche...
j'ai bien ajouter un bloc code, copier coller ton code,
remplacer les ID par les miens, j execute la variable se crée mais reste vide,
du coup j ai essayé le poste du dessous avec "meteo,domicile..."
j execute idem, la variable reste vide

ai je oublié quelque chose?

Avatar de l’utilisateur
Tauks
Actif
Messages : 621
Inscription : 04 avr. 2015, 19:57
Localisation : Strasbourg

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par Tauks » 25 août 2016, 22:30

Peux tu copier coller ton code ? S'il est identique c'est peut être que tes id de commande ne sont pas bons ou ne renvoient rien. Quand tu vas sur ton objet météo et que tu clic sur le bouton tester de la commande, tu as qqch ? Envoie déjà ton code ici et selon, je pourrai te proposer une variante du code pour vérifier.

Envoyé de mon YOGA Tablet 2-830L en utilisant Tapatalk
Box: RPi3 ZW+/RFXCom
Mon matériel: ici
Mes tutos: ici

nicocha
Timide
Messages : 116
Inscription : 06 avr. 2015, 08:50

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par nicocha » 26 août 2016, 13:10

fred59190 a écrit :Bonjour @Tauks

je seche...
j'ai bien ajouter un bloc code, copier coller ton code,
remplacer les ID par les miens, j execute la variable se crée mais reste vide,
du coup j ai essayé le poste du dessous avec "meteo,domicile..."
j execute idem, la variable reste vide

ai je oublié quelque chose?
Salut,
J'ai remarquer une petite erreur dans le code, j'ai eu le même soucie.
Voici le code corrigé.

Code : Tout sélectionner

// Récupération des valeurs de condition et température
// ====================================================
$cmd = cmd::byId(3169);
$condition_jour = $cmd->execCmd();
//$scenario->setData("debug",$condition_jour);

$cmd = cmd::byId(3168);
$temperature_max_jour = $cmd->execCmd();
//
// Déclaration des tableaux de conseils
// ====================================
$conseils_prendre = array();
$conseils_eviter = array();
//
// Construction d'un début de phrase différent selon que la condition soit un nom ou un adjectif
// =============================================================================================
$phrase_conseils = "... Bonjour, aujourd'hui ";
if (preg_match("/^([A-z]*)s\s/i",trim($condition_jour))) {
   $phrase_conseils .= "la météo sera constituée de ";
} else {
   $phrase_conseils .= "le temps sera ";
}
//
// Ajout de la condition du jour et de la température à la phrase
// ==============================================================
$phrase_conseils .= $condition_jour;
$phrase_conseils .= ", avec des températures allant jusqu'à ".round($temperature_max_jour,0)." degrés. ";

//
// Analyse de la condition du jour par expressions régulières
// ==========================================================
if (preg_match("/pluie|bruine|précipitation/i",$condition_jour)) {
     $type_condition = "pluie";
} elseif (preg_match("/soleil|beau/i",$condition_jour)) {
     $type_condition = "soleil";  
} elseif (preg_match("/eige/i",$condition_jour)) {
     $type_condition = "neige";  
} elseif (preg_match("/nuage|couvert/i",$condition_jour)) {
     $type_condition = "nuageux";  
}
//
// Analyse de la température max par tranches
// ==========================================
if ($temperature_max_jour <= 0) {
     $type_temperature = "grand_froid";
} elseif ($temperature_max_jour <= 10) { 
     $type_temperature = "froid";  
} elseif ($temperature_max_jour <= 20) {
     $type_temperature = "pas chaud";   
} elseif ($temperature_max_jour <= 25) {
      $type_temperature = "bon";    
} elseif ($temperature_max_jour <= 30) {
      $type_temperature = "chaud";    
} elseif ($temperature_max_jour <= 35) {
       $type_temperature = "très chaud";  
} else {
       $type_temperature = "canicule";   
}

//
// Construction des conseils selon les types définis ci-dessus
// ===========================================================
if ($type_temperature == "grand froid" || $type_condition == "neige") {
   $conseils_prendre[] = "des gants";
   $conseils_prendre[] = "un gros manteau"; 
   $conseils_eviter[] = "les plaques de verglas"; 
}
if ($type_condition == "pluie") {
   $conseils_prendre[] = "un parapluie";
     $conseils_prendre[] = "des chaussures imperméables";
   $conseils_eviter[] = "les flaques d'eau"; 
   $conseils_eviter[] = "l'aquaplanning"; 
}
if ($type_condition == "soleil") {
   $conseils_prendre[] = "des lunettes de soleil";
}
if ($type_temperature == "chaud" || $type_temperature == "très chaud" || $type_temperature == "canicule") {
   $conseils_prendre[] = "à boire";
     $conseils_prendre[] = "de la crême solaire";
}
if ($type_temperature == "très chaud" || $type_temperature == "canicule") {
   $conseils_eviter[] = "le soleil aux heures dangereuses";  
}
if ($type_condition == "nuageux") {
   $conseils_prendre[] = "un antidépresseur";  
}

// Transformation des tableaux en éléments de phrases
// ==================================================
$nb_conseils_prendre = sizeof($conseils_prendre);
if ($nb_conseils_prendre>0) {
  $phrase_conseils .= "Pensez à prendre ";
  foreach ($conseils_prendre as $key=>$conseil) {
    if ($key !== $nb_conseils_prendre - 1 || $nb_conseils_prendre == 1) {
         // si un seul conseil ou pas le dernier, on concatène le conseil et une virgule
      $phrase_conseils .= "$conseil, ";
    } else {
         // en cas de dernier élément du tableau, on vire la virgule et on lie par un 'et'
         $phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
      $phrase_conseils .= " et $conseil.";     
    }
  }
  // on vire toute virgule finale qui trainterait
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} else {
   $phrase_conseils = "";
}
// Rebelote avec les choses à éviter
$nb_conseils_eviter = sizeof($conseils_eviter);          
if ($nb_conseils_prendre > 0) {
     if ($nb_conseils_eviter > 0) {
      $phrase_conseils .= "En revanche, pensez à éviter ";
    } 
} elseif ($nb_conseils_eviter>0) {
     $phrase_conseils .= "Pensez à éviter ";
}
if ($nb_conseils_eviter>0) {
  foreach ($conseils_eviter as $key=>$conseil) {
    if ($key !== $nb_conseils_eviter - 1 || $nb_conseils_eviter == 1) {
      $phrase_conseils .= "$conseil, ";
    } else {
        $phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
      $phrase_conseils .= " et $conseil.";     
    }
  }
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} 
// Stockage dans une variable qu'on utilisera avec le TTS
// ======================================================        
$scenario->setData("meteo_conseiljour",$phrase_conseils);
Sur certain test pour crée la phrase, la variable utilisé n'etait pas la bonne.

coulox
Timide
Messages : 323
Inscription : 15 sept. 2014, 12:37
Localisation : Paris

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par coulox » 26 août 2016, 14:11

merci pour le partage ^^
DIY : PC ATOM X86 (DEBIAN) (Jeedom) + razpberry
RPI 2 (Jeedom) + GCE teleinfo + TTS
Tablette nexus 7 mural (IHM avec design jeedom de F$B33)
Zwave modules : 1 Greenwave multiprise, 5 FGMS-001, 3 FGK-101, 3 FGRM-222

Avatar de l’utilisateur
Tauks
Actif
Messages : 621
Inscription : 04 avr. 2015, 19:57
Localisation : Strasbourg

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par Tauks » 26 août 2016, 17:02

nicocha a écrit :
fred59190 a écrit :Bonjour @Tauks

je seche...
j'ai bien ajouter un bloc code, copier coller ton code,
remplacer les ID par les miens, j execute la variable se crée mais reste vide,
du coup j ai essayé le poste du dessous avec "meteo,domicile..."
j execute idem, la variable reste vide

ai je oublié quelque chose?
Salut,
J'ai remarquer une petite erreur dans le code, j'ai eu le même soucie.
Voici le code corrigé.

Code : Tout sélectionner

// Récupération des valeurs de condition et température
// ====================================================
$cmd = cmd::byId(3169);
$condition_jour = $cmd->execCmd();
//$scenario->setData("debug",$condition_jour);

$cmd = cmd::byId(3168);
$temperature_max_jour = $cmd->execCmd();
//
// Déclaration des tableaux de conseils
// ====================================
$conseils_prendre = array();
$conseils_eviter = array();
//
// Construction d'un début de phrase différent selon que la condition soit un nom ou un adjectif
// =============================================================================================
$phrase_conseils = "... Bonjour, aujourd'hui ";
if (preg_match("/^([A-z]*)s\s/i",trim($condition_jour))) {
   $phrase_conseils .= "la météo sera constituée de ";
} else {
   $phrase_conseils .= "le temps sera ";
}
//
// Ajout de la condition du jour et de la température à la phrase
// ==============================================================
$phrase_conseils .= $condition_jour;
$phrase_conseils .= ", avec des températures allant jusqu'à ".round($temperature_max_jour,0)." degrés. ";

//
// Analyse de la condition du jour par expressions régulières
// ==========================================================
if (preg_match("/pluie|bruine|précipitation/i",$condition_jour)) {
     $type_condition = "pluie";
} elseif (preg_match("/soleil|beau/i",$condition_jour)) {
     $type_condition = "soleil";  
} elseif (preg_match("/eige/i",$condition_jour)) {
     $type_condition = "neige";  
} elseif (preg_match("/nuage|couvert/i",$condition_jour)) {
     $type_condition = "nuageux";  
}
//
// Analyse de la température max par tranches
// ==========================================
if ($temperature_max_jour <= 0) {
     $type_temperature = "grand_froid";
} elseif ($temperature_max_jour <= 10) { 
     $type_temperature = "froid";  
} elseif ($temperature_max_jour <= 20) {
     $type_temperature = "pas chaud";   
} elseif ($temperature_max_jour <= 25) {
      $type_temperature = "bon";    
} elseif ($temperature_max_jour <= 30) {
      $type_temperature = "chaud";    
} elseif ($temperature_max_jour <= 35) {
       $type_temperature = "très chaud";  
} else {
       $type_temperature = "canicule";   
}

//
// Construction des conseils selon les types définis ci-dessus
// ===========================================================
if ($type_temperature == "grand froid" || $type_condition == "neige") {
   $conseils_prendre[] = "des gants";
   $conseils_prendre[] = "un gros manteau"; 
   $conseils_eviter[] = "les plaques de verglas"; 
}
if ($type_condition == "pluie") {
   $conseils_prendre[] = "un parapluie";
     $conseils_prendre[] = "des chaussures imperméables";
   $conseils_eviter[] = "les flaques d'eau"; 
   $conseils_eviter[] = "l'aquaplanning"; 
}
if ($type_condition == "soleil") {
   $conseils_prendre[] = "des lunettes de soleil";
}
if ($type_temperature == "chaud" || $type_temperature == "très chaud" || $type_temperature == "canicule") {
   $conseils_prendre[] = "à boire";
     $conseils_prendre[] = "de la crême solaire";
}
if ($type_temperature == "très chaud" || $type_temperature == "canicule") {
   $conseils_eviter[] = "le soleil aux heures dangereuses";  
}
if ($type_condition == "nuageux") {
   $conseils_prendre[] = "un antidépresseur";  
}

// Transformation des tableaux en éléments de phrases
// ==================================================
$nb_conseils_prendre = sizeof($conseils_prendre);
if ($nb_conseils_prendre>0) {
  $phrase_conseils .= "Pensez à prendre ";
  foreach ($conseils_prendre as $key=>$conseil) {
    if ($key !== $nb_conseils_prendre - 1 || $nb_conseils_prendre == 1) {
         // si un seul conseil ou pas le dernier, on concatène le conseil et une virgule
      $phrase_conseils .= "$conseil, ";
    } else {
         // en cas de dernier élément du tableau, on vire la virgule et on lie par un 'et'
         $phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
      $phrase_conseils .= " et $conseil.";     
    }
  }
  // on vire toute virgule finale qui trainterait
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} else {
   $phrase_conseils = "";
}
// Rebelote avec les choses à éviter
$nb_conseils_eviter = sizeof($conseils_eviter);          
if ($nb_conseils_prendre > 0) {
     if ($nb_conseils_eviter > 0) {
      $phrase_conseils .= "En revanche, pensez à éviter ";
    } 
} elseif ($nb_conseils_eviter>0) {
     $phrase_conseils .= "Pensez à éviter ";
}
if ($nb_conseils_eviter>0) {
  foreach ($conseils_eviter as $key=>$conseil) {
    if ($key !== $nb_conseils_eviter - 1 || $nb_conseils_eviter == 1) {
      $phrase_conseils .= "$conseil, ";
    } else {
        $phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
      $phrase_conseils .= " et $conseil.";     
    }
  }
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} 
// Stockage dans une variable qu'on utilisera avec le TTS
// ======================================================        
$scenario->setData("meteo_conseiljour",$phrase_conseils);
Sur certain test pour crée la phrase, la variable utilisé n'etait pas la bonne.

Hello, merci de ta vigilance. Aurais tu le numéro des lignes incriminées dans mon code initial ? Pour que je corrige...
Box: RPi3 ZW+/RFXCom
Mon matériel: ici
Mes tutos: ici

fred59190
Timide
Messages : 239
Inscription : 26 janv. 2016, 10:13

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par fred59190 » 27 août 2016, 08:00

nicocha a écrit :
fred59190 a écrit :Bonjour @Tauks

je seche...
j'ai bien ajouter un bloc code, copier coller ton code,
remplacer les ID par les miens, j execute la variable se crée mais reste vide,
du coup j ai essayé le poste du dessous avec "meteo,domicile..."
j execute idem, la variable reste vide

ai je oublié quelque chose?
Salut,
J'ai remarquer une petite erreur dans le code, j'ai eu le même soucie.
Voici le code corrigé.


Sur certain test pour crée la phrase, la variable utilisé n'etait pas la bonne.

Un grand merci

fred59190
Timide
Messages : 239
Inscription : 26 janv. 2016, 10:13

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par fred59190 » 27 août 2016, 12:48

@Tauks, j'adore tes scénarios je suis fan :p

pour le déclenchement, il s'agit d'un scénario que tu as mis dans réveil/avec le kawa??

Avatar de l’utilisateur
Ma Pomme
Timide
Messages : 123
Inscription : 30 juin 2015, 14:06
Localisation : Bordeaux
Contact :

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par Ma Pomme » 27 août 2016, 13:57

Excellent merci !!
Zibase, Eedomus; HC-Lite, Jeedom sur Pi2, Jeedom sur Nuc, Jeedom sous VM, modules Fibaro, Chacon,, Karotz, Tasker

nicocha
Timide
Messages : 116
Inscription : 06 avr. 2015, 08:50

Re: [Tuto code] : Des conseils vocaux selon la météo

Message par nicocha » 27 août 2016, 15:34

Tauks a écrit :
nicocha a écrit :
fred59190 a écrit :Bonjour @Tauks

je seche...
j'ai bien ajouter un bloc code, copier coller ton code,
remplacer les ID par les miens, j execute la variable se crée mais reste vide,
du coup j ai essayé le poste du dessous avec "meteo,domicile..."
j execute idem, la variable reste vide

ai je oublié quelque chose?
Salut,
J'ai remarquer une petite erreur dans le code, j'ai eu le même soucie.
Voici le code corrigé.

Code : Tout sélectionner

// Récupération des valeurs de condition et température
// ====================================================
$cmd = cmd::byId(3169);
$condition_jour = $cmd->execCmd();
//$scenario->setData("debug",$condition_jour);

$cmd = cmd::byId(3168);
$temperature_max_jour = $cmd->execCmd();
//
// Déclaration des tableaux de conseils
// ====================================
$conseils_prendre = array();
$conseils_eviter = array();
//
// Construction d'un début de phrase différent selon que la condition soit un nom ou un adjectif
// =============================================================================================
$phrase_conseils = "... Bonjour, aujourd'hui ";
if (preg_match("/^([A-z]*)s\s/i",trim($condition_jour))) {
   $phrase_conseils .= "la météo sera constituée de ";
} else {
   $phrase_conseils .= "le temps sera ";
}
//
// Ajout de la condition du jour et de la température à la phrase
// ==============================================================
$phrase_conseils .= $condition_jour;
$phrase_conseils .= ", avec des températures allant jusqu'à ".round($temperature_max_jour,0)." degrés. ";

//
// Analyse de la condition du jour par expressions régulières
// ==========================================================
if (preg_match("/pluie|bruine|précipitation/i",$condition_jour)) {
     $type_condition = "pluie";
} elseif (preg_match("/soleil|beau/i",$condition_jour)) {
     $type_condition = "soleil";  
} elseif (preg_match("/eige/i",$condition_jour)) {
     $type_condition = "neige";  
} elseif (preg_match("/nuage|couvert/i",$condition_jour)) {
     $type_condition = "nuageux";  
}
//
// Analyse de la température max par tranches
// ==========================================
if ($temperature_max_jour <= 0) {
     $type_temperature = "grand_froid";
} elseif ($temperature_max_jour <= 10) { 
     $type_temperature = "froid";  
} elseif ($temperature_max_jour <= 20) {
     $type_temperature = "pas chaud";   
} elseif ($temperature_max_jour <= 25) {
      $type_temperature = "bon";    
} elseif ($temperature_max_jour <= 30) {
      $type_temperature = "chaud";    
} elseif ($temperature_max_jour <= 35) {
       $type_temperature = "très chaud";  
} else {
       $type_temperature = "canicule";   
}

//
// Construction des conseils selon les types définis ci-dessus
// ===========================================================
if ($type_temperature == "grand froid" || $type_condition == "neige") {
   $conseils_prendre[] = "des gants";
   $conseils_prendre[] = "un gros manteau"; 
   $conseils_eviter[] = "les plaques de verglas"; 
}
if ($type_condition == "pluie") {
   $conseils_prendre[] = "un parapluie";
     $conseils_prendre[] = "des chaussures imperméables";
   $conseils_eviter[] = "les flaques d'eau"; 
   $conseils_eviter[] = "l'aquaplanning"; 
}
if ($type_condition == "soleil") {
   $conseils_prendre[] = "des lunettes de soleil";
}
if ($type_temperature == "chaud" || $type_temperature == "très chaud" || $type_temperature == "canicule") {
   $conseils_prendre[] = "à boire";
     $conseils_prendre[] = "de la crême solaire";
}
if ($type_temperature == "très chaud" || $type_temperature == "canicule") {
   $conseils_eviter[] = "le soleil aux heures dangereuses";  
}
if ($type_condition == "nuageux") {
   $conseils_prendre[] = "un antidépresseur";  
}

// Transformation des tableaux en éléments de phrases
// ==================================================
$nb_conseils_prendre = sizeof($conseils_prendre);
if ($nb_conseils_prendre>0) {
  $phrase_conseils .= "Pensez à prendre ";
  foreach ($conseils_prendre as $key=>$conseil) {
    if ($key !== $nb_conseils_prendre - 1 || $nb_conseils_prendre == 1) {
         // si un seul conseil ou pas le dernier, on concatène le conseil et une virgule
      $phrase_conseils .= "$conseil, ";
    } else {
         // en cas de dernier élément du tableau, on vire la virgule et on lie par un 'et'
         $phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
      $phrase_conseils .= " et $conseil.";     
    }
  }
  // on vire toute virgule finale qui trainterait
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} else {
   $phrase_conseils = "";
}
// Rebelote avec les choses à éviter
$nb_conseils_eviter = sizeof($conseils_eviter);          
if ($nb_conseils_prendre > 0) {
     if ($nb_conseils_eviter > 0) {
      $phrase_conseils .= "En revanche, pensez à éviter ";
    } 
} elseif ($nb_conseils_eviter>0) {
     $phrase_conseils .= "Pensez à éviter ";
}
if ($nb_conseils_eviter>0) {
  foreach ($conseils_eviter as $key=>$conseil) {
    if ($key !== $nb_conseils_eviter - 1 || $nb_conseils_eviter == 1) {
      $phrase_conseils .= "$conseil, ";
    } else {
        $phrase_conseils = preg_replace("/\,$/","",trim($phrase_conseils));
      $phrase_conseils .= " et $conseil.";     
    }
  }
  $phrase_conseils = preg_replace("/\,$/",".",trim($phrase_conseils));
} 
// Stockage dans une variable qu'on utilisera avec le TTS
// ======================================================        
$scenario->setData("meteo_conseiljour",$phrase_conseils);
Sur certain test pour crée la phrase, la variable utilisé n'etait pas la bonne.

Hello, merci de ta vigilance. Aurais tu le numéro des lignes incriminées dans mon code initial ? Pour que je corrige...
Bonjour
Oui c'est ligne 81

if ($type_temperature == "très chaud" || $type_temperature == "canicule") {
$conseils_eviter[] = "le soleil aux heures dangereuses";
}

Répondre

Revenir vers « Scénarios »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Titanium31 et 1 invité