Spisu treści:

Prosty system statusu i rezerwacji Kickera z integracją ze Slack: 12 kroków (ze zdjęciami)
Prosty system statusu i rezerwacji Kickera z integracją ze Slack: 12 kroków (ze zdjęciami)

Wideo: Prosty system statusu i rezerwacji Kickera z integracją ze Slack: 12 kroków (ze zdjęciami)

Wideo: Prosty system statusu i rezerwacji Kickera z integracją ze Slack: 12 kroków (ze zdjęciami)
Wideo: WEBINAR FCA #10: Wykorzystanie możliwosci technologii IP/MPLS w sieciach telekomunikacyjnych 2024, Lipiec
Anonim
Prosty system statusu i rezerwacji Kickera z integracją ze Slack
Prosty system statusu i rezerwacji Kickera z integracją ze Slack

W firmie, w której pracuję, jest stół kicker. Firma zajmuje wiele pięter, a niektórym pracownikom dojście do stołu i… uświadomienie sobie, że stół jest już zajęty, zajmuje nawet 3 minuty.

W związku z tym powstał pomysł zbudowania swego rodzaju prostego systemu nadawania i rezerwacji statusu, działającego w czasie rzeczywistym.

Firma korzysta z narzędzia komunikacyjnego Slack, w którym każdy pracownik ma konto. Mamy nawet kanał #kicker tylko do dyskusji o…kickerze. Kanał mógłby służyć jako swego rodzaju „punkt wejścia” do rezerwacji i bycia informowanym o aktualnym stanie stolika.

Jak zwykle jest wiele koncepcji, jak poradzić sobie z takim systemem. Ale generalnie we wszystkich pojawiła się jedna podstawowa zasada: musi być prosty w obsłudze, bez nadmiernych kroków do wykonania podczas pracy z systemem.

Urządzenie i usługa nie są przyklejone do tabeli kickera i mogą być używane do dowolnego „wspólnego zasobu” (takiego jak stół do ping-ponga, konsola itp.), który wymaga pewnego rodzaju rozwiązania do rozpowszechniania statusu i rezerwacji.

Więc zacznijmy…

Krok 1: Proof of Concept i prototypowanie

Proof of Concept i prototypowanie
Proof of Concept i prototypowanie
Proof of Concept i prototypowanie
Proof of Concept i prototypowanie
Proof of Concept i prototypowanie
Proof of Concept i prototypowanie

Pomysł polegał na zbudowaniu urządzenia, które będzie leżało obok stołu z kickerem zgodnie z następującymi wymaganiami:

  • kilka wskaźników o aktualnym stanie stołu - jeśli stoisz obok niego, powinieneś wiedzieć, że jest wolny lub zarezerwowany i ktoś przyjdzie zagrać za 3 minuty. Sygnalizacja świetlna idealnie wpisuje się w ten pomysł:

    • zielone światło - free to play,
    • żółte światło - zarezerwowane,
    • czerwone światło - zajęte.
  • button(s) Możesz kliknąć przed i po grze, aby wszyscy inni zostali poinformowani o aktualnym stanie stołu. Zamiast jednego przełącznika zdecydowałem się na użycie 2 oddzielnych przycisków:

    • czerwony przycisk - zajmij stolik, rozpocznij grę (po rezerwacji lub ad hoc).
    • zielony przycisk - stół zwalniający.
  • ekran z bardziej szczegółowymi informacjami o tym, „co się dzieje” - limit czasu rezerwacji, powtarzający się status stołu, limit czasu gry itp.

Przez rezerwację rozumiem tylko rezerwację na kolejne 3 minuty. System nie jest zaprojektowany tak, aby użytkownik mógł zarezerwować stolik o dokładnej godzinie (np. 14:00). Nie działa jak rezerwacja m.in. w restauracjach, ale tylko na najbliższe minuty.

Ze względu na brak połączenia LAN, jedyną opcją jest skorzystanie z WLAN - i tak jest to najlepsza opcja. Mózg systemu musi używać Slack API do wysyłania i odbierania poleceń z kanału Slack. Najpierw próbowałem użyć NodeMCU. Udało mi się uzyskać i odbierać wiadomości do i ze Slacka, ale z powodu użycia protokołu HTTPS, a także rozmiaru „wiadomości powitalnej” Slacka (~300kB), NodeMCU tracił połączenie i/lub otrzymał dziwny wyjątek, którego nie mogłem rozwiązać podczas kopania przez Internet.

Postanowiłem więc użyć czegoś mocniejszego: Raspberry Pi 3 (zero W z WiFi nie było jeszcze wtedy wypuszczane). Mając RPi mogłem zmienić język implementacji z C na Javę, ponieważ jest to dla mnie wygodniejsze - więc to była zaleta. Dzisiaj możesz użyć czegoś mocniejszego niż NodeMCU i mniej wydajnego niż RPi. Może Malina Zero?

Po zbudowaniu pierwszego prototypu na płytce prototypowej z szalonym okablowaniem, mnóstwem szkicowania i prototypowania, system wyglądał, jakby mógł działać.

Mając wszystkie te pomysły i działający PoC, zacząłem planować różne konfiguracje rozmieszczenia powyższych elementów na przednim panelu, aby były jak najbardziej pouczające i wygodne w użyciu. Możesz sprawdzić kilka innych propozycji, może niektóre bardziej do Ciebie pasują. Ostatnia była wybrana przeze mnie.

Krok 2: Materiały i narzędzia

Użyte materiały:

  • Skrzynka
  • Raspberry Pi, karta microSD, zasilacz micro USB
  • Zielone i czerwone przyciski arkadowe
  • Ekran LCD 16x2
  • Diody LED - ja użyłem RGB, ale możesz użyć odpowiedniego koloru
  • Kable połączeniowe męskie do żeńskich i żeńskie do żeńskich
  • Interfejs Micro USB
  • Mini płytka stykowa tylko do podłączenia niektórych przewodów
  • Krótki kabel micro USB działający jako zworka wewnątrz pudełka do zasilania RPi

Narzędzia, których użyłem:

  • Ostry nóż (np. nóż uniwersalny do cięcia dywanu)
  • Narzędzie obrotowe
  • Pistolet na gorący klej
  • Stacja lutownicza
  • Szczypce, szczypce ukośne/obcinaki boczne
  • Śrubokręt
  • Plik
  • Ja

Narzędzia, których prawdopodobnie potrzebujesz:

Wszystkie powyższe, ale zamiast „Ja” powinno być: „Ty”:)

Krok 3: Panel przedni - ekran LCD

Panel przedni - ekran LCD
Panel przedni - ekran LCD
Panel przedni - ekran LCD
Panel przedni - ekran LCD

Otwór na ekran LCD był prosty. Tylko prostokąt pasujący do mojego ekranu LCD. Po próbie przecięcia go ostrym nożem zdałem sobie sprawę, że plastik pudełka jest dość twardy. Użyłem więc narzędzia do wiercenia, aby wyciąć okno i wypolerować krawędzie.

Krok 4: Panel przedni - diody LED stanu

Panel przedni - diody LED stanu
Panel przedni - diody LED stanu
Panel przedni - diody LED stanu
Panel przedni - diody LED stanu

Otwory LED są również proste. Po prostu wziąłem dużą wiertarkę do drewna, a następnie wypolerowałem krawędzie wiertarką. Duże diody LED osadzone idealnie ciasno. Nie wlutowałem jeszcze żadnych rezystorów do diod LED - zostawiłem je do montażu.

Krok 5: Panel przedni - przyciski

Panel przedni - Przyciski
Panel przedni - Przyciski
Panel przedni - Przyciski
Panel przedni - Przyciski
Panel przedni - Przyciski
Panel przedni - Przyciski
Panel przedni - Przyciski
Panel przedni - Przyciski

Największym problemem z tymi 2 dużymi przyciskami było rozmieszczenie ich w równych odstępach. Wycinałem otwory za pomocą mojego narzędzia do wiercenia, ponieważ mogłem krok po kroku zwiększać średnicę, aby guziki pasowały ciasno.

Krok 6: Złącze zasilania

Złącze zasilania
Złącze zasilania

Mały otwór na zasilanie micro USB był bardzo delikatną pracą. Chciałem, żeby otwór był jak najbardziej dopasowany, więc spędziłem tu dużo czasu na polerowanie. Ale byłem zadowolony z efektu końcowego.

