Inhaltsverzeichnis:

Einfaches Kicker-Status- und Reservierungssystem mit Slack-Integration - Gunook
Einfaches Kicker-Status- und Reservierungssystem mit Slack-Integration - Gunook

Video: Einfaches Kicker-Status- und Reservierungssystem mit Slack-Integration - Gunook

Video: Einfaches Kicker-Status- und Reservierungssystem mit Slack-Integration - Gunook
Video: Tiefpunkt oder Wendepunkt? Die wichtigsten DFB-Niederlagen | RanKINGS 2024, Juli
Anonim
Einfaches Kicker-Status- und Reservierungssystem mit Slack-Integration
Einfaches Kicker-Status- und Reservierungssystem mit Slack-Integration

In einer Firma, in der ich arbeite, gibt es einen Kickertisch. Das Unternehmen belegt viele Stockwerke und manche Mitarbeiter brauchen bis zu 3 Minuten, um an den Tisch zu kommen und…zu erkennen, dass der Tisch schon besetzt ist.

Daher entstand die Idee, eine Art einfaches Status-Rundfunk- und Reservierungssystem zu bauen, das in Echtzeit arbeitet.

Das Unternehmen verwendet das Slack-Kommunikationstool, bei dem jeder Mitarbeiter ein Konto hat. Wir haben sogar einen #kicker-Kanal nur für Diskussionen über…Kicker. Der Kanal könnte als eine Art "Einstiegspunkt" für die Reservierung verwendet werden und über den aktuellen Tischstatus informiert werden.

Wie üblich gibt es viele Konzepte, wie man mit einem solchen System umgeht. Aber generell tauchte in allen eine Grundregel auf: Es muss einfach in der Handhabung sein, ohne übertriebene Arbeitsschritte im Umgang mit dem System.

Das Gerät und der Dienst sind nicht an den Kickertisch gebunden und können für jede "gemeinsame Ressource" (wie Tischtennisplatte, Konsole usw.) verwendet werden, die eine Art Statusbroadcasting- und Reservierungslösung benötigt.

Also lasst uns anfangen…

Schritt 1: Konzeptnachweis und Prototyping

Konzeptnachweis und Prototyping
Konzeptnachweis und Prototyping
Konzeptnachweis und Prototyping
Konzeptnachweis und Prototyping
Konzeptnachweis und Prototyping
Konzeptnachweis und Prototyping

Grob war die Idee, ein Gerät zu bauen, das neben dem Kickertisch liegt und folgende Anforderungen erfüllt:

  • einige Indikatoren über den aktuellen Tischstatus - wenn Sie daneben stehen, sollten Sie wissen, dass es frei oder reserviert ist und in 3 Minuten jemand zum Spielen kommt. Ampel passt perfekt zur Idee:

    • grünes Licht - kostenlos spielbar,
    • gelbes Licht - reserviert,
    • rotes Licht - besetzt.
  • Schaltfläche(n) Sie können vor und nach dem Spiel klicken, damit alle anderen über den aktuellen Tischstatus informiert werden. Anstelle von 1 Umschalttaste habe ich mich für 2 getrennte Tasten entschieden:

    • roter Knopf - den Tisch besetzen, ein Spiel starten (nach Reservierung oder ad hoc).
    • grüne Taste - Tisch freigeben.
  • einige Anzeigen mit detaillierteren Informationen über "was los ist" - Reservierungs-Timeout, wiederholter Tischstatus, Spielzeit-Timeout usw.

Mit Reservierung meine ich nur die Reservierung für die nächsten 3 Minuten. Das System ist nicht so ausgelegt, dass der Benutzer den Tisch zu einer genauen Zeit (z. B. 14:00 Uhr) reservieren kann. Es funktioniert nicht wie eine Reservierung z. B. in Restaurants, aber nur für die nächsten Minuten.

Da keine LAN-Verbindung vorhanden ist, ist die einzige Option die Verwendung von WLAN - es ist sowieso die beste Option. Das Gehirn des Systems muss die Slack-API verwenden, um Befehle vom Slack-Kanal zu senden und zu empfangen. Zuerst habe ich versucht, NodeMCU zu verwenden. Ich konnte Nachrichten von und zu Slack empfangen und empfangen, aber aufgrund der HTTPS-Nutzung und der Größe der "Willkommensnachricht" von Slack (~ 300 kB) verlor NodeMCU die Verbindung und / oder bekam eine seltsame Ausnahme, die ich beim Graben durch das Internet nicht beheben konnte.

Also entschied ich mich für etwas Mächtigeres: Raspberry Pi 3 (Zero W mit WiFi war zu diesem Zeitpunkt noch nicht erschienen). Mit RPi konnte ich die Implementierungssprache von C auf Java umstellen, da es für mich bequemer ist - das war also ein Vorteil. Heute können Sie etwas Mächtigeres als NodeMCU und weniger Mächtiges als RPi verwenden. Raspberry Zero vielleicht?

Nach dem Bau des ersten Prototyps auf einem Steckbrett mit einigen verrückten Verkabelungen, viel Skizzieren und Prototyping sah das System so aus, als könnte es funktionieren.

Mit all diesen Ideen und funktionierendem PoC begann ich, verschiedene Platzierungskonfigurationen der oben genannten Elemente auf einem Frontpanel zu planen, damit sie am informativsten und bequemsten zu verwenden sind. Sie können einige der anderen Vorschläge überprüfen, vielleicht passen einige besser zu Ihnen. Der letzte war der von mir Auserwählte.

Schritt 2: Materialien und Werkzeuge

Materialien die ich verwendet habe:

  • Kasten
  • Raspberry Pi, microSD-Karte, Micro-USB-Netzteil
  • Grüne und rote Arcade-Tasten
  • 16x2 LCD-Bildschirm
  • LEDs - Ich habe RGB verwendet, aber Sie können die richtige Farbe verwenden
  • Stecker zu Buchse und Buchse zu Buchse Steckbrett-Überbrückungskabel
  • Micro-USB-Schnittstelle
  • Mini-Steckbrett, nur um einige Drähte anzuschließen
  • Kurzes Micro-USB-Kabel, das als Jumper in der Box dient, um das RPi. mit Strom zu versorgen

Werkzeuge, die ich verwendet habe:

  • Scharfes Messer (z. B. Universalmesser zum Schneiden von Teppichen)
  • Drehwerkzeug
  • Heißklebepistole
  • Lötstation
  • Zangen, Diagonalzangen/Seitenschneider
  • Schraubenzieher
  • Datei
  • Mir

Werkzeuge, die Sie wahrscheinlich benötigen:

All dies, aber anstelle von "Ich" sollte es sein: "Du":)

Schritt 3: Frontplatte - LCD-Bildschirm

Frontplatte - LCD-Bildschirm
Frontplatte - LCD-Bildschirm
Frontplatte - LCD-Bildschirm
Frontplatte - LCD-Bildschirm

Loch für LCD-Bildschirm war unkompliziert. Nur ein Rechteck, das zu meinem LCD-Bildschirm passt. Nachdem ich versucht hatte, es mit einem scharfen Messer zu schneiden, stellte ich fest, dass der Kunststoff der Schachtel ziemlich hart ist. Also habe ich ein Bohrwerkzeug verwendet, um das Fenster zu schneiden und die Kanten zu polieren.

Schritt 4: Frontplatte - Status-LEDs

Frontplatte - Status-LEDs
Frontplatte - Status-LEDs
Frontplatte - Status-LEDs
Frontplatte - Status-LEDs

LED-Löcher sind auch unkompliziert. Ich habe einfach einen großen Bohrer für Holz genommen und dann die Kanten mit Bohrwerkzeug poliert. Die großen LEDs passten perfekt. Ich habe noch keine Widerstände an die LEDs gelötet - ich habe es für den Zusammenbau belassen.

Schritt 5: Frontplatte - Tasten

Frontplatte - Tasten
Frontplatte - Tasten
Frontplatte - Tasten
Frontplatte - Tasten
Frontplatte - Tasten
Frontplatte - Tasten
Frontplatte - Tasten
Frontplatte - Tasten

Das größte Problem bei diesen 2 großen Tasten war, sie gleichmäßig mit dem richtigen Abstand zu platzieren. Ich schneide die Löcher nur mit meinem Bohrwerkzeug, da ich den Durchmesser Schritt für Schritt erhöhen konnte, damit die Knöpfe fest sitzen.

Schritt 6: Stromanschluss

Stecker
Stecker

