Strona główna ASTOR
Automatyka w praktyce

Jak monitorować temperaturę i wilgotność w biurze z wykorzystaniem panelu Astraada HMI, czujników ELA i routera Teltonika

Kontakt w sprawie artykułu: Natalia Kazykalewicz - 2022-12-09

Z tego artykułu dowiesz się:

  • jak zbudować aplikację do monitorowania danych wysyłanych z czujników w oprogramowaniu Astraada HMI CFG,
  • w jaki sposób skonfigurować protokół MQTT w aplikacji Astraada HMI CFG,
  • jak monitorować dane pomiarowe na serwerze,
  • w jaki sposób skonfigurować router, aby pełnił role brokera i wysyłał dane z czujników po protokole mqtt na określone tematy.

Monitorowanie temperatury czy wilgotności w odległych od siebie lokalizacjach (pomieszczeniach) za pomocą jednego panelu, na który przesyłane są wszystkie zarejestrowane dane pomiarowe, jest bardzo praktyczne. Nie trzeba chodzić i kolejno sprawdzać wyniki pomiarów – zamiast tego monitorujemy je z jednego miejsca. Możliwość taką daje panel operatorski Astraada HMI w połączeniu z czujnikami ELA Innovation oraz routerem Teltonika RUTX11.

W tym artykule pokażemy, jak zbudować prosty system monitorowania temperatury i wilgotności w biurze za pomocą aplikacji Astraada HMI CFG oraz w jaki sposób dane z czujników są do niego wysyłane.

Tworzenie nowego projektu

Na samym początku po pobraniu i zainstalowaniu aplikacji Astraada HMI CFG ze strony wsparcia technicznego ASTOR należy zacząć od stworzenia nowego projektu.

Edycja ekranów aplikacji

W tej części zaczniemy tworzenie aplikacji, która będzie wizualizowała monitorowanie temperatury i wilgotności w każdym z pokojów biura. Biuro ma 8 pokoi i w każdym będzie wyświetlana bieżąca wartość temperatury i wilgotności. Po kliknięciu w dany obszar pokoju otworzy się okno z Data Loggerem.

Edycja ekranu startowego możliwa jest po dwukrotnym kliknięciu w niego w drzewie projektu:

W polu Screen Name wpisujemy nazwę ekranu. Niżej definiujemy typ ekranu Normal Screen (ekran podstawowy zajmujący cały obszar wyświetlacza) oraz resztę parametrów.

Na początek wgramy z dysku zdjęcie rzutu biura w formacie .png, które będzie głównym elementem aplikacji.

W tym celu wybieramy z menu Draw -> Picture -> Import Picture From File i wybieramy zdjęcie, które dopasowujemy do ekranu:

Następnie dodajemy opisy pomieszczeń, aby widok był bardziej czytelny.

Z menu Draw wybieramy Text, wstawiamy go w wybrane pomieszczenie i dwuklikiem przechodzimy do jego ustawień:

Po formatowaniu nasz ekran wygląda tak jak na zdjęciu poniżej:

Teraz przejdziemy do utworzenia nowego ekranu zawierającego nagłówek, który będzie wyświetlany na górze każdego z ekranów. Nowy ekran będzie miał typ Window Screen, na wzór okna Windows, aby było można je przesunąć:

Na nagłówku zamieścimy takie informacje, jak logo firmy, opis, datę i godzinę. Logo wstawiamy w identyczny sposób, jak rysunek rzutu biura, a opis w formie tekstu tak, jak opis pomieszczeń.

Datę oraz godzinę wybieramy z paska Object Toolbar i formatujemy:

Uwaga: Jeśli nie widzimy tego paska, wybieramy z menu View i zaznaczamy Object Toolbar:

Nasz nagłówek wygląda tak:

Dodanie go do ekranu Biuro odbywa się za pomocą elementu Windaw Screen Display z menu Object, dwuklikiem przechodzimy do konfiguracji i dopasowujemy nagłówek do ekranu.

