[AD2][LabVIEW] Analog Discovery 2 vs LabVIEW, bezpośredni zapis danych do Elasticsearch, Kibana w tle
: czwartek 04 lip 2019, 20:56
♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
♫ ♩ ♪ KAT ⚡ ☘ ⚡ Łza Dla Cieniów Minionych ♪ ♩ ♫
https://youtu.be/pofHffhzd_Q
Nooo, lektura lipcowej Poczty EdW dała mi do myślenia, że niby programowania było w gazetce za dużo? I że LabVIEW też? No faktycznie, bazgroły o LV nie mają startu do opisów palenisk i wspomnień z technikum za czasów PRL, prawda to.
Tak więc tutaj swobodna kontynuacja napoczętego kiedyś tematu obsługi puderniczki AD2 w moim ulubionym LabVIEW, w ramach ciekawostek zagonimy także do pracy oprogramowanie Elasticsearch i jego graficzne opakowanie - Kibanę.
Na początku garść linków, co automatycznie zwolni mnie z detalicznego opisywania każdej użytej w demku kostki:
Getting Started with LabVIEW and Analog Discovery 2
WaveForms vs LabForms Part 1
WaveForms vs LabForms Part 2
DIY ECG Using a Analog Discovery 2 and LabVIEW
JSON Serialization & Deserialization Library for LabVIEW
HTTP REST Client Library for LabVIEW
Z zestawem komponentów do AD2/WaveForms wystąpił pewien smuteczek, a mianowicie Digilent połknięty przez firmę National Instruments zaczyna powolutku uprawiać politykę nagonki na co raz to nowsze wersje LV. Osoby, które ciągle pracują z wersją LV 2014 Home Bundle i nie upilnują, aby skompletować sobie starsze, natywne dla tej wersji zestawy kostek i przykładów zostają nagle z ręką w majtkach - starszych wersji na stronach już nie ma, a LV2014 nowszych z reguły nie potrafi poprawnie otworzyć - vide rysunek poniżej.
Taka właśnie zaskoczka spotkała mnie przy plikach przykładów do AD2/WaveForms. O ile komponenty pobrane z repozytoriów National Instruments (via VI Package Manager) pasują do wersji i pracują poprawnie, to przykładów tam już dali. A te z for NI są pod wersję 2015. I brzdęk.
W załączniku podzielam się wynikami szybkiej konwersji VI-ek, macie spakowany firmowy komplet. To robi się tak, że na czystej kopii Win7 pod VirtualBox instaluje się LV2019, NI-VISA i WaveForms od Digilenta. LV jest oczywiście w wersji próbnej ale co tam i tak zaraz idzie do piasku. No i pracowicie wołamy po kolei File->Save for previous version.
Na początek drobne eksperymenty, jak wstawiać rekordy bezpośrednio do Elasticsearch. Sztuczka nie jest skomplikowana, ale trzeba poświęcić nieco uwagi na spreparowanie poprawnego strukturalnie JSON-a, do które źródłem danych pomiarowych jest niezdzieralny MCP9700 oraz fotoogniwo z lampki solarnej za 3 zł, z Castoramy.
Próbny diagram poniżej, operacja HTTP POST wykonywana jest do dwóch rozłącznych indeksów o nazwach ad2daq-temperature-* oraz ad2daq-light-*. Struktura danych jest identyczna - pola: value, @timestamp oraz sensor. No i zasadniczo to ładnie działało, choć generowało pewne problemy z korelacją danych w Kibanie. Do zapamiętania z rysunku powyżej jest klocuszek `Flatten to JSON`. Kostka potrafi skonwertować klaster wejściowy o zdefiniowanej typem strukturze na string JSON, jest fajna i oszczędza upierdliwych operacji na napisach.
Druga rzecz, już mniej fajna to konieczność wprowadzenia bokiem danych do autoryzacji, widać fragment tabeli z nagłówkiem HTTP Authorization/Basic wprowadzonej do komponentu JKI HTTP POST. No więc Elasticsearch sam w sobie spokojnie wspiera mechanizm preemptive authentication, tylko kostki JKI REST mają z tym jakiś problem bo gdy podawałam po bożemu user/password to kończyło się to klasycznym 403/forbidden. Podejrzewam, że JKI czeka na status HTTP 401 i dopiero wtedy wysyła dane logowania. W sumie szkoda dociekać i lepiej dostawiać logowanie dodatkowym nagłówkiem, tylko wypadałoby ubrać to w ładny klocuszek konwertujący dane do base64 itp, żeby nie było wioski.
Kolejne demko to już kompletna aplikacja do akwizycji danych o temperaturze i poziomie oświetlenia. I kolejna zmiana koncepcyjna we wstawianiu danych do Elastica - tym razem dane o świetle i temperaturze są w jednej paczce, konfekcjonowanie danych w jednym indeksie ad2daqcpx-*.
Obsługa AD2 chyba nie stanowi tu specjalnej zagadki - wykorzystuję dwa bloki puderniczki: zasilacz (PWS) oraz oscyloskop (MSO). Oba bloki są konfigurowane jednocześnie, mogę sobie na to pozwolić, ponieważ te kostki korzystają z rozłącznych handlerów. W przypadku zasilacza może tylko uwaga: na zakończenie aplikacji dobrze jest wykonać na nim operację wyłączenia, inaczej AD2 może generować napięcie aż do fizycznego zamknięcia LabVIEW.
Obsługa MSO także prosta jest - ustawiamy oba kanały mso/1 oraz mso/2 w tryb DC i na zakres 5V. Samplowanie przyjmijmy że 20kHz i jednosekundowy czas zbierania danych. I w ten sposób, po wyzwoleniu pomiaru w pętli głównej aplikacji kostka DWF MSO Read zwróci nam dwuwymiarową tablicę z próbkami do dalszej analizy. Tu nieco matematyki na poziomie liceum - Basic Averaged DC-RMS - z kostki pobieram sobie uśrednione wartości pracowicie zebranych przez AD2 próbek. No i dalej wiadomo - na miernik wskazówkowy, termometr i wysyłka do Elasticsearch znaną już metodą. Diagram i panel dema poniżej:
Jednej rzeczy w tym wszystkim brakuje - obsługi odpowiedzi z Elasticsearch, pominęłam aby nie motać bardziej diagramu. Ta aplikacja pisze raz na kilka sekund, ale bardziej żwawe i gadatliwe rozwiązanie mogłoby zwyczajnie przeciążyć interfejs HTTP Elastica, który sam z siebie nie kolejkuje danych (od takich spraw ma m.in. Logstash-a lub Kafkę /o tym kiedyś/).
Aplikacja chwilę sobie popracowała - od popołudnia, cała nocka, wyłączenie o poranku. Widać jak niewiele zmieniała się temperatura (czujnik przeniesiony na parapet balkonowy), za to ładnie widać zmiany oświetlenia (słońce >2V, nocka pojedyncze mV).
No i oczywiście filmik z nawigacji po danych oraz klecenia wizualizacji na kolanie, polecam zabawę.
https://youtu.be/bGAD1YxCf14
#slowanawiatr
♫ ♩ ♪ KAT ⚡ ☘ ⚡ Łza Dla Cieniów Minionych ♪ ♩ ♫
https://youtu.be/pofHffhzd_Q
Nooo, lektura lipcowej Poczty EdW dała mi do myślenia, że niby programowania było w gazetce za dużo? I że LabVIEW też? No faktycznie, bazgroły o LV nie mają startu do opisów palenisk i wspomnień z technikum za czasów PRL, prawda to.
Tak więc tutaj swobodna kontynuacja napoczętego kiedyś tematu obsługi puderniczki AD2 w moim ulubionym LabVIEW, w ramach ciekawostek zagonimy także do pracy oprogramowanie Elasticsearch i jego graficzne opakowanie - Kibanę.
Na początku garść linków, co automatycznie zwolni mnie z detalicznego opisywania każdej użytej w demku kostki:
Getting Started with LabVIEW and Analog Discovery 2
WaveForms vs LabForms Part 1
WaveForms vs LabForms Part 2
DIY ECG Using a Analog Discovery 2 and LabVIEW
JSON Serialization & Deserialization Library for LabVIEW
HTTP REST Client Library for LabVIEW
Z zestawem komponentów do AD2/WaveForms wystąpił pewien smuteczek, a mianowicie Digilent połknięty przez firmę National Instruments zaczyna powolutku uprawiać politykę nagonki na co raz to nowsze wersje LV. Osoby, które ciągle pracują z wersją LV 2014 Home Bundle i nie upilnują, aby skompletować sobie starsze, natywne dla tej wersji zestawy kostek i przykładów zostają nagle z ręką w majtkach - starszych wersji na stronach już nie ma, a LV2014 nowszych z reguły nie potrafi poprawnie otworzyć - vide rysunek poniżej.
Taka właśnie zaskoczka spotkała mnie przy plikach przykładów do AD2/WaveForms. O ile komponenty pobrane z repozytoriów National Instruments (via VI Package Manager) pasują do wersji i pracują poprawnie, to przykładów tam już dali. A te z for NI są pod wersję 2015. I brzdęk.
W załączniku podzielam się wynikami szybkiej konwersji VI-ek, macie spakowany firmowy komplet. To robi się tak, że na czystej kopii Win7 pod VirtualBox instaluje się LV2019, NI-VISA i WaveForms od Digilenta. LV jest oczywiście w wersji próbnej ale co tam i tak zaraz idzie do piasku. No i pracowicie wołamy po kolei File->Save for previous version.
Na początek drobne eksperymenty, jak wstawiać rekordy bezpośrednio do Elasticsearch. Sztuczka nie jest skomplikowana, ale trzeba poświęcić nieco uwagi na spreparowanie poprawnego strukturalnie JSON-a, do które źródłem danych pomiarowych jest niezdzieralny MCP9700 oraz fotoogniwo z lampki solarnej za 3 zł, z Castoramy.
Próbny diagram poniżej, operacja HTTP POST wykonywana jest do dwóch rozłącznych indeksów o nazwach ad2daq-temperature-* oraz ad2daq-light-*. Struktura danych jest identyczna - pola: value, @timestamp oraz sensor. No i zasadniczo to ładnie działało, choć generowało pewne problemy z korelacją danych w Kibanie. Do zapamiętania z rysunku powyżej jest klocuszek `Flatten to JSON`. Kostka potrafi skonwertować klaster wejściowy o zdefiniowanej typem strukturze na string JSON, jest fajna i oszczędza upierdliwych operacji na napisach.
Druga rzecz, już mniej fajna to konieczność wprowadzenia bokiem danych do autoryzacji, widać fragment tabeli z nagłówkiem HTTP Authorization/Basic wprowadzonej do komponentu JKI HTTP POST. No więc Elasticsearch sam w sobie spokojnie wspiera mechanizm preemptive authentication, tylko kostki JKI REST mają z tym jakiś problem bo gdy podawałam po bożemu user/password to kończyło się to klasycznym 403/forbidden. Podejrzewam, że JKI czeka na status HTTP 401 i dopiero wtedy wysyła dane logowania. W sumie szkoda dociekać i lepiej dostawiać logowanie dodatkowym nagłówkiem, tylko wypadałoby ubrać to w ładny klocuszek konwertujący dane do base64 itp, żeby nie było wioski.
Kolejne demko to już kompletna aplikacja do akwizycji danych o temperaturze i poziomie oświetlenia. I kolejna zmiana koncepcyjna we wstawianiu danych do Elastica - tym razem dane o świetle i temperaturze są w jednej paczce, konfekcjonowanie danych w jednym indeksie ad2daqcpx-*.
Obsługa AD2 chyba nie stanowi tu specjalnej zagadki - wykorzystuję dwa bloki puderniczki: zasilacz (PWS) oraz oscyloskop (MSO). Oba bloki są konfigurowane jednocześnie, mogę sobie na to pozwolić, ponieważ te kostki korzystają z rozłącznych handlerów. W przypadku zasilacza może tylko uwaga: na zakończenie aplikacji dobrze jest wykonać na nim operację wyłączenia, inaczej AD2 może generować napięcie aż do fizycznego zamknięcia LabVIEW.
Obsługa MSO także prosta jest - ustawiamy oba kanały mso/1 oraz mso/2 w tryb DC i na zakres 5V. Samplowanie przyjmijmy że 20kHz i jednosekundowy czas zbierania danych. I w ten sposób, po wyzwoleniu pomiaru w pętli głównej aplikacji kostka DWF MSO Read zwróci nam dwuwymiarową tablicę z próbkami do dalszej analizy. Tu nieco matematyki na poziomie liceum - Basic Averaged DC-RMS - z kostki pobieram sobie uśrednione wartości pracowicie zebranych przez AD2 próbek. No i dalej wiadomo - na miernik wskazówkowy, termometr i wysyłka do Elasticsearch znaną już metodą. Diagram i panel dema poniżej:
Jednej rzeczy w tym wszystkim brakuje - obsługi odpowiedzi z Elasticsearch, pominęłam aby nie motać bardziej diagramu. Ta aplikacja pisze raz na kilka sekund, ale bardziej żwawe i gadatliwe rozwiązanie mogłoby zwyczajnie przeciążyć interfejs HTTP Elastica, który sam z siebie nie kolejkuje danych (od takich spraw ma m.in. Logstash-a lub Kafkę /o tym kiedyś/).
Aplikacja chwilę sobie popracowała - od popołudnia, cała nocka, wyłączenie o poranku. Widać jak niewiele zmieniała się temperatura (czujnik przeniesiony na parapet balkonowy), za to ładnie widać zmiany oświetlenia (słońce >2V, nocka pojedyncze mV).
No i oczywiście filmik z nawigacji po danych oraz klecenia wizualizacji na kolanie, polecam zabawę.
https://youtu.be/bGAD1YxCf14
#slowanawiatr