Cette semaine a été remplie d’article pour votre Raspberry Pi, aujourd’hui on se penche sur un tutoriel pour la création d’un bot qui dicte la météo chez vous tous les matins.

Vous aurez besoin pour cela, d’un Raspberry Pi (RPi), et d’un haut-parleur que vous devrez brancher sur la carte mère du RPi, le haut-parleur du RPi n’étant pas assez puissant pour dicter quoi que ce soit.

Conception d’un bot qui dicte la météo

Pour commencer, créez vous un dossier dans votre répertoire de développement et créez-y un fichier que vous appellerez index.js par exemple.

Ensuite, installez les dépendances NodeJS suivantes :

  • google-tts-api : un « text-to-speech » pour faire parler votre compteur vocal
  • node-schedule : un planificateur de tâches pour exécuter les actions
  • play-sound : une dépendance nécessaire à l’exécution des fichiers audios
  • request : request est conçue pour être la manière la plus simple possible de faire des appels HTTP/HTTPS

Pour récupérer la météo, nous allons utiliser une API (Application Programming Interface, ou Interface de programmation) Suisse qui nous donnera la météo pour une ville souhaitée. Le résultat nous retournera différentes valeurs :

  • température minimum de la journée (en degré Celsius)
  • température maximum de la journée (en degré Celsius)
  • l’heure du levé du soleil
  • l’heure du couché du soleil
  • le jour exacte en Français (Lundi, Mardi, etc…)
  • la condition météo en moyenne pour la journée (pluvieux, ensoleillé, nuageux, etc…)
  • et tout un tas d’autres valeurs que nous n’utiliserons pas dans ce tutoriel

Commencez par inclure les dépendances dans votre projet, dans le fichier index.js, créé précédemment :

var request = require('request');
var player = require('play-sound')(opts = { player: "omxplayer" });
var googleTTS = require('google-tts-api');
var schedule = require('node-schedule');

On déclare une variable “ville” qui possède la valeur de votre ville en question, par exemple, ici, ça sera Marseille :

var ville = 'Marseille';

On doit à présent faire parler notre bot ! Pour cela nous allons utiliser une librairie de Google, le « text-to-speech » afin de transformer du texte en fichier audio, avec la même méthode utilisée pour Google Traduction.

var speak = function (text, callback) { // Nouvelle fonction speak avec text (string), et callback (fonction) en paramètres
    googleTTS(text, 'fr', 1) // On utilise googleTTS, qui prend en paramètre la variable text passée dans la fonction, puis la langue parlée, puis la vitesse de parole
        .then(function (url) { // La promesse nous retourne une fonction avec url comme argument
            callback(); // On exécute la fonction callback (fonction de rappel)
        })
        .catch(function (err) {
            console.error(err.stack); // Oups, une erreur !
        });
};

L’API que nous utiliserons est Suisse, son lien est prevision-meteo.ch/services/json/Marseille.

Nous allons donc utiliser la dépendance “request” pour appeler cette page est récupérer du contenu JSON (plus facile à lire dans notre code) :

request({ // Instanciation de la dépendance "request"
    method: 'GET', // Méthode utilisée : GET
    url: 'http://www.prevision-meteo.ch/services/json/' + ville, // URL de l'API
    headers: {
        'cache-control': 'no-cache' // Pas de cache
    }
}, function (error, response, body) {
    var b = JSON.parse(body); // On parse/manipule le code retourné en JSON
    var name = b.city_info.name; // Nom de la ville
    var sunrise = b.city_info.sunrise; // Heure du levé du soleil
    var sunset = b.city_info.sunset; // Heure du couché du soleil
    var day_long = b.fcst_day_0.day_long; // Jour de la semaine en Français
    var tmin = b.fcst_day_0.tmin; // Température minimum de la journée
    var tmax = b.fcst_day_0.tmax; // Température maximum de la journée
    var condition = b.fcst_day_0.condition; // Condition météo pour la journée

    // Exécution du "text-to-speech"
});

La méthode JSON.parse() “parse” (ou manipule) une chaîne de caractères en JSON et construit la valeur JavaScript ou l’objet décrit par cette chaîne. On peut éventuellement utiliser cette fonction avec un paramètre de modification permettant de traiter l’objet avant qu’il soit renvoyé.

Il faut ensuite faire parler le bot avec une série de fonction avec rappel (callback) :

speak("Bonjour, nous sommes " + day_long + ".", function () {
    speak("Aujourd'hui, à " + name + ", le temps sera " + condition + " avec une température minimum de " + tmin + "° et une température maximum de " + tmax + "°.", function () {
        speak("Le soleil se lèvera à " + sunrise + " et se couchera à " + sunset + ".", function () {
            speak("Bonne journée à tous !", function () {
                console.log('La météo a été récitée !');
            });
        });
    });
});

A vous de jouer, vous pouvez modifier à volonté ces phrases pour que votre bot soit le plus intelligent possible !

Il vous reste désormais à définir “node-schedule” pour qu’il exécute tout ce code à une heure précise de la journée, pour ma part, j’ai choisi 8h30 (l’heure à laquelle je suis levé).

schedule.scheduleJob('30 8 * * *', function () {
    // Exécution du code avec "request"
});

Résultat du code en entier

var request = require('request');
var player = require('play-sound')(opts = {});
var googleTTS = require('google-tts-api');
var schedule = require('node-schedule');

var ville = 'Marseille';

var speak = function (text, callback) {
    googleTTS(text, 'fr', 1)
        .then(function (url) {
            player.play(url, function (err, stdout, stderr) {
                callback();
            });
        })
        .catch(function (err) {
            console.error(err.stack);
        });
};

schedule.scheduleJob('30 8 * * *', function(){
    request({
        method: 'GET',
        url: 'http://www.prevision-meteo.ch/services/json/' + ville,
        headers: {
            'cache-control': 'no-cache'
        }
    }, function (error, response, body) {
        var b = JSON.parse(body);
        var name = b.city_info.name;
        var sunrise = b.city_info.sunrise;
        var sunset = b.city_info.sunset;
        var day_long = b.fcst_day_0.day_long;
        var tmin = b.fcst_day_0.tmin;
        var tmax = b.fcst_day_0.tmax;
        var condition = b.fcst_day_0.condition;

        speak("Bonjour, nous sommes " + day_long + ".", function () {
            speak("Aujourd'hui, à " + name + ", le temps sera " + condition + " avec une température minimum de " + tmin + "° et une température maximum de " + tmax + "°.", function () {
                speak("Le soleil se lèvera à " + sunrise + " et se couchera à " + sunset + ".", function () {
                    speak("Bonne journée à tous !", function () {
                        console.log('La météo a été récitée !');
                    });
                });
            });
        });
    });
});

Si le son n’est pas déclenché à partir de la console Shell. Vous pouvez installer les codecs audio en saisissant ces commandes :

sudo apt-get update
sudo apt-get install alsa-utils mpg123

Vous pouvez faire tourner ce programme aisément sur votre Raspberry Pi, ou un autre appareil.

