ThingSpeak - przykłady

 

ThingSpeak - przykłady

Do korzystania z ThingSpeak potrzebne jest nam źródło danych, stałe połączenie z internetem oraz odrobina cierpliwości do czytania dokumentacji. ThingSpeak współpracuje z przeróżnymi systemami i siłą rzeczy nie istnieje uniwersalna formuła, która pozwoliłaby na natychmiastową konfigurację systemu w każdym przypadku. Na szczęście czytanie dokumentacji w przypadku ThingSpeak nie sprawia kłopotu, a dużym ułatwieniem na start są liczne przykłady.

Raspberry Pi - Python

Na początek przedstawię konfigurację systemu pomiarowego zrealizowanego w oparciu o platformę raspberry pi wraz z dołączonym układem BMP180.

 

Jak widać, schemat połączeniowy nie jest skomplikowany. Układ BMC180 posiada dwa czujniki, ciśnienia oraz temperatury. Jeśli chcemy te dane zbierać (i przetwarzać)z pomocą platformy ThingSpeak, to przede wszystkim musimy skonfigurować kanał (channel) za pośrednictwem którego będziemy przekazywać dane z urządzenia w chmurę. Po zalogowaniu się na stronę ThingSpeak należy kliknąć przycisk New Channel i uzupełnić kilka pól.

Uzupełnić można jeszcze dodatkowe pola, jednak niezbędne jest jedynie wprowadzenie nazwy kanału oraz nazwanie i odznaczenie "Fields", z których zamierzamy korzystać. Na jeden kanał może przypadać maksymalnie 8 pól. Ich nazwa nie jest dla systemu specjalnie ważna, zarówno wysyłając dane na, jak i pobierając je z ThingSpeak, będziemy posługiwać się numerami pól.

Po stworzenie kanału można od razu przejść do zakładki API Keys i zapisać sobie kilka istotnych danych.

Najistotniejszy jest oczywiście Channel ID. Jeśli chcemy mieć możliwość zapisu danych za pośrednictwem kanału, należ znać Write API Key, jeżeli chcemy dane odczytywać niezbędny będzie Read API Key. No chyba że uczynimy kanał kanałem publicznym. Na tym można zakończyć wstępną konfiguracje na stronie www.ThingSpeak.com i przejść do konfiguracji urządzenia. Wiele będzie teraz zależało od systemu, z jakiego będziemy korzystać. W przypadku Raspberry Pi najwygodniej będzie stworzyć aplikacje pomiarową w języku Python, dołączyć do niej bibliotekę paho.mqtt.publish oraz klika poleceń wysyłających dane do chmury.

import paho.mqtt.publish as publish
import Adafruit_BMP.BMP085 as BMP085
import time

sensor = BMP085.BMP085()
# konfiguracja procesu wysyłania danych
channelID = "339104"
apiKey = "xxx"
mqttHost = "mqtt.thingspeak.com"
tTransport = "websockets"
tPort = 80
topic = "channels/" + channelID + "/publish/" + apiKey
# pętla główna
while (1):
        temp = sensor.read_temperature()
        pressure = sensor.read_pressure()*0.01 #hekto
        payload = "field1="+str(temp)+"&field2="+str(pressure)
        try:
                publish.single(topic, payload, hostname=mqttHost, transport=tTransport, port=tPort)

        except:
                print 'Blad przy publikacji danych'

        time.sleep(600)

I to w zasadzie wszystko. Po uruchomieniu skryptu na stronie ThingSpeak można obserwować napływające dane.

 

Inne źródła 

Tworzenie stacji pogodowych to oczywiście niezła zabawa - dowodem niech będzie choćby ilość pogodowych kanałów tworzonych na thingspeak. Zbudowanie porządnej stacji może być jednak trudne. Czasem okazuje się, że nie warto się męczyć, bo sąsiad obok już taką stację wybudował i publikuje dane pomiarowe w internecie. Jeśli chcemy z korzystać z takich danych i dołączyć własną analizę, to ThingSpeak również w tym nam pomoże. Za przykład niech posłuży storna air24.pl

O stronie już wspominałem we wpisie dotyczącym wyrażeń regularnych. Dane na stronie zostały umieszczone w dość niechlujny sposób, odczytanie ich nie jest do końca proste. Niemniej jednak strona może posłużyć za źródło danych dla ThingSpeak.

Rozpocząć należy oczywiście od stworzenia kanału:

Tym razem jednak dane nie będą wysyłane z zewnątrz. Będą co prawda pochodzić z zewnątrz, ale dostarczy je sama platforma ThingSpeak. Na stronie należy opuścić widok kanałów (Channels) i przejść do widoku Apps.

Jak widać możliwości wyboru jest kilka, w tym przykładzie skorzystam z pierwszego widocznego bloku, MATLAB Analysis. Po kliknięciu na przycisk NEW można przejść do tworzenia skryptu, który ma być dla nas wykonywany na platformie thingspeak. Oczywiście, tworzone skrypty mogą służyć analizie zebranych danych ale nic nie stoi na przeszkodzie, by za ich pomocą pobierać dane z zewnątrz. Skrypt "piszemy" w taki sam sposób, w jaki robimy to na komputerze ze zwykłym MATLABem. Pamiętać trzeba jednak o tym, że obowiązuje nas timeout. Skrypt powinien wykonać się w przeciągu maksymalnie 20 sekund. Drugim ograniczeniem jest dozwolona częstotliwość zapisu danych na kanał. Jeśli korzystamy z serwisu nieodpłatnie, możemy robić to co 15 sekund (w wersji płatnej co 1 sekundę). Operacje związane z odczytem i zapisem danych wymagają skorzystania ze specjalnych funkcji: thingSpeakRead i thingSpeakWrite

Przykładowy kod służący do pobrania danych ze strony www i zapisu ich na kanale wygląda tak:

% Okreslenie adresu url
url = 'http://83.12.141.66/env_stalowa_wola/pogoda2.php';

writeChannelID = 336069;

writeAPIKey = '';
readAPIKey = 'H1T1KY2NL9MJ2A4S';
% wczytanie danych ze strony
strona = webread(url);
% usuniecie zbednych znakow
strona = regexprep(strona, '\s', '');
% wyrazenia regularne
expr_daty = '(?<=>)\d+-\d+-\d+
\d+:\d+(?=</td>

)';
expr_dane = '(?<=>)\d+(\.\d)?(?=</table>

)'; 
% odczytanie dat pomiaru
dataPomiaru = regexp(strona, expr_daty, 'match');
dataPomiaru = (datetime(strrep(dataPomiaru, '
', ' ')))';
% odczytanie danych
dane = regexp(strona, expr_dane, 'match');
dane = (reshape(str2double(dane),5,[]))';

%% do tabeli
tabela = [table(dataPomiaru), array2table(dane, 'VariableNames',...
    {'Temp','Cisnienie','Kierunek_wiatru', 'Predkosc_wiatru', 'Wilgotnosc'})];
n = size(tabela);
disp(head(tabela))
disp(['Odczytano wierszy: ' num2str(n(1))]);
%% pobranie ostatnich dat pomiarow
[~, dataPomiaru_stara] = thingSpeakRead(writeChannelID, 'NumPoints', n(1), 'ReadKey',readAPIKey);

%% usuniecie zbednych danych
if ~isempty(dataPomiaru_stara)
    [~, idx] = intersect(dataPomiaru, dataPomiaru_stara);
    tabela(idx, 🙂 = [];
end

% zapisanie danych 
if ~isempty(tabela)
    thingSpeakWrite(writeChannelID,tabela,'WriteKey',writeAPIKey)
end
disp(['Zapisano wierszy: ' num2str(size(tabela, 1))]);

Po zakończeniu tworzenia skryptu należy jeszcze kliknąć na przycisk TimeControl i określić, jak często skrypt ma być uruchamiany. Napływające dane można obserwować na automatycznie generowanym wykresie, a można też stworzyć "od zera" swój własny wykres.

To wszystko to oczywiście jedynie próba przedstawienia głównych możliwości ThingSpeak. Platforma jest bardzo rozbudowana i omówienie wszystkich jej funkcjonalności wymagałoby napisanie dedykowanego podręcznika.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *