Scénarios : se notifier la météo

Météo Icone

La météo, si on vous la passe à la radio, à la TV, dans les journaux etc c’est bien parceque ca rend service. Savoir si il va pleuvoir pour prendre la parapluie, savoir si il va faire 35° pour pas mettre de pull …

Et si un journal papier y arrive, la domotique aussi. Il y a plusieurs façon de récupérer la météo (station locale, capteurs extérieurs simples, source météo sur le net) de disponible. Ensuite et bien ca reste quand même plus sympa quand Jeedom nous notifie cette fameuse météo. Et pour cela, il y a plein de méthodes possible, à chacun de mettre en place celle(s) qu’il souhaite.

Source météo

Météo générale

L’incontournable presque à moins d’être équipé comme un pro.

Pour obtenir la météo dans Jeedom via une source du web, il y a plusieurs solutions. Dont le plugin officiel Météo ou bien le plugin Dark Sky (anciennement Forecast.io)

Ici j’utilise Dark Sky biensur. Dark Sky propose plus de commandes informations comme les prévisions à la journée et des 5 prochaines heures en plus des conditions actuelles. Et également un panel météo.

Dark Sky Panel

Source locale

Il y a la solution des données locales. Là pour le coup vous pourrez obtenir la « météo » à hauteur des capteurs dont vous disposez et ce qui est « calculable »

Par exemple si vous avez uniquement un capteur hygro-température extérieur, biensur pas question d’avoir la direction du vent.

edualc a mis à dispo quelques plugins qui permettent de calculer localement sur Jeedom des informations utile en complément de celles des capteurs (température ressentie, tendance baromètre, point de rosée et givre)

Météo spécialisée

Les exemples indiqués ici sont assez généralistes (icone de météo, température etc) Mais il est tout a fait faisable de garder les mêmes principes avec des météos bien plus spécifiques. Souvent elles requièrent un plugin dédié ou un script récupérant l’information.

On peut citer par exemple :

  • météo des surfeurs (via Vigilance Météo)
  • pluie à 1h (via Vigilance Météo)
  • allergisants (pour ma part via un script de récupération au près de l’agence des Pays de la Loire)
  • risque de tremblement de terre (via Vigilance Météo, oui inutile vous me direz par chez nous, mais ailleurs dans le monde ils apprécient)

Types de notification

Chat Chaud

Si vous n’avez pas de chat pour vous indiquer qu’il fait froid dehors, voici quelques exemples.

Le message texte

Le facile d’abord on va dire…

Donc là rien de compliquer, le plus dur est de choisir son service de notification. SMS ? Email ? Pushbullet ? Telegram ? Slack ?

Voilà, y a le choix, à vous de prendre ce qui vous convient. Ici on prendra Telegram.

Exemple

Pas grand chose à dire, car ce cas est très simple. En fait il suffit de faire un scénario en choisissant sa commande de notification et dans le texte on ajoute la commande information de météo.

Un exemple avec juste les conditions du jour envoyées à 7h30

Scénario Météo Telegram

Le message audio

Là c’est du bonus WAF

Ici encore on a le choix pour la méthode de diffusion audio : Squeezebox Control ou PlayTTS par exemple.

Ici on prendra Squeezebox Control, c’est mieux une solution audio de ce type pour la domotique globalement. PlayTTS est utile dans une installation simple ou en attendant de mettre en place votre Logitech Media Server.

Exemple

Pour commencer, le rendu en log :

————————————
[2017-01-29 11:14:32][SCENARIO] Start : Scenario lance manuellement.
…[Paramétrer TTS] avec comme option(s) :
Array
(
[title] => picotts
[message] =>
)
[2017-01-29 11:14:32][SCENARIO] Exécution de la commande [Salon][SB gamelan][Parle] avec comme option(s) :
Array
(
[title] => 100
[message] => … Bonjour, aujourd’hui le temps sera Pluie faible débutant dans la soirée., avec des températures allant jusqu’à 10 degrés. Pensez à prendre un parapluie et des chaussures imperméables.En revanche, pensez à éviter les flaques d’eau et l’aquaplanning.
)
[2017-01-29 11:14:32][SCENARIO] Fin correcte du scénario

Vous voyez que là on a un message qui a été envoyé à la squeezebox en mode TTS

Pour cela, j’utilise le bloc code de Tauks qu’il a publié sur le forum

Une fois le code mis en place, vous n’avez plus qu’à transmettre la variable à votre commande TTS

Vous pourrez l’utiliser comme voulu en programmé ou provoqué (annonce le matin à heure fixe ou sur détection de mouvement après 7h dans la cuisine par exemple)

Scénario Météo TTS

La notification RGB

Cette solution est encore un moyen de gagner des points WAF. Idéale si vous avez un bandeau RGB ou une ampoule RGB quelque part, mais sans que ce soit l’ampoule de la pièce par exemple. A vous de voir mais là ca peut couter des points WAF par contre de baigner toute la cuisine en bleu pour dire qu’il fait froid.

La gateway Xiaomi est en revanche idéale pour ca.

Exemple

Cadavor a partagé sur le forum un bloc code pour scénario qui permet de faire un affichage RGB représentant la température.

Il suffit de paramétrer les informations suivantes dans le début du bloc :

  • la commande température qu’on souhaite représenter
  • la commande RGB pour faire l’affichage
  • le minimum à prendre en compte en degrés
  • le maximum à prendre en compte en degrés

Dans le cas de la Gateway Xiaomi, il faudra penser à ajouter une commande avant qui définit la luminosité pour l’allumer.

Ca donne ce type d’action avec le bloc code ensuite, facile non ?

Scénario Météo RGB

La notification sur écran

Souvent délaissée le retour affiché. On met toujours en place des capteurs, des actionneurs, des automates. Mais souvent la visibilité utilisateur est pauvre.

Pourtant on peut avoir : une tablette Android murale, un Dotti, un Nimbus ou bien même un Pi avec écran posé sur un meuble.

On va voir ce qu’on pourrait faire par exemple avec un Dotti

Exemple

Le plugin Dark Sky met à disposition une commande qui définit l’icone des conditions (disponible pour le jour en cours, les 4 suivants et les heures qui viennent, donc à vous de voir laquelle vous voulez utiliser)

On peut utiliser cette valeur pour afficher un icone par exemple sur Dotti.

Pour information, la liste des icones utilisés est disponible sur Weather Icons

Dans la configuration d’un Dotti (via le plugin BLE, le Dotti est disponible ici) on retrouve des exemples pré-existants

Configuration Dotti

Le plus facile est de repartir de ces icônes et créer ceux que l’on souhaite en les nommant comme les icones Weather Icons (rain, cloudy, sunny …)

Ainsi on peut ensuite dans le scénario voulu ajouter la commande du Dotti et mettre en valeur la commande Icone de Dark Sky (pour rappel, celui que vous voulez ca peut être du jour, dans une heure, demain … )

Scénario Météo Dotti

 

Pour continuer

Pas un mot pour finir ici car ce n’est que le début, des idées pour vous montrer ce qu’on peut faire ce qui est faisable. Mais surtout pour faire éclore d’autres idées (afficher un surfeur quand la météo des plages est au top, faire clignoter les ampoules en cas de risque de séisme …)

D’ailleurs, il est possible avec tout ca de faire un scénario envoyant l’ensemble des notifications à une heure souhaitée. Un bon exercice de mise en pratique.

Oui tout n’est pas fourni en copier-collable, c’est voulu. Jeedom n’a pas vraiment de limite. Il faut l’apprendre et le comprendre pour en faire ce qu’on veut. Alors go.

17 réflexions au sujet de “Scénarios : se notifier la météo

  1. Bonjour Lunarok. Très bon tutos. Jai juste un souci sur la partie messge audio. J’ai bien positionné le code de Tausk. J’ai gardé tes options avant de tenter de personnaliser. Lorsque je lance l’exécution, je ne reçois pas de message. Sur le topic de Tausk j’ai pu lire qu’une valeur en fin de code pouvais remettre à zéro j’ai tenté de mettre en commentaire et pas mieux. Si pour la variable je positionne (…,0) je reçois juste zéro.
    Je suis sur de mes id de commandes.
    Voici le log du scénario mais je ne vois rien de particulier :

    [2017-01-31 11:22:45][SCENARIO] Start : Scenario lance manuellement. Tags : Array
    (
    )
    [2017-01-31 11:22:45][SCENARIO] Exécution du sous-élément de type [action] : action
    [2017-01-31 11:22:45][SCENARIO] Exécution d’un bloc élément : 49
    [2017-01-31 11:22:45][SCENARIO] Exécution du sous-élément de type [action] : code
    [2017-01-31 11:22:45][SCENARIO] Exécution d’un bloc code
    [2017-01-31 11:22:45][SCENARIO] Exécution de la commande [Séjour][SB][Paramétrer TTS] avec comme option(s) :
    Array
    (
    [title] => picotts
    [message] => fr-FR
    )
    [2017-01-31 11:22:45][SCENARIO] Exécution de la commande [Séjour][SB][Parle] avec comme option(s) :
    Array
    (
    [title] => 100
    [message] =>
    )
    [2017-01-31 11:22:45][SCENARIO] Exécution de la commande [organisation][Telegram][name] avec comme option(s) :
    Array
    (
    [title] =>
    [message] => Météo:
    )
    [2017-01-31 11:22:45][SCENARIO] Exécution de la commande [Séjour][gateway][Définir Luminosité] avec comme option(s) :
    Array
    (
    [slider] => 50
    )
    [2017-01-31 11:22:45][SCENARIO] Exécution d’un bloc élément : 50
    [2017-01-31 11:22:45][SCENARIO] Exécution du sous-élément de type [action] : code
    [2017-01-31 11:22:45][SCENARIO] Exécution d’un bloc code
    [2017-01-31 11:22:45][SCENARIO] Exécution d’un bloc élément : 51
    [2017-01-31 11:22:45][SCENARIO] Tâche : 51 programmé à : 2017-01-31 11:25:00 (+ 3 min)
    [2017-01-31 11:22:45][SCENARIO] Fin correcte du scénario
    ————————————
    [2017-01-31 11:25:03][SCENARIO] ************Lancement sous tâche**************
    [2017-01-31 11:25:48][SCENARIO] Exécution du sous-élément de type [action] : do
    [2017-01-31 11:25:48][SCENARIO] Exécution de la commande [Séjour][gateway][Définir Luminosité] avec comme option(s) :
    Array
    (
    [slider] => 0
    )
    [2017-01-31 11:25:48][SCENARIO] ************FIN sous tâche**************

    Une idée de où je merde?
    Merci d’avance

      • Merci de ton retour.
        Voici le code que je lui met :

        // Récupération des valeurs de condition et température
        // ====================================================
        $cmd = cmd::byString(‘#[Météo][Météo][Condition]#’);
        $condition_jour = $cmd->execCmd();
        $cmd = cmd::byString(‘#[Météo][Météo][Température Apparente]#’);
        $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 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);

  2. Trouvé pour ceux qui cherchent dans le bloc de Tausk il y a une petite erreur il manque un espace après la virgule, remplacer :
    $scenario->setData(« meteo_conseiljour »,$phrase_conseils);
    par
    $scenario->setData(« meteo_conseiljour », $phrase_conseils);

  3. Bon dernier souci. Dans la suite de cette annonce dans le même scénario je veux gérer la partie affichage de l’anneau de la passerelle xiaomi
    Je défini donc une action luminosité à 50
    Puis je place le code suivant :

    $temp_value_cmd_string = « #[Météo][Météo][Température]# »;
    $RGB_value_cmd_string = « #[Séjour][gateway][rgb]# »;

    $temp_min = 10; // mini echelle température en °C
    $temp_max = 25; // max echelle température en °C
    $temp_scale_step = 10; // nombre de point de l’échelle

    $color_min = 240; // valeur H du modele HSV pour du bleu
    $color_max = 0; // valeur H du modele HSV pour du rouge

    // adaptation
    if ($color_min > $color_max) { // inversion de l’echelle
         $color_revert = $color_min;
       $color_min = $color_max;
         $color_max = $color_revert;
    } else {
         $color_revert = 0;
    }
    $temp_min = round($temp_min * 10);
    $temp_max = round($temp_max * 10);

    $color_range = $color_max – $color_min;
    $temp_range = $temp_max – $temp_min;
    $temp_nb_points = round($temp_range / $temp_scale_step); // nombre de marche de l’echelle température
    $scenario->setLog(« temp_nb_points – « .$temp_nb_points);

    $color_scale_step = $color_range / $temp_nb_points; // calcul la precision de l’echelle de couleur par rapport au nombre de point de l’echelle température
    $scenario->setLog(« color_scale_step – « .$color_scale_step);

    $temp_value_cmd = cmd::byString($temp_value_cmd_string);
    $temp_value = $temp_value_cmd->execCmd();
    $scenario->setLog(« temp_value – « .$temp_value);
    $temp_value = round($temp_value * 10);
    if ($temp_value $temp_max) $temp_value = $temp_max;

    $value_on_color_scale = ((($temp_value – $temp_min) / $temp_scale_step) * $color_scale_step) + $color_min;
    $scenario->setLog(« value_on_color_scale – « .$value_on_color_scale);
    $HofHSV = abs($value_on_color_scale – $color_revert);
    $scenario->setLog(« HofHSV – « .$HofHSV);

    /*
    **  Converts HSV to RGB values
    ** –––––––––––––––––––––––––––––––––––––––––––––––––––––
    **  Reference: http://en.wikipedia.org/wiki/HSL_and_HSV
    **  Purpose:   Useful for generating colours with
    **             same hue-value for web designs.
    **  Input:     Hue        (H) Integer 0-360
    **             Saturation (S) Integer 0-100
    **             Lightness  (V) Integer 0-100
    **  Output:    String « R,G,B »
    **             Suitable for CSS function RGB().
    */
    function fGetRGB($iH, $iS, $iV) {
      if($iH 360) $iH = 360; //   0-360
      if($iS 100) $iS = 100; //   0-100
      if($iV 100) $iV = 100; //   0-100
      $dS = $iS/100.0; // Saturation: 0.0-1.0
      $dV = $iV/100.0; // Lightness:  0.0-1.0
      $dC = $dV*$dS;   // Chroma:     0.0-1.0
      $dH = $iH/60.0;  // H-Prime:    0.0-6.0
      $dT = $dH;       // Temp variable
      while($dT >= 2.0) $dT -= 2.0; // php modulus does not work with float
      $dX = $dC*(1-abs($dT-1));     // as used in the Wikipedia link
      switch(floor($dH)) {
        case 0:
          $dR = $dC; $dG = $dX; $dB = 0.0; break;
        case 1:
          $dR = $dX; $dG = $dC; $dB = 0.0; break;
        case 2:
          $dR = 0.0; $dG = $dC; $dB = $dX; break;
        case 3:
          $dR = 0.0; $dG = $dX; $dB = $dC; break;
        case 4:
          $dR = $dX; $dG = 0.0; $dB = $dC; break;
        case 5:
          $dR = $dC; $dG = 0.0; $dB = $dX; break;
        default:
          $dR = 0.0; $dG = 0.0; $dB = 0.0; break;
      }
      $dM  = $dV – $dC;
      $dR += $dM; $dG += $dM; $dB += $dM;
      $dR *= 255; $dG *= 255; $dB *= 255;
      return array(round($dR),round($dG),round($dB));
    }

    $RGB_array = fGetRGB($HofHSV, 100, 100);
    $RGB_value = sprintf(« #%02X%02X%02X », $RGB_array[0], $RGB_array[1], $RGB_array[2]);
    $scenario->setLog(« RGB – « .$RGB_value);

    $RGB_value_cmd = cmd::byString($RGB_value_cmd_string);
    $RGB_value_cmd->execCmd(array(‘color’ => $RGB_value));

    Mais le bandeau s’allume en blanc.

    J’ai la même chose dans un scénario basé sur la lecture de codi. Que je mette la luminosité avant ou après la définition de la couleur.
    Comment tu as géré toi?
    Promis après ça doit rouler et merci pour les retours

      • $RGB_value_cmd_string = « #[Séjour][gateway][rgb-set]# »;

        ça reste blanc. D’ailleurs je l’avais pas visiblement cette commande
        Dans les commande de la gateway j’en ai que 4
        définir couleur
        définir luminosité
        Luminosité
        et rgb

  4. Je profite des vacances pour avancer un peu avec ma domotique…
    J’ai une question pour la météo : comment avoir la météo en français avec ton plugin ?
    Merci de ton aide et bravo pour le boulot

Laisser un commentaire