Następnie przeciąłem krótki kabel mini USB, który został umieszczony w pudełku. Z jednej strony jest wpięty do RPi, a z drugiej strony wszystkie kable zostały przylutowane do interfejsu micro USB zgodnie z wyprowadzeniami USB.

Następnie przykleiłem na gorąco małą płytkę bezpośrednio do pudełka (widać to na zdjęciu w kroku montażu).

Krok 7: Składanie wszystkiego razem

Składanie wszystkiego razem
Składanie wszystkiego razem
Składanie wszystkiego razem
Składanie wszystkiego razem
Składanie wszystkiego razem
Składanie wszystkiego razem

Najpierw przylutowałem odpowiednie rezystory do diod LED zgodnie z ich kolorem (napięciem) na 3,3V volt. Użyłem 100Ω dla czerwonego, dwa rezystory 82 i 100 dla żółtego (węzeł zielony i czerwony) i 100Ω dla zielonego. Możesz użyć jednego z rezystorów online do kalkulatora LED. Ale proszę, zrób kilka badań samodzielnie, zgodnie z jasnością i dokładnym odcieniem koloru, który chcesz osiągnąć.

Nogi żółtej diody LED zostały zlutowane, dzięki czemu samą diodę można kontrolować tylko jednym pinem na RPi.

Zgodnie z tym schematem pinów:

Węzły LED zostały połączone:

  • Zielona dioda LED - GPIO1 na Rpi
  • Żółta dioda LED (obie nogi) do GPIO2 na RPi
  • Czerwona dioda LED do GPIO0 na RPi

Podłączyłem LCD za pomocą pinów I2C na pinach RPi

  • LCD SDA do GPIO8 na RPi
  • LCD SCL do GPIO9 na RPi
  • LCD PWR do 5V na RPi
  • LCD GND do GND na RPi

Wyświetlacz LCD został przyklejony na gorąco do pudełka jako dodatkowe zabezpieczenie.

Podłączyłem 3,3V i GND do małej płytki stykowej, żebym mógł wykorzystać je do przycisków.

Zielony przycisk został podłączony do 3,3V przez mini płytkę stykową oraz do GPIO5 na RPi.

Czerwony przycisk został podłączony do 3,3V przez mini płytkę stykową oraz do GPIO4 na RPi.

Tak więc za każdym razem, gdy naciśniesz przycisk, na pinie RPi pojawia się stan wysoki.

Mini tabliczka działa dobrze, więc pominąłem lutowanie wszystkich przewodów do PCB. Zamiast tego po prostu pokryłem mini płytkę stykową gorącym klejem, żeby kable nie odpadły.

Przykleiłem też na gorąco obudowę RPi do pudełka, żeby nie chwiała się w środku.

Przykręciłem przedni panel ze wszystkimi rzeczami w środku.

Następnie wydrukowałam, wycięłam i przykleiłam proste etykiety przy sygnalizacji świetlnej i guzikach.

Krok 8: Konfiguracja luzu

Konfiguracja luzu
Konfiguracja luzu
Konfiguracja luzu
Konfiguracja luzu

Stwórz swój zespół na Slack.com lub użyj tego, który posiadasz i posiadasz co najmniej uprawnienia administratora.

W Slacku utwórz kanał do integracji usługi ze Slackiem (lub pomiń tworzenie kanału, jeśli chcesz użyć takiego, który już posiadasz).

Dodaj integrację Incomming Webhooks do swojego zespołu. Wybierz kanał i skopiuj adres URL webhooka.

Dodaj integrację botów do swojego zespołu. Wybierz nazwę dla swojego bota i skopiuj token API bota.

Twoja strona zarządzania niestandardowymi integracjami powinna wyglądać tak jak na obrazku.

Musisz zaprosić bota jako członka swojego kanału. Możesz to zrobić już podczas tworzenia kanału.

Jeśli chcesz dostosować usługę później, sprawdź Slack API.

Krok 9: Implementacja oprogramowania

Użyłem Raspbian jako systemu operacyjnego dla mojego RPi, postępując zgodnie z tym samouczkiem. Proszę mi wybaczyć, pominę to wyjaśnianie, ponieważ jest to już udokumentowane w wielu miejscach, a proces jest prosty. Mam nadzieję, że posiadasz odpowiednie umiejętności i doświadczenie, aby samodzielnie skonfigurować RPi. Nie zapomnij skonfigurować dostępu WiFi na swoim Raspberry Pi;)

Jak wspomniałem w sekcji o prototypowaniu, wykorzystałem Javę do implementacji mózgu całego systemu. Kod jest dostępny na GitHubie -

Wykorzystane przeze mnie biblioteki Java:

  • pi4j - do korzystania z Raspberry Pi z Javy
  • Springboot jako platforma aplikacji
  • allbegray/slack-api jako integracja ze Slackiem

Musisz edytować plik konfiguracyjny w src/resources/config.properties. Istnieją 3 wpisy, które musisz skonfigurować, aby korzystać ze Slack API:

  • channelName - nazwa kanału Chcesz publikować zmiany statusu i otrzymywać komendy.
  • slackBotToken - token bota skonfigurowanego w integracjach zespołu Your Slack, który będzie służył do wysyłania wiadomości na wspomniany kanał. Uwaga: Musisz dodać Slack Bot jako członka kanału.
  • webhookUrl - adres URL, który możesz uzyskać z niestandardowych integracji Slack Team.

Projekt jest Mavenized, więc aby go zbudować, wystarczy wpisać (musisz mieć co najmniej Java 8 i Maven):

mvn czysty pakiet

A w docelowym katalogu możesz znaleźć plik Springbooted JAR. Aby uruchomić usługę:

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

Ustawiłem tę linię na skrypt.sh i dodałem ją jako autostart. Dlatego zawsze, gdy zasilanie jest włączone, usługa uruchamia się automatycznie.

Dla wyświetlacza LCD potrzebne jest jedno specjalne wyjaśnienie.

Próbowałem różnych podejść / bibliotek do kontrolowania LCD przez I2C z RPi, ale po prostu mi się nie udało. Dla niektórych LCD nie działał poprawnie, dla innych wyświetlał jakieś śmieci.

Ale jedna rzecz działała bardzo ładnie zaraz po wyjęciu z pudełka. Jest to narzędzie wiersza poleceń, które znalazłem, którego można użyć do sterowania LCD. Postanowiłem więc użyć tego narzędzia bezpośrednio z Javy. Działa to tak, że normalny proces Linuksa (lcdi2c) jest wywoływany (z przygotowanymi parametrami) za każdym razem, gdy chcę coś wyświetlić na ekranie LCD.

Musisz pobrać narzędzie i umieścić je obok usługi JAR

Korzystanie z tego narzędzia jest rodzajem hacka i głupiego rozwiązania, ale przestrzegam pierwszej zasady inżynierii:

Jeśli jest głupie, ale działa…to nie jest głupie

Krok 10: Instrukcja użytkowania

Instrukcja użytkowania
Instrukcja użytkowania

Możesz sprawdzić aktualny status tabeli kickera na utworzonym kanale Slack, wpisując komendę "status" (lub krótko "st") lub bezpośrednio sprawdzić sygnalizację świetlną na urządzeniu.

Jeśli chcesz tylko pograć - naciśnij czerwony przycisk. Wiadomość zostanie wysłana na kanał Slack z informacją, że stół kickera jest zajęty. Kiedy skończysz grać - naciśnij zielony przycisk. Wiadomość zostanie wysłana na kanał Slack z informacją, że stół z kickerami jest darmowy.

Zmienią się również sygnalizacja świetlna, a na ekranie LCD pojawią się szczegółowe informacje.

Na wypadek, gdybyś zapomniała zwolnić stół po zakończeniu gry, jest limit czasu ustawiony na 20 minut. Jeśli nadal grasz i potrzebujesz więcej czasu, naciśnij ponownie czerwony przycisk, a mecz zostanie przedłużony o 5 minut (dotyczy tylko sytuacji, gdy do limitu czasu pozostało mniej niż 5 minut). Limit czasu odtwarzania zostanie wyświetlony na ekranie LCD.

Aby zarezerwować stolik z kickerem, napisz wiadomość „reserve” (lub po prostu: „res”) na kanał Slack.

Żółta sygnalizacja świetlna zaświeci się informując innych w pobliżu stołu z kickerem, że jest zarezerwowana i wkrótce ktoś przyjdzie do gry.

Limit czasu rezerwacji jest ustawiony na 3 minuty. Następnie stół z kickerem zmienia swój stan na free to play.

W razie potrzeby rezerwację można anulować pisząc „anuluj” na kanale Slack.

System posiada również kilka innych pomniejszych funkcji, takich jak:

  • Po dokonaniu rezerwacji przyciski zostają zamrożone na 5 sekund. Ma to na celu zapobieganie sytuacjom, że w tym samym czasie ktoś rezerwuje i milisekundę później ktoś naciska czerwony przycisk myśląc, że to On/Ona zajmuje stolik, ale nie wiedząc, że ktoś zarezerwował stolik milisekundę wcześniej.
  • Naciśnięcie dowolnego przycisku powoduje zamrożenie obu na pół sekundy. Ma to na celu zapobieganie szalonym klikaniu przycisków, dzięki czemu kanał Slack nie będzie tak często spamowany.
  • Darmowa wersja Slacka pozwala na przechowywanie 10000 wiadomości przez cały zespół. Aby zachować część wiadomości, serwis usuwa stare wiadomości związane z systemem rezerwacji/statusu) i zachowuje tylko ostatnie 6 z nich. Dlaczego 6? Ponieważ najczęściej występują 2 scenariusze statusu: „Zarezerwowany-Zajęty-Wolny” i „Zajęty-Wolny”. Dzięki temu system może przechowywać co najmniej 2 pełne sesje wolne od zajętości. Aby wyczyścić wszystkie komunikaty systemowe, wpisz polecenie „wyczyść” (lub „wyczyść”).

Krok 11: Uwalnianie

Zwalnianie
Zwalnianie
Zwalnianie
Zwalnianie

Do tej pory (do momentu opublikowania tej instrukcji) system działa ponad 2,5 miesiąca i korzysta z niego ponad 30 osób. Dzięki aktualizacji statusu stołu kickera zawsze wiemy, kiedy jest wolny lub zajęty, więc nie tracimy już czasu na chodzenie tam iz powrotem. Połączenie i usługa są bardzo stabilne, więc możemy na nich polegać.

Jak na razie dobrze…

Krok 12: Często zadawane pytania

Dlaczego limit czasu rezerwacji jest ustawiony na 3 minuty?

3 minuty to maksymalny czas rezerwacji, przyjmij go tak, jak lubisz w kodzie. Generalnie rzadko się zdarza, że upłyną pełne 3 minuty, a rezerwacja zostanie przekroczona. W większości przypadków ktoś w końcu przyjdzie i zajmie stół.

Dlaczego limit czasu gry jest ustawiony na 20 minut?

W zależności od gracza średni czas gry to ~10 minut. Jeśli chcesz grać dłużej, naciśnij ponownie czerwony przycisk, gdy pozostało mniej niż 5 minut, a czas oczekiwania zostanie przedłużony z powrotem do 5 minut. Ten limit czasu jest ustawiany na wypadek, gdyby ktoś zapomniał zwolnić stół.

Dlaczego na urządzeniu nie ma PIN Pada do potwierdzania rezerwacji; brak loginów i haseł?

Główną ideą było zachowanie prostoty i głupoty. W przeciwnym razie, jeśli rezerwacja, rozpoczęcie i zakończenie gry będzie wymagało zbyt dużego wysiłku, to nikt nie będzie chciał z niej skorzystać.

Dlaczego urządzenie wygląda tak brzydko przemysłowo?

Ponieważ nie miałem wycinarki laserowej, CNC, drukarki 3D, fantazyjnej kolorowej drukarki etykiet itp. Z przyjemnością ulepszysz ją i upiększysz.

Dlaczego nie po prostu zaimplementować jakiejś aplikacji i przykleić do ściany tani tablet z tą samą funkcjonalnością?

Aplikacje, aplikacje wszędzie. Ludzie lubią fizycznie wchodzić w interakcje z rzeczami, a nie tylko dotykać płaskich ekranów.

Zalecana: