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???