Table des matières:

Système simple de statut et de réservation Kicker avec intégration Slack : 12 étapes (avec photos)
Système simple de statut et de réservation Kicker avec intégration Slack : 12 étapes (avec photos)

Vidéo: Système simple de statut et de réservation Kicker avec intégration Slack : 12 étapes (avec photos)

Vidéo: Système simple de statut et de réservation Kicker avec intégration Slack : 12 étapes (avec photos)
Vidéo: Méthode simple pour rédiger les statuts d'une association 2024, Juillet
Anonim
Système simple de statut et de réservation Kicker avec intégration Slack
Système simple de statut et de réservation Kicker avec intégration Slack

Dans une entreprise où je travaille, il y a une table de kicker. L'entreprise occupe plusieurs étages et pour certains employés, il faut jusqu'à 3 minutes pour se mettre à table et… se rendre compte que la table est déjà occupée.

C'est ainsi qu'est née l'idée de construire une sorte de système simple de diffusion et de réservation de statuts fonctionnant en temps réel.

L'entreprise utilise l'outil de communication Slack où chaque employé a un compte. Nous avons même une chaîne #kicker juste pour discuter de… kicker. Le canal pourrait être utilisé comme une sorte de "point d'entrée" pour la réservation et pour être informé de l'état actuel de la table.

Comme d'habitude, il existe de nombreux concepts pour gérer un tel système. Mais généralement, une règle de base est apparue dans chacun d'eux: il doit être simple à utiliser sans aucune étape excessive à effectuer lors de la manipulation du système.

L'appareil et le service ne sont pas collés à la table kicker et peuvent être utilisés pour toute "ressource commune" (comme une table de ping-pong, une console, etc.) qui nécessite une sorte de solution de diffusion de statut et de réservation.

Alors, commençons…

Étape 1: Preuve de concept et prototypage

Preuve de concept et prototypage
Preuve de concept et prototypage
Preuve de concept et prototypage
Preuve de concept et prototypage
Preuve de concept et prototypage
Preuve de concept et prototypage

En gros, l'idée était de construire un appareil qui sera posé à côté de la table des kickers en suivant ces exigences:

  • quelques indicateurs sur l'état actuel de la table - si vous vous tenez à côté d'elle, vous devriez pouvoir savoir qu'elle est libre ou réservée et que quelqu'un viendra jouer dans 3 minutes. Les feux tricolores correspondent parfaitement à l'idée:

    • feu vert - libre de jouer,
    • feu jaune - réservé,
    • feu rouge - occupé.
  • bouton(s) Vous pouvez cliquer avant et après le jeu pour que tout le monde soit informé de l'état actuel de la table. Au lieu d'un bouton bascule, j'ai décidé d'utiliser 2 boutons séparés:

    • bouton rouge - occuper la table, démarrer une partie (après réservation ou ad hoc).
    • bouton vert - table de libération.
  • certains affichages avec des informations plus détaillées sur "ce qui se passe" - délai de réservation, statut de table répété, délai de lecture, etc.

Par réservation, j'entends juste la réservation pour les 3 prochaines minutes. Le système n'est pas conçu pour que l'utilisateur puisse réserver la table à l'heure exacte (par exemple 14h00). Cela ne fonctionne pas comme la réservation, par ex. dans les restaurants mais juste pour les minutes à venir.

En raison du manque de connexion LAN en place, la seule option est d'utiliser le WLAN - c'est de toute façon la meilleure option. Le cerveau du système doit utiliser l'API Slack pour envoyer et recevoir des commandes du canal Slack. J'ai d'abord essayé d'utiliser NodeMCU. J'ai pu recevoir et recevoir des messages vers et depuis Slack, mais en raison de l'utilisation de HTTPS et de la taille du "message de bienvenue" de Slack (~ 300 Ko), NodeMCU perdait la connexion et/ou obtenait une exception étrange que je ne pouvais pas résoudre en creusant via Internet.

J'ai donc décidé d'utiliser quelque chose de plus puissant: Raspberry Pi 3 (Zero W avec WiFi n'était pas encore sorti à cette époque). En ayant RPi, je pouvais changer le langage d'implémentation de C à Java car c'est plus pratique pour moi - c'était donc un avantage. Aujourd'hui, vous pouvez utiliser quelque chose de plus puissant que NodeMCU et de moins puissant que RPi. Raspberry Zero peut-être ?

Après avoir construit le premier prototype sur une maquette avec un câblage fou, beaucoup de croquis et de prototypage, le système semblait pouvoir fonctionner.

Ayant toutes ces idées et un PoC fonctionnel, j'ai commencé à planifier différentes configurations de placement des éléments ci-dessus sur un panneau avant afin qu'ils soient les plus informatifs et les plus pratiques à utiliser. Vous pouvez vérifier certaines des autres propositions, peut-être que certaines vous conviennent mieux. Le dernier a été choisi par moi.

Étape 2: Matériaux et outils

Matériel que j'ai utilisé:

  • Boîte
  • Raspberry Pi, carte microSD, alimentation micro USB
  • Boutons d'arcade verts et rouges
  • Écran LCD 16x2
  • LEDs - j'ai utilisé RVB mais vous pouvez utiliser la bonne couleur
  • Câbles de raccordement mâle à femelle et femelle à femelle
  • Interface micro-USB
  • Mini planche à pain juste pour connecter quelques fils
  • Câble micro USB court fonctionnant comme un cavalier à l'intérieur de la boîte pour alimenter le RPi

Outils que j'ai utilisé:

  • Un couteau bien aiguisé (par exemple un couteau utilitaire pour couper un tapis)
  • Outil rotatif
  • Pistolet à colle chaude
  • Poste de soudure
  • Pinces, pinces coupantes/couteaux latéraux
  • Tournevis
  • Déposer
  • Moi

Outils Vous avez probablement besoin de:

Tout ce qui précède, mais au lieu de "Moi", ce devrait être: "Vous":)

Étape 3: Panneau avant - Écran LCD

Panneau avant - Écran LCD
Panneau avant - Écran LCD
Panneau avant - Écran LCD
Panneau avant - Écran LCD

Le trou pour l'écran LCD était simple. Juste un rectangle qui s'adapte à mon écran LCD. Après avoir essayé de le couper avec un couteau bien aiguisé, je me suis rendu compte que le plastique de la boîte est assez dur. J'ai donc utilisé un outil de perçage pour couper la fenêtre et polir les bords.

Étape 4: Panneau avant - LED d'état

Panneau avant - LED d'état
Panneau avant - LED d'état
Panneau avant - LED d'état
Panneau avant - LED d'état

Les trous de LED sont également simples. J'ai juste pris une grosse perceuse à bois puis j'ai poli les bords avec un outil de perçage. Les grosses LED étaient parfaitement ajustées. Je n'ai pas encore soudé de résistances aux LED - je les ai laissées pour le processus d'assemblage.

Étape 5: Panneau avant - Boutons

Panneau avant - Boutons
Panneau avant - Boutons
Panneau avant - Boutons
Panneau avant - Boutons
Panneau avant - Boutons
Panneau avant - Boutons
Panneau avant - Boutons
Panneau avant - Boutons

Le plus gros problème avec ces 2 gros boutons était de les placer uniformément avec le bon espacement. J'ai coupé les trous en utilisant simplement mon outil de perçage car je pouvais augmenter le diamètre étape par étape afin que les boutons soient bien ajustés.

Étape 6: Connecteur d'alimentation

Câble d'alimentation
Câble d'alimentation

Un petit trou pour l'alimentation micro USB était un travail très délicat à faire. Je voulais que le trou soit aussi ajusté que possible, alors j'ai passé beaucoup de temps ici pour le polissage. Mais j'étais satisfait du résultat final.

Ensuite, j'ai coupé un court câble mini USB qui a été placé à l'intérieur de la boîte. D'un côté, il est branché sur RPi, et de l'autre côté, tous les câbles ont été soudés à l'interface micro USB selon les brochages USB.

Ensuite, j'ai collé à chaud le petit PCB directement sur le boitier (on le voit sur une photo lors de l'étape d'assemblage).

Étape 7: Tout assembler

Tout mettre ensemble
Tout mettre ensemble
Tout mettre ensemble
Tout mettre ensemble
Tout mettre ensemble
Tout mettre ensemble

J'ai d'abord soudé les résistances appropriées aux LED en fonction de leur couleur (tension) pour 3,3V volt. J'ai utilisé 100Ω pour le rouge, deux résistances 82 et 100 pour le jaune (nœud vert et rouge), et 100Ω pour le vert. Vous pouvez utiliser celui de la résistance en ligne pour la calculatrice LED. Mais veuillez faire des recherches par vous-même en fonction de la luminosité et de la tonalité de couleur exacte que vous souhaitez obtenir.

Les pattes de la LED jaune ont été soudées ensemble afin que la LED elle-même puisse être contrôlée par une seule broche sur le RPi.

D'après ce schéma de brochage:

Les nœuds LED ont été connectés:

  • LED verte - GPIO1 sur Rpi
  • LED jaune (les deux pattes) vers GPIO2 sur RPi
  • LED rouge vers GPIO0 sur RPi

J'ai connecté l'écran LCD en utilisant des broches I2C sur des broches RPi

  • LCD SDA vers GPIO8 sur RPi
  • LCD SCL vers GPIO9 sur RPi
  • LCD PWR à 5V sur RPi
  • LCD GND à GND sur RPi

L'écran LCD a été collé à chaud sur le boîtier comme protection supplémentaire.

J'ai connecté 3,3 V et GND à la petite planche à pain pour pouvoir les utiliser pour les boutons.

Le bouton vert était connecté au 3,3 V via une mini planche à pain et au GPIO5 sur RPi.

Le bouton rouge était connecté au 3,3 V via une mini planche à pain et au GPIO4 sur RPi.

Ainsi, chaque fois que vous appuyez sur le bouton, il y a un état haut sur la broche RPi.

Le mini Bradboard fonctionne très bien, j'ai donc sauté de souder tous les fils dans le PCB. Au lieu de cela, j'ai juste recouvert la mini planche à pain avec de la colle chaude pour que les câbles ne tombent pas.

J'ai également collé à chaud le couvercle du RPi sur la boîte pour qu'il ne vacille pas à l'intérieur.

J'ai vissé le panneau avant avec tous les trucs à l'intérieur.

Ensuite, j'ai imprimé, découpé et collé des étiquettes simples à côté des feux de circulation et des boutons.

Étape 8: Configuration de Slack

Configuration de la marge
Configuration de la marge
Configuration de la marge
Configuration de la marge

Créez votre équipe sur Slack.com ou utilisez celle dont vous disposez et vous avez au moins les droits d'administrateur.

Dans Slack, créez une chaîne pour l'intégration du service Slack (ou ignorez la création d'une chaîne si vous souhaitez en utiliser une que vous possédez déjà).

Ajoutez l'intégration des Webhooks entrants à votre équipe. Sélectionnez la chaîne et copiez l'URL du webhook.

Ajoutez l'intégration de Bots à votre équipe. Choisissez un nom pour votre bot et copiez le jeton API du bot.

La page de gestion de vos intégrations personnalisées devrait ressembler à l'image.

Vous devez inviter le bot en tant que membre de votre chaîne. Vous pouvez déjà le faire lors de la création d'un canal.

Si vous souhaitez personnaliser le service ultérieurement, veuillez consulter l'API Slack.

Étape 9: Implémentation du logiciel

J'ai utilisé Raspbian comme système d'exploitation pour mon RPi en suivant ce tutoriel. S'il vous plaît pardonnez-moi, je vais sauter l'expliquer car il est déjà documenté dans de nombreux endroits et le processus est simple. J'espère que vous êtes suffisamment compétent et expérimenté pour réussir à configurer RPi par vous-même. N'oubliez pas de configurer l'accès WiFi sur votre Raspberry Pi;)

Comme mentionné dans la section sur le prototypage, j'ai utilisé Java pour implémenter le cerveau de l'ensemble du système. Le code est disponible sur GitHub -

Les bibliothèques Java que j'ai utilisées:

  • pi4j - pour utiliser Raspberry Pi depuis Java
  • Springboot comme plate-forme d'application
  • allbegray/slack-api comme intégration Slack

Vous devez éditer le fichier de configuration dans src/resources/config.properties. Il y a 3 entrées que vous devez configurer pour utiliser l'API Slack:

  • channelName - nom du canal Vous souhaitez publier des changements d'état et recevoir des commandes.
  • slackBotToken - jeton d'un bot configuré dans les intégrations de votre équipe Slack qui sera utilisé pour publier des messages sur le canal mentionné ci-dessus. Veuillez noter que vous devez ajouter Slack Bot en tant que membre de la chaîne.
  • webhookUrl - l'URL que vous pouvez obtenir à partir des intégrations personnalisées de Slack Team.

Le projet est Mavenized, donc pour le construire, tapez simplement (vous avez besoin d'au moins Java 8 et Maven installés):

paquet propre mvn

Et dans target tirectory Vous pouvez trouver le fichier JAR Springbooted. Pour démarrer un service:

sudo java -jar kicker-reservation-service-0.3.0.jar

J'ai défini cette ligne sur le script.sh et l'ai ajoutée en tant que démarrage automatique. Ainsi, chaque fois que l'appareil est sous tension, le service démarre automatiquement.

Une explication particulière est nécessaire à l'écran LCD.

J'ai essayé différentes approches/bibliothèques pour contrôler LCD sur I2C à partir de RPi, mais j'ai échoué. Pour certains, l'écran LCD ne fonctionnait pas correctement, pour certains, il montrait des déchets.

Mais une chose fonctionnait très bien dès la sortie de la boîte. C'est l'outil de ligne de commande utilitaire que j'ai trouvé que vous pouvez utiliser pour contrôler l'écran LCD. J'ai donc décidé d'utiliser cet outil directement depuis Java. Cela fonctionne comme ça qu'un processus Linux normal (lcdi2c) est appelé (avec des paramètres préparés) chaque fois que je veux afficher quelque chose sur l'écran LCD.

Vous devez télécharger l'outil et le placer à côté du service JAR

Utiliser cet outil est une sorte de bidouille et de solution stupide Mais je suis la 1ère règle d'ingénierie:

Si c'est stupide, mais ça marche… ce n'est pas stupide

Étape 10: Instructions d'utilisation

Instructions d'utilisation
Instructions d'utilisation

Vous pouvez vérifier l'état actuel de la table kicker sur le canal Slack créé en tapant la commande "status" (ou brièvement "st") ou vérifier directement les feux de circulation sur l'appareil.

Si vous voulez juste jouer, appuyez sur le bouton rouge. Un message sera envoyé au canal Slack avec des informations indiquant que la table de kicker est occupée. Lorsque vous avez fini de jouer, appuyez sur le bouton vert. Un message sera envoyé à la chaîne Slack avec des informations indiquant que la table de kicker est libre de jouer.

Les feux de circulation changeront également et l'écran LCD affichera des informations détaillées.

Juste au cas où vous oublieriez de libérer la table après avoir fini de jouer, il y a un délai d'attente fixé à 20 minutes. Si vous jouez toujours et avez besoin de plus de temps, appuyez à nouveau sur le bouton rouge et le match sera prolongé de 5 minutes (ne s'applique que lorsqu'il reste moins de 5 minutes avant le temps mort). Le délai de lecture sera présenté sur l'écran LCD.

Pour réserver une table de kicker, écrivez un message « reserve » (ou simplement: « res ») sur le canal Slack.

Le feu jaune s'allumera pour informer les autres près de la table des kickers qu'il est réservé et bientôt quelqu'un viendra jouer.

Le délai d'expiration de la réservation est défini sur 3 minutes. Après cela, la table de kicker passe à l'état libre de jouer.

Si vous en avez besoin, vous pouvez annuler la réservation en écrivant « annuler » sur le canal Slack.

Le système a également d'autres fonctionnalités mineures telles que:

  • Après réservation, les boutons se figent pendant 5 secondes. C'est pour éviter des situations, que juste en même temps quelqu'un réserve et une milliseconde plus tard, quelqu'un appuie sur le bouton rouge en pensant qu'il/elle est celui qui occupe la table mais sans savoir que quelqu'un a réservé la table juste une milliseconde avant.
  • Appuyer sur n'importe quel bouton les gèle tous les deux pendant une demi-seconde. Ceci afin d'éviter les clics de boutons fous afin que la chaîne Slack ne soit pas autant spammée.
  • La version gratuite de Slack permet de stocker 10000 messages par toute l'équipe. Pour conserver certains messages, le service supprime les anciens messages liés au système de réservation/statut) et ne conserve que les 6 derniers d'entre eux. Pourquoi 6 ? Car le plus souvent il y a 2 scénarios d'état: "Réservé-Occupé-Libre" et "Occupé-Libre". Ainsi, le système peut stocker au moins 2 sessions complètes sans occupation. Pour nettoyer tous les messages système, tapez la commande "clean" (ou "clear").

Étape 11: Libération

Libération
Libération
Libération
Libération

Jusqu'à présent (le moment de la publication de cette instructable), le système fonctionne depuis plus de 2,5 mois et est utilisé par plus de 30 personnes. Grâce à la mise à jour du statut de la table kicker, nous savons toujours quand elle est libre ou occupée afin de ne plus perdre de temps à aller et venir. La connexion et le service sont très stables donc nous pouvons compter dessus.

Jusqu'ici tout va bien…

Étape 12: FAQ

Pourquoi le délai d'expiration de la réservation est défini sur 3 minutes ?

3 minutes est le temps de réservation max, adoptez-le comme vous le souhaitez dans le code. Généralement, cela arrivera rarement, que 3 minutes complètes s'écouleront et que la réservation sera expirée. Dans la plupart des cas, quelqu'un viendra éventuellement occuper la table.

Pourquoi le délai de lecture est défini sur 20 minutes ?

Selon les joueurs, le temps de jeu moyen est d'environ 10 minutes. Si vous devez jouer plus longtemps, appuyez à nouveau sur le bouton rouge lorsqu'il reste moins de 5 minutes et le délai d'attente sera prolongé à 5 minutes. Ce délai d'attente est configuré juste au cas où quelqu'un oublie de libérer la table.

Pourquoi il n'y a pas de clavier PIN sur l'appareil pour confirmer la réservation; pas de login et mot de passe ?

L'idée principale était de rester simple et stupide. Sinon, si la réservation, le démarrage et la fin du jeu demandent trop d'efforts, alors personne ne voudra l'utiliser.

Pourquoi l'appareil a l'air si laid industriel?

Parce que je n'avais pas de découpeuse laser, de CNC, d'imprimante 3D, d'étiqueteuse de couleur fantaisie, etc. Vous êtes plus que ravi de l'améliorer et de le rendre plus beau.

Pourquoi ne pas simplement implémenter une application et coller une tablette bon marché au mur avec les mêmes fonctionnalités ?

Des applications, des applications partout. Les gens aiment interagir physiquement avec les choses et pas seulement appuyer sur un écran plat.

Conseillé: