Tutoriel: Ajout de la Météo dans SARAH

Voici un petit exemple de grammaire/script permettant de demander à S.A.R.A.H. la météo de demain.

Grammaire

Voici une grammaire très simple pour demander la météo:

<grammar version="1.0" xml:lang="fr-FR" mode="voice" root="ruleMeteo" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
  <rule id="ruleMeteo" scope="public">
    <example>Sarah quelle est la météo pour demain ?</example>
    <tag>out.action=new Object(); </tag>
    <one-of>
      <item>Sarah quelle est la météo pour demain</item>
      <item>Sarah il fait quel temps demain</item>
    </one-of>
    <tag>out.action._attributes.uri="http://127.0.0.1:8080/sarah/phantom/meteo";</tag>
    <tag>out.action.zip="78000";</tag>
  </rule>
</grammar>
  • Voici une documentation des balises XML
  • L’attribut « uri » est une convention pour accéder aux scripts phantomJS
  • L’attribut « zip » est forcé pour le code postal

Script

Voici le script associé à mettre dans /scipt/phantom/meteo.js:

// Inject helper
phantom.injectJs("../lib/scraper.js");

// Merge default options
var options = {'zip' :'78000'};
scraper.setOptions(options);

// Scrap
var url = 'http://mobile.meteofrance.com/france/ville/versailles/'+options.zip;
scraper.scrap(url, options, function(options, results){

  var tr = $('DIV#prevision TABLE.prevSem1 TR:nth-child(4)');
  results.tts  = tr.find('TD:nth-child(1)').text() + ', ';          // Days
  results.tts += tr.find('TD:nth-child(2) IMG').attr('alt') + ', '; // Sun
  results.tts += tr.find('TD:nth-child(3)').text();                 // Temperature
});

En « Français » le code parcours le DOM (visible sous chrome: avec bouton droit > Inspecter)

  • Dans la DIV qui a l’identifiant « prevision »
  • on récupère la première TABLE ayant la classe « prevSem1 »
  • puis on prend le 4ème TR correspondant à demain
  • On concatène les 3 TDs, en utilisant l’attribut alt de l’image

Voici une documentation des sélecteurs jQuery

 

  1. Effectivement une API de web-scraping au dessus de PhantomJS simplifierait grandement le tout (pourtant déjà bien simplifié grâce à ta bonne conception).

    As tu regarder pjscrape ?
    http://nrabinowitz.github.com/pjscrape/

    J’aime

  2. Ah c’est pas mal, c’est exactement ce que j’avais en tête.

    J’aime

  3. Bonjour,
    bon boulot.
    J’ai apporté une petite modification.
    Dans la grammaire, j’ai ajouté un niveau supplémentaire: « aujourd’hui » et « demain » qui renvoie une option ‘date’ qui contient 1 ou 3.

    et j’ai modifié le code .js comme suis:

      // Scrapping
      var pos = parseInt(options.date);
      results = evaluate(page, function(pos) {
        results = {};
    
        var tr = $('DIV#prevision TABLE.prevSem1 TR:nth-child('+pos+')'); // 1 = aujourd'hui  3=demain
    

    D’ailleurs vous parsez ‘options.movie’. Un reste du script d’origine ?

    J’aime

  4. Oh oui il était tard hier soir 🙂

    C’est super ! Je n’avais pas rajouté les jours aujourd’hui / demain pour ne pas trop complexifier le code du billet.

    J’aime

  5. Je viens de publier la version 1.3
    – Amélioration du scraping
    – Ajout de la météo (simple)

    Le fichier scraper.js se charge du reste. J’ai mis à jour l’article.

    J’aime

  6. Bonjour,
    Auriez vous une idée du script php de la grammaire météo ? je suis sous raspberry (raspbian) et j’en aurai besoin pour le yuri.php dans mon dossier serveur.

    J’utilise un vieux pc sous win 7 qui envoie les infos sur le rapi.

    Voici le site dont j’ai suivi le tuto:

    http://blog.idleman.fr/

    J’aime

  7. @Sigisbert Renardet Je crois que Yuri c’est un serveur LAMP qui n’utilise que la partie cliente de SARAH.

    La partie serveur de SARAH est en NodeJS et dans le cas du plugin Meteo, on fait un bête Scraping PhantomJS (ça changera dans la 2.8)

    La liste + code des modules:
    http://dl.dropboxusercontent.com/u/255810/Encausse.net/Sarah/plugins/index.html

    J’aime

  8. Merci de ta réponse,

    Peux t’on utiliser yuri et sara en même temps ?

    J’aime

  9. @Sigisbert Renardet oui et non

    Après une réco vocale, SARAH balance une requête HTTP indiqué dans son XML. Quel serveur choisir ?

    Il y a un chercher/remplacer de 127.0.0.1 par l’adresse du serveur donc ça doit être possible d’avoir des grammaires qui pointent NodeJS et d’autres qui pointent Yuri

    Mais je n’ai pas fait le test, il y a peut-être d’autres choses qui bloquent.

    J’aime

  10. Re,

    J’ai fait le test cela ne fonctionne pas, j’ai dezipper sarah sur le bureau (et aussi sur c:/), le serveur http se lance mais pas kinect . Je pense que c’est parce que j’ai utiliser yuri avant..
    Même avec un redémarrage ça passe pas.

    Une idée ?

    J’aime

  11. Je ne connais pas bien Yuri, il faut

    Installer SARAH sur c:/
    Lancer WSRMicro (l’icone apparait dans la barre des tâches)
    Lancer WSRNodeJS
    Avoir Yuri de lancé sur RPi

    Normalement tout doit marcher, sinon regarder les logs sur /bin

    Tester « SARAH il est quelle heure » => requête à NodeJS et réponse
    Copier les grammaire de Yuri dans ??? plugins ?
    Appeler une grammaire de Yuri ???

    Je pars du principe que les grammaire de Yuri on l’Ip du RPi dans le XML sinon il faut modifier les grammaires de Yuri pour mettre l’IP de RPi

    J’aime

  12. Salut à tous,

    J’ai installé le plugin meteo depuis le store, mais je ne comprend pas comment paramétrer la météo pour ma ville…
    J’ai fait quelques modifs dans les différents fichiers ou je trouvais l’information de la ville en la remplaçant par celle voulue, mais rien n’y fait…
    Et lorsque je lance une requete, voici le code que jobtiens dans le fichier log:

    « [2013:05:26 11:23:27] [ENGINE] RECOGNIZED Speech: 0,7381006/0,9621688 Device: Text: SARAH quelle est la météo demain
    [2013:05:26 11:23:27] [CONTEXT] Reset timeout
    [2013:05:26 11:23:27] [HTTP] Build HttpRequest: http://127.0.0.1:8080/sarah/meteo?date=3&confidence=0,7381006&directory=C:SARAHmacros
    [2013:05:26 11:23:27] [HTTP] Send HttpRequest: http://127.0.0.1:8080/sarah/meteo?date=3&confidence=0,7381006&directory=C:SARAHmacros
    [2013:05:26 11:25:07] [HTTP] System.Net.WebException: Le délai d’attente de l’opération a expiré.
    à System.Net.HttpWebRequest.GetResponse()
    à net.encausse.sarah.WSRHttpManager.SendRequest(String url) »

    J’aime

  13. Normalement,
    – Solution simple: tu modifies la ville par défaut depuis le site web > configurer
    – Solution avancée: tu déclares plus de villes dans le meteo.xml

    Bon après faut que le site meteofrance connaissent ton zipcode

    J’aime

    1. moi jai installer au moin 12 plugin de meteo diferant et auqun ne marche, sa me dis ‘Object false has no method ‘action’ ‘ et sa me fait aussi sa pour des plugin autres que meteo donc je voulais savoir quoi faire

      J’aime

  14. Super JP, ça a fonctionnė sans soucis!!
    En tout cas bravo pour le boulot que tu fais sur Sarah, et surtout sur le partage!

    J’aime

  15. Bonjour, petite question, si d’aventure le site venait à subir une refonte par exemple et que le code source ne ressemble plus à celui-ci, faut-il revoir tout le script ?
    Merci et bonne soirée 😉

    J’aime

    1. Les billets de blog sont surtout pour expliquer le fonctionnement de SARAH.
      – le code « qui marche » est surtout dans les plugin du marketplace
      – la « vrai » doc est sur Github

      J’aime

  16. Bonjour,

    Information très intéressante pour l’ajout de la météo dans SARAH.
    Cependant, savez-vous comment ajouter ce type de widget météo ? http://www.my-meteo.fr/meteo+webmaster.html

    Je trouve le design plutôt sympa et je voudrais l’avoir sur mon projet.

    Merci à vous.

    J’aime

    1. Le Portail contient des toutes petites portlets très basique en HTML. Pour changer le look actuelle il suffit de recoder la portlet avec le HTML qui va bien

      J’aime

  17. Bonjour, pour trouver le code de sa ville en france : http://www.insee.fr/fr/methodes/nomenclatures/cog/default.asp
    Cela a fonctionné pour moi.

    J’aime

Répondre à Sigisbert Renardet Annuler la réponse.