Wstęp
Platforma smartmon.pl przeznaczona jest do zbierania, przechowywania i analizy danych telemetrycznych zbieranych przez czujniki (sensory). Możliwe jest również ustawianie reguł uaktywniających alarmy i informowanie obsługi za pomocą e-mail, SMS o aktywnych alarmach. Sensory pogrupowane są w urządzenia, które to raportują dane przy pomocy różnych protokołów. Przykładowe zastosowania to:- Monitoring różnych parametrów środowiska (temperatura, wilgotność, ciśnienie)
- Monitoring parametrów serwerów (zużycie procesora, pamięci, dysku itd.)
API
API znajduje się pod adresem http://api.smartmon.pl/ . Struktura API odpowiada następującej konwencji:
http://api.smartmon.pl/write/{format}/data/{symbol}/
Gdzie:
- write - oznacza API do zapisu (nie da się przy pomocy tego API odczytać danych)
- format - oznacza format w jakim będziemy przyjmować dane [json / arexx]
- symbol - symbol urządzenia którego dane zapisujemy
- json - najbardziej rozbudowany i umożliwiający zapis wszystkich danych
- arexx - obsługujący arexx multilogger (http://www.arexx.com/templogger/html/en/products.php)
Format JSON
Format JSON umożliwia zakodowanie najpełniejszej informacji o urządzeniu oraz czujnikach takich jak jego symbol, nazwa, metadane, struktura danych oraz same dane. Jest używany zarówno do założenia urządzenia i sensorów jak i dodawania danych.Autoryzacja
W celu zabezpieczenia komunikacji oraz identyfikacji użytkownika zastosowano autoryzację tokenem który można pobrać sobie z panelu użytkownika. Token musi zostać wysłany w nagłówku przy każdym zawołaniu API.Zapisywanie danych
Zapis danych odbywa się poprzez wywołania API przy pomocy metody POST podpisanej tokenem w nagłówku wiadomości. W celu ułatwienia interakcji z API w dalszych przykładach używać będziemy programu http (dostępny do pobrania na stronie http://httpie.org/). Kolejne wywołania API nadpisują dane zapisane w systemie (w zakresie takim jaki podamy w treści wywołania)Tworzenie urządzenia
Najprostsze wywołanie API powodujące utworzenie urządzenia o symbolu lab01 wygląda następująco:http POST http://api.smartmon.pl/write/json/data/lab01/ "Authorization:Token (token)"W przypadku gdy urządzenie o symbolu lab01 nie istniało w systemie zostanie założone, w przeciwnym wypadku zostanie zaktualizowane (w tym przypadku jedynie czas dostępu do tego urządzenia
Tworzenie / aktualizacja danych urządzenia
Kolejne dane wysyłamy w formacie json. Z racji tego że taki json potrafi być sporych rozmiarów dla zapewnienia czytelności przyjmijmy że za każdym razem zostanie on zapisany w pliku. Aby wysłać taki plik json z danymi do urządzenia używamy przekierowania w shellu.Przykładowo:
http POST http://api.smartmon.pl/write/json/data/lab01/ "Authorization:Token (token)" < file.jsonwyśle zawartość pliku file.json do urządzenia lab01. W dalszej części opisana będzie tylko zawartość pliku.
Aby utworzyć / zaktualizować urządzenie z pełnymi danymi należy wysłać
{
"name": "laboratorium 01",
"meta": {
"hostname": "lab01",
"type":"raspberrypi"
},
"attributes": {
"place": "laboratorium",
"city": "Warszawa"
}
}
Każdy z tych kluczy (“name”, “meta”, “attributes”) może zostać pominięty. Wówczas te dane nie zostają dodane / zaktualizowane.
Dodawanie / aktualizacja czujników
Każde urządzenie może posiadać listę czujników. Dodajmy zatem do powyższego jsona kolejny klucz “sensors” z listą czujników
{
"name": "laboratorium 01",
"meta": {
"hostname": "lab01",
"type":"raspberrypi"
},
"attributes": {
"place": "laboratorium",
"city": "Warszawa"
},
"sensors": [
{
"symbol": "28.3DB42E040000",
"structure": {"temperature":"float"},
"name": "Pomieszczenie 1 temperatura",
"meta": {
"type": "thermometer",
"unit": "celcius"
}
},
{
"symbol": "28.A935B4050000",
"structure":{"temperature":"float"},
"name":"Pomieszczenie 2",
"meta":{
"type":"thermometer",
"unit":"celsius"
}
}
]
}
Powyższe wywołanie spowoduje dodanie / aktualizację urządzenia a także dodanie / aktualizację danych czujników. Podobnie jak w przypadku urządzeń większość kluczy (wszystkie w wyjątkiem “symbol”) w czujniku można pominąć.
Dodawanie wartości (pomiarów)
Aby dodać wartości można rozszerzyć powyższą strukturę czujnika o values. Ponieważ jednak większość z tych kluczy można pominąć w poniższym przykładzie zaprezentujemy strukturę która dodaje/aktualizuje jedynie wartosci czujników.
{
"sensors": [
{
"symbol": "28.3DB42E040000",
"values": [
{
"t": "2015-01-05T00:00:00Z",
"v": {"temperature": 68}
},
{
"t": "2015-01-05T00:05:00Z",
"v": {"temperature": 67.5}
}
]
},
{
"symbol": "28.A935B4050000",
"values": [
{
"t": "2015-01-05T00:00:00Z",
"v": {"temperature": 71.5}
},
{
"t": "2015-01-05T00:05:00Z",
"v": {"temperature": 70.0}
}
]
}
]
}
Format AREXX
Format AREXX umożliwia przyjmowanie danych z loggerów arexx (http://www.arexx.com/templogger/html/en/products.php), np. BS1000
Aby skonfigurować w urządzeniu BS1000 wysyłanie danych należy:- podać adres
http://api.smartmon.pl/write/arexx/data/BS1000/
- metoda:
POST
- podać następujący ciąg konfiguracyjny
type==$q&&id==$i&&time==$S&&v==$v&&rssi==$r&&token==(token)
Oczywiście (token) podmieniamy na token pobrany z konfiguracji smartmon.pl.
Działanie API można również przetestować ręcznie:
http POST http://api.smartmon.pl/write/arexx/data/labar01/ token=(token) id=19200 type=1 time=2000 rssi=40 v=10
ESP Easy - Generic HTTP
ESP Easy to oprogramowanie umożliwiające zbieranie i przesyłanie danych z czujników podłączonych do popularnych modułów opartych na ESP8266 (np. Wemos 1D)
Oprogramowanie to można ściągnąć z githuba: https://github.com/letscontrolit/ESPEasy/releases, dokumentacja znajduje się tutaj: https://www.letscontrolit.com/wiki/index.php/ESPEasy
smartmon.pl obsługuje najprostszy format Generic HTTP w dwóch wariantach: token autoryzacyjy można podać w URL lub w basic auth. Aby umożliwić ESP wysyłanie danych do smartmon.pl należy:
- zainstalowac najnowszą wersję ESPEasy (dokumentacja powstała na podstawie wersji: mega-20180927)
- skonfigurować podłączone czujniki tak aby ich dane były lokalnie widoczne
- połączyć się przez przeglądarkę ze swoim ESPEasy
- wybrać zakładkę "Controllers"
- są tam trzy sloty na protokoły. należy kliknąć EDIT przy nieużywanym
- wybrać "Protocol" -> "Generic HTTP"
- konfigurujemy integrację ustawiając kolejno:
- Locate Controller: Use hostname
- Controller Hostname: api.smartmon.pl
- Controller Port: 80
- Controller User: token
- Controller Password: (token)
- Controller Publish: write/espeasy/generic_http/myesp/?sensor=%tskname%&vname=%valname%&v=%value%&name=%sysname%&rssi=%rssi%&uptime=%uptime%&id=%id%
- Enabled: zaznaczamy
Oczywiście (token) podmieniamy na token pobrany z konfiguracji smartmon.pl.
Powyższa konfiguracja spowoduje że w panelu smartmon.pl zobaczymy urządzenie o symbolu "myesp" (oczywiście ten symbol możemy sobie zdefiniowac dowolnie). W ramach tego urządzenia pojawią się sensory o symbolach: "(sensor)_(vname)". Obie te wartości można skonfigurować na karcie urządzenia ESP. Pierwsze z nich to "Name" urządzenia, drugie z nichto Name znajdujące się w sekcji Values. Ponieważ używamy do komunikacj metody GET postarajmy się aby te nazwy były jak najkrótsze i nie zawierały spacji oraz znaków specjalnych.
Alternatywie token można przekazać jako zmienna w query string. W tym wypadku nie podajemy go jako Controller User / Controller Password tylko doklejamy do urla w ControllerPublish jako "token=(token)". Rekomendowaną metodą jest jednak podanie go w parametrach integracji gdyż w ten sposób nie jest widoczny w logach oraz nie zabiera nam cennego miejsca w URL