Raspberry Pi : comment concevoir un bot qui dicte la météo chaque jour ?
Voter pour cet article
25 commentaires
  1. Question, tu te lève à 7h30 ou 8h30 ? :p

    “Il vous reste désormais à définir « node-schedule » pour qu’il exécute tout ce code à une heure précise de la journée, pour ma part, j’ai choisi 8h30 (l’heure à laquelle je suis levé).

    schedule.scheduleJob(’30 7 * * *’, function () {
    // Exécution du code avec “request”
    });”

  2. Merci pour le tuto, mais petit soucis à l’execution…
    [email protected]:~# nodejs index.js

    Error: native promise missing, set Fetch.Promise to your favorite alternative
    at new Fetch (/root/node_modules/google-tts-api/node_modules/isomorphic-fetch/node_modules/node-fetch/index.js:41:9)
    at Fetch (/root/node_modules/google-tts-api/node_modules/isomorphic-fetch/node_modules/node-fetch/index.js:37:10)
    at module.exports (/root/node_modules/google-tts-api/node_modules/isomorphic-fetch/fetch-npm-node.js:8:19)
    at module.exports (/root/node_modules/google-tts-api/lib/key.js:11:10)
    at module.exports (/root/node_modules/google-tts-api/index.js:14:10)
    at speak (/root/index.js:9:5)
    at Request._callback (/root/index.js:37:9)
    at Request.self.callback (/root/node_modules/request/request.js:188:22)
    at Request.emit (events.js:98:17)
    at Request. (/root/node_modules/request/request.js:1171:10)

    PS : je débute avec NodeJS

  3. pb trouve : maj nodejs en 5.12 et rajout d’omxplayer dans playsound.
    merci encore pour ce tuto, qui demontre bien l’interet de nodejs avec le raspberry

  4. Bonjour,

    pourrais -tu m’indiquer comment passer les arguments -o local a la fonction play-sound ou autre.
    En effet , je voudrais que l’audio soit dirigé vers la sortie jack 3.5mm.
    En ce moment , l’audio est tjs dirige vers l’hdmi.
    merci

    1. Salut ! Pour faire sortir le son sur le Jack, il te suffit de brancher ton périph’ en jack, et de faire un clique droit sur le réglage e son en bas à droite, puis sélectionner “analog” au lieu de HDMI.

      Bonne journée !

  5. Bonjour,
    Pas moyen de le faire parler ce fichu raspberry! Même en rajoutant ‘player: « omxplayer »‘.
    Le code tourne sans problème, il écrit bien “La météo a été citée”.
    J’ai bien nodejs à la version 8.6.

    Quand j’entre “aplay /usr/share/sounds/alsa/Front_Center.wav”, le rpi me joue bien le son.
    Que me manque-t-il???

    Autre question:
    Comment pourrais-je lancer ce script à partir de Domoticz lors d’un évènement (Exemple: la détection d’un mouvement par jour le matin). Ma question porte sur l’appel du script.

    Merci,
    François

    1. Hello, je me permettais de relancer .
      Pas possible de rediriger la voix vers un fichier mp3 ?
      mon rpi2 est sans ecran clavier souris hp , et il ne me sert que pour la station météo ( et autre chose ..) j’aimerais bien recuperer le son en MP3.
      Merci !

  6. Bon ben ca marche pas ;-(

    ….
    var fileSystem = require(‘fs’);
    var filepath = “mynewfile.txt”;
    var fs = require(‘fs’);
    ….

    var speak = function (text, callback) {
    googleTTS(text, ‘fr’, 1)
    .then(function (url) {
    fs.writeFile(filepath, url, (err) => {
    if (err) throw err;
    console.log(“The file was succesfully saved!”);
    });
    player.play(url, function (err, stdout, stderr) {
    callback();
    });
    })
    .catch(function (err) {
    console.error(err.stack);
    });
    };

  7. Bonjour,

    J’ai suivi le tuto et j’ai l’erreur suivante :
    FetchError: request to https://translate.google.com failed, reason: certificate is not yet valid
    at ClientRequest. (/home/pi/node_modules/node-fetch/index.js:133:11)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at TLSSocket.socketErrorListener (_http_client.js:387:9)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)

    Faut-il installé un certificat?

    Je suis avec la version stretch lite de raspbian

    1. Bonjour,
      Le son est toujours redirige sur le port Hdmi, j’ai pourtant le port analog coche dans le gestionnaire son, j’ai également configure le port “Analog” avec raspiconfig.
      J’ai teste sans raccordement Hdmi mais sans resultat.
      Existe t-il un configuration autre pour Omxplayer car j’ai essaye avec Vlc, le son est correctement redirige mais avec des coupures.
      Desole pour les accents, Qwerty oblige.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Inscrivez vous à notre newsletter

Soyez informé des derniers articles sur YubiGeek. Saisissez votre adresse email et validez le formulaire. Un email de confirmation vous sera communiqué.

Vous devriez également aimer

Kalliope : un assistant vocal pour votre Raspberry Pi (installation)

Aujourd’hui, je vous propose de découvrir Kalliope, un assistant vocal développé par Nicolas…

Installer un serveur Web avec Nginx & PHP 7.0 sur un Raspberry Pi

Il y a quelques temps, on vous présentait le Raspberry Pi, le nano-ordinateur…

Raspberry Pi : un compteur d’abonné visuel pour les réseaux sociaux

Je fais suite au tutoriel sur la création d’un compteur d’abonné vocal…

Installer un serveur MySQL avec MariaDB sur un Raspberry Pi

MariaDB est un système de gestion de base de données édité sous…