Konfiguracja MQTT w panelu Astraada HMI

W naszym projekcie chcemy, aby panel mógł publikować oraz subskrybować dane pomiarowe czujników na określony temat „RHT”.

Zaczynamy od przygotowania routera RUTX11, który będzie pełnił funkcję brokera o następujących parametrach:

  • adres: 192.168.1.1
  • port: 1883

W zakładce MQTT Client z węzła Link z drzewa projektu konfigurujemy połączenie między brokerem a panelem Astraada HMI.

Otwarte zostanie okno z konfiguracją MQTT, w którym należy zaznaczyć opcję ENABLE i uzupełnić informację o brokerze:

Na początku należy określić temat publikacji, subskrypcji oraz treść wiadomości. Dokonamy tego wybierając z drzewka projektowego opcję Text Format Table:

Wyświetli nam się tabela z trzema kolumnami: ID, Name, Language 1. W naszym przypadku będziemy mieć jeden wspólny temat dla publikacji i subskrypcji, więc treść wiadomości też będzie miała taki sam format dla obu trybów – wystarczy zdefiniować jedną treść wiadomości.

Wobec tego za pomocą ikony NEW tworzymy dwa wiersze. W kolumnie Name wpisujemy dowolną nazwę, a właściwy tekst zdefiniujemy w kolumnie Language 1.

  • Pierwszy wiersz stanowi tekst wiadomości – tekst będzie przesyłał zmienną, dlatego musi zostać ona zdefiniowana. W naszym przykładzie będziemy odczytywać tą samą wiadomość, jaką wysyłamy do brokera.
  • Drugi wiersz przedstawia formę tematu, na jaki będziemy publikować i subskrybować dane. W naszym przypadku będzie to wspólny temat „RHT”.

Podanym wierszom należy jeszcze nadać odpowiednie cechy, żeby mogły być wykorzystane do konkretnych celów. Aby to zrobić, zależy zaznaczyć wybrany tekst i kliknąć przycisk Property. W przypadku wiersza drugiego wystarczy zaznaczyć odpowiednie pola w Specific Purposes:

Natomiast w przypadku wiersza pierwszego, oprócz zaznaczenia odpowiednich pól w Specific Purposes, definiujemy zmienną $U1000, która będzie naszym ciągiem JSON. Zatwierdzamy przyciskiem OK. Ostatnim krokiem jest wpisanie w treść wiadomości znaku zdefiniowanej zmiennej – „%1”:

Nasza tabela powinna mieć następująca formę:

W następnym kroku powracamy do zakładki MQTT Client i przeprowadzamy dalszą konfigurację. Jedną z rzeczy, która zrobimy, jest zaznaczenie i wybranie zdefiniowanego przez nas tematu publikacji i subskrypcji:

Dobrym zwyczajem jest monitorowanie działania MQTT, żeby nie publikować/subskrybować danych na marne. Pomoże to również szybciej zauważyć, gdzie w obsłudze MQTT jest błąd. Do tego użyjemy elementu Bit lamp. Będzie on sygnalizował status MQTT – czy jest ono włączone, czy wyłączone.

Dalej utworzymy specjalne makra, za pomocą których odbywać się będzie komunikacja MQTT. Napiszemy w sumie trzy różne makra do trybu publikacji, subskrypcji i do zdefiniowania stałych zmiennych.

Zacznijmy od makra publikacji.

Tworzymy nowe makro, wybierając z drzewa projektu Macros -> Native Scripts -> Add Script i nadajemy dowolną nazwę, w naszym przypadku będzie to PUBLISH.

Do publikacji wiadomości skorzystamy z komendy: A = Mqtt_IF (B, C, D).

W naszym przypadku do zmiennej result przypiszemy funkcję Mqtt_IF. Wartości w nawiasie po kolei oznaczają:

1 – nasz temat „RHT” zaznaczony przy Topic ID 1.

2 – tekst naszej wiadomości zapisany w Text Format Table o ID 00002.

0 – wysłanie wiadomości bez żadnych potwierdzeń dostarczenia.

Zmienne takie jak result definiujemy w opcji Tags, umieszczonej w drzewie projektowym.

Zgodnie z powyższym nasze makro będzie miało następującą postać:

0\result = MqttP_IF (1,2,0)

Aby opublikować naszą wiadomość na serwerze, użyjemy elementu Bit Button, w którym zawrzemy stworzone przez nas makro.

Następnym krokiem będzie utworzenie nowego makra o nazwie STAŁE i zdefiniowanie w nim stałych, do których będą przypisane nazwy czujników. Nazwy czujników odpowiadają numerowi pokoju, w którym się znajdują.

0\czujnik8 = „8”

0\czujnik9 = „9”

0\czujnik10 = „10”

0\czujnik11 = „11”

0\czujnik12 = „12”

0\czujnik13 = „13”

0\czujnik14 = „14”

0\czujnik15 = „15”

Ten skrypt wystarczy, że wykona się tylko raz przy starcie aplikacji, więc powiążemy go z aplikacją w zakładce General Setup. Zaznaczamy pozycję Startup Macro i w zakładce, która się pojawiła, wybieramy makro STAŁE.

Ostatnim elementem konfiguracji MQTT będzie napisanie makra do trybu subskrypcji CONVERT. Makro to będzie odbierać informacje przychodzące na serwer, porównywać nazwy czujników, konwertować dane i zapisywać w zmiennych.

Skrypt rozpoczniemy od wykorzystania funkcji MqttGet, która odbiera informacje o najnowszej wiadomości od brokera. W zmiennej „nazwa” będzie przechowywany napis Nazwa. Dalej za pomocą funkcji GetJsonVal pobieramy nazwę czujnika w ciągu JSON o adresie $U1000, konwertujemy ją na typ danych STR i zapisujemy wynik w zmiennej wynik_nazwy. W zmiennej wynikJson będzie zapisane, czy operacja się powiodła czy też nie.

Następnie za pomocą funkcji STRCMP porównujemy ze sobą dwa stringi – nazwę czujnika zdefiniowaną w skrypcie STAŁE z nazwą odebraną przez broker.

Jeśli zdefiniowane i odebrane nazwy są takie same (czyli funkcja zwraca wartość 0) to wykonują się dalsze instrukcje związane z funkcją GetJsonVal. Na koniec wykonywana jest konwersja ASCII -> INT przy pomocy funkcji A2I, żeby wartości temperatury można było wyświetlić za pomocą elementu numeric display.

0\msgLen = MqttGet (0\topic[0], $U1000, 0\topicLen)
0\nazwa = L"Nazwa"
0\wynikJson = GetJsonVal($U1000,0\nazwa ,0\wynik_nazwy) (STR)

0\porownanie8 = STRCMP(0\wynik_nazwy,0\czujnik8)
0\porownanie9 = STRCMP(0\wynik_nazwy,0\czujnik9)
0\porownanie10 = STRCMP(0\wynik_nazwy,0\czujnik10)
0\porownanie11 = STRCMP(0\wynik_nazwy,0\czujnik11)
0\porownanie12 = STRCMP(0\wynik_nazwy,0\czujnik12)
0\porownanie13 = STRCMP(0\wynik_nazwy,0\czujnik13)
0\porownanie14 = STRCMP(0\wynik_nazwy,0\czujnik14)
0\porownanie15 = STRCMP(0\wynik_nazwy,0\czujnik15)
if 0\porownanie8 == 0
    0\nazwa_t = L”[0].Dane.temperature"
    0\wynikJson = GetJsonVal($U1000, 0\nazwa_t, 0\wynik_temp8) (STR)
    0\nazwa_h = L”[0]. Dane.humidity"
    0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum8) (STR)
endif
if 0\porownanie9 == 0
   0\nazwa_t = L"[0].Dane.temperature"
   0\wynikJson = GetJsonVal($U1000,0\nazwa_t, 0\wynik_temp9) (STR)
   0\nazwa_h = L"[0].Dane.humidity"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum9) (STR)
endif
if 0\porownanie10 == 0
   0\nazwa_t = L"[0].Dane.temperature"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_t, 0\wynik_temp10) (STR)
   0\nazwa_h = L"[0].Dane.humidity"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum10) (STR)
endif
if 0\porownanie11 == 0
   0\nazwa_t = L"[0].Dane.temperature"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_t, 0\wynik_temp11) (STR)
   0\nazwa_h = L"[0].Dane.humidity"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum11) (STR)
endif
if 0\porownanie12 == 0
   0\nazwa_t = L"[0].Dane.temperature"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_t, 0\wynik_temp12) (STR)
   0\nazwa_h = L"[0].Dane.humidity"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum12) (STR)  
endif
if 0\porownanie13 == 0
   0\nazwa_t = L"[0].Dane.temperature"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_t, 0\wynik_temp13) (STR)
   0\nazwa_h = L"[0].Dane.humidity"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum13) (STR)
endif 
if 0\porownanie14 == 0
   0\nazwa_t = L"[0].Dane.temperature"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_t, 0\wynik_temp14) (STR)
   0\nazwa_h = L"[0].Dane.humidity"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum14) (STR)
endif 
if 0\porownanie15 == 0
   0\nazwa_t = L"[0].Dane.temperature"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_t, 0\wynik_temp15) (STR)
   0\nazwa_h = L"[0].Dane.humidity"
   0\wynikJson = GetJsonVal($U1000, 0\nazwa_h, 0\wynik_hum15) (STR)
endif 
//ASCII->INT
0\wynik_t8 = A2I(0\wynik_temp8,4,0)(S)
0\wynik_h8 = A2I(0\wynik_hum8,4,0)(S)
0\wynik_t9 = A2I(0\wynik_temp9,4,0)(S)
0\wynik_h9 = A2I(0\wynik_hum9,4,0)(S)
0\wynik_t10 = A2I(0\wynik_temp10,4,0)(S)
0\wynik_h10 = A2I(0\wynik_hum10,4,0)(S)
0\wynik_t11 = A2I(0\wynik_temp11,4,0)(S)
0\wynik_h11 = A2I(0\wynik_hum11,4,0)(S)
0\wynik_t12 = A2I(0\wynik_temp12,4,0)(S)
0\wynik_h12 = A2I(0\wynik_hum12,4,0)(S)
0\wynik_t13 = A2I(0\wynik_temp13,4,0)(S)
0\wynik_h13 = A2I(0\wynik_hum13,4,0)(S)
0\wynik_t14 = A2I(0\wynik_temp14,4,0)(S)
0\wynik_h14 = A2I(0\wynik_hum14,4,0)(S)
0\wynik_t15 = A2I(0\wynik_temp15,4,0)(S)
0\wynik_h15 = A2I(0\wynik_hum15,4,0)(S)

Dodatkowe informacje dotyczące powyższego kodu

Jeśli tekst poprzedza litera „L” to jeden znak zapisywany jest na jednym bajcie, np.:

0\nazwa = L”Nazwa”

Używamy tej opcji tylko w przypadku, gdy wykorzystujemy później funkcję GetJsonVal, która konwertuje tekst do zmiennej określonego typu.

Tekst zdefiniowany bez litery „L” zapisze się w zmiennej jako ciąg, np.:

0\czujnik10 = „10”

Kropka umieszczona przed tekstem pozwala nam wejść jeden poziom głębiej w strukturze formatu JSON. Np. gdy mamy dane zapisane w takim formacie JSON:

