[PYTHON] L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT

Il semble que vous ayez lu l'autre jour Agrégation de la confirmation d'état et du fonctionnement d'IRKit et de Philips Hue avec MQTT, et après tout l'IoT est chaud. J'ai un ressenti.

Alors cette fois, parlons de MQTT avec Pepper. Cette fois, j'ai senti que ** "Si vous interconnectez le mécanisme de mémoire (ALMemory) et MQTT, vous pouvez facilement écrire une coopération cloud ou une application de coopération externe", alors j'ai fait une boîte comme ça **.

Quant à la gestion de MQTT avec Pepper, Suna l'a déjà essayé, je l'ai donc utilisé comme référence. Il est très soigneusement organisé, veuillez donc vous référer ici pour le contexte technique et les éléments.

Au fait, il y a quelques astuces personnelles telles que la façon de distribuer facilement celui qui utilise le module dans la boîte Python avec la bibliothèque de boîtes. Je le fais en tant que développement individuel jusqu'au dernier, mais depuis que j'ai tout fait, j'ai envie d'écrire comment l'utiliser et comment y penser.

Avec ALMemory, MQTT, modèle Pub / Sub

NAOqi est la base logicielle de Pepper, et au centre de ce framework se trouve un module appelé ** ALMemory **. Il prend en charge les événements de déclenchement, y souscription, la définition et la récupération de valeurs, etc. Il est conçu pour faire. (Pour plus de détails, voir [Acquisition d'événements et de valeurs via ALMemory](http://qiita.com/Atelier-Akihabara/items/4162192129f366da1240#almemory%E3%82%92%E4%BB%8B%E3%81%97] % E3% 81% 9F% E3% 82% A4% E3% 83% 99% E3% 83% B3% E3% 83% 88% E5% 80% A4% E3% 81% AE% E5% 8F% 96% E5 Voir environ% BE% 97))

D'autre part, ** MQTT ** peut être trouvé en lisant les messages [En savoir plus sur MQTT] de Shiguredo (https://sango.shiguredo.jp/mqtt), et divers appareils émettant des messages. C'est un protocole qui vous permet de vous abonner aux messages émis par un autre appareil. Différents appareils peuvent publier et s'abonner à des messages via ce qu'on appelle le courtier MQTT.

Ces modèles, tels que l'émission de messages et leur abonnement, sont appelés modèles Pub / Sub, mais ALMemory et MQTT sont ** le même modèle, et je suis sûr qu'ils ont une forte affinité **. Voilà pourquoi.

Poivre et nuage

J'ai aidé à développer avec Pepper lors d'événements, etc., et le sentiment que "En reliant Pepper à divers services externes, non seulement Pepper lui-même mais aussi la valeur du service sera encore améliorée" devient de plus en plus fort. Je vais.

Chaque service fournit une bibliothèque client très pratique, mais il est assez difficile d'utiliser ces bibliothèques directement à partir de la bibliothèque box fournie par l'outil de développement de Pepper Choregraphe, et dans de nombreux cas, il y a un mur de codage. Je ne peux pas l'éviter. De plus, bien que NAOqi soit un environnement d'exécution basé sur Python, c'est un environnement où le codage est facile car les outils de gestion de paquets tels que pip ne peuvent pas être utilisés librement et il y a des choses comme «les manières spécifiques à NAOqi». La situation actuelle est que ce n'est pas le cas.

De plus, bien que le processeur et la mémoire de Pepper aient été renforcés pour la vente générale, il est nécessaire d'utiliser la puissance de calcul pour un contrôle autonome comme la sécurité et des pièces telles que les cartes d'émotions, et il est également possible de faire circuler le calcul avec l'application. Il semble y avoir un problème. Il semble que des calculs lourds tels que le traitement de la reconnaissance devront être pris en compte dans le cloud ou sur un serveur quelque part en dehors de Pepper.

Boîtier adaptateur MQTT: liaison Pepper-Cloud d'interconnexion ALMemory-MQTT

C'est pourquoi j'ai pensé qu'en interconnectant ALMemory et MQTT, il serait possible de se relier facilement à des systèmes externes tels que le cloud avec juste le boîtier qui gère ALMemory.

image

Dans la zone Adaptateur MQTT, spécifiez ** à l'avance l'association entre la clé dans ALMemory et le sujet de MQTT **. En donnant ces informations d'association et de connexion à MQTT Broker, tout ce que vous avez à faire est de démarrer la boîte de l'adaptateur MQTT.

Je pense que ce serait intéressant de pouvoir bouger ainsi.

Boîtier adaptateur MQTT: comment utiliser

C'est pourquoi j'ai créé le boîtier adaptateur MQTT.

J'essaie de l'ajouter à la même bibliothèque de boîtes que la précédente Abonnez-vous à la boîte d'événement réécrite avec qi Framework. GitHub est ci-dessous

Le répertoire ** web-boxes ** est la bibliothèque box. Je vais vous expliquer comment charger et utiliser la bibliothèque box.

Chargement de la bibliothèque de boîtes

Pour placer le boîtier adaptateur MQTT dans votre application, vous devez d'abord ouvrir la bibliothèque de boîtes dans Choregraphe. Procédez comme suit:

  1. Sélectionnez [Ouvrir la bibliothèque de boîtes] dans le panneau [Bibliothèque de boîtes].

    BoxLib_Open.png

  2. Sélectionnez ** répertoire web-boxes ** dans les répertoires téléchargés ou clonés depuis GitHub.

    BoxLib_OpenDir.png

Notez que vous devez sélectionner «Box Library Directories» comme type de fichier.

  1. ** bibliothèque de boîtes web-box ** apparaîtra dans le panneau de bibliothèque de boîtes

    BoxLib_Loaded.png

Vous pouvez maintenant utiliser la bibliothèque de boîtes Web, qui comprend la boîte d'adaptateur MQTT.

Emplacement du boîtier adaptateur MQTT

La boîte Réseau> Adaptateur MQTT de la bibliothèque de boîtes Web est utilisée comme suit.

  1. Faites glisser et déposez la boîte Réseau> Adaptateur MQTT de la bibliothèque de boîtes web-boxes sur le panneau Diagramme de flux.

    MQTTAdapter_DnD.png

Cette boîte d'adaptateur MQTT utilise un module appelé paho, qui est automatiquement sous projet lorsque vous faites glisser et déposez la boîte d'adaptateur MQTT. Il est conçu pour être importé dans.

  1. Ouvrez la boîte de dialogue des paramètres de la boîte de l'adaptateur MQTT et définissez les paramètres suivants Les valeurs suivantes peuvent être définies. --Host ... Nom d'hôte du courtier MQTT --Port ... Numéro de port du courtier MQTT --Nom d'utilisateur ... Nom d'utilisateur de la connexion du courtier MQTT --Password ... Mot de passe de connexion du courtier MQTT
  1. Démarrez la boîte de l'adaptateur MQTT au bon moment --Démarrer l'interconnexion entre MQTT et ALMemory avec l'entrée onStart ... Après l'exécution du processus de connexion, la sortie onConnected est déclenchée. Ensuite, le relais d'événement entre ALMemory et MQTT sera exécuté jusqu'à ce que onStop soit entré. --L'entrée onStop met fin à l'interconnexion ... Lorsque la connexion se termine, la sortie onStopped est déclenchée.

Les détails de la méthode de définition et de l'exemple d'exécution seront expliqués ci-dessous.

Correspondance des thèmes clés

Le paramètre Liaisons de rubrique clé dans la zone Adaptateur MQTT vous permet de spécifier quelle valeur de clé dans ALMemory doit être associée à quelle valeur de rubrique dans MQTT.

Les correspondances sont spécifiées en les séparant par ʻALMemory key: MQTT topicet ainsi de suite. Plusieurs correspondances peuvent être définies en les séparant par;`.

En ajoutant / # à la fin du nom de la clé et du nom du sujet, vous pouvez spécifier les sujets clés suivants à la fois. Par exemple

Vous pouvez également définir des conversions de valeurs en définissant ʻALMemory key: MQTT topic: type`, etc.

--Si vous ne spécifiez pas de type, la valeur ne sera pas convertie lors de la conversion d'événement ALMemory-MQTT et la valeur sera envoyée avec le même type. Par conséquent, si l'événement a une valeur d'un type qui ne correspond pas à la charge utile MQTT, son émission peut échouer. --Si le type est str, il sera converti en type chaîne de caractères au moment de la conversion ALMemory → MQTT. Il en va de même pour MQTT → AL Memory --Si le type est json, vider dans json au moment de la conversion ALMemory → MQTT. Json est analysé lors de la conversion de MQTT vers ALMemory.

Voici un exemple de son utilisation ...

Passer une valeur de MQTT à Pepper Exemple: dire des instructions à Pepper à partir d'un autre appareil

Vous pouvez lancer une valeur d'un autre appareil dans ALMemory de Pepper via l'adaptateur MQTT et l'utiliser pour faire quelque chose comme Say Text. Voir ** samples / mqtt-say-text ** sur GitHub pour des exemples.

  1. Placez et installez le boîtier de l'adaptateur MQTT. Cette fois à titre d'exemple --Utilisez test.mosquitto.org pour MQTT Broker --Définir la rubrique MQTT test-yacchin1205 / sample1 / Message à interconnecter avec ALMemory MQTT / Test / Sample1 / Message

    mqtt-say-text_settings.png

  2. Créez une entrée dans le diagramme de flux pour vous abonner à l'événement MQTT / Test / Sample1 / Message et connectez-le à la zone Say Text.

    mqtt-say-text_flow.png

À titre de test, avec cette application en cours d'exécution, essayez de lancer un message à MQTT avec la commande mosquitto_pub installée sur votre Raspberry Pi. Par exemple, si vous lancez une rubrique test-yacchin1205 / sample1 / Message (ALMemory dans MQTT / Test / Sample1 / Message) au message Hello de `` MQTT est comme suit.

pi@raspberrypi ~ $ mosquitto_pub -h test.mosquitto.org -t test-yacchin1205/sample1/Message -Bonjour de m MQTT

La zone Say Text répondra alors via ALMemory.

mqtt-say-text_robotview.png

En passant par MQTT de cette manière, vous pouvez facilement lancer des instructions à Pepper depuis l'extérieur de Pepper.

Passer une valeur de Pepper à MQTT Exemple: contrôler la teinte de Pepper

Comme présenté dans Agrégation de la vérification de l'état et du fonctionnement d'IRKit et de Philips Hue avec MQTT, Hue chez moi peut être utilisé via MQTT. ..

Cette fois, j'écrirai un exemple qui contrôle l'éclairage de la lampe de Hue en caressant la tête de Pepper.

Correspondance entre MQTT et Hue

À la maison, ʻusername / hue / xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx (bridge UDN) / light / x (light ID) / status` En lançant des données JSON sur le sujet, l'état d'éclairage de la lumière peut être modifié comme suit. J'essaye de le contrôler.

username/hue/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/light/x/status {"on": true, "saturation": 254, "brightness": 204, "hue": 34297}

Ici, si vous donnez une valeur liée à l'état d'éclairage de Hue à ALMemory, vous voulez changer l'état de Hue, mais si vous donnez de telles données JSON (dict), dans ALMemory `[[" on ", True] , ["saturation", 254], ["luminosité", 204], ["teinte", 34297]] ʻest automatiquement converti.

Créer une application

Créez l'application comme suit. Des informations telles que l'identifiant et le mot de passe seront incluses, donc seulement un aperçu ...

  1. Placez et installez le boîtier de l'adaptateur MQTT --Utilisez Sango pour le courtier MQTT. Utilisez les informations spécifiées par Sango pour l'hôte, le port, le nom d'utilisateur et le mot de passe
  1. Place Sensing> Touch> Tactile Head box et nouvelle boîte Python (Hue On, Hue Off), Programmation> Memory> Raise Event box

    pepper-hue_flow.png

  2. La case Hue On doit afficher une valeur qui active Hue.

    def onInput_onStart(self):
        self.onStopped([["on", True], ["saturation", 254], ["brightness", 204], ["hue", 34297]])
    
  3. Dans la zone Hue Off, indiquez une valeur qui désactive Hue.

    def onInput_onStart(self):
        self.onStopped([["on", False], ["saturation", 254], ["brightness", 204], ["hue", 34297]])
    
  4. Connectez la boîte Événement d'augmentation à la boîte Hue On et Hue Off, et spécifiez la clé correspondant au pont et à la lumière Hue.

    pepper-hue_eventname.png

Avec cela seul, toucher l'avant de la tête transmettra les données d'instructions d'éclairage au programme de commande Hue Bridge via MQTT, et la lampe peut être allumée et éteinte en touchant l'arrière.

Petite histoire: inclure du code Python dans la bibliothèque de boîtes

Dans Creating a Tweet Box for Pepper, j'ai écrit une méthode pour inclure un module Python (.py) dans un projet et l'importer depuis une boîte Python. Cette procédure nécessite des procédures telles que la copie de fichiers lors de la création d'un projet, et elle est un peu gênante à utiliser pour l'implémentation. ** Ce serait bien d'avoir un mécanisme pour conserver les fichiers de ces modules Python dans la bibliothèque de boîtes afin que lorsque vous copiez la boîte dans votre projet, vous puissiez également copier le code Python ensemble **.

Cette fois, nous y sommes parvenus en utilisant le mécanisme de ** fichier joint **. Si vous regardez le contenu de la boîte de l'adaptateur MQTT, vous constaterez que la boîte d'implément de l'adaptateur MQTT de la boîte Python est en fait à l'intérieur.

python-module-attach-1.png

Dans cette boîte, il y a des variables de type [Attachment] appelées LibFile1, ..., LibFile4. Ici, j'ai spécifié les fichiers que je souhaite inclure lors de la copie de la bibliothèque de boîtes vers le comportement.

python-module-attach-2.png

En faisant cela, les fichiers sous / paho / ... seront copiés lorsqu'ils seront copiés de la bibliothèque de boîtes vers le comportement.

J'ai volontairement créé la boîte MQTT Adapter Impl en tant qu'enfant de la boîte MQTT Adapter parce que je ne voulais pas montrer les éléments liés à ces pièces jointes aux utilisateurs de la boîte (pour éviter toute confusion, etc.).

Pour l'instant, cela semble fonctionner correctement, mais lors de la création d'une bibliothèque de boîtes, lors de la copie d'un comportement vers une bibliothèque de boîtes, le chemin du fichier joint ressemble au chemin relatif dans le projet (et non au chemin relatif dans le comportement). Il peut y avoir des pièges et il peut y avoir d'autres pièges, donc cette fois il ne s'agit que d'un essai.

Résumé

Grâce au support MQTT de Hue et IRKit, j'ai senti qu'il serait plus facile de lier des applications à l'aide de MQTT, j'ai donc créé une boîte qui peut gérer MQTT même avec Pepper et en ai fait un formulaire qui peut être distribué sous forme de bibliothèque de boîtes.

Je l'ai fait sans penser au chiffrement pour le moment, mais je veux toujours prendre en charge TLS. Je vais le mettre à jour sur GitHub, alors jetez un œil. De plus, les demandes d'extraction sont les bienvenues.

Cependant, les modèles PubSub comme MQTT sont sympas de pouvoir coder librement la communication entre les nœuds, mais si je flirtais et écrivais divers codes, j'ai accidentellement créé du code qui envoie des messages de ping-pong, et en un clin d'œil 10000 Il y a aussi eu une tragédie comme l'envoi d'un message ou le manque d'emplacements gratuits. Je pense qu'il serait peut-être préférable de configurer un courtier MQTT par vous-même en utilisant Mosquitto pour les tests.

Recommended Posts

L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
L'histoire de la création d'un bot de boîte à questions avec discord.py
L'histoire de la création d'un module qui ignore le courrier avec python
L'histoire de la création d'un outil qui fonctionne sur Mac et Windows sur le site de développement de jeux
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
L'histoire de la création d'un générateur d'icônes mel
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
Une histoire qui réduit l'effort de fonctionnement / maintenance
L'histoire de la création d'un réseau neuronal de génération musicale
Une histoire qui a analysé la livraison de Nico Nama.
L'histoire de Python et l'histoire de NaN
L'histoire de l'exportation d'un programme
L'histoire de la création d'un pilote standard pour db avec python.
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
Ceci et celui de la notation d'inclusion.
L'histoire de la fabrication d'un moule immuable
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
L'histoire de la création d'un slackbot qui génère un gif ou un png lorsque vous envoyez le code de traitement
L'histoire d'essayer deep3d et de perdre
L'histoire du traitement A du blackjack (python)
L'histoire de la création d'une compétence (probablement) minimale qui implémente la personnalisation et la facturation des compétences
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
L'histoire de la création du Mel Icon Generator version 2
Prise en compte des forces et faiblesses de Python
L'histoire du serveur Web et du DAG d'Airflow, dont le chargement prend beaucoup de temps
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
Une histoire que Seaborn était facile, pratique et impressionnée
L'histoire du lancement d'un serveur Minecraft depuis Discord
[Python] Un programme qui compte le nombre de vallées
L'histoire de Python sans opérateurs d'incrémentation et de décrémentation.
J'ai créé une boîte de changement de seuil pour Pepper's Dialog
Créez un BOT qui raccourcit l'URL Discord
Une histoire d'essayer pyenv, virtualenv et virtualenvwrapper
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Une histoire qui a eu du mal avec l'ensemble commun HTTP_PROXY = ~
Générer cette forme du fond d'une bouteille pour animaux de compagnie
Une histoire sur le changement du nom principal de BlueZ
L'histoire selon laquelle la valeur de retour de tape.gradient () était None
Le problème Zip 4 Gbyte est une histoire du passé
[Python] Un programme qui compare les positions des kangourous.
Je suis à Singapour en ce moment Une histoire sur la création d'un LineBot et la volonté de faire un travail mémorable
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV
L'histoire de la création d'un «espace de discussion sur l'esprit et le temps» exclusivement pour les ingénieurs de l'entreprise
Une bibliothèque qui surveille la vie et la mort d'autres machines en envoyant un ping à partir de Python
Une histoire qui facilite l'estimation de la surface habitable à l'aide d'Elasticsearch et de Python
Une histoire sur le portage du code de "Essayez de comprendre comment fonctionne Linux" sur Rust
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
L'histoire de sys.path.append ()
Un outil qui transforme automatiquement le gacha de Soshage
L'histoire de la création d'un canal VIP dans le chatwork en interne
Obtenez l'identifiant d'un GPU avec une faible utilisation de la mémoire
L'histoire du champ de modèle Django disparaissant de la classe