Moja asystentka Andra

W poprzednim wpisie opisywałem, jak w mojej głowie zrodziła się idea stworzenia swojej własnej mobilnej asystentki. Natomiast dzisiaj chciałbym przybliżyć jej działanie i opisać jak wyglądała ewolucja projektu oraz rozwinąć trochę wątek historii projektu.

Trudne początki

Jak już wspominałem, Andra rodziła się w bólach, a jej API było już raz przepisywane ze względu na przyjęcie złych założeń na etapie planowania projektu. Jednak nie wspomniałem, co było dodatkowym powodem tego, że zdecydowałem się na pisanie swojej asystentki od podstaw.

W czasie, kiedy projekt zaczynał raczkować, byłem posiadaczem urządzeń z różnymi systemami operacyjnymi: na komputerze stacjonarnym przełączałem się między Linuxem a Windowsem, "sekcja mobilna" działała w oparciu o Androida i Windows Phone (co ciekawe, przez pewien czas rozwijałem aplikację mobilną dla tej ostatniej platformy). Ja jednak potrzebowałem mieć wszystko w jednym miejscu, zsynchronizowane ze wszystkimi urządzeniami, a nie rozsiane po kilku platformach i kontach. Dlatego zapadła decyzja o napisaniu swojego rozwiązania. Dzisiaj mógłbym próbować używać Cortany, ale nie mam ochoty i czasu na migrację na kolejną platformę.

Koncepcja graficzna i jej ewolucja

Pierwszym problemem, z którym zetknąłem się na początku projektu, był brak spójnej koncepcji dotyczącej graficznej oprawy mojej nowej "koleżanki". Bądź co bądź miała to być aplikacja, której będę używał codziennie, więc ważnym aspektem była kwestia interfejsu użytkownika. Ostatecznie stanęło na tym, że moja asystentka w pierwotnej formie układem bardzo przypominała pierwsze wersje Cortany. Nawet była przypięta w tym samym miejscu na pasku narzędzi systemu Windows. Na zrzucie ekranu, zamieszczonym poniżej, widać Andrę w jej pierwszej wersji. Logo, które wtedy towarzyszyło projektowi, rozświetlało się podczas przetwarzania poleceń.

Przez trzy lata trwania projektu powstawały liczne modyfikacje graficzne, które dodatkowo komplikowały implementacje wszystkiego na każdej obsługiwanej platformie. Pierwsza wersja Andry wspierała aż 4 motywy kolorystyczne. Wymuszało to generowanie po stronie API wielu obrazów, które różniły się tylko kolorem, bowiem Andra przedstawia część informacji w formie graficznej (np. prognozę pogody). Kiedy jednak zdecydowałem się na stworzenie nowego API powoli zacząłem odchodzić od wspierania motywów kolorystycznych. Wielka zmiana w temacie oprawy graficznej zaszła w 2016 roku.

Światowe Dni Młodzieży mają wpływ na programistów

Jako, że mieszkam w Krakowie nie ominęły mnie w 2016 roku odbywające się tutaj Światowe Dni Młodzieży. Całe szczęście mieszkam na peryferiach miasta i mogłem zabarykadować się na tydzień w mieszkaniu, a to zaowocowało sporą ilością wolnego czasu.

Postanowiłem, oprócz wykonywania mojej pracy zawodowej, skupić się na ujednoliceniu osobistej komunikacji wizualnej oraz elementów komunikacji wizualnej moich projektów. W tym czasie skonkretyzowały się dokładne wytyczne dotyczące mojego osobistego logo oraz projektów, które powstawały. Zmiany dotknęły też Andrę.

Głównym założeniem nowej komunikacji wizualnej było użycie prostych figur geometrycznych w logo projektów oraz rezygnacja z cieni i gradientów. Jak pewnie zauważyliście, pierwsze logo zupełnie nie wpisywało się w te wytyczne. Z tego powodu, któregoś wieczoru powstała nowa komunikacja wizualna dla Andry.

Rewolucja 2018

Końcem 2017 roku postanowiłem rozdzielić identyfikację wizualną projektów od identyfikacji osobistej ze względu na to, że dokument opisujący wszystkie wytyczne wraz ze stroną internetową stawały się coraz bardziej obszerne. Skutkiem tego było rozpoczęcie prac nad nowym projektem, mającym na celu opisanie i stworzenie uniwersalnych zaleceń, dotyczących tworzenia interfejsów użytkownika dla moich projektów. Po trzech miesiącach prac przygotowawczych rozpocząłem wdrażanie nowych wytycznych w moim sztandarowym projekcie. Przy tej okazji postanowiłem delikatnie zmodyfikować logo, aby w możliwie łatwy sposób zastosować w aplikacji założenia dotyczące animacji. W styczniu 2018 roku nowa wersja została w pełni wdrożona.

Równolegle do prac nad nowym interfejsem zajmowałem się "mózgiem" Andry. Kod został znacznie uproszczony, a samo API zostało w końcu udokumentowane. Przeniosłem także zarządzanie pamięcią zadań (np. zadawaniem dodatkowych pytań do tworzonego przypomnienia) na aplikacje klienckie. Wcześniej wszystko było zapamiętywane po stronie serwera, a to niesamowicie utrudniało obsługę Andry na wielu urządzeniach. Była to jedna z gorszych decyzji projektowych, podjętych na samym początku tworzenia projektu, która jednak nie była nieuzasadniona. Chciałem, żeby operacje rozpoczęte na jednym urządzeniu można było dokończyć na innym. Ostatecznie rozwiązanie nie sprawdziło się i obecnie każde urządzenie działa niezależnie od innych.

Główne funkcje

Jak już wspominałem Andra pomaga mi w organizacji mojej pracy i planowaniu mojego dnia. Obecnie dostępne są 4 główne "podprogramy", z których aktywnie korzystam oraz mniejsze funkcje wykorzystywane rzadziej.

Notatki

Notatki są jedną z najprostszych i najstarszych części Andry. Nie oferują zbyt wiele możliwości, ale takie było ich założenie. Dzięki nim w każdej chwili mam dostęp do miejsca, gdzie mogę zapisywać swoje nowe pomysły lub rzeczy, które mam kupić w sklepie. Ta ostatnia notatka jest traktowana wyjątkowo, gdyż w razie potrzeby na jej podstawie moja asystentka może wysłać mi wiadomość SMS z obecną listą zakupów. Opcja ta była niesamowicie przydatna w czasie, kiedy korzystałem z Windows Phone, w którym nie zdążyłem zaimplementować obsługi modułu notatek. Obecnie dzięki Progressive Web Apps mogę mieć wszystkie funkcje Andry na moim telefonie z Androidem, więc z opcji wysyłania listy SMS-em korzystam coraz rzadziej.

Kalendarz

W przypadku tego modułu także można byłoby pomyśleć, że jest to bardzo prosta aplikacja, ale nie do końca tak jest. Kalendarz wbudowany w moją asystentkę różni się - i to bardzo - od tego spotykanego chociażby w portfolio usług firmy Google.

Początki jego implementacji sięgają dwa lata wstecz, kiedy plan całego tygodnia miałem rozpisany na mojej tablicy suchościeralnej wiszącej na ścianie. Stosowałem metodę podziału dnia na godzinowe segmenty, a każdej godzinie odpowiadała jedna komórka tabeli, w którą wklejałem samoprzylepną karteczkę z zadaniem do wykonania o określonej porze. Jeśli zadanie miało trwać dłużej pozostawiałem kolejne komórki puste. Dlatego dzisiejszy kalendarz Andry także opiera się na tym pomyśle. Jednym z usprawnień jest to, że wydarzenia mogą mieć zapisaną większą ilość informacji oraz to, że może być ich kilka w ciągu jednej godziny – w takim przypadku komórka dzielona jest równo pomiędzy wydarzenia.

Każdy z wpisów w kalendarzu może też mieć zapisaną dokładniejszą godzinę rozpoczęcia, np. 17:30, ale nie zmienia to formy wyświetlania w panelu kalendarza. Od pewnego czasu w kalendarzu wyświetlane są także ustawione przypomnienia, które dla odróżnienia są jaśniejsze niż zwykłe wydarzenia.

Dodawanie przypomnień do kalendarza może odbywać się na dwa sposoby. Pierwszy to oczywiście możliwość "wyklikania" odpowiednich opcji, a drugi to głosowe przekazanie instrukcji do Andry. Nad implementacją drugiej metody wprowadzania danych spędziłem sporo czasu, ale opłaciło się, bo dzięki temu mogę w naturalny sposób powiedzieć np. "przypomnij mi za 10 minut, żeby zadzwonić do banku" i Andra zapisze przypomnienie w swojej bazie, a jeśli czegoś nie zrozumie to dopyta o interesujące ją szczegóły. Na obecną chwilę uprościłem nieco ten mechanizm i czas przypomnień jest zaokrąglany do 15 minut, ale nic nie stoi na przeszkodzie, żeby kiedyś wprowadzić ustawianie przypomnienia co do minuty. Ustawione przypomnienia są wysyłane SMS-em, a w przypadku niepowodzenia e-mailem. Dodatkowo przypomnienia są wyświetlane w aplikacji (wraz z głosowym powiadomieniem) oraz podawane przez mój domowy "inteligentny" głośnik oparty o rozwiązanie Google.

Kiedyś Andra synchronizowała swój kalendarz z kalendarzem firmy Microsoft, ale niestety API, z którego korzystałem już w chwili implementacji było przestarzałe, a obecnie zostało wyłączone. Planowałem podłączenie do kalendarza Google, ale ostatecznie nie zdecydowałem się na to, dlatego że chcę się chociaż w niewielkim stopniu odciąć od usług zewnętrznych. Śledzenie tego czy kod odpowiedzialny za synchronizację jest aktualny i czy nie zaszły jakieś zmiany w zewnętrznym API niestety zabiera zbyt wiele cennego czasu.

Finanse

Moja asystentka pomaga mi także w planowaniu domowego budżetu. W aplikacji mogę ustalić miesięczny limit wydatków oraz dodać wydatki do jednej ze zdefiniowanych kategorii. Na chwilę obecną nie ma możliwości konfiguracji kategorii, ale pracuję nad uniwersalizacją tego narzędzia w związku z tym, że niektóre kategorie są już niepotrzebne.

Kontrola wagi

Najnowszym podsystemem Andry jest ten odpowiedzialny za pomoc w utrzymywaniu odpowiedniej wagi ciała użytkownika. Tutaj także nie ma zbyt odkrywczych rozwiązań. Aplikacja pozwala na zapisanie wagi rano i wieczorem oraz dodanie do konkretnego dnia komentarza, np. z informacją, że tego dnia odbyłem swój trening. Z zapisanych danych generowany jest miesięczny wykres wagi ciała.

Jedynym udziwnieniem jest możliwość zapisania wagi przy użyciu opcji rozpoznawania mowy – przydatne narzędzie od czasu kiedy zintegrowałem Andrę z Google Voice Kit.

    Co dzieje się pod maską?

    Moja asystentka to nie tylko to, co widzą użytkownicy (na chwilę obecną "aż" dwie osoby), ale także operacje wykonywane w tle. Już na początku projektu zauważyłem, że nie mogę wszystkich zadań przerzucić na API i tak powstał kolega Andry - Kłapouchy, a właściwie Eeyore. Nazwa dla systemu oczywiście zaczerpnięta jest z powieści Kubuś Puchatek, a sam "osiołek" to w pewnym sensie asystent mojej asystentki. To do tej aplikacji kierowane są zadania wymagające czasu na przetworzenie lub mające się dziać automatycznie.

    Ten specjalny podsystem w imieniu Andry wysyła powiadomienia SMS z przypomnieniami oraz np. z alarmami pogodowymi, dotyczącymi burz w okolicy (na podstawie danych z serwisu burze.dzis.net). Do zadań Eeyore należą także: 

    • wysyłka codziennych raportów z informacjami na temat interesujących mnie dziedzin oraz wydarzeniami z kraju i ze świata, a także tych lokalnych (na chwilę obecną tylko z Krakowa),
    • dbanie o synchronizację danych z centralnym serwerem uwierzytelniania użytkowników (IMid),
    • pobieranie rozkładów jazdy z serwerów MPK Kraków,
    • śledzenie stron, na których mogą pojawić się ważne dla mnie informacje,
    • czuwanie nad statusem pracy moich serwerów i wysyłka w przypadku awarii SMS-a z odpowiednią informacją.

    Eeyore jest także generatorem mowy dla Andry (wykorzystywane jest do tego zewnętrzne API, ale potrzebowałem prostego mechanizmu do tworzenia cache zapytań).

    Podsumowanie

    Tak na dzień dzisiejszy wygląda moja osobista asystentka. Nie jest to twór nawet po części mogący konkurować z Siri czy Asystentem Google, ale do moich osobistych spraw nadaje się idealnie. Sam projekt dał mi bardzo dużo, sporo nauczyłem się podczas pisania kodu oraz poszukiwania rozwiązań, które akurat były mi potrzebne. Cały projekt opiera się wszędzie tam, gdzie to tylko możliwe, na darmowych rozwiązaniach, a jedynym kosztem utrzymania jest koszt serwerów i opłaty za wysyłkę SMS-ów z powiadomieniami.

    Jeśli ktoś byłby zainteresowany sprawdzeniem, jak sprawuje się Andra, to z chęcią udostępnię aplikację do testów. Proszę tylko o kontakt za pośrednictwem portalu.

    Na zakończenie tradycyjnie dziękuję za przeczytanie i zapraszam do pozostawienia komentarza. Kolejne wpisy są w przygotowaniu.  

    Komentarze