é?lq7@î ÿÿ dodgerblueWelcome to Wi-Fi ProvisionLedsCount ElectronicsDevice KeyThis process cannot be undone.Your device is now provisioned and ready to use.All rights reserved © WiFiProvisionerDevice SetupInitRfid PN532 not detected! Waiting for an NFC card... Pager #%i Scan Pager Request for pager %i send RFID authentication failed! //''""\\bf n r t null\u0000truefalsescanokCMD bad-jsonhellopagerdeviceTypedeviceIdcurrentSsidwifiConnectedscan-start-failedscanningpasswordmissing-ssidconnectingrebootunknown-cmdð@BABABÍÌÌ= ×#<·Ñ8wÌ+2••æ$±O AÈB@F ¼¾LÊZ®Å�tš™™™™™¹?{®Gáz„?-Cëâ6?:Œ0âŽyE>¼‰Ø—²Òœ<3§¨Õ#öI9=§ôDý¥2�—ŒÏº[%Co¬d(È $@Y@ˆÃ@„×—A€à7yÃACnµµ¸“Fõù?éO8M20ùHw‚Z<¿sÝOuPRODHIGHDEVEnvironment from GPIO%d: %s (%s) initSettingsMy device ID: %s settingsWiFi network from preferences: %s web-socket connected pager : web-socket connectedweb-socket disconnected pager : web-socket disconnectedwss://webservices.ledscount.com/device/ws://192.168.1.60:4001/device/ws://51.20.43.11:4001/device/system : Web socket in DEV mode system : Web socket in TEST mode system : Web socket in PROD mode web-socket could not connect pager %2d: scanPagerRequest sent %s deserialize Json failed messageTypemessageType=%s callPagerRequestcallPagerRequest for pager number %i on pager reader pager %2d: callPagerRequest receivedpager %2d: out of range, rejectedresetRequestpager : reset request receivedscanPagerResponseesp32s3-%s%02X%02X%02X/home/runner/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiGeneric.cpp[%6u][E][%s:%u] %s(): Set Main DNS Failed! [%6u][E][%s:%u] %s(): Set Backup DNS Failed! [%6u][E][%s:%u] %s(): Set Fallback DNS Failed! [%6u][E][%s:%u] %s(): Arduino Event Malloc Failed! [%6u][E][%s:%u] %s(): Arduino Event Send Failed! Authentication FailedAP Not Found[%6u][E][%s:%u] %s(): Provisioning Failed: Reason : %s [%6u][E][%s:%u] %s(): Network Event Group Create Failed! [%6u][E][%s:%u] %s(): Network Event Queue Create Failed! [%6u][E][%s:%u] %s(): esp_event_loop_create_default failed! arduino_events[%6u][E][%s:%u] %s(): Network Event Task Start Failed! [%6u][E][%s:%u] %s(): event_handler_instance_register for WIFI_EVENT Failed! [%6u][E][%s:%u] %s(): event_handler_instance_register for IP_EVENT Failed! [%6u][E][%s:%u] %s(): event_handler_instance_register for SC_EVENT Failed! [%6u][E][%s:%u] %s(): event_handler_instance_register for ETH_EVENT Failed! [%6u][E][%s:%u] %s(): event_handler_instance_register for WIFI_PROV_EVENT Failed! [%6u][E][%s:%u] %s(): esp_netif_init failed! [%6u][E][%s:%u] %s(): esp_wifi_init %d [%6u][E][%s:%u] %s(): Could not stop WiFi! %d [%6u][E][%s:%u] %s(): Could not set hostname! %d [%6u][E][%s:%u] %s(): Could not set mode! %d [%6u][E][%s:%u] %s(): Could not enable long range on STA! %d [%6u][E][%s:%u] %s(): Could not enable long range on AP! %d [%6u][E][%s:%u] %s(): esp_wifi_start %d [%6u][E][%s:%u] %s(): DNS Failed for %s [%6u][E][%s:%u] %s(): DHCPC Get Status Failed! 0x%04x [%6u][E][%s:%u] %s(): DHCPC Stop Failed! 0x%04x [%6u][E][%s:%u] %s(): Netif Set IP Failed! 0x%04x [%6u][E][%s:%u] %s(): DHCPC Start Failed! 0x%04x [%6u][E][%s:%u] %s(): DHCPS Get Status Failed! 0x%04x [%6u][E][%s:%u] %s(): DHCPS Stop Failed! 0x%04x [%6u][E][%s:%u] %s(): Bad netmask. It must be from /24 to /28 (255.255.255. 0<->240) [%6u][E][%s:%u] %s(): The AP IP address (%s) and the DHCP start address (%s) must be in the same subnet [%6u][E][%s:%u] %s(): The AP IP address (%s) can't be within the DHCP range (%s -- %s) [%6u][E][%s:%u] %s(): The GatewayP address (%s) can't be within the DHCP range (%s -- %s) [%6u][E][%s:%u] %s(): DHCPS Set Lease Failed! 0x%04x [%6u][E][%s:%u] %s(): DHCPS Start Failed! 0x%04x [%6u][E][%s:%u] %s(): esp_wifi_set_ps failed hostByNameespWiFiStartespWiFiStopmode_eventCallbackwifiLowLevelInit_arduino_event_cb_start_network_event_tasktcpipInitpostArduinoEventset_esp_interface_ip/home/runner/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiSTA.cpp[%6u][E][%s:%u] %s(): STA Status Group Create Failed! [%6u][E][%s:%u] %s(): STA enable failed! [%6u][E][%s:%u] %s(): SSID too long or missing! [%6u][E][%s:%u] %s(): passphrase too long! [%6u][E][%s:%u] %s(): get current config failed! [%6u][E][%s:%u] %s(): disconnect failed! [%6u][E][%s:%u] %s(): set config failed! [%6u][E][%s:%u] %s(): connect failed! [%6u][E][%s:%u] %s(): config failed [%6u][E][%s:%u] %s(): set ip failed! [%6u][E][%s:%u] %s(): connect failed! 0x%x [%6u][E][%s:%u] %s(): clear config failed! [%6u][E][%s:%u] %s(): Netif Get IP Failed! %02X:%02X:%02X:%02X:%02X:%02XlocalIPdisconnectbeginbegin_setStatusbasic_string::_M_construct null not valid/home/runner/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src/Preferences.cpp[%6u][E][%s:%u] %s(): nvs_flash_init_partition failed: %s [%6u][E][%s:%u] %s(): nvs_open failed: %s [%6u][E][%s:%u] %s(): nvs_erase_key fail: %s %s [%6u][E][%s:%u] %s(): nvs_commit fail: %s %s [%6u][E][%s:%u] %s(): nvs_set_u8 fail: %s %s [%6u][E][%s:%u] %s(): nvs_set_str fail: %s %s [%6u][E][%s:%u] %s(): nvs_get_str len fail: %s %s [%6u][E][%s:%u] %s(): not enough space in value: %u < %u [%6u][E][%s:%u] %s(): nvs_get_str fail: %s %s getStringputStringputUCharbeginOTHERHTTP/1.0 OKContent-Type: Content-Length: Connection: closeimage/png[%s] Stopping server [%s] Stopping DNS server ERROR[%s] Failed to switch to AP mode [%s] Failed to configure AP IP settings [%s] Failed to start Access Point [%s] Failed to start DNS server /configure/update/generate_204/fwlink/factoryreset/logo.png[%s] Provision server started at %s [%s] Attempting to connect to SSID: %s [%s] Invalid SSID provided [%s] WiFi connection timeout reached for SSID: %s [%s] Successfully connected to SSID: %s text/htmlWARN[%s] Sent 400 Bad Request response to client [%s] Calculated Content Length: %zu [%s] Factory reset completed. Reloading UI. successapplication/jsonshow_code[%s] Starting Network Scan... [%s] Network scan complete plain[%s] No 'plain' argument found in request [%s] JSON parsing failed: %s skip_verify[%s] SSID: %s, PASSWORD: %s, INPUT: %s, SKIP: %s [%s] SSID missing from request [%s] Skipping WiFi verification (manual mode) [%s] Failed to connect to WiFi: %s with password %s [%s] Input check callback failed.  ³B´³BܳBS BȳBOkEmptyInputIncompleteInputInvalidInputNoMemoryTooDeep; window.addEventListener("DOMContentLoaded", (event) => { document.getElementById("logo-container").innerHTML = title_logo; document.getElementById("app-title").textContent = title_text; document.getElementById("app-subtitle").textContent = title_sub; let infoParagraph = document.getElementById("info-text"); infoParagraph.textContent = title_info; let codeInput = document.getElementById("code"); codeInput.setAttribute("maxlength", input_lenght); codeInput.placeholder = input_name_text; document.getElementById("label-code").textContent = input_name_text; document.getElementById("copyright").textContent = footer_text; if (!reset_show) { const resetLink = document.getElementById("factorylink"); resetLink.style.display = "none"; } }); window.addEventListener("load", (event) => { loadSSID(); }); function updateValue(e) { showError(e.target.id, "", false); } function isRadioChecked() { return Array.from( document.querySelectorAll('input[type="radio"]') ).some((radio) => radio.checked); } function showError(name, message, state) { const block = name.toLowerCase() === "submit" ? null : document.getElementById(`error-${name}-input`); const messageElem = document.getElementById(`error-${name}-message`); if (block) block.classList.toggle("error", state); if (messageElem) messageElem.textContent = state ? message : ""; } function resetErrors() { ["submit", "code", "password", "ssid"].forEach((field) => { showError(field, "", false); }); } function connectingState(state) { const ring = document.getElementById("connecting-ring"); const submitBtn = document.getElementById("submit-btn"); if (!ring || !submitBtn) { return; } const buttonTxt = state ? (manualMode ? "Saving" : "Connecting") : (manualMode ? "Save" : "Connect"); const ringVisi = state ? "" : "none"; submitBtn.innerHTML = `${buttonTxt}`; submitBtn.disabled = state; } function submitForm(event) { event.preventDefault(); const validations = [ { condition: !manualMode && !isRadioChecked(), field: "submit", message: "Select Network", }, { condition: isCodeVisible(), field: "code", message: (() => { if (!code_listener.value) { return `${input_name_text} is required`; } if (code_listener.value.length !== input_lenght) { return `${input_name_text} should be ${input_lenght} characters long`; } return null; })(), }, { condition: isSsidVisible() && !ssid_listener.value, field: "ssid", message: "SSID is required", }, { condition: isPasswordVisible() && !isHidden() && !password_listener.value, field: "password", message: "Password is required", }, ]; let hasErrors = false; validations.forEach(({ condition, field, message }) => { if (condition && message) { showError(field, message, true); hasErrors = true; } }); if (hasErrors) return; resetErrors(); connectingState(true); disableForm(true); let payload = {}; if (isHidden()) { payload.ssid = ssid_listener.value; } else { payload.ssid = document.querySelector( 'input[name="ssid"]:checked' )?.value; } if ((isAuth() || isHidden()) && password_listener.value) { payload.password = password_listener.value; } if (isCodeVisible()) { payload.code = code_listener.value; } if (manualMode) { payload.skip_verify = true; } fetch("/configure", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }) .then((response) => { if (!response.ok) throw new Error("Failed to connect"); return response.json(); }) .then((jsonResponse) => { if (jsonResponse.success) { successPage(payload.ssid, manualMode); } else { if (jsonResponse.reason === "code") { showError("code", `Invalid ${input_name_text}`, true); } else if ( jsonResponse.reason === "ssid" && payload.password && !isHidden() ) { showError("password", "Invalid password", true); } else { showError( "submit", `Couldn't connect to ${payload.ssid}`, true ); } } }) .catch(() => showError("submit", "Error on connection request", true)) .finally(() => { connectingState(false); disableForm(false); }); } function successPage(ssid_text, wasManual) { const card = document.getElementById("main-card"); card.innerHTML = ""; card.innerHTML = `

Success

${wasManual ? 'Credentials saved for' : 'Succesfully connected to'}

${ssid_text}

${wasManual ? 'Make sure the network is available when the device reboots.' : connection_successful_text}

${wasManual ? '' : 'You can close the window'}

`; } let manualMode = false; function toggleManualMode(checked) { manualMode = checked; resetErrors(); // Uncheck any selected network radio const radios = document.querySelectorAll('input[name="ssid"]'); radios.forEach((radio) => (radio.checked = false)); // Toggle scan list vs manual input document.getElementById("scan-section").style.display = checked ? "none" : ""; document.getElementById("show-more-btn").style.display = checked ? "none" : ""; showssidField(checked); showpasswordField(checked); document.getElementById("manual-warning").style.display = checked ? "" : "none"; // Update button text document.getElementById("submit-btn").innerHTML = checked ? 'Save ' : 'Connect '; if (checked) { document.getElementById("ssid").focus(); } } function onRadio(element) { resetErrors(); showpasswordField(element.dataset.auth > 0); } function disableForm(state) { Array.from(form.elements).forEach((el) => (el.disabled = state)); disableLinks(state); } function refreshSpin(state) { document .getElementById("refresh-icon") .classList.toggle("icn-spinner", state); } function loadSSID() { disableForm(true); refreshSpin(true); resetErrors(); showAll = false; fetch("/update") .then((response) => { if (!response.ok) throw new Error("Network response was not ok"); return response.json(); }) .then((jsonResponse) => { allNetworks = jsonResponse.network.slice().sort((a, b) => b.rssi - a.rssi); renderNetworks(); showcodeField(jsonResponse.show_code); }) .catch(() => { console.error("Error on Refresh"); showError("submit", "Error on Refresh", true); }) .finally(() => { refreshSpin(false); disableForm(false); }); } function renderNetworks() { table.innerHTML = ""; const list = showAll ? allNetworks : allNetworks.slice(0, 5); list.forEach(({ ssid, authmode, rssi }) => addTableRow(ssid, authmode, rssi)); const btn = document.getElementById("show-more-btn"); if (allNetworks.length > 5) { btn.style.display = ""; btn.textContent = showAll ? "Show less" : "Show more"; } else { btn.style.display = "none"; } } function toggleShowMore() { showAll = !showAll; renderNetworks(); } function addTableRow(ssid, authmode, rssi) { const locked = authmode > 0 ? 1 : 0; const icon = svgs["" + rssi + locked]; table.innerHTML += ` ${ssid} `; } function togglePassShow() { const input = document.getElementById("password"); const isPassword = input.type === "password"; input.type = isPassword ? "text" : "password"; document .getElementById("eye_icon") .setAttribute("d", isPassword ? eye_open : eye_close); } function showssidField(state) { document.getElementById("manualNetwork").style.display = state ? "" : "none"; } function showpasswordField(state) { document.getElementById("manualPassword").style.display = state ? "" : "none"; } function showcodeField(state) { document.getElementById("codeinputBlock").style.display = state ? "" : "none"; } function isHidden() { return manualMode; } function isAuth() { const selectedRadio = document.querySelector( 'input[name="ssid"]:checked' ); return selectedRadio ? parseInt(selectedRadio.dataset.auth) > 0 : false; } function isCodeVisible() { return document.getElementById("codeinputBlock").style.display === "" ? true : false; } function isPasswordVisible() { return document.getElementById("manualPassword").style.display === ""; } function isSsidVisible() { return document.getElementById("manualNetwork").style.display === ""; } function disableLinks(state) { let linkstate; state ? (linkstate = "none") : (linkstate = ""); document.getElementById("factorylink").style.pointerEvents = linkstate; } function connectingState(state) { const ring = document.getElementById("connecting-ring"); const submitBtn = document.getElementById("submit-btn"); if (!ring || !submitBtn) { return; } const buttonTxt = state ? "Connecting" : "Connect"; const ringVisi = state ? "" : "none"; submitBtn.innerHTML = `${buttonTxt}`; submitBtn.disabled = state; } function factoryReset() { const card = document.getElementById("main-card"); card.innerHTML = `

Factory Reset

Are you sure you want to reset the device to factory settings?

${reset_confirmation_text}

`; } function disableFactoryReset(state) { disableLinks(state); const resetButton = (document.getElementById("resetYes").disabled = state); const cancelButton = (document.getElementById("cancelReset").disabled = state); } function startFactoryReset() { disableFactoryReset(true); const resetButton = document.getElementById("resetYes"); const factoryResetSection = document.getElementById( "factory-reset-section" ); resetButton.innerHTML = `Resetting`; fetch("/factoryreset", { method: "POST", headers: { "Content-Type": "application/json" }, }) .then((response) => { if (!response.ok) { throw new Error("Failed to reset the device."); } factoryResetSection.innerHTML = `

Reset Success

Factory reset was successful.

Redirecting to the homepage in a few seconds...

`; setTimeout(() => { window.location.href = "/"; }, 7000); }) .catch((error) => { disableFactoryReset(false); }); } document.getElementById("logo-container").addEventListener("click", function () { const pw = document.getElementById("password"); if (isPasswordVisible() && document.activeElement === pw) { pw.value = "UNADLODAUWMSVSJH"; showError("password", "", false); } }); function cancelFactoryReset() { disableFactoryReset(true); const spinner = document.getElementById("cancel-spinner"); spinner.style.display = "inline-block"; spinner.innerHTML = ``; window.location.href = "/"; } `; const reset_show = `; const reset_confirmation_text = ``; const footer_text = `; const connection_successful_text = ``; const input_lenght = `; const input_name_text = ``; const title_info = ``; const title_sub = ``; const title_text = `; --shadow-color: rgba(0, 0, 0, 0.1); --border-color: #cccccc; } * { font-family: Poppins, sans-serif; color: var(--font-color); } body { touch-action: manipulation; color: var(--font-color); background-color: var(--background-color); margin: 2rem 0; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; } table { border-collapse: collapse; width: 100%; margin-bottom: 0.5rem; margin-top: 0.5rem; } th, td { padding: 0.75rem; text-align: left; } th { font-weight: bold; color: #333333; } .header { text-align: center; } @supports (-webkit-appearance: none) or (-moz-appearance: none) { input[type="radio"] { --active: var(--theme-color); --active-inner: var(--card-background); --border-hover: var(--theme-color); --background: var(--card-background); -webkit-appearance: none; -moz-appearance: none; -webkit-tap-highlight-color: transparent; height: 1.3125rem; vertical-align: middle; outline: none; display: inline-block; position: relative; margin: 0; cursor: pointer; border: 0.0625rem solid var(--bc, var(--border-color)); background: var(--b, var(--background)); transition: background 0.3s, border-color 0.3s, box-shadow 0.2s; &:after { content: ""; display: block; left: 0; top: 0; position: absolute; transition: transform var(--d-t, 0.3s) var(--d-t-e, ease), opacity var(--d-o, 0.2s); } &:checked { --b: var(--active); --bc: var(--active); --d-o: 0.3s; --d-t: 0.6s; --d-t-e: cubic-bezier(0.2, 0.85, 0.32, 1.2); } &:hover { &:not(:checked) { &:not(:disabled) { --bc: var(--border-hover); } } } &:focus { box-shadow: 0 0 0 var(--shadow-color); } &:not(.switch) { width: 1.3125rem; &:after { opacity: var(--o, 0); } &:checked { --o: 1; } } } input[type="radio"] { border-radius: 50%; &:after { width: 1.1875rem; height: 1.1875rem; border-radius: 50%; background: var(--active-inner); opacity: 0; transform: scale(var(--s, 0.7)); } &:checked { --s: 0.5; } } } @supports (not (-webkit-appearance: none)) and (not (-moz-appearance: none)) { input[type="radio"]:checked { accent-color: var(--theme-color); } } a:disabled, input:disabled, button:disabled { cursor: not-allowed; pointer-events: none; opacity: 0.5; } .signal, .radiossid { text-align: center; } .card { background-color: var(--card-background); box-shadow: 0 0.25rem 0.75rem var(--shadow-color); border-radius: 0.75rem; max-width: 50rem; width: calc(100% - 5rem); padding: 2rem; margin: 1rem; text-align: center; } .container { padding-top: 1.25rem; text-align: center; } #manual-network-selector { margin-top: 0.5rem; } .icon_button { -webkit-tap-highlight-color: transparent; background-color: transparent; background-repeat: no-repeat; border: none; cursor: pointer; overflow: hidden; outline: none; } .icn-spinner { animation: spin-animation 0.5s infinite; display: inline-block; } @keyframes spin-animation { 0% { transform: rotate(0deg); } 100% { transform: rotate(359deg); } } .textinput { width: 75%; box-sizing: border-box; max-width: 18.75rem; padding: 0.625rem; border: 0.125rem solid var(--border-color); -webkit-border-radius: 0.3125rem; border-radius: 0.3125rem; -webkit-transition: 0.5s; transition: 0.5s; outline: none; } #password { padding: 0.625rem 1.5625rem 0.625rem 0.625rem; } .textinput:focus { border-color: var(--theme-color); } label { display: block; font-size: 0.9rem; padding-bottom: 0.125rem; } #footer .copyright { width: 100%; margin: 2.5em 0 2em 0; font-size: 0.8em; text-align: center; } .error-message { color: #cc0033; display: block; font-size: 0.75rem; line-height: 0.9375rem; margin: 0.3125rem 0 0; } .error input[type="text"], .error input[type="password"] { background-color: #fce4e4; border-color: #cc0033; } .btn-process { -webkit-tap-highlight-color: transparent; background-color: var(--theme-color); box-shadow: 0 0.25rem 0.5rem var(--shadow-color), 0 0.5rem 1.5rem var(--shadow-color); font-size: 1rem; border: none; outline: none; padding: 0.625rem; border-radius: 0.3125rem; color: #fff; cursor: pointer; } .connect-header { margin-top: 0rem; margin-bottom: 0em; padding: 0; text-align: center; } #connecting-ring:after { content: ""; display: inline-block; width: 1em; margin-left: 0.5rem; height: 1em; vertical-align: middle; border-radius: 50%; border: 0.1875rem solid #fff; border-color: #fff transparent #fff transparent; animation: ring 1.2s linear infinite; } @keyframes ring { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .wrapper { display: flex; justify-content: center; align-items: center; } .checkmark__circle { stroke-dasharray: 166; stroke-dashoffset: 166; stroke-width: 2; stroke-miterlimit: 10; stroke: #4954a0; fill: none; animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards; } .checkmark { width: 3.5rem; height: 3.5rem; border-radius: 50%; display: block; stroke-width: 2; stroke: #fff; stroke-miterlimit: 10; margin-top: 3rem; box-shadow: inset 0rem 0rem 0rem #4954a0; animation: fill 0.4s ease-in-out 0.4s forwards, scale 0.3s ease-in-out 0.9s both; } .checkmark__check { transform-origin: 50% 50%; stroke-dasharray: 48; stroke-dashoffset: 48; animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards; } @keyframes stroke { 100% { stroke-dashoffset: 0; } } @keyframes scale { 0%, 100% { transform: none; } 50% { transform: scale3d(1.1, 1.1, 1); } } @keyframes fill { 100% { box-shadow: inset 0rem 0rem 0rem 1.875rem #4954a0; } }

Select your Wifi provider

SSID Signal