Sommario:

Stato Kicker semplice e sistema di prenotazione con integrazione Slack: 12 passaggi (con immagini)
Stato Kicker semplice e sistema di prenotazione con integrazione Slack: 12 passaggi (con immagini)

Video: Stato Kicker semplice e sistema di prenotazione con integrazione Slack: 12 passaggi (con immagini)

Video: Stato Kicker semplice e sistema di prenotazione con integrazione Slack: 12 passaggi (con immagini)
Video: Online Marketing per Business FISICI (Big Luca parla a OSA) 2024, Dicembre
Anonim
Stato Kicker semplice e sistema di prenotazione con integrazione Slack
Stato Kicker semplice e sistema di prenotazione con integrazione Slack

In un'azienda dove lavoro c'è un kicker table. L'azienda occupa molti piani e per alcuni dipendenti ci vogliono fino a 3 minuti per arrivare al tavolo e…per rendersi conto che il tavolo è già occupato.

Quindi è nata l'idea di costruire una sorta di semplice sistema di trasmissione e prenotazione dello stato che operi in tempo reale.

L'azienda utilizza lo strumento di comunicazione Slack in cui ogni dipendente ha un account. Abbiamo anche un canale #kicker solo per discussioni su…kicker. Il canale potrebbe essere utilizzato come una sorta di "punto di ingresso" per la prenotazione e per essere informato sullo stato attuale del tavolo.

Come al solito, ci sono molti concetti su come affrontare un tale sistema. Ma in generale, una regola di base è apparsa in tutti loro: deve essere semplice da usare senza passaggi eccessivi da eseguire quando si ha a che fare con il sistema.

Il dispositivo e il servizio non sono attaccati al tavolo kicker e possono essere utilizzati per qualsiasi "risorsa comune" (come tavolo da ping-pong, console, ecc…) che necessita di una sorta di trasmissione dello stato e soluzione di prenotazione.

Quindi iniziamo…

Passaggio 1: prova del concetto e prototipazione

Proof of Concept e prototipazione
Proof of Concept e prototipazione
Proof of Concept e prototipazione
Proof of Concept e prototipazione
Proof of Concept e prototipazione
Proof of Concept e prototipazione

L'idea approssimativa era quella di costruire un dispositivo che verrà posato accanto al tavolo dei kicker seguendo questi requisiti:

  • alcuni indicatori sullo stato attuale del tavolo - se sei in piedi accanto ad esso, dovresti essere in grado di sapere che è gratuito o riservato e qualcuno verrà a giocare in 3 minuti. I semafori si adattano perfettamente all'idea:

    • semaforo verde - libero di giocare,
    • luce gialla - riservata,
    • semaforo rosso - occupato.
  • pulsante/i Puoi fare clic prima e dopo la partita in modo che tutti gli altri vengano informati sullo stato attuale del tavolo. Invece di 1 pulsante di attivazione ho deciso di utilizzare 2 pulsanti separati:

    • pulsante rosso - occupa il tavolo, inizia una partita (previa prenotazione o ad hoc).
    • pulsante verde - tabella di rilascio.
  • alcuni display con informazioni più dettagliate su "cosa sta succedendo" - timeout della prenotazione, stato del tavolo ripetuto, timeout del playtime ecc…

Per prenotazione intendo solo la prenotazione per i prossimi 3 minuti. Il sistema non è progettato in modo che l'utente possa prenotare il tavolo all'ora esatta (ad es. 14:00). Non funziona come la prenotazione, ad es. nei ristoranti ma solo per i prossimi minuti.

A causa della mancanza di una connessione LAN, l'unica opzione è usare la WLAN - è comunque l'opzione migliore. Il cervello del sistema deve utilizzare l'API Slack per inviare e ricevere comandi dal canale Slack. Per prima cosa ho provato a usare NodeMCU. Sono stato in grado di ricevere e ricevere messaggi da e verso Slack ma a causa dell'utilizzo di HTTPS e anche della dimensione del "messaggio di benvenuto" di Slack (~ 300 kB), NodeMCU stava perdendo la connessione e/o ha ricevuto qualche strana eccezione che non sono riuscito a risolvere scavando su Internet.

Quindi ho deciso di utilizzare qualcosa di più potente: Raspberry Pi 3 (Zero W con WiFi non era ancora stato rilasciato in quel momento). Avendo RPi, ho potuto cambiare il linguaggio di implementazione da C a Java in quanto è più conveniente per me, quindi questo è stato un vantaggio. Oggi puoi usare qualcosa di più potente di NodeMCU e meno potente di RPi. Lampone Zero forse?

Dopo aver costruito il primo prototipo su una breadboard con alcuni cavi folli, molti schizzi e prototipi, il sistema sembrava funzionare.

Avendo tutte queste idee e PoC funzionante, ho iniziato a pianificare diverse configurazioni di posizionamento degli elementi di cui sopra su un pannello frontale in modo che siano i più informativi e convenienti da usare. Puoi controllare alcune delle altre proposte, forse alcune si adattano meglio a te. L'ultimo è stato il prescelto da me.

Passaggio 2: materiali e strumenti

Materiali che ho usato:

  • Scatola
  • Raspberry Pi, scheda microSD, alimentatore micro USB
  • Pulsanti arcade verdi e rossi
  • Schermo LCD 16x2
  • LED - Ho usato RGB ma puoi usare il colore giusto
  • Cavi jumper per breadboard maschio-femmina e femmina-femmina
  • Interfaccia micro USB
  • Mini breadboard solo per collegare alcuni fili
  • Cavo micro USB corto che funge da ponticello all'interno della scatola per alimentare RPi

Strumenti che ho usato:

  • Coltello affilato (ad es. coltello multiuso per tagliare la moquette)
  • Strumento rotante
  • Pistola per colla a caldo
  • Stazione di saldatura
  • Pinze, pinze diagonali/tronchesi laterali
  • Cacciavite
  • File
  • Me

Strumenti che probabilmente ti occorrono:

Tutto quanto sopra ma invece di "Me" dovrebbe essere: "Tu":)

Passaggio 3: pannello frontale - schermo LCD

Pannello frontale - Schermo LCD
Pannello frontale - Schermo LCD
Pannello frontale - Schermo LCD
Pannello frontale - Schermo LCD

Il foro per lo schermo LCD era semplice. Solo un rettangolo che si adatta al mio schermo LCD. Dopo aver provato a tagliarlo con un coltello affilato, mi sono accorto che la plastica della scatola è piuttosto dura. Quindi ho usato uno strumento di perforazione per tagliare la finestra e lucidare i bordi.

Passaggio 4: pannello frontale - LED di stato

Pannello frontale - LED di stato
Pannello frontale - LED di stato
Pannello frontale - LED di stato
Pannello frontale - LED di stato

Anche i fori dei LED sono semplici. Ho appena preso un grosso trapano per legno e poi ho lucidato i bordi con uno strumento di perforazione. I grandi LED si adattavano perfettamente. Non ho ancora saldato alcun resistore ai LED - l'ho lasciato per il processo di assemblaggio.

Passaggio 5: pannello frontale - Pulsanti

Pannello frontale - Pulsanti
Pannello frontale - Pulsanti
Pannello frontale - Pulsanti
Pannello frontale - Pulsanti
Pannello frontale - Pulsanti
Pannello frontale - Pulsanti
Pannello frontale - Pulsanti
Pannello frontale - Pulsanti

Il problema più grande con questi 2 pulsanti grandi era posizionarli in modo uniforme con la spaziatura corretta. Ho tagliato i fori semplicemente usando il mio strumento di perforazione poiché potevo aumentare il diametro passo dopo passo in modo che i bottoni si adattassero perfettamente.

Passaggio 6: connettore di alimentazione

Connettore di alimentazione
Connettore di alimentazione

Un piccolo foro per l'alimentazione micro USB era un lavoro molto delicato da fare. Volevo che il foro fosse il più in forma possibile, quindi ho trascorso qui molto tempo per la lucidatura. Ma sono rimasto soddisfatto del risultato finale.

Quindi ho tagliato un cavo mini USB corto che è stato inserito all'interno della scatola. Un lato è collegato a RPi e, dall'altro, tutti i cavi sono stati saldati all'interfaccia micro USB in base alla piedinatura USB.

Poi ho incollato a caldo il piccolo PCB direttamente sulla scatola (si vede in una foto in fase di assemblaggio).

Passaggio 7: mettere tutto insieme

Mettere tutto insieme
Mettere tutto insieme
Mettere tutto insieme
Mettere tutto insieme
Mettere tutto insieme
Mettere tutto insieme

Per prima cosa ho saldato i resistori appropriati ai LED in base al loro colore (tensione) per 3,3 V volt. Ho usato 100Ω per il rosso, due resistori 82 e 100 per il giallo (nodo verde e rosso) e 100Ω per il verde. Puoi usare quello del resistore online per il calcolatore LED. Ma per favore fai qualche ricerca da solo in base alla luminosità e all'esatta tonalità di colore che desideri ottenere.

Le gambe del LED giallo sono state saldate insieme in modo che il LED stesso possa essere controllato da un solo pin su RPi.

Secondo questo diagramma di pinout:

I nodi LED sono stati collegati:

  • LED verde - GPIO1 su Rpi
  • LED giallo (entrambe le gambe) a GPIO2 su RPi
  • LED rosso a GPIO0 su RPi

Ho collegato l'LCD utilizzando i pin I2C sui pin RPi

  • LCD SDA a GPIO8 su RPi
  • LCD da SCL a GPIO9 su RPi
  • LCD PWR a 5V su RPi
  • LCD GND a GND su RPi

Il display LCD è stato incollato a caldo sulla scatola come protezione aggiuntiva.

Ho collegato 3.3V e GND alla piccola breadboard in modo da poterli usare per i pulsanti.

Il pulsante verde è stato collegato al 3.3V tramite mini breadboard e al GPIO5 su RPi.

Il pulsante rosso è stato collegato a 3.3V tramite mini breadboard e a GPIO4 su RPi.

Quindi, ogni volta che premi il pulsante, c'è uno stato alto sul pin RPi.

Il mini bradboard funziona bene, quindi ho saltato la saldatura di tutti i fili nel PCB. Invece ho semplicemente coperto la mini breadboard con la colla a caldo in modo che i cavi non cadano.

Ho anche incollato a caldo il coperchio di RPi sulla scatola in modo che non traballi all'interno.

Ho avvitato il pannello frontale con tutte le cose all'interno.

Poi ho stampato, tagliato e incollato semplici etichette vicino ai semafori e ai pulsanti.

Passaggio 8: configurazione allentata

Configurazione lenta
Configurazione lenta
Configurazione lenta
Configurazione lenta

Crea la tua squadra su Slack.com o usa quella che hai e hai almeno i diritti di amministratore.

In Slack, crea un canale per l'integrazione di Slack del servizio (o salta la creazione di un canale se desideri utilizzarne uno che già possiedi).

Aggiungi l'integrazione di Webhook in entrata al tuo team. Seleziona il canale e copia l'URL del webhook.

Aggiungi l'integrazione dei bot al tuo team. Scegli un nome per il tuo bot e copia il token API del bot.

La tua pagina di gestione delle integrazioni personalizzate dovrebbe apparire come nell'immagine.

Devi invitare il bot come membro del tuo canale. Potresti farlo già durante la creazione di un canale.

Se desideri personalizzare il servizio in un secondo momento, controlla l'API Slack.

Passaggio 9: implementazione del software

Ho usato Raspbian come sistema operativo per il mio RPi seguendo questo tutorial. Per favore perdonami, eviterò di spiegarlo poiché è già documentato in molti punti e il processo è semplice. Spero che tu sia abbastanza esperto ed esperto per riuscire a configurare RPi da solo. Non dimenticare di configurare l'accesso WiFi sul tuo Raspberry Pi;)

Come accennato nella sezione prototipazione, ho utilizzato Java per implementare il cervello dell'intero sistema. Il codice è disponibile su GitHub -

Le librerie Java che ho usato:

  • pi4j - per usare Raspberry Pi da Java
  • Springboot come piattaforma applicativa
  • allbegray/slack-api come integrazione Slack

Devi modificare il file di configurazione in src/resources/config.properties. Ci sono 3 voci che devi configurare per usare Slack API:

  • channelName - nome del canale Vuoi postare cambiamenti di stato e ricevere comandi.
  • slackBotToken - token di un bot configurato nelle integrazioni del tuo team Slack che verrà utilizzato per inviare messaggi al canale sopra menzionato. Nota Devi aggiungere Slack Bot come membro del canale.
  • webhookUrl: l'URL che puoi ottenere dalle integrazioni personalizzate di Slack Team.

Il progetto è Mavenized quindi per costruirlo basta digitare (è necessario installare almeno Java 8 e Maven):

pacchetto mvn pulito

E nella casella di destinazione puoi trovare il file JAR Springbooted. Per avviare un servizio:

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

Ho impostato questa riga su.sh script e l'ho aggiunta come avvio automatico. Quindi, ogni volta che l'alimentazione è accesa, il servizio si avvia automaticamente.

È necessaria una spiegazione speciale per l'LCD.

Ho provato diversi approcci/librerie per controllare LCD su I2C da RPi, ma ho fallito. Per alcuni LCD non funzionava correttamente, per alcuni mostrava un po' di spazzatura.

Ma una cosa stava funzionando molto bene appena fuori dalla scatola. È lo strumento da riga di comando di utilità che ho trovato È possibile utilizzare per controllare LCD. Quindi ho deciso di utilizzare questo strumento direttamente da Java. Funziona così che un normale processo Linux (lcdi2c) viene chiamato (con parametri preparati) ogni volta che voglio visualizzare qualcosa sullo schermo LCD.

Devi scaricare lo strumento e posizionarlo accanto al servizio JAR

L'uso di questo strumento è una specie di hack e una soluzione stupida, ma seguo la prima regola dell'ingegneria:

Se è stupido, ma funziona…non è stupido

Passaggio 10: istruzioni per l'uso

Istruzioni per l'uso
Istruzioni per l'uso

Puoi controllare lo stato corrente della tabella kicker sul canale Slack creato digitando il comando "status" (o brevemente "st") o controllare direttamente i semafori sul dispositivo.

Se vuoi solo giocare, premi il pulsante rosso. Il messaggio verrà inviato al canale Slack con l'informazione che il tavolo kicker è occupato. Quando hai finito di giocare, premi il pulsante verde. Verrà inviato un messaggio al canale Slack con l'informazione che il tavolo kicker è libero di giocare.

Anche i semafori cambieranno e lo schermo LCD mostrerà alcune informazioni dettagliate.

Nel caso in cui ti dimentichi di rilasciare il tavolo dopo aver finito di giocare, c'è un timeout impostato su 20 minuti. Se stai ancora giocando e hai bisogno di più tempo, premi di nuovo il pulsante rosso e la partita verrà prolungata di 5 minuti (si applica solo quando mancano meno di 5 minuti prima del timeout). Il timeout di riproduzione verrà visualizzato sullo schermo LCD.

Per prenotare un tavolo kicker, scrivi un messaggio "reserve" (o semplicemente: "res") nel canale Slack.

Il semaforo giallo si accenderà informando gli altri vicino al tavolo dei kicker che è riservato e presto qualcuno verrà a giocare.

Il timeout della prenotazione è impostato su 3 minuti. Dopodiché, il tavolo kicker cambia il suo stato in free to play.

Se necessario, puoi cancellare la prenotazione scrivendo "cancella" sul canale Slack.

Il sistema ha anche alcune altre caratteristiche minori come:

  • Dopo la prenotazione, i pulsanti vengono congelati per 5 secondi. Questo è così per prevenire situazioni, che proprio nello stesso tempo qualcuno prenota e un millisecondo dopo qualcuno preme il pulsante rosso pensando che lui/lei sia quello che occupa il tavolo ma senza sapere che qualcuno ha prenotato il tavolo solo un millisecondo prima.
  • La pressione di un pulsante qualsiasi li blocca entrambi per mezzo secondo. Questo è così per prevenire i clic folli sui pulsanti in modo che il canale Slack non venga spammato così tanto.
  • La versione gratuita di Slack consente di memorizzare 10.000 messaggi di tutto il team. Per preservare alcuni dei messaggi, il servizio elimina i vecchi messaggi relativi al sistema di prenotazione/stato) e conserva solo gli ultimi 6 di essi. Perché 6? Perché molto spesso ci sono 2 scenari di stato: "Riservato-Occupato-Libero" e "Occupato-Libero". Quindi il sistema può memorizzare almeno 2 sessioni complete libere da occupazione. Per pulire tutti i messaggi di sistema, digita il comando "clean" (o "clear").

Passaggio 11: rilascio

Rilascio
Rilascio
Rilascio
Rilascio

Fino ad ora (il momento della pubblicazione di questo istruibile), il sistema è in esecuzione per più di 2,5 mesi ed è utilizzato da più di 30 persone. Grazie all'aggiornamento dello stato del tavolo kicker, sappiamo sempre quando è libero o occupato, così non perdiamo più tempo ad andare avanti e indietro. La connessione e il servizio sono molto stabili quindi possiamo fare affidamento su di esso.

Fin qui tutto bene…

Passaggio 12: domande frequenti

Perché il timeout della prenotazione è impostato su 3 minuti?

3 minuti è il tempo massimo di prenotazione, adottalo come preferisci nel codice. Generalmente accade raramente che trascorrano 3 minuti interi e la prenotazione scadrà. Nella maggior parte dei casi, prima o poi, qualcuno arriverà e occuperà il tavolo.

Perché il timeout di riproduzione è impostato su 20 minuti?

A seconda dei giocatori, il tempo medio di gioco è di ~10 minuti. Se hai bisogno di giocare più a lungo, premi di nuovo il pulsante rosso quando mancano meno di 5 minuti e il timeout verrà esteso a 5 minuti. Questo timeout viene impostato nel caso in cui qualcuno si dimentichi di rilasciare il tavolo.

Perché non c'è un PIN pad sul dispositivo per confermare la prenotazione; nessun login e password?

L'idea principale era di mantenerlo-semplicemente stupido. Altrimenti, se la prenotazione, l'inizio e la fine del gioco richiedono uno sforzo eccessivo, nessuno vorrà utilizzarlo.

Perché il dispositivo sembra così brutto dal punto di vista industriale?

Perché non avevo taglierina laser, CNC, stampante 3D, etichettatrice colorata di fantasia ecc. Sei più che lieto di migliorarlo e renderlo più bello.

Perché non implementare semplicemente qualche app e attaccare un tablet economico al muro con la stessa funzionalità?

App, app ovunque. Alla gente piace interagire fisicamente con le cose e non solo toccare uno schermo piatto.

Consigliato: