Firma Grenton wysłała mi swój nowy “Grenton Smart Panel” do testów za co bardzo dziękuję. W tym poście chciałbym Wam pokazać czego się dowiedziałem w ciągu ostatnich kilku dni.
Nowy panel dotykowy
Na wizualizacjach nowy panel wygląda następująco:
W rzeczywistości różni się kilkoma detalami. Po pierwsze, logo jest mniej widoczne, co jest na plus. Po drugie, koło diod umieszczone są czujniki wykrywające gesty. Wielkość wyświetlacza się zgadza. Na dole pod logiem znajduje się czujnik zmierzchu. Ciężko jest zrobić dobre zdjęcie panelowi, bo bardzo dobrze odbija światło.
Dokładna instrukcja dostępna jest pod adresem: http://www.grenton.pl/upload/files/PL/GRENTON_SMART_PANEL_TF-Bus.pdf
Dane techniczne
• zasilanie: 5-24V DC
• średni pobór prądu w trybie czuwania (dla 5V): 20 mA
• maks. pobór prądu (dla 5V): 80 mA
• waga: 120 g
• zakres temperatur pracy: 0-45°C
• wymiary (wys/szer/gł): 80/80/10 mm
Tył panelu i podłączenie
Zacznijmy od podłączenia. Tu jest spora zmiana na plus, ponieważ Grenton zrezygnował ze swojego złącza TF-BUS na rzecz zwykłych śrubek. Adapter ARK pozwalający na podłączenie poprzedniego panelu kosztował 39 zł i trzeba było go zamontować w puszce wraz z każdym panelem dotykowym, teraz potrzeba znacznie mniej adapterów. Z tyłu obudowy wystaje karta SD, (4GB!) prawdopodobnie to na niej trzymane są ikony. Ta część w prawym dolnym rogu to chyba głośnik. Część w lewym górnym rogu to silnik do wibracji .
Poniżej adapter ARK, który jest potrzebny aby podłączyć przewody szyny TF-BUS do Clu.
W opakowaniu dołączony jest pierścień, który pozwala na zamontowanie panelu (informacje na temat montażu w instrukcji). Pierścień mocuje się do puszki za pomocą wkrętów, a następnie mocuje się panel dotykowy. Miejsca na śruby pozwalają poradzić sobie z niedokładnym osadzeniem puszki przez tynkarzy. Jest jakiś mały margines na ustawienie panelu prosto.
Pierwsze uruchomienie
Przed uruchomieniem musiałem ściągnąć nową wersję OM (Object Managera), czyli aplikacji pozwalającej na konfigurację Clu oraz logiki całego systemu. Również pierwszy raz przeszedłem procedurę aktualizacji firmware, która okazała się bezbolesna. Co najważniejsze, projekt nad którym pracowałem został przeniesiony na nową wersję bez problemów. Samo podłączenie panelu jest dość proste, dwa przewody do zasilania i dwa przewody do danych. Panel podczas włączania wyświetla następujące informacje:
Całkiem sporo informacji
Oczywiście, najważniejsza funkcjonalność nowego panelu dotykowego, to wyświetlacz, ale za pomocą Smart Panelu można przekazać całkiem sporo informacji:
- Na wyświetlaczu oled można wyświetlić tekst, ikony, pliki bmp oraz rysować za pomocą Lua.
- Przy każdym z przycisków można wyświetlić dwie różne ikony, zależnie od stanu przycisku. Opcja łatwa do wyklikania w OM.
- Diody przy każdym z przycisków mogą świecić w dwóch kolorach – zielony i czerwony.
- Panel może wydawać piszczący dźwięk (można go wyłączyć).
Dodatkowo wszystko jest sterowane za pomocą Lua. Jestem sobie w stanie wyobrazić, jak ktoś robi za pomocą tego panelu interfejs, który pozwoliłby na sterowanie dowolnym innym urządzeniem wpiętym w Grentona. Coś w stylu menu jak starym telefonie komórkowym.
Rozpoznawanie gestów
Przy każdej z diod sygnalizujących stan przycisku, umieszczony jest czujnik pozwalający wykryć gest. Wykrywanie jest zrobione całkiem proste. Przedmiot wielkości dłoni musi zacząć ruch od jednej strony i skończyć ten ruch po drugiej stronie. Panel rozpoznaje cztery gesty – ruchy ręką w lewo, prawo, górę i dół. Gesty tłumaczone są na zdarzenia w OM, przez co ich obsługa w Lua jest całkiem prosta.
Wyświetlacz oled
Wyświetlacz nie jest duży. Pewnie większy wyświetlacz mocno by podniósł cenę urządzenia. Podejrzewam, że gdyby się okazało, że zapotrzebowanie na większe wyświetlacze jest realne, Grenton miałby już gotowy software oraz proces wytwórczy. Zakładam, że nie jest to finalna wersja panelu. Sam wyświetlacz jest dość jasny, ma dobry kontrast. Rozdzielczość to 128 x 64 piksele.
Responsywność
Panel jest bardzo czuły, zresztą tak jak poprzednie. Delikatny kontakt z palcem powoduje reakcję panelu. Nie czuć większych opóźnień, ale nie mam pomysłu jak zmierzyć czas od naciśnięcia do włączenia światła. I tak największe opóźnienie będzie na przekaźniku włączającym urządzenie. Obstawiam, że sama komenda z panelu do Clu wysyłana jest w mniej niż 100 ms (bo około tyle trwa wysyłanie wiadomości z telefonu do Clu przez sieć). Naciskając palcem na panel wyznaczyłem strefy, w których przyciski reagują na dotyk(oznaczone na zielono). Między przyciskami biegnie pas, który na dotyk nie reaguje, ma ok. 1 cm szerokości. Po bokach znajdują się mniejsze pasy po około 4-5 mm. Można nacisnąć wiele przycisków w tym samym momencie, tak samo w poprzedniej wersji panelu.
Podstawowa konfiguracja
Panel po podłączeniu został wykryty przez OM. Dzięki czemu na liście dostępnych modułów pojawiły się nowe wpisy.
PANEL1 – jest to miejsce w którym można skonfigurować podstawowe parametry oraz ustawić cechy wbudowane.
Dziwne, że GestureIconUp ma zakres [0-9] a wpisana jest wartość “up”. W każdym razie w tym miejscu można włączyć/wyłączyć głośnik oraz wibracje. Nie można sterować głośnością, typem dźwięku oraz siłą wibracji. Każdą z tych cech można zmienić dynamicznie za pomocą Lua w dowolnym momencie. Lista zdarzeń wygląda następująco:
Można reagować na jakiś ruch w pobliżu panelu (OnProximityDetect) oraz na gesty. Inżynierowie Grentona bardzo zadbali o dużą ilość komend, które można wywołać z poziomu Lua. W porównaniu do innych modułów które posiadam, ta lista jest naprawdę spora.
Jak widać można rysować linię, punkty, tekst, liczby, ikony. Dziwna jest niekonsekwencja w długości nazw plików ikon.
Ciekawe, bo karta SD jest pewnie sformatowana w formacie FAT, a tam system plików przyjmuje pliki o długości 8 znaków i 3 znaków rozszerzenia. Będę musiał to zweryfikować 🙂
Ciekawe czy Grenton zrobi następny panel z kolorowym wyświetlaczem i w pole “color” pozwoli umieścić wartość z przedziału 0-255? 🙂
Niemniej, to całkiem spore to API jak na panel dotykowy.
Następnymi pozycjami na liście są sensory natężenia światła (ukryty na dole panelu, nie ma o nim słowa w instrukcji) oraz temperatury. Ich konfiguracja jest identyczna jak sensorów z poprzedniego panelu dotykowego.
Na koniec dostępne są cztery przyciski, których konfiguracja bardzo przypomina konfigurację poprzedniego panelu, ale z możliwością dodania ikon.
Powyższa konfiguracja pozwala na umieszczenie ikony obok przycisku. Gdy przycisk jest wyłączony wyświetla się ikona “lamp2off”, gdy włączony wyświetlana jest ikona “lamp2on”. Podstawowa konfiguracja jest dość prosta. Ale co jak chcemy trochę więcej?
Tekst
Pierwszy test, wyświetlenie alfabetu, wielkość fontu 1:
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->PrintText(0,0,’abcdefghijklmnoprstuwyz’,1)
DOM->x250000067_PANEL1->PrintText(0,30,’ABCDEFGHIJKLMNOPRSTUWYZ’,1)
DOM->x250000067_PANEL1->DisplayContent()
Drugi test, wyświetlenie alfabetu, wielkość fontu 2:
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->PrintText(0,0,’abcdefghijklmnoprstuwyz’,2)
DOM->x250000067_PANEL1->PrintText(0,30,’ABCDEFGHIJKLMNOPRSTUWYZ’,2)
DOM->x250000067_PANEL1->DisplayContent()
Trzeci test, wyświetlenie alfabetu, wielkość fontu 3:
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->PrintText(0,0,’ABCDEFGHIJKLMNOPRSTUWYZ’,3)
DOM->x250000067_PANEL1->DisplayContent()
Tekst się zawija i nachodzi na pierwsze litery. Ograniczenie do 15 znaków tutaj nie działa.
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->PrintText(0,0,’ABCDEF’,3)
DOM->x250000067_PANEL1->DisplayContent()
Teraz jest już dobrze. Największym fontem można wyświetlić na ekranie około 6 liter.
Czwarty test, wyświetlenie polskich znaków:
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->PrintText(0,0,’ĄĆĘÓŃŁŚĆŹŻ ąćęóńłśćźż’,1)
DOM->x250000067_PANEL1->PrintText(0,15,’ĄĆĘÓŃŁŚĆŹŻ ąćęóńłśćźż’,1)
DOM->x250000067_PANEL1->PrintText(0,30,’ĄĆĘÓŃŁŚĆŹŻ ąćęóńłśćźż’,1)
DOM->x250000067_PANEL1->PrintText(0,45,’ĄĆĘÓŃŁŚĆŹŻ ąćęóńłśćźż’,1)
DOM->x250000067_PANEL1->DisplayContent()
Polskie znaki działają, ale kodowane są prawdopodobnie za pomocą utf-8, gdzie jeden znak zajmuje dwa bajty. Wygląda to na drobny bug. 15/2 ~= 7 znaków. Dlatego zamiast 15 znaków można wyświetlić maksymalnie 7.
Rysowanie
Aby móc rysować, trzeba przełączyć wyświetlacz w tryb “freedraw”. Robi się to za pomocą metody “DisplayContent”. Żeby wrócić do trybu przycisków – metoda “ShowButtons”. Nie znalazłem metody, która by pozwalała sprawdzić w jakim trybie jest aktualnie wyświetlacz.
Tryb “showButtons”
Tryb “freeDraw”
W trybie “freeDraw” przyciski działają tak jak zostały skonfigurowane wcześniej, można dalej włączać urządzenia podpięte pod przyciski. Żeby zrobić jakąś bardziej skomplikowaną logikę na panelu, trzeba całą konfigurację pisać w Lua.
Kod, który narysował rysunek powyżej:
DOM->x250000067_PANEL1->DrawIcon(10,10,”lamp2off”) — rysujemy ikonę (w odwrotnej kolejności ikona zamaluje czarnym tłem linię)
DOM->x250000067_PANEL1->DrawLine(0,0,127,63,1) — rysujemy linie od lewego górnego rogu do prawego dolnego rogu
DOM->x250000067_PANEL1->DisplayContent() — wyświetlamy to co zostało na rysowane w buforze na ekran
Wygląda prosto. Teraz bardziej ambitny przykład, wyświetlę aktualną temperaturę za pomocą następującego kodu:
temp = DOM->x250000067_PANELSENSTEMP1->Value — temperatura z czujnika w panelu
DOM->x250000067_PANEL1->ClearScreen() — czyść ekran
DOM->x250000067_PANEL1->PrintFloat(45,20,temp,2,2) — wyświetl liczbę x=45, y=2, temperatura, precyzja = 2, font = 2
DOM->x250000067_PANEL1->DisplayContent() — bufor
Teraz na gest w lewo- przyciski, na gest w prawo – temperatura. Skrypt z temperaturą zapisałem pod nazwą “rysowanie”.
To tylko prosty przykład do napisania w 10 minut. Poniżej film, który pokazuje jak działa powyższy kod i konfiguracja.
Nie wiem jak zlikwidować napis “RIGHT” oraz “LEFT”, który pojawia się przy gestach. Na filmach od Grentona tego nie było, pewnie muszę nadpisać jakieś domyślne wartości.
Co jest na karcie pamięci?
Na początku nie wiedziałem jak wyjąć tę kartę. Wydawało mi się, że muszę rozkręcić panel. Okazało się, że w instrukcji jest pokazane jak to zrobić. Podłączyłem kartę do komputera i znalazłem tam pliki bmp. Kata pamięci jest sformatowana w formacie FAT32, a nie FAT16 tak jak myślałem.
Wszystkie ikony na karcie mają rozmiar 64 x 32. Czyli każda na 1/4 ekranu.
Dziwny jest katalog upload/03/03 w którym znajduje się plik “020c.fw” o wielkości 55KB. Wygląda na jakiś firmware. Sprawdziłem jakie ten plik zawiera ciągi znaków za pomocą narzędzia strings:
strings -n 10 020c.fw > strings.out
Wynik:
GRENTON[03-03-0c-02-3.0.4.1803c ]
GRENTON[03-03-0c-02-3.0.4.1803c ]
upload/03/03/020c.fw
vk`VMD;3,$”*+,:;<=>?[]rH
Upss! Err:
IMAGE FOUND
BOOTLOADER
Smart Panel
FEDCBA9876543210123456789ABCDEF
N]f!Q[^Yvt
\B!`T= \C!`T> \D4 p
`r}5(x s {
xlFdxnF4plFcp
II hIzHCc0d!
0x C0p0xh@0pv
2x”C2p2xj@2pI
Natomiast narzędzie binwalk nie znalazło żadnego znanego filesystemu, podobnie zresztą jak w przypadku firmware do Clu.
Ikony
Ściągnąłem z internetu kota i za pomocą ImageMagicka przekonwertowałem go do monochromatycznych bitmap.
Polecenie do konwersji:
convert b04.gif -resize 128 -crop 128×64+0+25 +repage -monochrome -type Grayscale -colors 2 kot%02d.bmp
Jako wynik otrzymałem takie pliki, które wgrałem na kartę pamięci panelu dotykowego. Pliki nie wyszyły idealnie ale cały proces trwał chwilę. Kot w ostatnich klatkach jest trochę przesunięty w do dołu.
Napisałem następujący kod, który pozwoli wyświetlić kota na ekranie:
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->DrawIcon(0,0,”kot00″)
DOM->x250000067_PANEL1->DisplayContent()
Wynik na zdjęciu poniżej. Kolory zostały odwrócone przez panel. Muszę poprawić pliki.
Musiałem zmienić polecenie, żeby odwróciło kolory:
convert b04.gif -resize 128 -crop 128×64+0+25 +repage -monochrome -type Grayscale -colors 2 -negate xkot%02d.bmp
Teraz mam dwa zestawy ikonek: “koty” i “xkoty” z braku lepszego pomysłu na nazwę.
Test xkota na panelu:
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->DrawIcon(0,0,”xkot00″)
DOM->x250000067_PANEL1->DisplayContent()
“xkot” na panelu wygląda dużo lepiej.
Ikona jest wielkości 128×64, czyli zajmuje cały wyświetlacz. Wygląda na to, że można zastosować dowolną wielkość ikon (pewnie w ramach rozsądku). Ciekawe czy można wyświetlić ikonę w innych miejscach ekranu?
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->DrawIcon(30,20,”xkot00″)
DOM->x250000067_PANEL1->DisplayContent()
Okazuje się, że można (darowałem sobie zdjęcie). Nie działają natomiast współrzędne ujemne. Trochę szkoda, bo dawało by to trochę więcej możliwości.
Gdy zapisałem ikony z większą ilością kolorów niż 2, panel nie potrafił ich otworzyć.
Animacja
Skoro mam już bitmapy gotowe, pora zrobić animację. Pierwsza, naiwna próba wyglądała tak:
local file
DOM->x250000067_PANEL1->SwitchOnDisplay()
for i=1,9 do
file = “xkot0” .. i
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->DrawIcon(0,0,file)
DOM->x250000067_PANEL1->DisplayContent()
end
DOM->x250000067_PANEL1->ShowButtons()
Okazało się, że panel bardzo szybko wyświetlał animację i musiałem dodać coś żeby ją spowolnić. Kolejna próba wyglądała następująco:
local f
DOM->x250000067_PANEL1->SwitchOnDisplay()
for i=1,9 do
f = “xkot0” .. i
DOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->DrawIcon(0,0,f)
DOM->x250000067_PANEL1->DisplayContent()for j=0,100000 do end — w Lua nie ma sleep, Grenton wyciął też większość bibliotek, które pozwalały zrobić sleep
end
DOM->x250000067_PANEL1->ShowButtons()
Teraz animacja działa. Jednak taki kod całkowicie blokuje Clu, aż do momentu, gdy animacja się zakończy (ma to związek ze zdarzeniową architekturą Clu). Tego typu animacje trzeba by obsługiwać w inny sposób. Wydaje mi się, że należy użyć obiektu timera i za jego pomocą zmieniać klatki animacji. W ten sposób nie będzie to blokowało Clu oraz będzie można dobrać czas w milisekundach między klatkami animacji.
Poniżej filmik przedstawiający moją pierwszą animację.
Nieblokująca animacja
Aby panel wyświetlał cały czas animację i nie blokował Clu, trzeba użyć obiektu timera. Obiekt ten będzie generował event w ramach którego zostanie wyświetlona klatka animacji, a pozostały czas Clu będzie miało dla siebie. Przykładowy skrypt “animacja3” może wyglądać w następujący sposób
if _G[‘x’] == nil then — w tablicy globalnej przechowywane są koordynaty.
_G[‘x’] = 0
endif _G[‘y’] == nil then — defensywne ify
_G[‘y’] = 0
endif _G[‘xx’] == nil then
_G[‘xx’] = 1
endif _G[‘xy’] == nil then
_G[‘xy’] = 1
end_G[‘x’] = _G[‘x’] + _G[‘xx’];
_G[‘y’] = _G[‘y’] + _G[‘xy’];if (_G[‘x’] >= 64) or (_G[‘x’] <= 0) then — odbicie ikonki w poziomie
_G[‘xx’] = _G[‘xx’] * -1
endif (_G[‘y’] >= 32) or ( _G[‘y’] <= 0) then — odbicie ikonki w pionie
_G[‘xy’] = _G[‘xy’] * -1
endDOM->x250000067_PANEL1->ClearScreen()
DOM->x250000067_PANEL1->DrawIcon(_G[‘x’],_G[‘y’],”lamp2on”) — rysowanie
DOM->x250000067_PANEL1->DisplayContent()
Następnie tworzymy nowy timer i do timera dodajemy zdarzenie “OnTimer” i przypisujemy komendę animacja3. Następnie w cechach wbudowanych timera ustalamy czas co jaki “klatka animacji” ma być odświeżana. Gdzieś w kodzie uruchamiamy timer za pomocą metody “start”. Dzięki czemu otrzymamy następującą animację. Widać, że podczas trwania animacji przyciski działają normalnie.
Sterowanie termostatem
Na filmach od Grentona jeden z przykładów pokazuje zastosowanie panelu jako sterownika do wentylacji. Poniżej moja próba zrobienia termostatu pokojowego za pomocą Smart Panelu.
Button1 – przycisk będzie pozwalał sterować pierwszym światłem w pokoju (bistabilny, ikony = lamp2off, lamp2on)
Button2 – przycisk “plus” pozwalający zwiększyć temperaturę o 1 stopień (monostabilny, ikona = plus)
Button3 – przycisk będzie pozwalał sterować drugim światłem w pokoju (bistabilny, ikony = lamp1off, lamp1on)
Button4 – przycisk “minus” pozwalająca zmniejszyć temperaturę o 1 stopień (monostabilny, ikona = minus)
Po tych zmianach panel wygląda tak:
Stworzyłem domyślny termostat:
Jako źródło temperatury podłączyłem, go pod Smart Panel, a do sterowania dałem mu wyjście DOUT4 na jednym Relay, który będzie sterował termostatem w rozdzielaczu od kaloryfera (czy czymkolwiek, co spowoduje że temperatura w pokoju się zmieni).
Teraz wypada sterować PointValue. Stworzyłem nowy skrypt, który nazwałem “termostatChange” z parametrem “temp”:
local value = DOM->termostat->PointValue — pobiera aktualnie ustaloną temperaturę
DOM->termostat->SetPointValue(value + temp) — dodaje do ustalonej temperatury wartość temp
DOM->timer2->Start() — uruchamia timer
Timer – potrzebuję timer, który po zmianie temperatury do góry lub w dół, po 1 sekundzie wywoła skrypt, który spowoduje, że panel ponownie wyświetli ikony. Skrypt nazwałem “termostatTimer”:
DOM->x250000067_PANEL1->ShowButtons() — pokazuje przyciski na panelu
DOM->timer2->Stop() — wyłącza timer
Dzięki temu, gdy użytkownik przestanie zmieniać temperaturę, zobaczy po sekundzie ponownie przyciski.
Kolejny skrypt odpowiedzialny jest za wyświetlenie tego, co użytkownik ustawił za pomocą przycisków “plus” i “minus”. Nazwałem skrypt “termostatShow”:
local temp = DOM->x250000067_PANELSENSTEMP1->Value — pobranie temperatury z panelu
local pointValue = DOM->termostat->PointValue — pobranie temperatury docelowej
DOM->x250000067_PANEL1->ClearScreen() — czyszczenie ekranu
DOM->x250000067_PANEL1->PrintText(20,0,’Temp. pokój 1:’,1) — wyświetlenie pierwszej linii.
DOM->x250000067_PANEL1->PrintFloat(45,20,temp,2,1) — wyświetlenie aktualnej temperatury
DOM->x250000067_PANEL1->PrintFloat(45,40,pointValue,2,1) — wyświetlenie docelowej temperatury
DOM->x250000067_PANEL1->DisplayContent() — narysowanie na ekranie
Następnie zmieniłem konfigurację przycisku “BUTTON2” oraz “BUTTON4” (przyciski “plus” oraz “minus”).
Analogicznie dla przycisku BUTTON2. Dzięki takiej konfiguracji, udało mi się za pomocą panelu stworzyć działający termostat pokojowy. Przykład poniżej:
Co się stanie jak włączę panel bez karty SD?
Okazuje się, że panel jest na to gotowy. Wszystko działa tak jak zostało zaprogramowane. Jedyną różnicą jest to, że nie wyświetla ikon, jedynie teksty które zostały zdefiniowane jako “label” przycisku w “cechach wbudowanych” w OM.
Podsumowanie
- Fajny, responsywny gadżet.
- Można przekazać użytkownikowi bardzo dużo informacji.
- Ogromne możliwości dzięki Lua.
- Api jest spójne z dotychczasowymi produktami Grentona. Duży plus za konsekwencję.
- Można rysować jak w jakimś Turbo Pascalu :).
- Pozwala wgrywać własne ikony, tworzyć menu i wyświetlać proste animacje.
- Instrukcja mogłaby zawierać dokumentację metod wraz z parametrami jakie przyjmują i trochę przykładów.
- Nie można wgrać obrazków na panel za pomocą OMa, trzeba wyciągać kartę z panelu.
- Nie można pobrać listy obrazków jakie znajdują się na panelu.
- Strasznie się palcuje.
- Drobne bugi z fontami i niekonsekwencje w ograniczeniu pól w OM. Większych błędów nie znalazłem.
Podsumowując panel bardzo mi się podoba. Jeśli macie jakieś pytania to chętnie odpowiem, bo na pewno nie wyczerpałem tematu. Pewnie w najbliższym czasie napiszę ciekawszy przykład i opublikuję na blogu.
Pozdrawiam,
T
Cześć, zakupiłem Smart Panel ale system nie do końca go wykrywa. Proszę o pomoc. Przed numerem seryjnym w nazwie pokazuje “???”. Nie można go skonfigurować 🙁 Co może być przyczyną. Z góry dzięki za pomoc.
Pozdrawiam
Darek Juszczyk
Cześć,
Ja wraz z panelem otrzymałem nową wersję firmware. Prawdopodobnie to jest przyczyna.
Pozdrawiam,
T