{
"Nazwa": "8",
"Dane":{
       ”temperature": "23",
      "humidity": "50"
            }
}

to żeby odnieść się do „temperature” musimy użyć zapisu „.Dane.temperature”

STR – 8-bitowy ciąg zakończony znakiem NULL

Wszystkie zmienne użyte w skryptach definiujemy w węźle Tags -> Interial Memory i wyglądają one następująco:

tagdata typeaddralias forscan rateexposed
result16-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
topic16-Bit Unsigned Integer[72]AUTO-2097152n/aNormalNo
msgLen16-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
topicLen16-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
czujnik8STRINGAUTO-2097152n/aNormalNo
czujnik9STRINGAUTO-2097152n/aNormalNo
czujnik10STRINGAUTO-2097152n/aNormalNo
czujnik11STRINGAUTO-2097152n/aNormalNo
czujnik12STRINGAUTO-2097152n/aNormalNo
czujnik13STRINGAUTO-2097152n/aNormalNo
czujnik14STRINGAUTO-2097152n/aNormalNo
czujnik15STRINGAUTO-2097152n/aNormalNo
porownanie816-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
porownanie916-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
porownanie1016-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
porownanie1116-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
porownanie1216-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
porownanie1316-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
porownanie1416-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
porownanie1516-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
wynik_nazwySTRINGAUTO-2097152n/aNormalNo
wynik_temp8STRINGAUTO-2097152n/aNormalNo
wynik_temp9STRINGAUTO-2097152n/aNormalNo
wynik_temp10STRINGAUTO-2097152n/aNormalNo
wynik_temp11STRINGAUTO-2097152n/aNormalNo
wynik_temp12STRINGAUTO-2097152n/aNormalNo
wynik_temp13STRINGAUTO-2097152n/aNormalNo
wynik_temp14STRINGAUTO-2097152n/aNormalNo
wynik_temp15STRINGAUTO-2097152n/aNormalNo
wynik_t816-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_t916-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_t1016-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_t1116-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_t1216-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_t1316-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_t1416-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_t1516-Bit Signed IntegerAUTO-2097152n/aNormalNo
nazwaSTRINGAUTO-2097152n/aNormalNo
wynikJson16-Bit Unsigned IntegerAUTO-2097152n/aNormalNo
wynik_hum8STRINGAUTO-2097152n/aNormalNo
wynik_hum9STRINGAUTO-2097152n/aNormalNo
wynik_hum10STRINGAUTO-2097152n/aNormalNo
wynik_hum11STRINGAUTO-2097152n/aNormalNo
wynik_hum12STRINGAUTO-2097152n/aNormalNo
wynik_hum13STRINGAUTO-2097152n/aNormalNo
wynik_hum14STRINGAUTO-2097152n/aNormalNo
wynik_hum15STRINGAUTO-2097152n/aNormalNo
wynik_h816-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_h916-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_h1016-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_h1116-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_h1216-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_h1316-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_h1416-Bit Signed IntegerAUTO-2097152n/aNormalNo
wynik_h1516-Bit Signed IntegerAUTO-2097152n/aNormalNo
nazwa_tSTRINGAUTO-2097152n/aNormalNo
nazwa_hSTRINGAUTO-2097152n/aNormalNo

Teraz wrócimy do naszego ekranu Biuro i dodamy elementy wyświetlające temperaturę i wilgotność w każdym z pokojów. Procedura jest taka sama dla wyświetlania temperatury, jak i wilgotności – wybieramy odpowiednie do każdego pokoju zmienne zamienione z ASCII na INT ze skryptu CONVERT wynik_t[8-15], wynik_h[8-15] i konfigurujemy dany element.

Końcowy efekt wstawiania elementów Numeric Display do pokojów prezentuje się tak jak na poniższym rysunku:

Data Logger

Przydatną funkcjonalnością, którą oferuje panel Astraada HMI, jest możliwość utworzenia Data Loggerów – obiektów do gromadzenia danych. Dzięki nim stworzymy wizualizację, która ułatwi nam późniejsze analizy.

Klikamy na węzeł Data Loggers -> Add Data Loggers. Zaczynamy od wpisania nazwy i zdefiniowania, które dane chcemy zapisywać. W naszym przypadku będą to zmienne wynik_t[8-15] i wynik_h[8-15]. W Data Logger możemy zapisywać tylko jedną daną, więc musimy więc utworzyć 16 Data Loggerów – po dwa na każdy czujnik (temperatura i wilgotność). Wielkość bufora przechowującego dane ustawiamy na 100 słów bitowych, a interwał pobierania danych ustawiamy na 1 sekundę.

Zaznaczamy Save Data to File i ustalamy parametry zapisu danych do plików. Stworzony zostanie plik .csv w określonym miejscu na dysku. Plik zostanie stworzony tylko raz a dane są do niego dopisywane. Powiadomienia o zapisie danych do pliku nie będą wyświetlane.

Cała konfiguracja dla pokoju nr 8 wygląda następująco:

Przechodzimy do drugiej zakładki Data Item, tam dodajemy nazwę zmiennej, która będzie widoczna w pliku i obiektach graficznych. Dla Data Loggerów związanych z temperaturą zmienna będzie miała nazwę „Poziom temperatury”, a dla związanych z wilgotnością – „Poziom wilgotności”. Powinno to wyglądać tak, jak na poniższych ilustracjach:

Chcemy, aby po naciśnięciu na obszar danego pokoju pojawiał się ekran z Data Loggerem. Tworzymy zatem 8 nowych ekranów DataLogger[8-15] z poniższymi parametrami.  Ekrany te będą w trybie Window Screen, aby było można je otworzyć klikając na określony przycisk oraz zamknąć.

Dla pokoju nr 8 dodawanie ekranu wygląda następująco:

Po zdefiniowaniu wszystkich ekranów powinny być one widoczne w następujący sposób:

Do każdego z ekranów Data Loggera dodajemy następujące elementy:

  • Nagłówek (wstawiamy tak samo, jak do ekranu Biuro)
  • Historic Data Table wraz z suwakiem, aby wyświetlać dane w postaci tabeli – po jednym dla temperatury i wilgotności
  • Historic Trend Graph wraz z suwakiem, aby wyświetlać dane w postaci wykresu – po jednym dla temperatury i wilgotności
  • Przycisk Screen Button do zamknięcia ekranu

Dodawanie tych elementów dla pokoju nr 8 wygląda tak:

Uwaga:

Elementy Historic Data Table oraz Historic Trend Graph mają przypisane ID. Dodając Scroll Bar musimy w polu Asscociated Object ID wybrać ID elementu, do którego chcemy dołączyć Scroll Bar.

Po sformatowaniu ekran DataLogger8 wygląda u nas tak:

Na ekranie Biuro w poszczególnych pokojach wstawiamy elementy Screen Button, otwierające nowo utworzone ekrany DataLogger[8-15]. Przyciski będą przeźroczyste, obejmujące całą powierzchnię pokoju, aby użytkownik klikając na obszar pokoju został przeniesiony do odpowiedniego ekranu:

Uwaga:

  • Każdy z dodanych elementów możemy dodatkowo sformatować według uznania (nadać kolor, tekst).
  • Przykłady wykonane są dla pokoju nr 8. Czynności wykonujemy w taki sam sposób dla pozostałych pokojów.

Konfiguracja czujników ELA Innovation

Aby czujniki zbierały dane środowiskowe (temperaturę i wilgotność), trzeba je aktywować i skonfigurować moc oraz częstotliwość nadawania. W tym celu korzystamy z aplikacji Device Manager, która pobrać należy z Google Play lub Apple App Store. Konfiguracja jest bardzo prosta i odbywa się poprzez NFC. W naszym przypadku użyjemy czujników RHT, musimy zmienić dodatkowo ich nazwy, tak aby odpowiadały numerowi pokoju, w którym się znajdują.

Konfiguracja powinna wyglądać tak, jak poniżej:

Konfiguracja MQTT routera Teltonika RUTX11

Przejdziemy teraz do aplikacji konfiguracyjnej routera, wpisując w przeglądarkę jego adres IP i logując się.

Na początku należy z menu SERVICES przejść do zakładki MQTT i aktywować opcję MQTT Broker, aby router mógł pełnić funkcję serwera:

Aby router mógł odbierać paczki danych pomiarowych wysyłane przez czujniki, musi być on z nimi sparowany.

W tym celu wybieramy SERVICES -> BLUETOOTH, po czym przesuwamy Enable Bluetooth na „on” i rozpoczynamy skanowanie czujników. Jeśli na liście zeskanowanych czujników jest ten, który nas interesuje – zaznaczamy go i klikamy PAIR. Zatwierdzamy dokonane zmiany przyciskiem SAVE&APPLY:

Uwaga:

Zaleca się zaznaczenie STORE DATA.

Przechodzimy do DATA TO SERVER z menu SERVICES, gdzie możemy dodać i skonfigurować czujnik, który zebrane dane wysyła na broker – w naszym przypadku router wysyła dane „sam na siebie”. Klikamy ADD i przechodzimy do konfiguracji czujnika. Wybieramy SAVE&APLLY, aby zapisać zmiany:

Wgrywanie projektu z aplikacji Astraada HMI CFG na fizyczny panel

Zobaczmy teraz efekt końcowy na panelu Astraada HMI, w naszym przypadku jest to model AS46TFT1207. Aby wgrać projekt z aplikacji na panel, należy go zapisać, skompilować i załadować za pomocą trzech ikon zaznaczonych poniżej na żółto.

Uwaga:

Jeśli projekt prawidłowo działa na symulacji, a na panelu nie, sprawdź, czy klikając na przycisk Download masz zaznaczone checkboxy tak, jak na ilustracji poniżej:

A tak wygląda nasza aplikacja na panelu Astraada HMI:

Monitorowanie informacji na serwerze

Do monitorowania danych przesyłanych na serwer skorzystamy z narzędzia MQTT EXPLORER, które możemy pobrać ze sklepu Microsoft.

Po uruchomieniu zainstalowanej aplikacji należy dodać nasz broker, do którego będzie łączy się MQTT Explorer:

MQTT Explorer domyślnie subskrybuje wszystkie tematy, wystarczy więc poczekać, aż na podany przez nas temat w DATA TO SERVER przyjdzie paczka danych. Można w ten sposób porównać, czy dane pomiarowe na ekranie Biuro są takie same, jak tu.

Z poziomu naszego narzędzia można również publikować dane na wybrany temat. W aplikacji Astraada HMI CFG zdefiniowaliśmy temat „RHT” do subskrypcji oraz dane „Nazwa”, „temperature” i „humidity” – więc w naszym przypadku powinno to wyglądać tak:

Uwaga:

Jeżeli chcemy, aby dane z czujników były wysyłane automatycznie przez router dzięki DATA TO SERVER, to w skrypcie CONVERT przy zmiennych 0\nazwa_t i 0\nazwa_h należy dodać indeksowanie L[0].Dane.temperature.

Jednak jeśli chcemy wysyłać dane ręcznie poprzez jakieś narzędzie (np. MQTT Explorer), to rezygnujemy z indeksowania L”.Dane.temperature”.

Newsletter Poradnika Automatyka

Czytaj trendy i inspiracje, podstawy automatyki, automatykę w praktyce

Please wait...

Thank you for sign up!

Czy ten artykuł był dla Ciebie przydatny?

Średnia ocena artykułu: 5 / 5. Ilość ocen: 6

Ten artykuł nie był jeszcze oceniony.

Zadaj pytanie

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *