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 PythonkudagoGetData: function () {
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 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 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!