Inhoudsopgave:

Eenvoudig Kicker-status- en reserveringssysteem met Slack-integratie: 12 stappen (met afbeeldingen)
Eenvoudig Kicker-status- en reserveringssysteem met Slack-integratie: 12 stappen (met afbeeldingen)

Video: Eenvoudig Kicker-status- en reserveringssysteem met Slack-integratie: 12 stappen (met afbeeldingen)

Video: Eenvoudig Kicker-status- en reserveringssysteem met Slack-integratie: 12 stappen (met afbeeldingen)
Video: Elon Musk if Joe Rogan gets Cancelled! #short 2024, Juli-
Anonim
Eenvoudig Kicker-status- en reserveringssysteem met Slack-integratie
Eenvoudig Kicker-status- en reserveringssysteem met Slack-integratie

In een bedrijf waar ik werk staat een kickertafel. Het bedrijf beslaat vele verdiepingen en voor sommige medewerkers duurt het tot 3 minuten om bij de tafel te komen en… om te beseffen dat de tafel al bezet is.

Daarom ontstond het idee om een soort eenvoudig statusuitzend- en reserveringssysteem te bouwen dat in realtime werkt.

Bedrijf gebruikt Slack communicatietool waar elke medewerker een account heeft. We hebben zelfs een #kicker-kanaal alleen voor discussies over … kicker. Het kanaal zou kunnen worden gebruikt als een soort "toegangspunt" voor reserveringen en om geïnformeerd te worden over de huidige tafelstatus.

Zoals gewoonlijk zijn er veel concepten om met zo'n systeem om te gaan. Maar over het algemeen was er één basisregel in al deze: het moet eenvoudig te gebruiken zijn zonder buitensporige stappen om uit te voeren bij het omgaan met het systeem.

Het apparaat en de service zijn niet vastgehouden aan de kicker-tafel en kunnen worden gebruikt voor elke "gewone bron" (zoals pingpongtafel, console, enz …) die een soort van status-uitzending en reserveringsoplossing nodig heeft.

Dus laten we beginnen…

Stap 1: Proof of Concept en prototypen

Bewijs van concept en prototypen
Bewijs van concept en prototypen
Bewijs van concept en prototypen
Bewijs van concept en prototypen
Bewijs van concept en prototypen
Bewijs van concept en prototypen

Het idee was om een apparaat te bouwen dat naast de kicker-tafel zal worden gelegd volgens deze vereisten:

  • enkele indicatoren over de huidige tafelstatus - als je ernaast staat, zou je moeten kunnen weten dat het gratis of gereserveerd is en dat er over 3 minuten iemand zal komen spelen. Verkeerslichten passen perfect bij het idee:

    • groen licht - gratis om te spelen,
    • geel licht - gereserveerd,
    • rood licht - bezet.
  • knop(pen) Je kunt voor en na het spel klikken zodat iedereen op de hoogte wordt gehouden van de huidige tafelstatus. In plaats van 1 schakelknop heb ik besloten om 2 gescheiden knoppen te gebruiken:

    • rode knop - bezet de tafel, start een spel (na reservering of ad hoc).
    • groene knop - vrijgavetabel.
  • een display met meer gedetailleerde informatie over "wat er aan de hand is" - reserveringstime-out, herhaalde tafelstatus, speeltijd-time-out enz…

Met reservering bedoel ik alleen de reservering voor de komende 3 minuten. Het systeem is niet zo ontworpen dat de gebruiker de tafel op het exacte tijdstip kan reserveren (bijv. 14:00 uur). Het werkt niet zoals reserveren, b.v. in restaurants, maar alleen voor de komende minuten.

Omdat er geen LAN-verbinding is, is de enige optie om WLAN te gebruiken - het is hoe dan ook de beste optie. Het brein van het systeem moet Slack API gebruiken om opdrachten van het Slack-kanaal te verzenden en te ontvangen. Eerst probeerde ik NodeMCU te gebruiken. Ik kon berichten van en naar Slack ontvangen en ontvangen, maar vanwege HTTPS-gebruik en ook Slack's "welkomstbericht" -grootte (~ 300 kB), verloor NodeMCU de verbinding en / of kreeg ik een rare uitzondering die ik niet kon oplossen door op internet te graven.

Dus besloot ik iets krachtigers te gebruiken: Raspberry Pi 3 (Zero W met WiFi was toen nog niet uitgebracht). Door RPi te hebben, kon ik de implementatietaal overschakelen van C naar Java, omdat dit voor mij handiger is - dus dit was een voordeel. Vandaag kun je iets krachtigers gebruiken dan NodeMCU en minder krachtig dan RPi. Raspberry Zero misschien?

Na het bouwen van het eerste prototype op een breadboard met wat gekke bedrading, veel schetsen en prototyping, leek het systeem te kunnen werken.

Met al deze ideeën en werkende PoC, begon ik verschillende plaatsingsconfiguraties van bovenstaande items op een voorpaneel te plannen, zodat ze het meest informatief en gemakkelijk te gebruiken zijn. U kunt enkele van de andere voorstellen bekijken, misschien passen sommige beter bij u. De laatste was door mij gekozen.

Stap 2: Materialen en gereedschappen

Materialen die ik heb gebruikt:

  • Doos
  • Raspberry Pi, microSD-kaart, micro-USB-voeding
  • Groene en rode arcade-knoppen
  • 16x2 LCD-scherm
  • LED's - ik heb RGB gebruikt, maar u kunt de juiste kleur gebruiken
  • Man-vrouw en vrouw-vrouw breadboard-startkabels
  • Micro-USB-interface
  • Mini breadboard om wat draden aan te sluiten
  • Korte micro-USB-kabel die als jumper in de doos werkt om de RPi. van stroom te voorzien

Hulpmiddelen die ik heb gebruikt:

  • Scherp mes (bijvoorbeeld een mes voor het snijden van tapijt)
  • Roterend gereedschap
  • Heet lijmpistool
  • Soldeerstation
  • Tang, zijkniptang/zijkniptang
  • Schroevendraaier
  • Bestand
  • Mij

Hulpmiddelen die je waarschijnlijk nodig hebt:

Al het bovenstaande, maar in plaats van "Ik" zou het moeten zijn: "Jij":)

Stap 3: Voorpaneel - LCD-scherm

Voorpaneel - LCD-scherm
Voorpaneel - LCD-scherm
Voorpaneel - LCD-scherm
Voorpaneel - LCD-scherm

Gat voor LCD-scherm was eenvoudig. Gewoon een rechthoek die op mijn LCD-scherm past. Nadat ik had geprobeerd het met een scherp mes te snijden, realiseerde ik me dat het plastic van de doos behoorlijk hard is. Dus ik gebruikte boorgereedschap om het raam te snijden en de randen te polijsten.

Stap 4: Voorpaneel - Status-LED's

Voorpaneel - Status-LED's
Voorpaneel - Status-LED's
Voorpaneel - Status-LED's
Voorpaneel - Status-LED's

LED-gaten zijn ook eenvoudig. Ik nam gewoon een grote boor voor hout en polijst de randen met boorgereedschap. De grote LED's pasten perfect strak. Ik heb nog geen weerstanden aan de LED's gesoldeerd - ik liet het voor het montageproces.

Stap 5: Voorpaneel - Knoppen

Voorpaneel - Knoppen
Voorpaneel - Knoppen
Voorpaneel - Knoppen
Voorpaneel - Knoppen
Voorpaneel - Knoppen
Voorpaneel - Knoppen
Voorpaneel - Knoppen
Voorpaneel - Knoppen

Het grootste probleem met deze 2 grote knoppen was om ze gelijkmatig te plaatsen met de juiste tussenruimte. Ik sneed de gaten gewoon met mijn boorgereedschap, omdat ik de diameter stap voor stap kon vergroten, zodat de knoppen strak passen.

