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.
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
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
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)
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 ?
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
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 … )
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.
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
Tu ne recois pas non plu sla météo via Telegram donc oui je dirais vérifier les commandes sources. La le log est vide alors qu’il devrait avoir le contenu.
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);
On est d’accord que si je regarde les variables je devrait voir la variable meteo_conseiljour.
Là je ne la vois pas comme si elle n’était pas créée par le code
Oui elle se créée, on peut la voir avec le bouton voir variables
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);
$scenario->setData(« meteo_conseiljour »,$phrase_conseils);
Ca marche sans l’espace, c’est sans espace chez moi, tous mes setData
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
#[Séjour][gateway][rgb]# -> ca c’est la commande info qui donne la couleur actuelle, c’est rgb-set celle pour commander
$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
Je n’ai que 4 commandes à la gateway et pas le rgb-set
J’ai testé avec ce paramètre et toujours blanc
Bonjour,
J’ai copié collé le code de cob94440 puis modifié ainsi:
$temp_value_cmd_string = “#[Salon][Météo][Température]#”;
$RGB_value_cmd_string = “#[Salon][Gateway][Définir Couleur]#”;
$temp_min = -10; // mini echelle température en °C
$temp_max = 40; // max echelle température en °C
$temp_scale_step = 25; // nombre de point de l’échelle
Mais l’anneau de la gateway reste blanc…
Ah tiens, je viens de découvrir et ton blog et le re-use de mon code. J’en suis flatté. Bon vent l’ami 🙂
ah yep je t’ai pas averti toi, les autres oui 🙂
je l’utilise depuis que tu l’as partagé, un must
Hello Lunarok, content de te retrouver ici…
Très bon article !
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
Les conditions sont en francais dans le plugin. A condition que Jeedom soit bien en francais
Merci beaucoup… Je venais de chercher pendant 2 heures !!!
Bonjour Lunarok,
J’ai une question de base: comment fais tu pour avoir la représentation graphique de la météo à 1 jour au début de ton article ?
Je ne vois de quantité de précipitation seulement pour h+5, tu sembles avoir des prévisions à plus long terme …
Merci
Sue le panel y a plus d’infos que ce qui est dispo dans les commandes 🙂 c’est un autre appel API
OK ! la classe !
Mais y’a t’il moyen des récupérer ces infos du coup (je recherche les prévisions de précipitations pour piloter le système d’arrosage que je viens de mettre en place) ?
Merci
Actuellement non il n’y a que le H+5 max de mappé dans Jeedom. C’est pas suffisant entre H+5 et J+1 ?
Si, la quantité de précipitation à J+1 m’irait parfaitement mais à priori, ça n’est pas dispo
l’intensité de précipitation ? elle oui, c’est juste par heure
En mm/h, oui mais ça n’est pas dispo au delà de h+5
et il faudrait combien d’heures ? c’est lourd en commandes à rajouter, si c’est bien dedans
L’objectif est de piloter un arrosage dont la durée sera en fonction de l’eau qui est tombée depuis j-1 et qui tombera en j+1 mais je le ferai de J-1 à h+5 (je pense également intégrer la température et humidité en affectant des coefficients).
Merci d’avoir répondu si vite
a+
Généralement les algos d’arrosage prennent en compte l’historique et les conditions actuelles (https://github.com/rszimm/sprinklers_pi/wiki/Weather-adjustments) après c’est sur que si on te dit il va pleuvoir assez dans les prochaines heures c’est utile, mais plutot pour décaler l’arrosage (et si il a bien plus seulement annulé l’arrosage prévu)
Le lien vers le tuto de tauks pour le tts ne marche plus, quelqu’un a encore les infos pour le mettre en place?