Wstęp
Na co dzień używamy kalendarzy do planowania różnego rodzaju spotkań – dlaczego więc nie potraktować takiego spotkania jako przedział czasu do włączenia jakiegoś urządzenia. Możemy sterować dosłownie wszystkim – począwszy od różnego rodzaju lampek, poprzez sterowanie roletami a skończywszy na podlewaniu trawnika. Jeśli użyjemy do tego Google Calendar-a to mamy gotowy interfejs użytkownika dla naszego sterownika czasowego (zarówno webowy jak i na urządzenia mobilne). Teraz czas na element wykonawczy i tu odpowiedź jest oczywista RaspberryPI -Dlaczego ?, bo ma GPIO, dzięki któremu możemy sterować przekaźnikami i ma linuxa, na którym używając curl-a (narzędzie do wysyłania zapytań http z linii komend) możemy w prosty sposób odpytać API Google Calendar-a. Upraszczając sprawę pytamy kalendarz o to czy jest spotkanie o nazwie np.: L1 i jeśli jest aktywne to Raspberry PI ustawi na GPIO stan odpowiadający logicznej jedynce.
Wymagania sprzętowe:
- raspberry PI – w projekcie PI 2 model B,
- przekaźnik – w projekcie relpol 12V DC w podstawce,
- zasilacz 12V DC – w projekcie F&F ZI-20,
- układ scalony ULN2803.
Lista potrzebnego oprogramowania:
- Google kalendarz i jego ID,
- konto na Google Developers – utworzymy projekt dla Google Calendar API, i wykreujemy API key.
- skrypt shelowy, w którym cykliczne co 61 sekund będziemy odpytywać kalendarz o aktualny stan naszych ustawionych spotkań.
Uzyskanie klucza API i ID kalendarza
Logujemy się na stronie https://developers.google.com/?hl=pl – na dole strony klikamy na Google API Console
Następnie tworzymy nowy Projekt:
Do projektu Test01 dodajemy API kalendarza
Musimy teraz włączyć API i wygenerowac API klucz:
I jeszcze jeden krok i mamy wygenerowany API klucz:
Następny krok to dodanie kalendarza. Google kalendarz daje nam możliwość dodawania dodatkowych kalendarzy do naszego głównego kalendarza, dodajmy wiec kalendarz np.: Lampa 01
Rzućmy teraz okiem jakie jest ID tego kalendarza:
Mamy wygenerowany API Klucz AIzaSyAsfD9cY_eJwt0UDPU5YX6b9b7Y3nADk1o i Kalendarz ID: gdhdpbd95b2tf9415cskium21s@group.calendar.google.com, więc możemy zalogować się do RaspberryPI.
Uruchomienie skryptu do odczytu spotkań ustawionych w naszym kalendarzu Lampa 01
Logujemy się na Raspberry PI i tworzymy nowy plik w ulubionym edytorze np vi i wklejamy poniższy kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#!/bin/bash echo 26 > /sys/class/gpio/unexport echo 26 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio26/direction while [ 1 ] do echo "--------------------" echo "Start:" startYear=`date +%Y-%m-%d` echo $startYear startHour=`date +%H` echo $startHour startMinute=`date +%M` echo $startMinute sleep 61 echo "Stop:" stopYear=`date +%Y-%m-%d` echo $stopYear stopHour=`date +%H` echo $stopHour stopMinute=`date +%M` echo $stopMinute doCheck=`curl -i -X GET "https://www.googleapis.com/calendar/v3/calendars/gdhdpbd95b2tf9415cskium21s@group.calendar.google.com/events?singleEvents=true&timeMax="$stopYear"T"$stopHour"%3A"$stopMinute"%3A00%2B02%3A00&timeMin="$startYear"T"$startHour"%3A"$startMinute"%3A00%2B02%3A00&key=AIzaSyAsfD9cY_eJwt0UDPU5YX6b9b7Y3nADk1o"` echo $doCheck if [[ "$doCheck" == *start* && "$doCheck" == *L1* ]] then echo "turn on lamp L1" echo "1" > /sys/class/gpio/gpio26/value else echo "turn off the lamp L1" echo "0" > /sys/class/gpio/gpio26/value fi if [[ "$doCheck" == *start* && "$doCheck" == *L2* ]] then echo "turn on lamp L2" else echo "turn off the lamp L2" fi done |
Do zmiennej doCheck będzie wpisany wynik z uruchomienia narzędzia curl.
Przy wywołaniu komendy curl musimy wpisać ID kalendarza i API Key, które otrzymaliśmy wcześniej:
doCheck=curl -i --proxy http://135.245.192.7:8000 -X GET "https://www.googleapis.com/calendar/v3/calendars/gdhdpbd95b2tf9415cskium21s@group.calendar.google.com/events?singleEvents=true&timeMax="$stopYear"T"$stopHour"%3A"$stopMinute"%3A00%2B02%3A00&timeMin="$startYear"T"$startHour"%3A"$startMinute"%3A00%2B02%3A00&key=AIzaSyAsfD9cY_eJwt0UDPU5YX6b9b7Y3nADk1o"
zapisujemy plik i nadajemy prawa do uruchomienia:
1 |
chmod 755 test02, gdzie test02 to przykładową nazwą pliku. |
jeśli nie mamy curl -a to go instalujemy:
1 |
apt-get install curl |
Czas na uruchomienie skryptu
1 |
./test02 - gdzie test02 przykładowa nazwa pliku |
1 2 3 4 |
Start: 2017-04-07 12 40 |
skrtypt czeka 61 sekund
1 2 3 4 5 6 7 8 9 10 11 |
Stop: 2017-04-07 12 41 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 284 100 284 0 0 294 0 --:--:-- --:--:-- --:--:-- 331 { "kind": "calendar#events", "etag": "\"p330bjg47ii9d60g\"", "summary": "Lampa 01", "description": "", "updated": "2017-04-07T10:40:27.000Z", "timeZone": "Europe/Warsaw", "accessRole": "reader", "defaultReminders": [], "nextSyncToken": "CMC5wIeUktMCEAAYAQ==", "items": [] } |
skrypt sprawdza czy miedzy 2017-04-07 12:40 a 2017-04-07 12:41 jest ustawione jakieś spotkanie,
jeśli jest, to sprawdza czy ma tytuł L1. Dla tego przedziału czasu nie ma ustawionych spotkań -> “items”: [] .
Ostatecznie ustawiamy na wyjściu GPIO 26 wartość 0.
i wypisuje na ekranie:
1 |
turn off lamp L1 |
Dodajmy do kalendarza spotkanie z tytułem L1:
po chwili skrypt powinien “zauważyć” nowe spotkanie i ustawić na wyjściu GPIO26 wartość 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Start: 2017-04-07 12 53 Stop: 2017-04-07 12 54 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1067 100 1067 0 0 1945 0 --:--:-- --:--:-- --:--:-- 2146 { "kind": "calendar#events", "etag": "\"p3388p3ssiu9d60g\"", "summary": "Lampa 01", "description": "", "updated": "2017-04-07T10:54:35.538Z", "timeZone": "Europe/Warsaw", "accessRole": "reader", "defaultReminders": [], "nextSyncToken": "CNCMj5yXktMCEAAYAQ==", "items": [ { "kind": "calendar#event", "etag": "\"2983124950820000\"", "id": "emv1ga51392dq4ffohfjp1ldds", "status": "confirmed", "htmlLink": "https://www.google.com/calendar/event?eid=ZW12MWdhNTEzOTJkcTRmZm9oZmpwMWxkZHMgZ2RoZHBiZDk1YjJ0Zjk0MTVjc2tpdW0yMXNAZw", "created": "2017-04-07T10:54:35.000Z", "updated": "2017-04-07T10:54:35.410Z", "summary": "L1", "creator": { "email": "adam.meller.test01@gmail.com" }, "organizer": { "email": "gdhdpbd95b2tf9415cskium21s@group.calendar.google.com", "displayName": "Lampa 01", "self": true }, "start": { "dateTime": "2017-04-07T12:30:00+02:00" }, "end": { "dateTime": "2017-04-07T13:30:00+02:00" }, "iCalUID": "emv1ga51392dq4ffohfjp1ldds@google.com", "sequence": 0 } ] } turn on lamp L1 |
Jeśli zwrócony tekst będzie zawierał słowo start i L1 to ustawiamy GPIO na 1, jeśli będzie start i L2 to skrypt wypisze na ekran “turn on lamp L2”.
Czas na część sprzętową:
Jako bufor pomiędzy wyjściami Raspberrego PI a przekaźnikiem zastał użyty układ scalony ULN2803 (8 tranzystorów Darlingtona), przekaźnik z cewką na 12 V – styki wykonawcze pozwalają podłączyć odbiorniki dużej mocy.
Dla powyższego kalendarza są ustawione spotkania:
od 8 do 14 – L1
od 11 do 17 – L2
Miłej zabawy z Google kalendarzem,
Adam Meller
Nie używam kalendarza Google ze względu na prywatność. Wprawdzie dane wysyłane do nich są zabezpieczone protokołem HTTPS, ale po dotarciu na serwer są już odszyfrowywane i w dodatku wykorzystywane do profilowania użytkowników. Zna ktoś jakiś alternatywny serwis, w którym wydarzenia w kalendarzu, notatki itp. byłyby szyfrowane hasłem użytkownika i dostępne tylko dla niego? Najlepiej, żeby była możliwa też synchronizacja offline (np. przez USB, Bluetooth, WiFi Direct), żeby można było np. przesłać dane pomiędzy smartfonem a laptopem w miejscach, gdzie nie ma WiFi.
“This calendar will appear in public Google search results” powinno włączyć czerwoną lampkę… i nie chodzi tu o przekaźnik. Dać się da, ale nie oparłbym na tym nic więcej niż lampkę na biurku na czas eksperymentów.
Co to jest za przekaźnik???