Stap 6: Stroomaansluiting

Stekker
Stekker

Een klein gaatje voor micro-USB-voeding was een zeer delicate klus om te doen. Ik wilde dat het gat zo passend mogelijk was, dus ik bracht hier veel tijd door met polijsten. Maar ik was tevreden met het eindresultaat.

Toen knipte ik een korte mini-USB-kabel die in de doos werd geplaatst. Aan de ene kant is hij aangesloten op RPi en aan de andere kant zijn alle kabels volgens USB-pinouts aan de micro-USB-interface gesoldeerd.

Vervolgens heb ik de kleine PCB rechtstreeks op de doos gelijmd (het is te zien op een foto in de montagestap).

Stap 7: Alles samenbrengen

Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten

Eerst heb ik geschikte weerstanden aan de LED's gesoldeerd volgens hun kleur (voltage) voor 3,3V volt. Ik gebruikte 100Ω voor rood, twee weerstanden 82 en 100 voor geel (groen en rood knooppunt) en 100Ω voor groen. U kunt die van de online weerstand voor LED-calculator gebruiken. Maar doe zelf wat onderzoek op basis van de helderheid en exacte kleurtint die u wilt bereiken.

Poten van gele LED zijn aan elkaar gesoldeerd, zodat de LED zelf kan worden bediend met slechts één pin op RPi.

Volgens dit pinout-diagram:

LED-knooppunten waren verbonden:

  • Groene LED - GPIO1 op Rpi
  • Gele LED (beide poten) naar GPIO2 op RPi
  • Rode LED naar GPIO0 op RPi

Ik heb het LCD-scherm aangesloten met behulp van I2C-pinnen op RPi-pinnen

  • LCD SDA naar GPIO8 op RPi
  • LCD SCL naar GPIO9 op RPi
  • LCD PWR tot 5V op RPi
  • LCD GND naar GND op RPi

Het LCD-scherm werd als extra bescherming op de doos gelijmd.

Ik heb 3.3V en GND op het kleine breadboard aangesloten, zodat ik ze voor knoppen kon gebruiken.

Groene knop was verbonden met de 3.3V via mini-breadboard en met GPIO5 op RPi.

Rode knop was verbonden met de 3.3V via mini-breadboard en met GPIO4 op RPi.

Dus wanneer u op de knop drukt, is er een hoge status op de RPi-pin.

De mini-bradboard werkt prima, dus ik heb het solderen van alle draden in de PCB overgeslagen. In plaats daarvan heb ik het mini-broodplankje gewoon bedekt met hete lijm, zodat de kabels er niet af vallen.

Ik heb ook het deksel van RPi warm gelijmd op de doos, zodat het niet van binnen wiebelt.

Ik heb het voorpaneel vastgeschroefd met alle spullen erin.

Daarna printte, knipte en plakte ik simpele labels naast de stoplichten en knoppen.

Stap 8: Slack-configuratie

Slack-configuratie
Slack-configuratie
Slack-configuratie
Slack-configuratie

Creëer je team op Slack.com of gebruik het team dat je hebt en je hebt ten minste beheerdersrechten.

Maak in Slack een kanaal voor de Slack-integratie van de service (of sla het maken van een kanaal over als je er een wilt gebruiken die je al hebt).

Voeg integratie van inkomende webhooks toe aan uw team. Selecteer het kanaal en kopieer de webhook-URL.

Voeg Bots-integratie toe aan uw team. Kies een naam voor uw bot en kopieer de bot-API-token.

De pagina voor het beheren van aangepaste integraties zou eruit moeten zien zoals op de afbeelding.

Je moet de bot uitnodigen als lid van je kanaal. Je zou het al kunnen doen tijdens het aanmaken van een kanaal.

Als u de service later wilt aanpassen, controleer dan de Slack API.

Stap 9: Software-implementatie

Ik gebruikte Raspbian als besturingssysteem voor mijn RPi door deze tutorial te volgen. Vergeef me alsjeblieft, ik zal het uitleggen overslaan omdat het al op veel plaatsen is gedocumenteerd en het proces eenvoudig is. Ik hoop dat u bekwaam en ervaren genoeg bent om zelf RPi in te stellen. Vergeet niet om WiFi-toegang op uw Raspberry Pi te configureren;)

Zoals vermeld in het gedeelte over prototypen, heb ik Java gebruikt om het brein van het hele systeem te implementeren. De code is beschikbaar op GitHub -

De Java-bibliotheken die ik heb gebruikt:

  • pi4j - om Raspberry Pi van Java te gebruiken
  • Springboot als applicatieplatform
  • allbegray/slack-api als Slack-integratie

U moet het configuratiebestand bewerken in src/resources/config.properties. Er zijn 3 items die u moet configureren om Slack API te gebruiken:

  • channelName - naam van het kanaal U wilt statuswijzigingen posten en opdrachten ontvangen.
  • slackBotToken - token van een bot die is geconfigureerd in uw Slack-teamintegraties en die zal worden gebruikt om berichten op het hierboven genoemde kanaal te plaatsen. Let op Je moet Slack Bot toevoegen als lid van het kanaal.
  • webhookUrl - de URL die u kunt krijgen van de aangepaste integraties van Slack Team.

Project is Mavenized, dus om het te bouwen typt u gewoon (u moet minimaal Java 8 en Maven geïnstalleerd hebben):

mvn schoon pakket

En in het doel-tabblad vindt u het Springbooted JAR-bestand. Een dienst starten:

sudo java -jar kicker-reserveringsservice-0.3.0.jar

Ik heb deze regel ingesteld op.sh-script en toegevoegd als een autostart. Dus wanneer de stroom is ingeschakeld, start de service automatisch op.

Er is een speciale uitleg nodig voor het LCD-scherm.

Ik heb verschillende benaderingen / bibliotheken geprobeerd om het LCD-scherm via I2C vanuit RPi te bedienen, maar ik faalde gewoon. Voor sommigen werkte het LCD-scherm niet goed, voor sommigen vertoonde het wat rommel.

Maar één ding werkte heel goed, net uit de doos. Het is het hulpprogramma voor de opdrachtregel dat ik heb gevonden dat u kunt gebruiken om het LCD-scherm te bedienen. Dus besloot ik om deze tool gewoon rechtstreeks vanuit Java te gebruiken. Het werkt zo dat een normaal Linux-proces (lcdi2c) wordt aangeroepen (met voorbereide parameters) telkens als ik iets op het LCD-scherm wil weergeven.

U moet de tool downloaden en naast de JAR-service plaatsen

Het gebruik van deze tool is een soort hack en een domme oplossing. Maar ik volg de eerste regel van engineering:

Als het stom is, maar het werkt… is het niet stom

Stap 10: Gebruiksinstructie

Gebruiksinstructie
Gebruiksinstructie

U kunt de huidige status van de kicker-tabel op het gemaakte Slack-kanaal controleren door de opdracht "status" (of kortweg "st") te typen of rechtstreeks de verkeerslichten op het apparaat te controleren.

Als je gewoon wilt spelen - druk op de rode knop. Er wordt een bericht verzonden naar het Slack-kanaal met de informatie dat de kicker-tafel bezet is. Als je klaar bent met spelen - druk op de groene knop. Er wordt een bericht naar het Slack-kanaal gestuurd met de informatie dat de kicker-tafel gratis te spelen is.

Verkeerslichten zullen ook veranderen en het LCD-scherm zal wat gedetailleerde informatie tonen.

Voor het geval u vergeet de tafel los te laten nadat u klaar bent met spelen, is er een time-out ingesteld op 20 minuten. Als je nog steeds aan het spelen bent en meer tijd nodig hebt, druk dan nogmaals op de rode knop en de wedstrijd wordt met 5 minuten verlengd (alleen van toepassing als er minder dan 5 minuten over zijn voor de time-out). De speeltime-out wordt weergegeven op het LCD-scherm.

Om een kicker-tafel te reserveren, schrijft u een bericht "reserve" (of gewoon: "res") naar het Slack-kanaal.

Het gele verkeerslicht gaat aan om anderen in de buurt van de kickertafel te informeren dat deze is gereserveerd en binnenkort zal er iemand komen spelen.

De time-out van de reservering is ingesteld op 3 minuten. Daarna verandert de kickertafel van staat naar vrij om te spelen.

Indien nodig, kunt u de reservering annuleren door "annuleren" op het Slack-kanaal te schrijven.

Het systeem heeft ook enkele andere kleine functies, zoals:

  • Na reservering worden knoppen 5 seconden bevroren. Dit is om situaties te voorkomen, dat net op hetzelfde moment iemand reserveert en een milliseconde later iemand op de rode knop drukt in de veronderstelling dat hij/zij degene is die de tafel bezet, maar zonder te weten dat iemand de tafel slechts een milliseconde eerder heeft gereserveerd.
  • Als u op een willekeurige knop drukt, worden ze allebei een halve seconde stil. Dit is zo om gekke knopklikkers te voorkomen, zodat het Slack-kanaal niet zo veel wordt gespamd.
  • De gratis versie van Slack maakt het mogelijk om 10000 berichten van het hele team op te slaan. Om sommige berichten te bewaren, verwijdert u de oude berichten met betrekking tot het reserverings-/statussysteem) en bewaart u alleen de laatste zes. Waarom 6? Omdat er meestal 2 statusscenario's zijn: "Gereserveerd-bezet-vrij" en "bezet-vrij". Het systeem kan dus minimaal 2 volledig bezet-vrije sessies opslaan. Typ de opdracht "clean" (of "clear") om alle systeemberichten op te schonen.

Stap 11: Vrijgeven

vrijgeven
vrijgeven
vrijgeven
vrijgeven

Tot nu toe (het moment van publicatie van deze instructable), draait het systeem meer dan 2,5 maand en wordt het door meer dan 30 mensen gebruikt. Vanwege de statusupdate van de kickertafel weten we altijd wanneer deze vrij of bezet is, zodat we geen tijd meer verliezen met heen en weer gaan. De verbinding en de service zijn zeer stabiel, dus we kunnen erop vertrouwen.

Tot nu toe, zo goed…

Stap 12: Veelgestelde vragen

Waarom is de reserveringstime-out ingesteld op 3 minuten?

3 minuten is de maximale reserveringstijd, neem deze over zoals u wilt in de code. Over het algemeen zal het zelden voorkomen dat de volledige 3 minuten verstrijken en de reservering vervalt. In de meeste gevallen komt er uiteindelijk iemand aan tafel.

Waarom is de speeltime-out ingesteld op 20 minuten?

Afhankelijk van een speler is de gemiddelde speelduur ~10 minuten. Als u langer moet spelen, drukt u nogmaals op de rode knop als er minder dan 5 minuten over zijn en de time-out wordt weer verlengd tot 5 minuten. Deze time-out wordt ingesteld voor het geval iemand vergeet de tafel vrij te geven.

Waarom er geen pincode op het apparaat zit om de reservering te bevestigen; geen logins en wachtwoorden?

Het belangrijkste idee was om het simpel-dom te houden. Anders, als reserveren, starten en eindigen van het spel te veel moeite kost, dan zal niemand er gebruik van willen maken.

Waarom ziet het apparaat er zo industrieel-lelijk uit?

Omdat ik geen lasersnijder, CNC, 3D-printer, fancy gekleurde labelmaker enz. had. U bent meer dan blij om het te verbeteren en mooier te maken.

Waarom niet gewoon een app implementeren en een goedkope tablet aan de muur plakken met dezelfde functionaliteit?

Apps, apps overal. Mensen houden ervan om fysiek met dingen om te gaan en niet alleen op een flatscreen te tikken.

Aanbevolen: