O remoteme.org

Jest to system który umożliwia sterowanie i komunikacje pomiędzy urządzeniami takimi jak ESP, RasbperryPi, skryptami pythonowymi, stroną internetową.

Najprosciej : możecie napisać własną stronę internetową  html, javascript, css ) hostować ja na remoteme.org i za pomocą dostarczonych bibliotek sterować Waszym urządzeniem poprzez internet z każdego miejsca na świecie 🙂 tutaj  znajdziecie przykłady zastosowań z gotowym kodem

Niektóre funkcje sysyemu

  • Wysyłanie poleceń do urządzeń ze strony internetowej w czasie rzeczywistym  (komunikacja asynchroniczna) lub urządzenie <-> urządzenie nawet jak urządzenia znajdują się 1000km od siebie
  • Odczyt danych z urządzeń(komunikacja synchroniczna)
  • Obraz na żywo ( tylko 200ms opóźnienia) na stronie internetowej z kamerki podpiętej do RasbperryPi (nie potrzeba żadnych pluginów i działa na urządzeniach mobilnych)
  • Zarządzanie skryptami pythonowymi na rawsbperryPi z interfejsu uzytkownika i wysyłanie do skryptów wiadomości
  • Zapis do bazy danych
  • Darmowe hostowanie stron internetowych do komunikacji z Waszym urządzeniem
  • Zamknięty dostęp – tylko Wy i osoby którym udostępnicie klucze mają dostęp do Waszych stron i urządzeń
  • Czasowy dostęp do urządzenia, stron internetowych – możecie wygenerować linki które pozwolą na sterowanie Waszym urządzeniem przez np 90sekund

Wstęp

Tym razem za pokaże jak odczytać dane z nodeMCU, WemOS, lub podobnych poprzez internet – w artykule te urządzenia będę nazywał po prostu ESP lub arduino. Przykład jakim się posłużę to odczyt temperatury z czujnika podłączonego do ESP.

Drugim przykładem jaki opisze to odczyt temperatury ciśnienia i zapis co jakiś czas na serwer, żeby potem pokazać dane na ładnym wykresie.

Cały kurs znajduję się jako film:

 

 

Temperatura ciśnienie i wilgotność na żądanie

Założenia

Dostęp do całego mechanizmu będzie spoza sieci lokalnej, czyli nie będzie problemu odczytać temperaturę z komórki w autobusie.

Żeby odczytać temperaturę stworzymy synchroniczną komunikacje, po wysłaniu wiadomości do naszego ESP w odpowiedzi dostaniemy temperaturę, wilgotność i ciśnienie.

Ogólnie żeby stworzyć tego typu scenariusz musimy mieć dostęp do naszego arduino spoza sieci lokalnej – rozwiązań jest kilka ja pokaże jak to zrobić za pomocą remoteme.org

Jaki efekt chcemy uzyskać

Stronę internetową o takim wyglądzie:

Po załadowaniu strony odczytujemy dane, i podobnie dane są odświeżane po kliknięciu przycisku Refresh.

Elementy

  • nodeMCU lub WemOS
  • GY-BME280 – jako termometr ciśnieniomierz i wilgotnościomierz w jednym

 

Połączenia

Konfiguracja app.remoteme.org

Konfigurowanie systemu remoteme:

Zanim wrócimy do naszego arduino zarejestrujmy się w systemie i utwórzmy token – którego zadania opisałem wyżej.

Rejestracja
  • przejdźmy pod adres klik tutaj
  • zakładka Sign Up
  • nie podajecie swojego maila więc nie ma możliwości odzyskania hasła – musicie je zapamiętać
  • klik SignUp system od razu nas zaloguje

Tworzenie tokenu

Za pomocą tokenu dodanego do programu na arduino, arduino będzie się łączyło do naszego konta.

  • Przechodzimy po lewej stronie do zakładki Tokens
  • Klikamy New Token, uzupełniamy nazwę (obojętne co wpiszemy ) i klikamy OK
  • [3] jest to jedyne pole jakie wypełniacie – nazwy tokenu jest tylko dla nas, nie jest wykorzystywana nigdzie indziej poza wyświetleniem tokenu na liście tokenów.
  • Token zostanie utworzony:
  • Jak tokenu nie widać odświeżamy stronę.
  • w moim przypadku token to „~267_ZxoWtJ)0ph&2c” można go skopiować klikając w niebieską ikonkę

 

Program na arduino

potrzebne biblioteki:

  • WebSockets by Markus Sattler
  • ArduinoHttpClient by Arduino
  • ESP8266WiFi by Iven Grokhotkov
  • SparkFun BME280 by SparkFun Electronics
  • RemoteMe libraries by Remoteme.org

Właściwy program na arduino tutaj

Myśle że sam program jest dość czytelny, a najważniejszą funkcję onUserSyncMessage opisałem powyżej. Oczywiście musimy uzupełnić nasze stałe:

Dodatkowo opis działania na dole artykułu

Wgrywamy program na arduino. Po uruchomieniu w zakładce Devices pojawi się nasz ESP:

Strona internetowa

Teraz pora na utworzenie strony internetowej która będzie się łączyła do naszego ESP i pokazywała odczyt.

W zakładce Devcies Wybieramy przycisk New, a następnie „New WebPage”

  • Uzupełniamy jak na screenie. Informacja co oznaczają poszczególne pola tutaj.
  • Teraz wgrajmy trzy pliki do naszej strony internetowej.
    • Pliki do wgrania index.html, script.js and styles.css znajdują się tutaj
    • Najprościej jest poprostu przeciągnąć pliki z githuba do naszej strony internetowej, pokazane na filmiku

 

  • Otwarcie strony internetowej: klikamy na plik index.html i wybieramy opcje Open in New Tab. Na nowej zakładce pojawi się nasza strona internetowa gdzie po kliknięciu Refresh temperatura, ciśnienie i wilgotność będzie się nam zmieniała na aktualna

Jak To wszystko działa.

Cała logika znajduję się w plikach script.js i w programie na arduino. Omówmy więc fragmenty:

script.js

standardowe ustawienia. Program odrazu się łączy i rejestruje do aplikacji remoteme.org.  I ciekawe odwołanie do funkcji

sama funkcja wygląda tak:

czyli po poprawnym połączeniu z remoteme.org program zczytuje dane. Ta sama funkcja readDataNow() jest wywoływana po kliknięciu w przycisk „Refresh”.

Zobaczmy zatem co robi funkcja readDataNow():

wysyła ona dane do naszego ESP(dlatego potrzebne jest temperatureArduinoDeviceId które wskaże ID czyli adres naszego ESP u nas jet to 204) jako dane wysyłamy pustą tablice : [], a po przyjściu odpowiedzi ma się wywołać funkcja onResponse.

Przejdźmy zatem do programy na ESP i zobaczmy jak obsługujemy przychodzące synchronicze wiadomości

arduino.ino:

ta funkcja zostanie wywołana gdy nadejdzie wiadomość z script.js parametry:

  • senderDeviceId – id naszej storny internetowej
  • dataSize – jak duzo danych wysyłą nasz script.js ponieważ wysłałiśmy pusta tablice będzie tutaj 0
  • data – dane jakie wysł script.js u nas  nic tu nie będzie
  • returnDataSize – tutaj wpiszemy ile bajtów wyślemy jako odpowiedź – my wysyłamy 12 bo mamy trzy odczyty, a każdy zapisujemy we floatcie który ma 4 bajty
  • returnData – tutaj zapiszemy zwrócone liczby

  • korzystając z funkcji putFloat wpisujemy do wyjściowej tablicy po kolei trzy odczyty (pos jest za każdym razem powieszany o liczbę bajtów wpisanych do tablicy). Więc po wyjściu z funkcji mamy zapisaną tablice bajtów gdzie po kolei zapisane są liczby : temperatura, ciśnienie i wilgotność. Jak widzicie nie korzystamy nigdzie z danych które wysłał nam script.js dlatego wysyłamy pustą tablice

Wróćmy do pliku script.js i do odczytu tych wartośći:

script.js

funkcją popFloat32 pobieramy po koleij trzy pwisane liczby i po odpowiednim sformatowaniu wyświetlamy przy pomocy jquery w odpowiednie elementy.

 

Temperatura ciśnienie i wilgotność zapisywane na serwer i wyświetlane na wykresie

Tym razem niechcemy odczytywać temperatury na życzenie ale zapisywać odczyty co jakiś czas (w przykładzie 5minut) zapisać na serwer i mieć do nich dostęp w formie wykresu.

Zasada działania

ESP co jakiś czas wybudza się z trybu deepSleep odczytuje dane z GY-BME280  i zapisuje je na serwer,żeby potem znowu usnąć i wybudzić sie za czas jakiś, i tak w kółko.

Oczywiście nie potrzebujecie własnej bazy danych – remoteme.org udostępnia funkcje do zapisu danych do chmury -a za pomocą dostarczonego API odczyt ich

Wykres jaki uzyskamy:

Połączenia

Prawie identyczne jak w projekcie do odczytu na żądanie, róznica to zielony przewód – pozwala on na samowybudzanie się układu – zainteresowanych zachęcam do zapoznania się z trybem deepSleep

Kod źródłowy

arduino

strona internetowa

Porpostu wgrajmy do remoteme.org i na nasze arduino pamiętając o  wprowadzeniu danych do łączenia się z siecią wifi i tokenu. Wszystko analogicznie jak w poprzednim przykładzie.

Opis ciekawszych framgnetów kodu

arduino:

odczyt temperatury:

Wykonujemy 9 pomiarów w odstępnie 100ms, a nastęnie sortujemy, żęby na serwer wysłać mediane – pozwoli to na pozbycie się błędnych danych – czasem nasz czujnik zwraca dziwne wartości

funkcje po kolei zapisuja na serwer dane pod numerami 1,2,3 (pierwszy parametr).  Obrazowo dane będa zapisywane do różnych tabel do tabeli pierwszej trafi temperatura itd.

Drugi parametr wkazuje zaokraglenie czasu ustawione jest na 5minut, oznacza to ze jezeli wyślemy dane 03.06.2018 18:41:23 po stronie serwera zostanie to zapisane z czasem 03.06.2018 18:40:00. Dzięki temu zaokrągleniu po stronie serwera dane będą się lepiej układać na wykresie ( dostępne są inne zaokraglenia lub możemy wogole nie zaokrąglać (szczegóły w dokumentacji))

ostani parametr – np temp[5] to mediana odczytanych temperatur.

po dokonaniu pomiarów ESP usypia się na 4minuty

jeżeli było by to dokładnie 5minut to ponieważ obudzenie się ESP i wysłanie czasu na serwer trochę trwa ( ja założyłem że nie więcej niż 1minute) mielibyśmy po jakimś czasie braki na naszym wykresie

script.js

Najciekawszym momentem to odebranie danych i wyświetleniem ich na wykresie.

aplikacje udostępnia nasze dane pod linkiem

( dokumentacja całego REST Api aplikacji remoteme w tym linku   )

link zwroci nam dane dla series podanych w parametrze {SERIES ids} używając formatu czasu podanym w {FORMAT} z przedziału [ {FROM} – {TO} [ i zwróci dane w psotaci jsona

w naszym przykładzie javascript wygeneruje linka:

dane pobieramy – na jeden dzień do tyłu – zachęcam do rozbudowania 😉

Sprawdźmy co znajduję się pod wskazanym linkiem ( ograniczyłem w danych czas do 20minut)

„dataSeriesId” to id naszych danych czyli w 1 będzie temperatura ponieważ w arduino jest:

a pierwszy parametr czyli 1 oznacza „zapisz moje dane do dataseriesID =1 ”

ponieważ w linku ostanim paramtrem jest 1,2,3 pobieramy za jednym zamchem temperature, ciśnienie i wilgotność.

 

Tak pobranego jsona plotly wyświetla w postaci wykresu . Żeby zobaczyć jak wykres jest konfigurowany zachęcam do sprawdzenia funkcji createChart i sprawdzeniu dokumentacji plotly.

Żeby zobaczyć wykre należy otworzyć plik index.html identycznie jak w przykładzie poprzednim.

 

Podgląd naszych danych

w zakładce Series możemy zobaczyć jakie dane mamy zapisane w systemie.

 

Zachęcam do zapoznania się z dokumentacją , gdzie szczegółowo opisane są funkcje z których korzystaliśmy.

Pozdrawiam,

Maciek