Ein kleines Loch für die Micro-USB-Stromversorgung war eine sehr heikle Aufgabe. Ich wollte, dass das Loch so fit wie möglich ist, also habe ich hier viel Zeit zum Polieren verbracht. Aber mit dem Endergebnis war ich zufrieden.

Dann schneide ich ein kurzes Mini-USB-Kabel, das in die Box gelegt wurde. Auf der einen Seite wird es in RPi gesteckt, auf der anderen Seite wurden alle Kabel entsprechend der USB-Pinbelegung an die Micro-USB-Schnittstelle gelötet.

Dann habe ich die kleine Platine direkt auf die Box geklebt (auf einem Foto im Montageschritt zu sehen).

Schritt 7: Alles zusammenfügen

Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen

Zuerst habe ich den LEDs entsprechend ihrer Farbe (Spannung) entsprechende Widerstände für 3,3V Volt angelötet. Ich habe 100Ω für Rot, zwei Widerstände 82 und 100 für Gelb (grüner und roter Knoten) und 100Ω für Grün verwendet. Sie können den Online-Widerstand für LED-Rechner verwenden. Aber bitte recherchieren Sie selbst nach der Helligkeit und dem genauen Farbton, den Sie erreichen möchten.

Die Beine der gelben LED wurden zusammengelötet, sodass die LED selbst nur über einen Pin am RPi gesteuert werden kann.

Nach diesem Pinbelegungsdiagramm:

LED-Knoten wurden angeschlossen:

  • Grüne LED - GPIO1 auf Rpi
  • Gelbe LED (beide Beine) an GPIO2 auf RPi
  • Rote LED zu GPIO0 auf RPi

Ich habe das LCD mit I2C-Pins an RPi-Pins angeschlossen

  • LCD-SDA zu GPIO8 auf RPi
  • LCD SCL zu GPIO9 auf RPi
  • LCD PWR bis 5V auf RPi
  • LCD GND zu GND auf RPi

Als zusätzlicher Schutz wurde das LCD mit Heißkleber auf die Box geklebt.

Ich habe 3,3 V und GND an das kleine Steckbrett angeschlossen, damit ich sie für Tasten verwenden konnte.

Der grüne Knopf wurde über ein Mini-Steckbrett mit 3,3 V und auf RPi mit GPIO5 verbunden.

Der rote Knopf wurde über ein Mini-Steckbrett mit 3,3 V und auf RPi mit GPIO4 verbunden.

Jedes Mal, wenn Sie die Taste drücken, befindet sich der RPi-Pin im High-Zustand.

Das Mini-Bradboard funktioniert gut, also habe ich das Löten aller Drähte in die Leiterplatte übersprungen. Stattdessen habe ich nur das Mini-Steckbrett mit Heißkleber bedeckt, damit die Kabel nicht abfallen.

Ich habe auch die Abdeckung von RPi heiß auf die Box geklebt, damit sie nicht im Inneren wackelt.

Ich schraubte die Frontplatte mit all dem Zeug im Inneren.

Dann habe ich einfache Etiketten gedruckt, ausgeschnitten und neben die Ampeln und Knöpfe geklebt.

Schritt 8: Slack-Konfiguration

Slack-Konfiguration
Slack-Konfiguration
Slack-Konfiguration
Slack-Konfiguration

Erstelle dein Team auf Slack.com oder verwende das, das du hast und du hast mindestens Administratorrechte.

Erstellen Sie in Slack einen Kanal für die Slack-Integration des Dienstes (oder überspringen Sie das Erstellen eines Kanals, wenn Sie einen bereits vorhandenen verwenden möchten).

Fügen Sie die Integration eingehender Webhooks zu Ihrem Team hinzu. Wählen Sie den Kanal aus und kopieren Sie die Webhook-URL.

Fügen Sie Ihrem Team Bots-Integration hinzu. Wählen Sie einen Namen für Ihren Bot und kopieren Sie das Bot-API-Token.

Die Seite zur Verwaltung benutzerdefinierter Integrationen sollte wie auf dem Bild aussehen.

Sie müssen den Bot als Mitglied Ihres Kanals einladen. Sie können dies bereits beim Erstellen eines Kanals tun.

Wenn Sie den Dienst später anpassen möchten, überprüfen Sie bitte die Slack-API.

Schritt 9: Softwareimplementierung

Ich habe Raspbian als Betriebssystem für mein RPi verwendet, indem ich diesem Tutorial gefolgt bin. Bitte verzeihen Sie mir, dass ich es überspringen werde, es zu erklären, da es an vielen Stellen bereits dokumentiert ist und der Prozess einfach ist. Ich hoffe, Sie sind kompetent und erfahren genug, um RPi selbst einzurichten. Bitte vergessen Sie nicht, den WLAN-Zugang auf Ihrem Raspberry Pi zu konfigurieren;)

Wie im Abschnitt Prototyping erwähnt, habe ich Java verwendet, um das Gehirn des gesamten Systems zu implementieren. Der Code ist auf GitHub verfügbar -

Die von mir verwendeten Java-Bibliotheken:

  • pi4j - um Raspberry Pi aus Java zu verwenden
  • Springboot als Anwendungsplattform
  • allbegray/slack-api als Slack-Integration

Sie müssen die Konfigurationsdatei in src/resources/config.properties bearbeiten. Es gibt 3 Einträge, die Sie konfigurieren müssen, um die Slack-API zu verwenden:

  • channelName - Name des Kanals Sie möchten Statusänderungen posten und Befehle erhalten.
  • slackBotToken - Token eines Bots, der in Ihren Slack-Team-Integrationen konfiguriert ist und verwendet wird, um Nachrichten an den oben genannten Kanal zu senden. Bitte beachten Sie, dass Sie Slack Bot als Mitglied des Kanals hinzufügen müssen.
  • webhookUrl - die URL, die Sie von den benutzerdefinierten Integrationen von Slack Team erhalten können.

Das Projekt ist Mavenized, um es zu erstellen, geben Sie einfach ein (Sie benötigen mindestens Java 8 und Maven installiert):

mvn sauberes Paket

Und im Zielverzeichnis finden Sie die Springbooted JAR-Datei. So starten Sie einen Dienst:

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

Ich habe diese Zeile auf.sh script gesetzt und als Autostart hinzugefügt. Immer wenn das Gerät eingeschaltet ist, startet der Dienst automatisch.

Eine besondere Erklärung ist für das LCD erforderlich.

Ich habe verschiedene Ansätze / Bibliotheken ausprobiert, um LCD über I2C von RPi zu steuern, aber ich bin einfach gescheitert. Bei einigen funktionierte das LCD nicht richtig, bei anderen zeigte es Müll.

Aber eine Sache funktionierte sehr gut direkt aus der Box. Es ist das Dienstprogramm-Befehlszeilentool, das ich gefunden habe, mit dem Sie das LCD steuern können. Also habe ich mich entschieden, dieses Tool einfach direkt aus Java heraus zu verwenden. Es funktioniert so, dass jedes Mal, wenn ich etwas auf dem LCD-Bildschirm anzeigen möchte, ein normaler Linux-Prozess (lcdi2c) (mit vorbereiteten Parametern) aufgerufen wird.

Sie müssen das Tool herunterladen und neben dem JAR-Dienst platzieren

Die Verwendung dieses Tools ist eine Art Hack und eine dumme Lösung. Aber ich folge der 1. Regel der Technik:

Wenn es dumm ist, aber es funktioniert … es ist nicht dumm

Schritt 10: Gebrauchsanweisung

Gebrauchsanweisung
Gebrauchsanweisung

Sie können den aktuellen Status der Kickertabelle im erstellten Slack-Kanal überprüfen, indem Sie den Befehl "status" (oder kurz "st") eingeben oder direkt die Ampel auf dem Gerät überprüfen.

Wenn Sie nur spielen möchten, drücken Sie die rote Taste. Eine Nachricht wird an den Slack-Kanal gesendet mit der Information, dass der Kickertisch besetzt ist. Wenn Sie mit dem Spielen fertig sind, drücken Sie die grüne Taste. Eine Nachricht wird an den Slack-Kanal gesendet mit der Information, dass der Kickertisch kostenlos gespielt werden kann.

Die Ampeln ändern sich auch und der LCD-Bildschirm zeigt einige detaillierte Informationen an.

Für den Fall, dass Sie nach Beendigung des Spiels vergessen, den Tisch freizugeben, gibt es eine Zeitüberschreitung von 20 Minuten. Wenn Sie noch spielen und mehr Zeit benötigen, drücken Sie erneut den roten Knopf und das Spiel wird um 5 Minuten verlängert (gilt nur, wenn bis zum Timeout weniger als 5 Minuten verbleiben). Die Spielzeitüberschreitung wird auf dem LCD-Bildschirm angezeigt.

Um einen Kickertisch zu reservieren, schreibe eine Nachricht „reserve“(oder einfach: „res“) an den Slack-Kanal.

Die gelbe Ampel wird eingeschaltet und informiert andere in der Nähe des Kickertisches, dass es reserviert ist und bald jemand zum Spielen kommt.

Das Reservierungs-Timeout ist auf 3 Minuten eingestellt. Danach wechselt der Kicker-Tisch seinen Status auf Free to Play.

Bei Bedarf können Sie die Reservierung stornieren, indem Sie im Slack-Kanal „Stornieren“schreiben.

Das System hat auch einige andere kleinere Funktionen wie:

  • Nach der Reservierung werden die Schaltflächen für 5 Sekunden eingefroren. Dies dient dazu, Situationen zu vermeiden, dass jemand in der gleichen Zeit reserviert und eine Millisekunde später den roten Knopf drückt und denkt, dass er/sie derjenige ist, der den Tisch besetzt, aber ohne zu wissen, dass jemand den Tisch nur eine Millisekunde zuvor reserviert hat.
  • Das Drücken einer beliebigen Taste friert beide für eine halbe Sekunde ein. Dies dient dazu, verrückte Schaltflächenklicker zu verhindern, damit der Slack-Kanal nicht so viel Spam erhält.
  • Die kostenlose Version von Slack ermöglicht es, 10000 Nachrichten vom gesamten Team zu speichern. Um einige der Nachrichten zu bewahren, löschen Sie die alten Nachrichten zum Reservierungs-/Statussystem) und behalten Sie nur die letzten 6 davon. Warum 6? Denn am häufigsten gibt es 2 Statusszenarien: "Reserviert-Occupied-Free" und "Occupied-Free". Das System kann also mindestens 2 volle belegte-freie Sitzungen speichern. Um alle Systemmeldungen zu bereinigen, geben Sie den Befehl "clean" (oder "clear") ein.

Schritt 11: Loslassen

Freigeben
Freigeben
Freigeben
Freigeben

Bis jetzt (der Moment der Veröffentlichung dieses instructable) läuft das System seit 2,5+ Monaten und wird von mehr als 30 Personen verwendet. Durch das Kicker-Status-Update wissen wir immer, wann es frei oder besetzt ist, damit wir keine Zeit mehr verlieren. Die Verbindung und der Service sind sehr stabil, sodass wir uns darauf verlassen können.

So weit, ist es gut…

Schritt 12: Häufig gestellte Fragen

Warum ist das Reservierungs-Timeout auf 3 Minuten eingestellt?

3 Minuten ist die maximale Reservierungszeit. Übernehmen Sie diese nach Belieben im Code. Im Allgemeinen wird es selten vorkommen, dass volle 3 Minuten vergehen und die Reservierung abgebrochen wird. In den meisten Fällen kommt irgendwann jemand und besetzt den Tisch.

Warum ist die Spielzeitüberschreitung auf 20 Minuten eingestellt?

Je nach Spieler beträgt die durchschnittliche Spielzeit ~10 Minuten. Wenn Sie länger spielen müssen, drücken Sie die rote Taste erneut, wenn weniger als 5 Minuten verbleiben und das Timeout wird auf 5 Minuten verlängert. Dieses Timeout wird nur für den Fall eingerichtet, dass jemand vergisst, den Tisch freizugeben.

Warum gibt es kein PIN-Pad auf dem Gerät, um die Reservierung zu bestätigen; keine Logins und Passwörter?

Die Hauptidee war, es-einfach-dumm zu halten. Wenn die Reservierung, das Starten und das Beenden des Spiels sonst zu viel Aufwand erfordern, wird es niemand benutzen wollen.

Warum sieht das Gerät so industriell-hässlich aus?

Weil ich keinen Laserschneider, CNC, 3D-Drucker, keinen ausgefallenen farbigen Etikettendrucker usw. hatte. Sie sind mehr als erfreut, es zu verbessern und schöner zu machen.

Warum nicht einfach eine App implementieren und ein billiges Tablet mit der gleichen Funktionalität an die Wand kleben?

Apps, Apps überall. Menschen mögen es, physisch mit Dingen zu interagieren und nicht nur auf einen Flachbildschirm zu tippen.

Empfohlen: