logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Czujnik obecności Tuya 5.8G "Radar" z nieznaną implementacją protokołu TuyaMCU (polecenie

vandenelsenkoen 21 Gru 2024 03:05 2286 4
REKLAMA
Treść została przetłumaczona angielski » polski Zobacz oryginalną wersję tematu
  • #1 21356988
    vandenelsenkoen
    Poziom 3  
    Posty: 4
    Ocena: 3
    Pracuję nad tym, aby wszystkie moje urządzenia odeszły od oprogramowania w chmurze i zaczęły działać lokalnie.

    Jednym z moich czujników jest czujnik obecności człowieka 5.8G "MmWave Radar", patrz zdjęcie poniżej:

    Czujnik obecności człowieka 5.8G MmWave Radar z danymi technicznymi.

    Chociaż zewnętrznie wyglądał podobnie do urządzenia używanego w tym temacie:

    https://www.elektroda.com/rtvforum/topic3987582.html .

    W rzeczywistości jest zupełnie inny w środku, co widać na poniższych zdjęciach. Należy zauważyć, że na tych zdjęciach układ TuyaMCU jest tymczasowo zdjęty z płyty, aby zapewnić wyraźniejszy przegląd.

    Zdjęcie przedstawia płytkę drukowaną urządzenia z układem scalonym widocznym w lewym górnym rogu i pustym miejscem po centralnym układzie. Płytka drukowana z modułem CB3S Beken. Widok z góry na płytkę czujnika z widocznymi oznaczeniami pinów. Płytka drukowana czujnika 5.8G MmWave Radar .

    Czujnik wykorzystuje MCU CB3S Beken do komunikacji wifi, który jest podłączony do płytki "more sense", na której znajduje się MCU o oznaczeniu 58h32.

    Przeczytanie postu p.kaczmarek2 dostarczyło mi narzędzi do debugowania i zbadania komunikacji między Wifi MCU a TuyaMCU, która wydaje się używać protokołu TuyaMCU przy 9600 bodów.

    Aplikacja Smart Life zapewnia użytkownikowi kilka opcji sterowania:
    - Czułość ruchu, wartość od 0 do 10
    - Czułość mikroruchów, wartość od 0 do 10
    - Dolna granica zakresu wykrywania ruchu, wartość od 0 do 600 cm
    - Górny limit zakresu wykrywania ruchu, wartość od 0 do 600 cm
    - Dolna granica zakresu wykrywania mikroruchów, wartość od 0 do 600 cm
    - Górny limit zakresu detekcji mikroruchów, wartość między 0 a 600 cm
    - "Nobody-Time" po jakim czasie braku ruchu/mikroruchu czujnik powinien wskazywać brak obecności, wartość 30, 60, 90 lub 120

    Badanie komunikacji w sposób dwukierunkowy za pomocą narzędzia z https://www.elektroda.com/rtvforum/topic3970199.html dało następujące wyniki:

    Ustawienie czułości ruchu:
    
    Sent by WiFi module:
    55 AA	00	06		00 08	6902000400000006	82	
    HEADER	VER=00	SetDP		LEN	dpId=105 Val V=6		CHK	
    
    Received by WiFi module:
    55 AA	03	07		00 08	69 02 00 04 00000006 		86	
    HEADER	VER=03	State		LEN	dpId=105 Val V=6	CHK	
    


    Ustawienie mikro czułości ruchu:
    
    Sent by WiFi module:
    55 AA	00	06		00 08	6B02000400000004	82	
    HEADER	VER=00	SetDP		LEN	dpId=107 Val V=4		CHK	
    
    Received by WiFi module:
    55 AA	03	07		00 08	6B 02 00 04 00000004 		86	
    HEADER	VER=03	State		LEN	dpId=107 Val V=4	CHK
    


    Ustawienie zakresu wykrywania ruchu, zmiana wartości minimalnej lub maksymalnej zawsze wysyła obie wartości do TuyaMCU:
    
    Received by WiFi module:
    55 AA	03	07		00 08	6D 02 00 04 00000186 		0B	
    HEADER	VER=03	State		LEN	dpId=109 Val V=390	CHK	
    
    Sent by WiFi module:
    55 AA	00	06		00 08	6D02000400000186	07	
    HEADER	VER=00	SetDP		LEN	dpId=109 Val V=390		CHK	
    
    Received by WiFi module:
    55 AA	03	07		00 08	6E 02 00 04 00000000 		85	
    HEADER	VER=03	State		LEN	dpId=110 Val V=0	CHK	
    
    Sent by WiFi module:
    55 AA	00	06		00 08	6E02000400000000	81	
    HEADER	VER=00	SetDP		LEN	dpId=110 Val V=0		CHK	
    

    Gdzie dpid 109 to górny limit, a dpid 110 to dolny limit.

    Ustawienie zakresu wykrywania mikroruchów, zmiana wartości minimalnej lub maksymalnej zawsze wysyła obie wartości do TuyaMCU:
    
    Sent by WiFi module:
    55 AA	00	06		00 08	6F020004000000FA	7C	
    HEADER	VER=00	SetDP		LEN	dpId=111 Val V=250		CHK	
    
    Received by WiFi module:
    55 AA	03	07		00 08	6F 02 00 04 000000FA 		80	
    HEADER	VER=03	State		LEN	dpId=111 Val V=250	CHK	
    
    Sent by WiFi module:
    55 AA	00	06		00 08	7002000400000000	83	
    HEADER	VER=00	SetDP		LEN	dpId=112 Val V=0		CHK	
    
    Received by WiFi module:
    55 AA	03	07		00 08	70 02 00 04 00000000 		87	
    HEADER	VER=03	State		LEN	dpId=112 Val V=0	CHK		
    

    Gdzie dpid 111 to górny limit, a dpid 112 to dolny limit.

    Ustawienie Nobody Time:
    
    Sent by WiFi module:
    55 AA	00	06		00 08	680200040000003C	B7	
    HEADER	VER=00	SetDP		LEN	dpId=104 Val V=60		CHK	
    
    Received by WiFi module:
    55 AA	03	07		00 08	68 02 00 04 0000003C 		BB	
    HEADER	VER=03	State		LEN	dpId=104 Val V=60	CHK	
    


    Aktualizacja luminancji z TuyaMCU:
    
    Received by WiFi module:
    55 AA	03	07		00 08	67 02 00 04 00000012 		90	
    HEADER	VER=03	State		LEN	dpId=103 Val V=18	CHK	
    


    Wszystko powyższe wydaje się logiczne, a wartości są zgodne z moimi ustawieniami w aplikacji smart life. Jak widać, Tuya MCU przesyła z powrotem wszystkie otrzymane dane, zakładam, że służy to weryfikacji.

    Jednak, jak można już zauważyć, nie obejmuje to jeszcze faktycznego odbioru głównej wartości czujnika: obecności.
    Gdy obecność zostanie wykryta lub nie zostanie już znaleziona, jest to wysyłane z TuyaMCU do Wifi MCU, jednak ta wiadomość nie wydaje się być zgodna z protokołem.

    Wykryto obecność:
    
    Received by WiFi module:
    55 AA	03	22		00 05	6504000100	93	
    HEADER	VER=03	Unk		LEN	6504000100	CHK	
    
    Sent by WiFi module:
    55 AA	00	23		00 01	01	24	
    HEADER	VER=00	Unk		LEN	01	CHK	
    


    Nie wykryto obecności:
    
    Received by WiFi module:
    55 AA	03	22		00 05	6504000101	94	
    HEADER	VER=03	Unk		LEN	6504000101	CHK	
    
    Sent by WiFi module:
    55 AA	00	23		00 01	01	24	
    HEADER	VER=00	Unk		LEN	01	CHK
    


    Wygląda na to, że jest to "normalna" operacja ustawiania DPID TuyaMCU, z pominięciem niektórych bajtów.
    Komenda #22 nie jest rozpoznawana przez narzędzie analizatora TuyaMCU.
    Ostatnia wartość wydaje się jednak odpowiadać oczekiwanym wartościom 0 i 1 (choć odwróconym).

    W celach weryfikacyjnych sprawdziłem dpid, że stan obecności powinien być używany w środowisku Tuya Developer Cloud, co można zobaczyć na poniższym obrazku:
    Dziennik zdarzeń czujnika obecności pokazujący stan i szczegóły komunikacji. .
    Ten obraz pokazuje, że "kod" lub dpid powinien wynosić 101, co odpowiada "65" w pakiecie wysłanym przez TuyaMCU.

    W tym momencie utknąłem, próbując zaimplementować ten czujnik w openbeken, ponieważ nie wiem, jak mogę zaimplementować / pracować z tym nieprawidłowym / nieznanym pakietem TuyaMCU.

    Może jest ktoś, kto może mi pomóc?
  • REKLAMA
  • #2 21358200
    vandenelsenkoen
    Poziom 3  
    Posty: 4
    Ocena: 3
    Dla wszystkich zainteresowanych, ściągnąłem oryginalny plik bin oprogramowania układowego za pomocą narzędzia BK7231 Flasher:

    presence_s...-31-47.bin (2 MB)Musisz być zalogowany, aby pobrać ten załącznik. .
  • REKLAMA
  • Pomocny post
    #3 21358291
    divadiow
    Poziom 38  
    Posty: 5060
    Pomógł: 438
    Ocena: 893
    Super. dzięki za opublikowanie kopii zapasowej.

    Oto kilka innych fragmentów, które mogą być powtórzeniem informacji, które już opublikowałeś

    Rejestruje się jako 001HPS01_5.8G po sparowaniu z Tuyą.

    obecny w binarnym po sparowaniu:

    Kod: JSON
    Zaloguj się, aby zobaczyć kod



    dpIDs

    Kod: JSON
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 21359011
    vandenelsenkoen
    Poziom 3  
    Posty: 4
    Ocena: 3
    >>21358291

    Wow, bardzo fajnie, że jesteś w stanie uzyskać wszystkie te informacje z tego pliku bin!
    Wydaje się, że w większości pasują one do informacji, które uzyskałem z komunikacji UART, co warto wiedzieć.
    Interesujące jest to, że "czas nikogo" lub "opóźnienie obecności" może być dowolną wartością od 0 do 180, zamiast tylko wartości, które można wybrać w aplikacji smart life (30, 60, 90, 120).

    Bardzo interesujące jest to, że dpid 101 dla obecności pojawia się jako "zwykły" dpid. Wygląda na to, że zarówno oryginalny plik bin, jak i środowisko Tuya Cloud Developer pokazują go jako normalny dpid, tylko komunikacja uart nie.

    Mogę spróbować skonfigurować oprogramowanie openbeken, zakładając, że wszystkie dpid są regularne, aby zobaczyć, co robi / czego nie robi.
  • #5 21360585
    vandenelsenkoen
    Poziom 3  
    Posty: 4
    Ocena: 3
    Dobre wieści!

    Wydaje się, że wartość obecności jest odbierana przez sterownik TuyaMCU w OpenBeken, a jej wartość jest poprawnie aktualizowana.

    Dla porównania, to jest plik autoexec.bat, którego teraz używam/testuję:

    
    startDriver TuyaMCU
    
    // always report paired
    tuyaMcu_defWiFiState 4
    // baud
    tuyaMcu_setBaudRate 9600
    
    // 101 is presence alarm
    setChannelType 1 ReadOnly
    setChannelLabel 1 Presence
    linkTuyaMCUOutputToChannel 101 bool 1
    
    // 103 is light sensor
    setChannelType 2 ReadOnly
    setChannelLabel 2 Lux
    linkTuyaMCUOutputToChannel 103 val 2 
    
    // 105 is dp_motion_sensitivity
    setChannelType 3 TextField
    setChannelLabel 3 Motion_Sensitivity 
    linkTuyaMCUOutputToChannel 105 val 3
    
    // 110 is dp_motion_range_lower
    setChannelType 4 TextField
    setChannelLabel 4 Motion_Min_Centimeters
    linkTuyaMCUOutputToChannel 110 val 4
    
    // 109 is dp_motion_range_upper
    setChannelType 5 TextField
    setChannelLabel 5 Motion_Max_Centimeters
    linkTuyaMCUOutputToChannel 109 val 5
    
    //104 is presence delay
    setChannelType 6 TextField
    setChannelLabel 6 Presence_Delay
    linkTuyaMCUOutputToChannel 104 val 6
    
    // 107 is dp_micro_sensitivity
    setChannelType 7 TextField
    setChannelLabel 7 Micro_Sensitivity 
    linkTuyaMCUOutputToChannel 107 val 7
    
    // 112 is dp_micro_range_lower
    setChannelType 8 TextField
    setChannelLabel 8 Micro_Min_Centimeters
    linkTuyaMCUOutputToChannel 112 val 8
    
    // 111 is dp_micro_range_upper
    setChannelType 9 TextField
    setChannelLabel 9 Micro_Max_Centimeters
    linkTuyaMCUOutputToChannel 111 val 9
    


    Nadal nie mam pojęcia, dlaczego dpid 101 jest z jakiegoś powodu wysyłany przy użyciu różnych typów poleceń i formatowania wiadomości, ale sterownik TuyaMCU wydaje się być w stanie obsłużyć go bez żadnych problemów...!

    Poniżej dwa obrazy przedstawiające stan pracy czujnika, należy zauważyć, że wartość obecności jest odwrócona (zgodnie z oczekiwaniami), więc 0 oznacza, że ktoś został wykryty. (można to również zauważyć w niższej wartości luminancji, ponieważ położyłem rękę nad czujnikiem, aby wykryć obecność, co spowodowało niższą wartość światła wykrytą przez czujnik).

    Zrzut ekranu przedstawiający stronę konfiguracji czujnika z różnymi ustawieniami do edycji. Zrzut ekranu strony konfiguracyjnej czujnika obecności z ustawieniami kanałów.

    Dodano po 2 [godzinach] 3 [minutach]:

    Aktualizacja:

    Na podstawie tego postu P.Kaczmarka2:
    topic3987582 .
    Zaktualizowałem plik autoexec.bat, aby zawierał teraz odwołanie przycisku do strony konfiguracji i zaimplementowałem tę stronę konfiguracji.
    Dodam oba poniżej.

    Autoexec:
    
    startDriver TuyaMCU
    startDriver httpButtons
    
    setButtonEnabled 0 1
    setButtonLabel 0 "Open Sensor Config"
    setButtonCommand 0 "*/api/lfs/cfg.html"
    setButtonColor 0 "#FF0000"
    
    // always report paired
    tuyaMcu_defWiFiState 4
    // baud
    tuyaMcu_setBaudRate 9600
    
    // 101 is presence alarm
    setChannelType 1 Motion_n
    linkTuyaMCUOutputToChannel 101 bool 1
    
    // 103 is light sensor
    setChannelType 2 Illuminance
    linkTuyaMCUOutputToChannel 103 val 2 
    
    // 105 is dp_motion_sensitivity
    setChannelType 3 TextField
    setChannelLabel 3 Motion_Sensitivity 
    linkTuyaMCUOutputToChannel 105 val 3
    
    // 110 is dp_motion_range_lower
    setChannelType 4 TextField
    setChannelLabel 4 Motion_Min_Centimeters
    linkTuyaMCUOutputToChannel 110 val 4
    
    // 109 is dp_motion_range_upper
    setChannelType 5 TextField
    setChannelLabel 5 Motion_Max_Centimeters
    linkTuyaMCUOutputToChannel 109 val 5
    
    //104 is presence delay
    setChannelType 6 TextField
    setChannelLabel 6 Presence_Delay
    linkTuyaMCUOutputToChannel 104 val 6
    
    // 107 is dp_micro_sensitivity
    setChannelType 7 TextField
    setChannelLabel 7 Micro_Sensitivity 
    linkTuyaMCUOutputToChannel 107 val 7
    
    // 112 is dp_micro_range_lower
    setChannelType 8 TextField
    setChannelLabel 8 Micro_Min_Centimeters
    linkTuyaMCUOutputToChannel 112 val 8
    
    // 111 is dp_micro_range_upper
    setChannelType 9 TextField
    setChannelLabel 9 Micro_Max_Centimeters
    linkTuyaMCUOutputToChannel 111 val 9
    


    Strona konfiguracyjna html (cfg.html):
    
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Radar Control</title>
        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
    </head>
    
    <body>
        <div class="container mt-5 text-center">
            <h1 class="mb-3">Presence Sensor Controller</h1>
            <div class="row">
                <div class="col-md-4 offset-md-4">
                    <div class="card">
                        <div class="card-body">
                            <h2 class="card-title mb-4">Sensor Results</h2>
                            <div class="mt-5">
                                <label for="presence">Presence: <strong id="presence">?</strong></label>
                            </div>
                            <div class="mt-3">
                                <label for="lux">Illuminance: <strong id="lux">?</strong></label>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
    
            <div class="row">
                <div class="col-md-4 offset-md-4">
                    <div class="card">
                        <div class="card-body">
                            <h2 class="card-title mb-4">Configure Sensor</h2>
                            <div class="mt-5">
                                <p>
                                    <label for="motion-sensitivity">Motion Sensitivity (0-10):</label>
                                </p>
                                <input type="range" class="form-range" id="motion-sensitivity" min="0" max="10" value="5"
                                    step="1" list="sensitivity-values" onchange="onChange_Motion_Sens(this.value)">
                            </div>
                            <div class="mt-3">
                                <p>
                                    <label for="motion-min-distance">Motion Minimum Distance (0-600):</label>
                                </p>
                                <input type="range" class="form-range" id="motion-min-distance" min="0" max="600" value="0"
                                    step="10" list="distance-values" onchange="onChange_Motion_Min(this.value)">
                            </div>
                            <div class="mt-3">
                                <p>
                                    <label for="motion-max-distance">Motion Maximum Distance (0-600):</label>
                                </p>
                                <input type="range" class="form-range" id="motion-max-distance" min="0" max="600" value="30"
                                    step="10" list="distance-values" onchange="onChange_Motion_Max(this.value)">
                            </div>
                            <div class="mt-5">
                                <p>
                                    <label for="micro-sensitivity">Micro Sensitivity (0-10):</label>
                                </p>
                                <input type="range" class="form-range" id="micro-sensitivity" min="0" max="10" value="5"
                                    step="1" list="sensitivity-values" onchange="onChange_Micro_Sens(this.value)">
                            </div>
                            <div class="mt-3">
                                <p>
                                    <label for="micro-min-distance">Micro Minimum Distance (0-600):</label>
                                </p>
                                <input type="range" class="form-range" id="micro-min-distance" min="0" max="600" value="0"
                                    step="10" list="distance-values" onchange="onChange_Micro_Min(this.value)">
                            </div>
                            <div class="mt-3">
                                <p>
                                    <label for="micro-max-distance">Micro Maximum Distance (0-600):</label>
                                </p>
                                <input type="range" class="form-range" id="micro-max-distance" min="0" max="600" value="30"
                                    step="10" list="distance-values" onchange="onChange_Micro_Max(this.value)">
                            </div>
                            <div class="mt-5">
                                <p>
                                    <label for="presence-delay">Presence Delay (0-180):</label>
                                </p>
                                <input type="range" class="form-range" id="presence-delay" min="0" max="180" value="10"
                                    step="1" onchange="onChange_Pres_Delay(this.value)">
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="container mt-4 text-center">
            <a href="/">Back to Main Page</a>
        </div>
    
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
        <script>
            // http://192.168.xxx.xxx/api/lfs/cfg.html
            let baseURL = "";
            let channel_presence = 1;
            let channel_lux = 2;
            let channel_motion_dist_min = 4;
            let channel_motion_dist_max = 5;
            let channel_motion_sens = 3;
            let channel_micro_dist_min = 8;
            let channel_micro_dist_max = 9;
            let channel_micro_sens = 7;
            let channel_presence_delay = 6;
    
            // Function to update the motion minimum distance value
            function onChange_Motion_Min(val) {
                if (val > document.getElementById('motion-max-distance').value) {
                    document.getElementById('motion-max-distance').value = val;
                    setChannel(channel_motion_dist_max, val);
                }
                setChannel(channel_motion_dist_min, val);
            }
    
            // Function to update the motion maximum distance value
            function onChange_Motion_Max(val) {
                if (val < document.getElementById('motion-min-distance').value) {
                    document.getElementById('motion-min-distance').value = val;
                    setChannel(channel_motion_dist_min, val);
                }
                setChannel(channel_motion_dist_max, val);
            }
    
            // Function to update the motion sensitivity value
            function onChange_Motion_Sens(val) {
                setChannel(channel_motion_sens, val);
            }
    
            // Function to update the micro minimum distance value
            function onChange_Micro_Min(val) {
                if (val > document.getElementById('micro-max-distance').value) {
                    document.getElementById('micro-max-distance').value = val;
                    setChannel(channel_micro_dist_max, val);
                }
                setChannel(channel_micro_dist_min, val);
            }
    
            // Function to update the micro maximum distance value
            function onChange_Micro_Max(val) {
                if (val < document.getElementById('micro-min-distance').value) {
                    document.getElementById('micro-min-distance').value = val;
                    setChannel(channel_micro_dist_min, val);
                }
                setChannel(channel_micro_dist_max, val);
            }
    
            // Function to update the micro sensitivity value
            function onChange_Micro_Sens(val) {
                setChannel(channel_micro_sens, val);
            }
    
            // Function to update the presence delay value
            function onChange_Pres_Delay(val) {
                setChannel(channel_presence_delay, val);
            }
    
            // Function to set a channel value through a REST API call
            function setChannel(ch, val) {
                console.log("Sending new value to OBK API, changes channel " + ch + " to " + val);
                fetch(baseURL + '/cm?cmnd=SetChannel ' + ch + ' ' + val, {
                    method: 'GET'
                })
                    .then(response => {
                        if (response.ok) {
                            response.text().then(data => {
                                console.log("OK");
                                // Handle successful response
                            });
                        } else {
                            throw new Error('Network response was not ok');
                        }
                    })
                    .catch(error => {
                        // Handle fetch error or error during response processing
                        console.error('Error:', error);
                    });
            }
    
            // Function to retrieve channel values from the REST API
            function getChannels() {
                fetch(baseURL + '/cm?cmnd=Ch', {
                    method: 'GET'
                })
                    .then(response => {
                        response.json().then(data => {
                            console.log(data);
                            const motion_dist_min = data['Ch' + channel_motion_dist_min];
                            const motion_dist_max = data['Ch' + channel_motion_dist_max];
                            const motion_sens = data['Ch' + channel_motion_sens];
                            const micro_dist_min = data['Ch' + channel_micro_dist_min];
                            const micro_dist_max = data['Ch' + channel_micro_dist_max];
                            const micro_sens = data['Ch' + channel_micro_sens];
                            const presence_delay = data['Ch' + channel_presence_delay];
                            console.log("Cur values received correctly!");
                            document.getElementById('motion-min-distance').value = motion_dist_min;
                            document.getElementById('motion-max-distance').value = motion_dist_max;
                            document.getElementById('motion-sensitivity').value = motion_sens;
                            document.getElementById('micro-min-distance').value = micro_dist_min;
                            document.getElementById('micro-max-distance').value = micro_dist_max;
                            document.getElementById('micro-sensitivity').value = micro_sens;
                            document.getElementById('presence-delay').value = presence_delay;
                            const presence = data['Ch' + channel_presence];
                            const lux = data['Ch' + channel_lux];
                            document.getElementById('presence').innerText = presence;
                            document.getElementById('lux').innerText = lux;
                        });
                    });
            }
    
            // Start the countdown timer when the page loads
            window.onload = function () {
                getChannels();
                setInterval(getChannels, 1000);
            };
        </script>
    </body>
    
    <datalist id="sensitivity-values">
        <option value="0" label="0"></option>
        <option value="2" label="2"></option>
        <option value="4" label="4"></option>
        <option value="6" label="6"></option>
        <option value="8" label="8"></option>
        <option value="10" label="10"></option>
    </datalist>
    
    <datalist id="distance-values">
        <option value="0" label="0"></option>
        <option value="100" label="100"></option>
        <option value="200" label="200"></option>
        <option value="300" label="300"></option>
        <option value="400" label="400"></option>
        <option value="500" label="500"></option>
        <option value="600" label="600"></option>
    </datalist>
    
    </html>
    


    Wszystko to prowadzi do strony konfiguracyjnej, którą można zobaczyć na poniższym obrazku:
    Panel kontrolny czujnika obecności z wynikami i opcjami konfiguracji
    Wizualnie zdecydowanie można to poprawić, ale funkcjonalnie działa poprawnie.
REKLAMA