Concerts et événements KudaGo dans votre miroir

Je vais vous expliquer comment j'ai rendu possible la réception et l'affichage d'informations sur l'API publique KudaGo sur votre miroir. Bien sûr, il ne s'agit pas d'un miroir simple, mais d'un miroir «intelligent».

Qu'est-ce qu'un miroir intelligent?


Très probablement, beaucoup ont entendu parler de la plate-forme modulaire MagicMirror² , qui vous permet de déployer une application sur Raspberry Pi qui peut transformer un miroir pour un hall d'entrée ou une salle de bain en votre assistant personnel. Vous pouvez implémenter ceci ou cela en utilisant le miroir dit "bidirectionnel", le moniteur, les bras droits et le micro-ordinateur susmentionné.

La magie dans MagicMirror est uniquement dans le nom. Si j'ai bien compris, tout cela a été développé sur Electron , ce qui signifie que Node.js. est impliqué dans l'affaire. L '"Application" crée une page html qui, lorsqu'elle est lancée, s'ouvre dans une fenêtre de navigateur, et les soi-disant modules y sont déjà affichés, tous deux préinstallés (Horloge, Calendrier, Météo actuelle, Prévisions météorologiques, Flux d'actualités.) Et développés par la communauté . Et il y a suffisamment d'intéressant (à la fois utile et têtu inhabituel), par exemple, voici quelques-uns de plus d'une centaine de modules:

Utile



Fantaisie



Contexte


Sur la façon dont j'ai récupéré mon miroir, je ne peindrai pas en détail. Si quelqu'un s'intéresse, vous pouvez lire ici . Si vous souhaitez créer le vôtre, une simple recherche Google renverra des dizaines d'exemples \ guides \ manuels. Je veux montrer comment créer un module pour un tel miroir.

Je suis un grand fan d'assister à divers concerts et événements de Saint-Pétersbourg. Mais il arrive parfois que (même en tenant compte de l'abondance de la publicité contextuelle, du spam et des affiches) j'apprenne certains événements presque un jour ou deux avant eux. Par conséquent, j'ai toujours cherché un moyen de filtrer de manière optimale le flux d'informations les concernant. Les applications sur un smartphone aux fonctionnalités similaires ne sont pas restées longtemps (plus précisément, je les ai oubliées). Toutes les affiches ont nécessité du temps et un passage constant de la quête «choisissez 10 filtres et devinez lequel est le bon». Les flux de médias sociaux se sont généralement transformés en spam publicitaire. Et puis l'idée est venue avec l'idée d'implémenter un «analyseur» qui sélectionnerait périodiquement des informations sur ses propres critères et les afficherait quelque part.

Développement de votre module


Si quelqu'un veut immédiatement voir le résultat, ou installer le module sur un «miroir», alors voici le lien vers le référentiel . Il y a aussi des instructions d'installation.

En tant que source d'informations, le service kudago s'est avéré être le plus adéquat. Aucune inscription requise. Méthodes sensées. Des données concises dans la réponse. Ce n'est pas une couverture étrange, cela inclut non seulement les "trottoirs urbains" et "non-caoutchouc", mais aussi 9 grandes villes russes en plus.

Notre module développé doit être stocké dans le dossier modules / modulename . Pour créer un module simple (comme le mien), nous devons créer deux fichiers dans ce dossier:

  • modulename / modulename.js est le script du module principal.
  • modulename / node_helper.js est l '"aide facultative" qui sera chargée par le script. L'assistant et le script de module peuvent communiquer entre eux à l'aide d'un système de socket intégré.

Après avoir bricolé un guide du développeur MagicMirror , ainsi que regarder les solutions d'autres personnes, j'ai téléchargé un script pour obtenir des entrées de l'API kudago en utilisant XMLHttpRequest. Et a rencontré le problème des requêtes inter-domaines. Je ne suis pas du tout un expert en javascript (et même pas un développeur). Tout ce que j'ai compris, c'est d'envoyer une demande "exécuter un script dans un navigateur" et d'obtenir une réponse de kudago, je n'ai pas réussi. Voici ce que learn.javascript m'a expliqué

Les demandes interdomaines font l'objet d'un contrôle de sécurité spécial, dont le but est d'empêcher les pirates malveillants de conquérir Internet.

Sérieusement. Les développeurs de la norme ont fourni toutes les barrières afin que le «hacker maléfique» ne puisse pas, en utilisant la nouvelle norme, faire quelque chose de fondamentalement différent de ce qu'il aurait pu faire auparavant et, par conséquent, «casser» un serveur exécutant l'ancienne norme. et ne rien attendre de fondamentalement nouveau.

Enfin, pas vraiment ce que je voulais. Je n'avais aucune envie de comprendre les problèmes javascript. Après tout, à portée de main était le Python familier et prévisible. Je vais juste obtenir des informations de la bibliothèque de requêtes , en écrivant le résultat dans json. Il ne reste plus qu'à résoudre la question de savoir comment faire exécuter du code Python à partir de js.

Il s'avère que node_helper.js m'est utile! Lors du démarrage de notre module, vous pouvez utiliser les capacités de python-shell . Spécifiez simplement le chemin d'accès à l'interpréteur Python, le chemin d'accès au script, les arguments et leurs valeurs. Sous cette forme, kudago m'a gentiment retourné une réponse réussie.

Code d'appel du script Python
kudagoGetData: function () { //call python script for collecting events from KudaGo api self = this; var options = { pythonPath: this.config.pythonPath, scriptPath: './modules/MMM-KudaGo', mode: 'json', args: [ "--location", this.config.location, "--days", this.config.days, "--categories", this.config.categories, "--tags", this.config.tags, ] }; pyshell.PythonShell.run('KudaGo.py', options, function (err) { if (err) throw err; }); } 


De plus, seul node_helper.js est capable de lire les informations du fichier json (par défaut, le fichier se trouvera sur le chemin kudago / events.json ) avec les données téléchargées de kudago. Nous y implémentons la même lecture du fichier.

Code pour lire les informations d'un fichier
 readData: function () { //read a file with events fs.readFile("./modules/MMM-KudaGo/kudago/events.json", "utf8", (err, data) => { if (err) throw err; this.sendSocketNotification("DATA", data); }); } 


Comme je l'ai déjà écrit, dans MagicMirror tous les modules communiquent via un système de socket, donc pour que notre script Python s'exécute au démarrage, ajoutez le code approprié à node_helper.js

Code pour démarrer le module au démarrage
 socketNotificationReceived: function (notification, payload) { if (notification === "START") { this.config = payload; this.kudagoGetData(); setInterval(() => { this.kudagoGetData(); }, this.config.updateInterval); } } 


Tous les paramètres obtenus à partir de this.config sont soit les variables prédéfinies dans le fichier principal du module, soit celles spécifiées dans config.js - le fichier de configuration générale pour tous les modules MagicMirror.

Exemple de configuration pour le module créé
 { module: 'MMM-KudaGo', disabled: false, position: 'bottom_bar', config: { location: "spb", categories: "concert", tags: "  --,", days: 7 } } 


Eh bien, dans le fichier principal de notre module MMM-KudaGo.js, il y a des paramètres par défaut, des fonctions pour gérer les données d'événement (prises à partir d'un fichier json), des signes pour dessiner une plaque (à partir de laquelle les gens qui savent vont saigner du sang de mes yeux, mais je suis dans un réservoir, la chose principale pour moi est travaillé). En raison du fait que j'ai retiré le travail avec l'API dans des fichiers python, les fichiers .js ne sont pas surchargés de code (contrairement à la plupart des autres modules), imbriqués (ou comment sont-ils appelés ici?) Fonctions, boucles et autres nouilles.

Résultat


Capture d'écran du module lui-même
image

Capture d'écran miroir
image

Il s'est avéré implémenter une recherche pour une ou plusieurs catégories d'événements, une recherche par balises, une recherche pour un intervalle de jours donné, avec une mise à jour à des intervalles spécifiés (pour une liste plus détaillée des catégories et des balises, voir le fichier Lisez - moi ). Et affichez le tout sur l'écran, en indiquant le lieu, le nom, la date et le prix, sous une forme lisible, et sans perdre de temps sur une recherche indépendante.

Bien sûr, vous devez regarder attentivement plusieurs fois ce que l'applet y renvoie pour comprendre quelles balises vous devez mettre afin qu'elle ne montre pas de concerts ou de représentations théâtrales, mais par exemple des cours de yoga ou des festivals gratuits dans votre ville. Mais personnellement, mes besoins sont pleinement satisfaits!

J'espère que vous avez également trouvé et créé un module utile pour la communauté, que vous partagez avec les autres sur une page spéciale du projet. Soit dit en passant, si vous avez de bonnes idées ou besoin de quelque chose, écrivez dans les commentaires. Peut-être pousser quelqu'un à la création!

Source: https://habr.com/ru/post/fr473344/


All Articles