";rowSensor.insertAdjacentHTML("beforeend",t)}}}if(void 0!==t.door){if(void 0!==t.door.state){let e=t.door.state.replace(/_/g,"-").toLowerCase();const o=window.translateString("text-door-state-"+e);dashStatus.textContent=o}else{const t=window.translateString("text-door-state-nc");dashStatus.textContent=t}if(void 0!==t.door.position_current&&"not connected"!=t.door.position_current)dashPosition.textContent=t.door.position_current+"%",buildDoorAnimation(t.door.position_current);else{const t=window.translateString("text-door-state-nc");dashPosition.textContent=t,buildDoorAnimation(0)}void 0!==t.door.light&&(switchLight.checked=!0===t.door.light)}}async function doorControl(t){if("open"===t||"close"===t||"stop"===t||"half"===t||"vent"===t)try{const e=new URLSearchParams({action:t});if(!(await fetch("/api/control",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Access-Source":"webui",Authorization:savedToken},body:e})).ok)return void console.error("Door control failed")}catch(t){console.error("API error: ",t)}}async function lightControl(t){let e;"toggle"===t?e=new URLSearchParams({action:"light"}):"invert"==t&&(e=switchLight.checked?new URLSearchParams({action:"light",state:"on"}):new URLSearchParams({action:"light",state:"off"}));try{if(!(await fetch("/api/control",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Access-Source":"webui",Authorization:savedToken},body:e})).ok)return void console.error("Door control failed")}catch(t){console.error("API error: ",t)}}async function getDoorUpdates(){const t=new EventSource("/api/events");t.addEventListener("open",(function(t){console.log("Connected to door updates.")}),!1),t.addEventListener("door",(function(t){updateDashboard(JSON.parse(t.data))}),!1),t.addEventListener("error",(function(t){t.readyState==EventSource.CLOSED&&(console.error("Error connecting to live logs:",t),setTimeout(getDoorUpdates,5e3))}),!1)}async function checkForUpdates(){const t=localStorage.getItem("version_fw")||"0.0.0";try{const e=await fetch("https://api.github.com/repos/derDeno/PandaGarage/releases/latest");e.ok||console.log(`GitHub API returned an error: ${e.status}`);const o=await e.json();isNewerVersion(o.tag_name.replace(/^v/,""),t)&&(alertUpdate.style.display="block")}catch(t){console.error(`Error checking for updates: ${t.message}`)}}function isNewerVersion(t,e){const o=t=>{const[e,o]=t.split("-");return{parts:e.split(".").map(Number),pre:o||""}},n=o(t),r=o(e);for(let t=0;to)return!0;if(e0;var s,a}function doorSVG(){doorContainer.innerHTML='\n\t\t\n\t',buildDoorAnimation()}function buildDoorAnimation(t=0){const e=30.4,o=5*(1-Math.max(0,Math.min(100,t))/100),n=Math.floor(o),r=o-n,s=document.getElementById("door-panels");s.innerHTML="";for(let t=0;t0&&n<5){const t=16+34.4*n,o=document.createElementNS("http://www.w3.org/2000/svg","rect");o.setAttribute("x",16),o.setAttribute("y",t),o.setAttribute("width",168),o.setAttribute("height",e*r),o.setAttribute("fill","#212529"),s.appendChild(o)}}
\ No newline at end of file
+let alertUpdate,dashTemp,dashHum,dashLux,dashStatus,dashPosition,btnUp,btnDown,btnStop,switchLight,btnHalf,btnVent,dashExtCard,dashExtTitle,dashExtVal,dashExtUnit,rowSensor,doorContainer;document.addEventListener("DOMContentLoaded",init);const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),await loadDashboardData(),getDoorUpdates(),checkForUpdates(),doorSVG()}function cacheElements(){alertUpdate=document.getElementById("alert-update"),dashTemp=document.getElementById("dash-temp"),dashHum=document.getElementById("dash-hum"),dashLux=document.getElementById("dash-lux"),dashStatus=document.getElementById("door-status-val"),dashPosition=document.getElementById("door-position-val"),doorContainer=document.getElementById("door-container"),btnUp=document.getElementById("btn-door-up"),btnDown=document.getElementById("btn-door-down"),btnStop=document.getElementById("btn-door-stop"),switchLight=document.getElementById("switch-light"),btnHalf=document.getElementById("btn-door-half"),btnVent=document.getElementById("btn-door-vent"),dashExtCard=document.getElementById("dash-ext-card"),dashExtTitle=document.getElementById("dash-ext-title"),dashExtVal=document.getElementById("dash-ext-val"),dashExtUnit=document.getElementById("dash-ext-unit"),rowSensor=document.getElementById("sensor-row"),alertUpdate.style.display="none"}async function bindEvents(){btnUp.addEventListener("click",(async function(){doorControl("open")})),btnDown.addEventListener("click",(async function(){doorControl("close")})),btnStop.addEventListener("click",(async function(){doorControl("stop")})),switchLight.addEventListener("change",(async function(){lightControl("invert")})),btnHalf.addEventListener("click",(async function(){doorControl("half")})),btnVent.addEventListener("click",(async function(){doorControl("vent")}))}async function loadDashboardData(){try{const t=await fetch("/api/status");if(!t.ok)throw new Error("Response was not ok");const e=await t.json();localStorage.setItem("version_fw",e.version_fw||"0"),updateDashboard(e)}catch(t){console.error("Failed to load dashboard data:",t)}}function updateDashboard(t){void 0!==t.sensor&&(void 0!==t.sensor.temperature&&(dashTemp.textContent=Number(t.sensor.temperature).toFixed(2)),void 0!==t.sensor.humidity&&(dashHum.textContent=Number(t.sensor.humidity).toFixed(2)),void 0!==t.sensor.lux&&(dashLux.textContent=Number(t.sensor.lux).toFixed(2)),void 0!==t.sensor.externalSensor&&("none"==t.sensor.externalSensor?(dashExtCard.style.display="none",rowSensor.classList.remove("row-cols-lg-4"),rowSensor.classList.add("row-cols-lg-3")):(dashExtCard.style.display="block",rowSensor.classList.add("row-cols-lg-4"),rowSensor.classList.remove("row-cols-lg-3"),dashExtTitle.textContent=t.sensor.externalSensor.title,dashExtVal.textContent=t.sensor.externalSensor.val,dashExtUnit.textContent=t.sensor.externalSensor.unit))),void 0!==t.door&&(void 0!==t.door.state?dashStatus.textContent=t.door.state:dashStatus.textContent="not connected",void 0!==t.door.position_current?(dashPosition.textContent=t.door.position_current+"%",buildDoorAnimation(t.door.position_current)):dashPosition.textContent="not connected",void 0!==t.door.light&&(switchLight.checked=!0===t.door.light))}async function doorControl(t){if("open"===t||"close"===t||"stop"===t||"half"===t||"vent"===t)try{const e=new URLSearchParams({action:t});if(!(await fetch("/api/control",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Access-Source":"webui",Authorization:savedToken},body:e})).ok)return void console.error("Door control failed")}catch(t){console.error("API error: ",t)}}async function lightControl(t){let e;"toggle"===t?e=new URLSearchParams({action:"light"}):"invert"==t&&(e=switchLight.checked?new URLSearchParams({action:"light",state:"on"}):new URLSearchParams({action:"light",state:"off"}));try{if(!(await fetch("/api/control",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Access-Source":"webui",Authorization:savedToken},body:e})).ok)return void console.error("Door control failed")}catch(t){console.error("API error: ",t)}}async function getDoorUpdates(){const t=new EventSource("/api/events");t.addEventListener("open",(function(t){console.log("Connected to door updates.")}),!1),t.addEventListener("door",(function(t){updateDashboard(JSON.parse(t.data))}),!1),t.addEventListener("error",(function(t){t.readyState==EventSource.CLOSED&&(console.error("Error connecting to live logs:",t),setTimeout(getDoorUpdates,5e3))}),!1)}async function checkForUpdates(){const t=localStorage.getItem("version_fw")||"0.0.0";try{const e=await fetch("https://api.github.com/repos/derDeno/PandaGarage/releases/latest");e.ok||console.log(`GitHub API returned an error: ${e.status}`);const o=await e.json();isNewerVersion(o.tag_name.replace(/^v/,""),t)&&(alertUpdate.style.display="block")}catch(t){console.error(`Error checking for updates: ${t.message}`)}}function isNewerVersion(t,e){const o=t=>{const[e,o]=t.split("-");return{parts:e.split(".").map(Number),pre:o||""}},n=o(t),r=o(e);for(let t=0;to)return!0;if(e0;var s,a}function doorSVG(){doorContainer.innerHTML='\n\t\t\n\t',buildDoorAnimation()}function buildDoorAnimation(t=0){const e=30.4,o=5*(1-Math.max(0,Math.min(100,t))/100),n=Math.floor(o),r=o-n,s=document.getElementById("door-panels");s.innerHTML="";for(let t=0;t0&&n<5){const t=16+34.4*n,o=document.createElementNS("http://www.w3.org/2000/svg","rect");o.setAttribute("x",16),o.setAttribute("y",t),o.setAttribute("width",168),o.setAttribute("height",e*r),o.setAttribute("fill","#212529"),s.appendChild(o)}}
\ No newline at end of file
diff --git a/data/assets/js/i18n/de.json b/data/assets/js/i18n/de.json
index 7d8ad1a7..6b2a6cbb 100644
--- a/data/assets/js/i18n/de.json
+++ b/data/assets/js/i18n/de.json
@@ -1 +1 @@
-{"nav-dashboard":"Übersicht","nav-info":"Info","nav-logs":"Protokolle","nav-settings":"Einstellungen","nav-settings-device":"Gerät","nav-settings-garage-door":"Garagentor","nav-settings-security":"Sicherheit","nav-settings-wifi":"WLAN","nav-settings-ha":"Home Assistant","nav-settings-update":"Aktualisierung","nav-settings-restart":"Neustart","nav-settings-logout":"Abmelden","title-info-device":"Geräteinformationen","title-info-general":"Allgemeine Informationen","title-temp":"Temperatur","title-humidity":"Luftfeuchtigkeit","title-light":"Licht","title-404":"Ups... die gesuchte Seite konnte nicht gefunden werden :(","title-wifi-change":"WLAN ändern","title-wifi-manual":"Manuelle Methode","title-wifi-ap":"Hotspot-Methode","title-update":"OTA-Aktualisierung","title-security":"Sicherheit","title-settings":"Einstellungen","title-ha":"Home Assistant-Verbindung","title-garage-door":"Garagentor-Konfiguration","title-device":"Gerätekonfiguration","title-sensors":"Sensoren","title-sensors-ext":"Externe Sensoren","title-buzzer":"Summer","title-logging":"Protokollierung","title-reset-device-1":"Gerät zurücksetzen","title-reset-device-2":"Auf Werkseinstellungen zurücksetzen","title-welcome":"Willkommen bei deinem PandaGarage","title-lets-started":"Lass uns loslegen!","title-set-device-name":"Gerätenamen festlegen","title-connect-wifi-1":"Mit deinem lokalen Netzwerk verbinden","title-connect-wifi-2":"Mit WLAN verbinden","title-verify-connection":"Verbindung überprüfen","title-found-networks":"Gefundene Netzwerke","title-ready":"Bereit zum Start","title-test-ha-connection":"Home Assistant-Verbindung testen","title-ota-complete":"Aktualisierung installiert!","title-ota-failed":"Aktualisierung fehlgeschlagen!","title-saved-security":"Sicherheitseinstellungen gespeichert!","title-saved-ha":"Home Assistant-Einstellungen gespeichert!","title-saved-device":"Geräteeinstellungen gespeichert!","title-pressure":"Druck","title-restarting":"Starte neu...","btn-up":"Hoch","btn-down":"Runter","btn-stop":"Stopp","btn-half":"Halb","btn-vent":"Belüften","btn-close":"Schließen","btn-delete-log-debug":"Debug-Protokoll löschen","btn-delete-log-access":"Zugriffsprotokoll löschen","btn-download-log-debug":"Debug-Protokoll herunterladen","btn-download-log-access":"Zugriffsprotokoll herunterladen","btn-login":"Anmelden","btn-return-settings":"❮ Einstellungen","btn-save-connect":"Speichern & Verbinden","btn-save":"Speichern","btn-restart-ap":"Neu starten (Hotspot)","btn-update":"Aktualisieren","btn-test-connection":"Verbindung testen","btn-play":"Abspielen","btn-reset":"Zurücksetzen","btn-reset-verify":"Ja, zurücksetzen","btn-go":"Los geht's!","btn-next-step":"Nächster Schritt","btn-scan-networks":"Netzwerke scannen","btn-restart-now":"Jetzt neu starten","btn-diagnose":"Diagnosedaten herunterladen","alert-error":"Fehler: ","alert-no-auth":"Sie sind nicht authentifiziert, bitte melden Sie sich an!","alert-wrong-pwd":"Das eingegebene Passwort ist falsch!","alert-logs":"Protokolldatei gelöscht!","alert-fw-update-title":"Aktualisierung verfügbar!","alert-fw-update-text":"Eine neue Firmware-Version ist verfügbar.","alert-fw-update-link":"Hier prüfen","input-device-name":"Gerätename","input-device-language":"WebUI-Sprache","input-temp":"Temperatur","input-sensor-update":"Aktualisierungsintervall (ms)","input-threshold-temp":"Temperaturschwelle","input-threshold-hum":"Luftfeuchtigkeitsschwelle","input-threshold-pres":"Druckschwelle","input-threshold-lux":"Lichtschwelle","input-activate":"Aktivieren","input-sensor-ext":"Externer Sensor","input-combine-sensors":"Sensoren der gleichen Art kombinieren","input-buzzer-tune":"Klang","input-buzzer-open":"Bei Türöffnung abspielen","input-buzzer-close":"Bei Türschließung abspielen","input-log-access":"Zugriffsprotokollierung: ","input-log-level":"Protokollierungsstufe","input-ip":"IP-Adresse","input-port":"Port","input-user":"Benutzername","input-pwd":"Passwort","input-ssid":"SSID","input-new-pwd":"Neues Passwort","input-use-auth":"Authentifizierung verwenden","text-sensor-ext-1":"Wenn Sie einen externen Sensor an den I2C-Anschluss angeschlossen haben, aktivieren Sie diese Option und wählen Sie Ihren Sensor aus der Dropdown-Liste.","text-sensor-ext-2":"Ihren Sensor nicht gefunden? Eventuell müssen Sie die Firmware selbst aktualisieren oder ein Issue auf GitHub eröffnen, damit er im nächsten Update hinzugefügt wird.","text-buzzer":"Aktivieren Sie den eingebauten Summer und wählen Sie die gewünschten Töne und Optionen aus.","text-log-access":"Zeichnet jede Garagentor-Interaktion über PandaGarage auf.","text-reset-device-1":"Setzen Sie Ihr Gerät auf Werkseinstellungen zurück.","text-reset-device-2":"DIES LÖSCHT IHRE EINSTELLUNGEN!","text-reset-device-3":"Möchten Sie Ihr PandaGarage wirklich auf Werkseinstellungen zurücksetzen?","text-ha":"Nachdem Sie Ihre Zugangsdaten eingegeben haben, klicken Sie auf „Verbindung testen“, um sie zu prüfen und zu speichern.","text-security":"Das Passwort wird sowohl für die WebUI als auch für die API verwendet.","text-wifi-1":"Sie haben zwei Möglichkeiten, die WLAN-Verbindung zu ändern:","text-wifi-2":"Geben Sie die neuen WLAN-Daten manuell ein","text-wifi-3":"Geben Sie SSID und Passwort des neuen WLANs ein. Das Gerät startet neu und versucht die Verbindung. Bei Fehlschlag kehrt es zum alten WLAN zurück.","text-wifi-4":"Nutzen Sie die Hotspot-Setup-Methode","text-wifi-5":"PandaGarage kann neu starten und einen temporären WLAN-Hotspot erstellen. Verbinden Sie sich damit, um das neue WLAN auszuwählen.","text-lets-start":"Bevor Sie Ihr Garagentor anschließen: Einrichtung abschließen.","text-set-device-name":"Unten sehen Sie den Standard-Gerätenamen. Sie können ihn ändern – so erscheint Ihr Gerät im Netzwerk und Smart-Home. Später änderbar in Einstellungen.","text-connect-wifi":"Bitte verbinden Sie Ihr PandaGarage mit Ihrem lokalen Netzwerk, um fortzufahren.","text-ready-1":"Ihr PandaGarage ist erfolgreich mit dem Netzwerk verbunden!","text-ready-2":"Nach „Jetzt neu starten“ verbinden Sie sich bitte erneut per IP und Log-in mit dem unten gezeigten Passwort.","text-panda-ssid":"Netzwerk-SSID","text-panda-ip":"PandaGarage IP","text-panda-pwd":"Standard-Passwort","text-verify-connection":"Verbindung wird geprüft, bitte warten...","text-verify-mqtt-connection":"MQTT-Verbindung wird getestet...","text-connection-failed":"Verbindung fehlgeschlagen!","text-connection-success":"Verbindung erfolgreich!","text-connect-ssid":"Netzwerkname (SSID)","text-connect-pwd":"Netzwerkpasswort (leer lassen, wenn keines)","text-other-network":"Anderes Netzwerk","text-device-name":"Gerätename","text-wifi-strength":"WLAN-Signalstärke","text-ip":"IP-Adresse","text-mac":"MAC-Adresse","text-uptime":"Betriebszeit","text-local-time":"Lokale Zeit","text-version-fw":"Firmware-Version","text-version-fs":"Dateisystem-Version","text-version-hw":"Hardware-Version","text-serial":"Seriennummer","text-author":"Autor","text-github":"GitHub","text-docs":"Dokumentation","text-changelog":"Changelog","text-sensor-threshold":"Diese Schwellenwerte legen fest, ab wann Änderungen registriert werden. Eine Temperaturschwelle von 1 °C bedeutet z. B., dass erst ab ±1 °C Abweichung protokolliert wird.","text-ota-update":"OTA-Update wird installiert (bis zu 2 Minuten).","text-ota-failed":"Protokolle prüfen, starte jetzt neu ...","text-restart-now":"Starte jetzt neu...","text-timestamp":"Zeitstempel","text-log-level":"Protokollierungsstufe","text-tag":"Tag","text-message":"Nachricht","text-no-logs":"Keine Protokolle gefunden","text-restarting":"Wird nach Neustart aktualisiert","text-door-state-nc":"Nicht verbunden","text-door-state-open":"Offen","text-door-state-closed":"Geschlossen","text-door-state-open-h":"Halb offen","text-door-state-venting":"Belüftung","text-door-state-stopped":"Angehalten","text-door-state-opening":"Öffnet","text-door-state-closing":"Schließt"}
\ No newline at end of file
+{"nav-dashboard":"Übersicht","nav-info":"Info","nav-logs":"Protokolle","nav-settings":"Einstellungen","nav-settings-device":"Gerät","nav-settings-garage-door":"Garagentor","nav-settings-security":"Sicherheit","nav-settings-wifi":"WLAN","nav-settings-ha":"Home Assistant","nav-settings-update":"Update","nav-settings-restart":"Neustart","nav-settings-logout":"Abmelden","title-info-device":"Geräteinformationen","title-info-general":"Allgemeine Informationen","title-temp":"Temperatur","title-humidity":"Luftfeuchtigkeit","title-light":"Licht","title-404":"Ups... die gesuchte Seite konnte nicht gefunden werden :(","title-wifi-change":"WLAN ändern","title-wifi-manual":"Manuelle Methode","title-wifi-ap":"Hotspot-Methode","title-update":"OTA-Update","title-security":"Sicherheit","title-settings":"Einstellungen","title-ha":"Home Assistant Verbindung","title-garage-door":"Konfiguration Garagentor","title-device":"Gerätekonfiguration","title-sensors":"Sensoren","title-sensors-ext":"Externe Sensoren","title-buzzer":"Summer","title-logging":"Protokollierung","title-reset-device-1":"Gerät zurücksetzen","title-reset-device-2":"Auf Werkseinstellungen zurücksetzen","title-welcome":"Willkommen bei deinem PandaGarage","title-lets-started":"Los geht's!","title-set-device-name":"Gerätename festlegen","title-connect-wifi-1":"Mit deinem lokalen Netzwerk verbinden","title-connect-wifi-2":"Mit WLAN verbinden","title-verify-connection":"Verbindung überprüfen","title-found-networks":"Gefundene Netzwerke","title-ready":"Bereit","title-test-ha-connection":"Home Assistant Verbindung testen","title-ota-complete":"Update installed!","title-ota-failed":"Update failed!","btn-up":"Hoch","btn-down":"Runter","btn-stop":"Stop","btn-light":"Licht","btn-half":"Halb","btn-vent":"Lüften","btn-close":"Schließen","btn-delete-log-debug":"Debug-Protokoll löschen","btn-delete-log-access":"Zugriffsprotokoll löschen","btn-download-log-debug":"Debug-Protokoll herunterladen","btn-download-log-access":"Zugriffsprotokoll herunterladen","btn-login":"Anmelden","btn-return-settings":"❮ Einstellungen","btn-save-connect":"Speichern & Verbinden","btn-save":"Speichern","btn-restart-ap":"Zum Hotspot neu starten","btn-update":"Aktualisieren","btn-test-connection":"Verbindung testen","btn-play":"Abspielen","btn-reset":"Zurücksetzen","btn-reset-verify":"Ja, zurücksetzen","btn-go":"Los geht's!","btn-next-step":"Nächster Schritt","btn-scan-networks":"Netzwerke scannen","btn-restart-now":"Jetzt neu starten","btn-diagnose":"Diagnosedaten herunterladen","alert-error":"Fehler: ","alert-no-auth":"Du bist nicht authentifiziert, bitte melde dich an!","alert-wrong-pwd":"Das eingegebene Passwort ist falsch!","alert-logs":"Protokolldatei gelöscht!","alert-security":"Sicherheitseinstellungen erfolgreich gespeichert!","alert-ha":"Home Assistant-Einstellungen erfolgreich gespeichert!","alert-garage-door":"Garagentor-Einstellungen erfolgreich gespeichert!","alert-device":"Geräteeinstellungen erfolgreich gespeichert!","alert-fw-update-title":"Update verfügbar!","alert-fw-update-text":"Neue Firmware-Version ist verfügbar.","alert-fw-update-link":"Hier prüfen","input-device-name":"Gerätename","input-device-language":"WebUI Sprache","input-temp":"Temperatur","input-sensor-update":"Update Intervall (ms)","input-threshold-temp":"Temperatur Schwelle","input-threshold-hum":"Luftfeuchtigkeits Schwelle","input-threshold-lux":"Licht Schwelle","input-activate":"Aktivieren","input-sensor-ext":"Externer Sensor","input-buzzer-tune":"Klang","input-buzzer-open":"Abspielen beim Öffnen","input-buzzer-close":"Abspielen beim Schließen","input-log-access":"Zugriffsprotokollierung: ","input-log-debug":"Debug-Protokollierung: ","input-ip":"IP-Adresse","input-port":"Port","input-user":"Benutzername","input-pwd":"Passwort","input-ssid":"SSID","input-new-pwd":"Neues Passwort","input-use-auth":"Authentifizierung aktivieren","text-sensor-ext-1":"Wenn du einen externen Sensor an den I2C-Anschluss angeschlossen hast, aktiviere diese Option und wähle deinen Sensor aus der Dropdown-Liste aus.","text-sensor-ext-2":"Kannst du deinen Sensor nicht finden? Möglicherweise musst du die Firmware selbst aktualisieren oder ein Issue auf GitHub eröffnen, damit er in einem zukünftigen Update hinzugefügt werden kann.","text-buzzer":"Aktiviere den integrierten Summer und wähle die verschiedenen Töne und Optionen dafür aus.","text-log-access":"Protokolliert jede Interaktion mit dem Garagentor über PandaGarage.","text-log-debug":"Zeichnet verschiedene interne Aktionen von PandaGarage auf, um bei der Fehlerbehebung und dem Debugging zu helfen.","text-reset-device-1":"Setze dein Gerät auf die Werkseinstellungen zurück. ","text-reset-device-2":"DIES WIRD DEINE EINSTELLUNGEN LÖSCHEN!","text-reset-device-3":"Möchtest du dein PandaGarage wirklich auf die Werkseinstellungen zurücksetzen?","text-ha":"Nachdem du deine Zugangsdaten eingegeben hast, klicke auf 'Verbindung testen', um sie zu überprüfen und zu speichern.","text-security":"Das Passwort wird für die Anmeldung sowohl im WebUI als auch in der API verwendet.","text-wifi-1":"Du hast zwei Möglichkeiten, die WLAN-Verbindung zu ändern:","text-wifi-2":"Gib die neuen WLAN-Zugangsdaten manuell ein","text-wifi-3":"Du kannst den Namen (SSID) und das Passwort des neuen WLANs eingeben. Beachte jedoch: Das Gerät startet neu und versucht, sich damit zu verbinden. Scheitert die Verbindung, kehrt es zum aktuellen WLAN zurück.","text-wifi-4":"Hotspot-Methode verwenden","text-wifi-5":"PandaGarage kann neu starten und einen temporären WLAN-Hotspot erstellen (wie bei der Erstinstallation). Du musst dich in der Nähe des Geräts befinden und dich mit deinem Smartphone oder Computer mit diesem Hotspot verbinden, um das neue WLAN auszuwählen.","text-lets-start":"Bevor du dein Garagentor verbindest, lass uns die Geräteeinrichtung abschließen.","text-set-device-name":"Unten siehst du den Standard-Gerätenamen. Du kannst ihn ändern, wenn du möchtest — so erscheint das Gerät in deinem lokalen Netzwerk und in deinem Smart-Home-System. Du kannst ihn später auch in den Einstellungen aktualisieren.","text-connect-wifi":"Bitte verbinde dein PandaGarage mit deinem lokalen Netzwerk, um fortzufahren.","text-ready-1":"Dein PandaGarage wurde erfolgreich mit deinem lokalen Netzwerk verbunden!","text-ready-2":"Nach dem Klick auf 'Jetzt neu starten' musst du dich mit der IP-Adresse erneut verbinden und dich mit dem unten angezeigten Passwort einloggen.","text-panda-ssid":"Netzwerk-SSID","text-panda-ip":"PandaGarage IP","text-panda-pwd":"Standard Anmeldepasswort","text-verify-connection":"Verbindung wird überprüft, bitte warten...","text-verify-mqtt-connection":"MQTT-Verbindung wird getestet...","text-connection-failed":"Verbindung fehlgeschlagen!","text-connection-success":"Verbindung erfolgreich!","text-connect-ssid":"Netzwerkname (SSID)","text-connect-pwd":"Netzwerkpasswort (leer lassen, wenn keines)","text-other-network":"Anderes Netzwerk","text-device-name":"Gerätename","text-wifi-strength":"WLAN-Signalstärke","text-ip":"IP-Adresse","text-mac":"MAC-Adresse","text-uptime":"Betriebszeit","text-local-time":"Lokale Zeit","text-version-fw":"Firmware-Version","text-version-fs":"Dateisystem-Version","text-version-hw":"Hardware-Version","text-serial":"Seriennummer","text-author":"Autor","text-github":"GitHub","text-docs":"Dokumentation","text-changelog":"Changelog","text-sensor-threshold":"Diese Werte definieren die Schwellenwerte, ab denen Änderungen registriert werden. Ein Temperaturschwellenwert von 1 bedeutet bspw., dass Temperaturschwankungen nur dann aufgezeichnet und angezeigt werden, wenn sich der Messwert um mindestens ein Grad Celsius ändert.","text-ota-update":"Installing OTA Update. This may take up to 2 minutes.","text-ota-complete":"Will restart now...","text-ota-failed":"Check logs, will restart now ..."}
\ No newline at end of file
diff --git a/data/assets/js/i18n/en.json b/data/assets/js/i18n/en.json
index 55ff2ae1..5bad2780 100644
--- a/data/assets/js/i18n/en.json
+++ b/data/assets/js/i18n/en.json
@@ -1 +1 @@
-{"nav-dashboard":"Dashboard","nav-info":"Info","nav-logs":"Logs","nav-settings":"Settings","nav-settings-device":"Device","nav-settings-garage-door":"Garage Door","nav-settings-security":"Security","nav-settings-wifi":"WiFi","nav-settings-ha":"Home Assistant","nav-settings-update":"Update","nav-settings-restart":"Restart","nav-settings-logout":"Logout","title-info-device":"Device Info","title-info-general":"General Info","title-temp":"Temperature","title-humidity":"Humidity","title-light":"Light","title-404":"ooops... the site you were looking for couldn't be found :(","title-wifi-change":"Change WiFi","title-wifi-manual":"Manually method","title-wifi-ap":"Hotspot method","title-update":"OTA Update","title-security":"Security","title-settings":"Settings","title-ha":"Home Assistant Connection","title-garage-door":"Garage Door Configuration","title-device":"Device Configuration","title-sensors":"Sensors","title-sensors-ext":"External Sensors","title-buzzer":"Buzzer","title-logging":"Logging","title-reset-device-1":"Reset Device","title-reset-device-2":"Reset to factory settings","title-welcome":"Welcome to your PandaGarage","title-lets-started":"Let's get started!","title-set-device-name":"Set your Device Name","title-connect-wifi-1":"Connect to your local Network","title-connect-wifi-2":"Connect to WiFi","title-verify-connection":"Verify Connection","title-found-networks":"Found Networks","title-ready":"Ready to go","title-test-ha-connection":"Test Home Assistant Connection","title-ota-complete":"Update installed!","title-ota-failed":"Update failed!","title-saved-security":"Security settings saved!","title-saved-ha":"Home Assistant settings saved!","title-saved-device":"Device settings saved!","title-pressure":"Pressure","title-restarting":"Restarting...","btn-up":"Up","btn-down":"Down","btn-stop":"Stop","btn-half":"Half","btn-vent":"Vent","btn-close":"Close","btn-delete-log-debug":"Delete Debug Log","btn-delete-log-access":"Delete Access Log","btn-download-log-debug":"Download Debug Log","btn-download-log-access":"Download Access Log","btn-login":"Login","btn-return-settings":"❮ Settings","btn-save-connect":"Save & Connect","btn-save":"Save","btn-restart-ap":"Restart to Hotspot","btn-update":"Update","btn-test-connection":"Test Connection","btn-play":"Play","btn-reset":"Reset","btn-reset-verify":"Yes, Reset","btn-go":"Let's go!","btn-next-step":"Next Step","btn-scan-networks":"Scan Networks","btn-restart-now":"Restart now","btn-diagnose":"Download Diagnostics","alert-error":"Error: ","alert-no-auth":"You are not authenticated, please login!","alert-wrong-pwd":"The entered password is wrong!","alert-logs":"Log file deleted!","alert-fw-update-title":"Update available!","alert-fw-update-text":"New firmware version is available.","alert-fw-update-link":"Check here","input-device-name":"Device Name","input-device-language":"WebUI Language","input-temp":"Temperature","input-sensor-update":"Update Interval (ms)","input-threshold-temp":"Temperature Threshold","input-threshold-hum":"Humidity Threshold","input-threshold-pres":"Pressure Threshold","input-threshold-lux":"Light Threshold","input-activate":"Activate","input-sensor-ext":"External Sensor","input-combine-sensors":"Combine sensors of same type","input-buzzer-tune":"Tune","input-buzzer-open":"Play on door opening","input-buzzer-close":"Play on door closing","input-log-access":"Access Logging: ","input-log-level":"Log Level","input-ip":"IP Address","input-port":"Port","input-user":"Username","input-pwd":"Password","input-ssid":"SSID","input-new-pwd":"New Password","input-use-auth":"Use Authentication","text-sensor-ext-1":"If you've connected an external sensor to the I2C header, turn on this option and choose your sensor from the dropdown list.","text-sensor-ext-2":"Can't find your sensor? You might need to update the firmware yourself or open an issue on GitHub so it can be added in a future update.","text-buzzer":"Activate the onboard buzzer and select the different sounds and options for it.","text-log-access":"Keeps a record of every garage door interaction made through PandaGarage","text-reset-device-1":"Reset your device to factory settings.","text-reset-device-2":"THIS WILL DELETE YOUR SETTINGS!","text-reset-device-3":"Do you really want to reset your PandaGarage to factory settings?","text-ha":"After entering your credentials, click 'Test Connection' to verify and save them.","text-security":"The password is used to log into both the WebUI and the API.","text-wifi-1":"You have two ways to change the WiFi connection:","text-wifi-2":"Enter the new WiFi details manually","text-wifi-3":"You can type in the name (SSID) and password of the new WiFi. But keep in mind: the device will restart and try to connect to it. If the connection fails, it will go back to the current WiFi.","text-wifi-4":"Use the setup hotspot method","text-wifi-5":"PandaGarage can restart and create its own temporary WiFi hotspot (like it did during the first setup). You'll need to be near the device and connect to this hotspot with your phone or computer to choose the new WiFi network.","text-lets-start":"Before connecting to your garage door, let's complete the device setup.","text-set-device-name":"Below is the default device name. You can change it if you'd like — this is how the device will appear on your local network and in your smart home system. You can also update it later in the settings.","text-connect-wifi":"Please connect your PandaGarage to your local network to proceed.","text-ready-1":"Your PandaGarage has successfully connected to your local network!","text-ready-2":"After clicking 'Restart now', you'll need to reconnect using the IP address and login using the password shown below.","text-panda-ssid":"Network SSID","text-panda-ip":"PandaGarage IP","text-panda-pwd":"Default Login Password","text-verify-connection":"Checking connection, please wait...","text-verify-mqtt-connection":"Testing MQTT connection...","text-connection-failed":"Connection failed!","text-connection-success":"Connection successful!","text-connect-ssid":"Network name (SSID)","text-connect-pwd":"Network password (leave blank if none)","text-other-network":"Other Network","text-device-name":"Device Name","text-wifi-strength":"WiFi Signal Strength","text-ip":"IP Address","text-mac":"MAC Address","text-uptime":"Uptime","text-local-time":"Local Time","text-version-fw":"Firmware Version","text-version-fs":"Filesystem Version","text-version-hw":"Hardware Version","text-serial":"Device Serial","text-author":"Author","text-github":"GitHub","text-docs":"Documentation","text-changelog":"Changelog","text-sensor-threshold":"These values define the thresholds for registering changes. For example, a temperature threshold of 1 means that temperature fluctuations will only be recorded and displayed when the reading varies by at least one degree Celsius.","text-ota-update":"Installing OTA Update. This may take up to 2 minutes.","text-ota-failed":"Check logs, will restart now ...","text-restart-now":"Will restart now...","text-timestamp":"Timestamp","text-log-level":"Log Level","text-tag":"Tag","text-message":"Message","text-no-logs":"No Logs found","text-restarting":"Will refresh when restarted","text-door-state-nc":"Not Connected","text-door-state-open":"Open","text-door-state-closed":"Closed","text-door-state-open-h":"Half Open","text-door-state-venting":"Ventilation","text-door-state-stopped":"Stopped","text-door-state-opening":"Opening","text-door-state-closing":"Closing"}
\ No newline at end of file
+{"nav-dashboard":"Dashboard","nav-info":"Info","nav-logs":"Logs","nav-settings":"Settings","nav-settings-device":"Device","nav-settings-garage-door":"Garage Door","nav-settings-security":"Security","nav-settings-wifi":"WiFi","nav-settings-ha":"Home Assistant","nav-settings-update":"Update","nav-settings-restart":"Restart","nav-settings-logout":"Logout","title-info-device":"Device Info","title-info-general":"General Info","title-temp":"Temperature","title-humidity":"Humidity","title-light":"Light","title-404":"ooops... the site you were looking for couldn't be found :(","title-wifi-change":"Change WiFi","title-wifi-manual":"Manually method","title-wifi-ap":"Hotspot method","title-update":"OTA Update","title-security":"Security","title-settings":"Settings","title-ha":"Home Assistant Connection","title-garage-door":"Garage Door Configuration","title-device":"Device Configuration","title-sensors":"Sensors","title-sensors-ext":"External Sensors","title-buzzer":"Buzzer","title-logging":"Logging","title-reset-device-1":"Reset Device","title-reset-device-2":"Reset to factory settings","title-welcome":"Welcome to your PandaGarage","title-lets-started":"Let's get started!","title-set-device-name":"Set your Device Name","title-connect-wifi-1":"Connect to your local Network","title-connect-wifi-2":"Connect to WiFi","title-verify-connection":"Verify Connection","title-found-networks":"Found Networks","title-ready":"Ready to go","title-test-ha-connection":"Test Home Assistant Connection","title-ota-complete":"Update installed!","title-ota-failed":"Update failed!","btn-up":"Up","btn-down":"Down","btn-stop":"Stop","btn-light":"Light","btn-half":"Half","btn-vent":"Vent","btn-close":"Close","btn-delete-log-debug":"Delete Debug Log","btn-delete-log-access":"Delete Access Log","btn-download-log-debug":"Download Debug Log","btn-download-log-access":"Download Access Log","btn-login":"Login","btn-return-settings":"❮ Settings","btn-save-connect":"Save & Connect","btn-save":"Save","btn-restart-ap":"Restart to Hotspot","btn-update":"Update","btn-test-connection":"Test Connection","btn-play":"Play","btn-reset":"Reset","btn-reset-verify":"Yes, Reset","btn-go":"Let's go!","btn-next-step":"Next Step","btn-scan-networks":"Scan Networks","btn-restart-now":"Restart now","btn-diagnose":"Download Diagnostics","alert-error":"Error: ","alert-no-auth":"You are not authenticated, please login!","alert-wrong-pwd":"The entered password is wrong!","alert-logs":"Log file deleted!","alert-security":"Security settings saved successfuly!","alert-ha":"Home Assistant settings saved successfuly!","alert-garage-door":"Garage Door settings saved successfuly!","alert-device":"Device settings saved successfuly!","alert-fw-update-title":"Update available!","alert-fw-update-text":"New firmware version is available.","alert-fw-update-link":"Check here","input-device-name":"Device Name","input-device-language":"WebUI Language","input-temp":"Temperature","input-sensor-update":"Update Interval (ms)","input-threshold-temp":"Temperature Threshold","input-threshold-hum":"Humidity Threshold","input-threshold-lux":"Light Threshold","input-activate":"Activate","input-sensor-ext":"External Sensor","input-buzzer-tune":"Tune","input-buzzer-open":"Play on door opening","input-buzzer-close":"Play on door closing","input-log-access":"Access Logging: ","input-log-debug":"Debug Logging: ","input-ip":"IP Address","input-port":"Port","input-user":"Username","input-pwd":"Password","input-ssid":"SSID","input-new-pwd":"New Password","input-use-auth":"Use Authentication","text-sensor-ext-1":"If you've connected an external sensor to the I2C header, turn on this option and choose your sensor from the dropdown list.","text-sensor-ext-2":"Can't find your sensor? You might need to update the firmware yourself or open an issue on GitHub so it can be added in a future update.","text-buzzer":"Activate the onboard buzzer and select the different sounds and options for it.","text-log-access":"Keeps a record of every garage door interaction made through PandaGarage","text-log-debug":"Records various internal actions of PandaGarage to help with troubleshooting and debugging","text-reset-device-1":"Reset your device to factory settings.","text-reset-device-2":"THIS WILL DELETE YOUR SETTINGS!","text-reset-device-3":"Do you really want to reset your PandaGarage to factory settings?","text-ha":"After entering your credentials, click 'Test Connection' to verify and save them.","text-security":"The password is used to log into both the WebUI and the API.","text-wifi-1":"You have two ways to change the WiFi connection:","text-wifi-2":"Enter the new WiFi details manually","text-wifi-3":"You can type in the name (SSID) and password of the new WiFi. But keep in mind: the device will restart and try to connect to it. If the connection fails, it will go back to the current WiFi.","text-wifi-4":"Use the setup hotspot method","text-wifi-5":"PandaGarage can restart and create its own temporary WiFi hotspot (like it did during the first setup). You'll need to be near the device and connect to this hotspot with your phone or computer to choose the new WiFi network.","text-lets-start":"Before connecting to your garage door, let's complete the device setup.","text-set-device-name":"Below is the default device name. You can change it if you'd like — this is how the device will appear on your local network and in your smart home system. You can also update it later in the settings.","text-connect-wifi":"Please connect your PandaGarage to your local network to proceed.","text-ready-1":"Your PandaGarage has successfully connected to your local network!","text-ready-2":"After clicking 'Restart now', you'll need to reconnect using the IP address and login using the password shown below.","text-panda-ssid":"Network SSID","text-panda-ip":"PandaGarage IP","text-panda-pwd":"Default Login Password","text-verify-connection":"Checking connection, please wait...","text-verify-mqtt-connection":"Testing MQTT connection...","text-connection-failed":"Connection failed!","text-connection-success":"Connection successful!","text-connect-ssid":"Network name (SSID)","text-connect-pwd":"Network password (leave blank if none)","text-other-network":"Other Network","text-device-name":"Device Name","text-wifi-strength":"WiFi Signal Strength","text-ip":"IP Address","text-mac":"MAC Address","text-uptime":"Uptime","text-local-time":"Local Time","text-version-fw":"Firmware Version","text-version-fs":"Filesystem Version","text-version-hw":"Hardware Version","text-serial":"Device Serial","text-author":"Author","text-github":"GitHub","text-docs":"Documentation","text-changelog":"Changelog","text-sensor-threshold":"These values define the thresholds for registering changes. For example, a temperature threshold of 1 means that temperature fluctuations will only be recorded and displayed when the reading varies by at least one degree Celsius.","text-ota-update":"Installing OTA Update. This may take up to 2 minutes.","text-ota-complete":"Will restart now...","text-ota-failed":"Check logs, will restart now ..."}
\ No newline at end of file
diff --git a/data/assets/js/i18n/es.json b/data/assets/js/i18n/es.json
index 33920a57..469678c1 100644
--- a/data/assets/js/i18n/es.json
+++ b/data/assets/js/i18n/es.json
@@ -1 +1 @@
-{"nav-dashboard":"Panel","nav-info":"Información","nav-logs":"Registros","nav-settings":"Configuración","nav-settings-device":"Dispositivo","nav-settings-garage-door":"Puerta de garaje","nav-settings-security":"Seguridad","nav-settings-wifi":"WiFi","nav-settings-ha":"Home Assistant","nav-settings-update":"Actualizar","nav-settings-restart":"Reiniciar","nav-settings-logout":"Cerrar sesión","title-info-device":"Info del dispositivo","title-info-general":"Info general","title-temp":"Temperatura","title-humidity":"Humedad","title-light":"Luz","title-404":"Vaya… no se encontró la página :(","title-wifi-change":"Cambiar WiFi","title-wifi-manual":"Método manual","title-wifi-ap":"Método hotspot","title-update":"Actualización OTA","title-security":"Seguridad","title-settings":"Configuración","title-ha":"Conexión Home Assistant","title-garage-door":"Configuración puerta garaje","title-device":"Configuración dispositivo","title-sensors":"Sensores","title-sensors-ext":"Sensores externos","title-buzzer":"Zumbador","title-logging":"Registro","title-reset-device-1":"Restablecer dispositivo","title-reset-device-2":"Restablecer valores de fábrica","title-welcome":"Bienvenido a tu PandaGarage","title-lets-started":"¡Empecemos!","title-set-device-name":"Define nombre del dispositivo","title-connect-wifi-1":"Conéctate a tu red","title-connect-wifi-2":"Conéctate al WiFi","title-verify-connection":"Verificar conexión","title-found-networks":"Redes encontradas","title-ready":"Listo para usar","title-test-ha-connection":"Probar conexión Home Assistant","title-ota-complete":"¡Actualización instalada!","title-ota-failed":"¡Error en la actualización!","title-saved-security":"¡Ajustes de seguridad guardados!","title-saved-ha":"¡Ajustes de Home Assistant guardados!","title-saved-device":"¡Ajustes de dispositivo guardados!","title-pressure":"Presión","title-restarting":"Reiniciando...","btn-up":"Arriba","btn-down":"Abajo","btn-stop":"Detener","btn-half":"Mitad","btn-vent":"Ventilar","btn-close":"Cerrar","btn-delete-log-debug":"Eliminar log debug","btn-delete-log-access":"Eliminar log accesos","btn-download-log-debug":"Descargar log debug","btn-download-log-access":"Descargar log accesos","btn-login":"Iniciar sesión","btn-return-settings":"❮ Configuración","btn-save-connect":"Guardar & conectar","btn-save":"Guardar","btn-restart-ap":"Reiniciar en hotspot","btn-update":"Actualizar","btn-test-connection":"Probar conexión","btn-play":"Reproducir","btn-reset":"Restablecer","btn-reset-verify":"Sí, restablecer","btn-go":"¡Vamos!","btn-next-step":"Siguiente paso","btn-scan-networks":"Escanear redes","btn-restart-now":"Reiniciar ahora","btn-diagnose":"Descargar diagnóstico","alert-error":"Error: ","alert-no-auth":"No estás autenticado, por favor inicia sesión!","alert-wrong-pwd":"¡Contraseña incorrecta!","alert-logs":"¡Archivo de registro eliminado!","alert-fw-update-title":"¡Actualización disponible!","alert-fw-update-text":"Hay una nueva versión de firmware disponible.","alert-fw-update-link":"Compruébalo aquí","input-device-name":"Nombre dispositivo","input-device-language":"Idioma WebUI","input-temp":"Temperatura","input-sensor-update":"Intervalo actualización (ms)","input-threshold-temp":"Umbral temperatura","input-threshold-hum":"Umbral humedad","input-threshold-pres":"Umbral presión","input-threshold-lux":"Umbral luz","input-activate":"Activar","input-sensor-ext":"Sensor externo","input-combine-sensors":"Combinar sensores","input-buzzer-tune":"Tono","input-buzzer-open":"Sonar al abrir","input-buzzer-close":"Sonar al cerrar","input-log-access":"Registro accesos: ","input-log-level":"Nivel de log","input-ip":"Dirección IP","input-port":"Puerto","input-user":"Usuario","input-pwd":"Contraseña","input-ssid":"SSID","input-new-pwd":"Nueva contraseña","input-use-auth":"Usar autenticación","text-sensor-ext-1":"Si has conectado un sensor externo al cabezal I2C, activa esta opción y selecciona tu sensor.","text-sensor-ext-2":"¿No encuentras tu sensor? Tal vez debas actualizar el firmware o abrir un issue en GitHub para añadirlo.","text-buzzer":"Activa el zumbador integrado y elige sonidos y opciones.","text-log-access":"Registra cada interacción con la puerta de garaje vía PandaGarage.","text-reset-device-1":"Restablece tu dispositivo a valores de fábrica.","text-reset-device-2":"¡ESTO ELIMINARÁ TUS AJUSTES!","text-reset-device-3":"¿Seguro que quieres restablecer PandaGarage a fábrica?","text-ha":"Tras introducir credenciales, haz clic en “Probar conexión” para verificar y guardar.","text-security":"La contraseña sirve para la WebUI y la API.","text-wifi-1":"Tienes dos maneras de cambiar la conexión WiFi:","text-wifi-2":"Introduce manualmente los datos WiFi","text-wifi-3":"Escribe la SSID y contraseña. El dispositivo se reiniciará y, si falla, volverá al WiFi actual.","text-wifi-4":"Usa el método hotspot","text-wifi-5":"PandaGarage puede crear un hotspot temporal. Conéctate para elegir la nueva red.","text-lets-start":"Antes de conectar la puerta, completa la configuración del dispositivo.","text-set-device-name":"Abajo ves el nombre predeterminado. Puedes cambiarlo: así aparecerá en tu red y hogar inteligente. Modificable luego en Configuración.","text-connect-wifi":"Conecta PandaGarage a tu red local para continuar.","text-ready-1":"¡PandaGarage conectado con éxito!","text-ready-2":"Tras “Reiniciar ahora” vuelve a conectar por IP e inicia sesión con la contraseña mostrada.","text-panda-ssid":"SSID de red","text-panda-ip":"IP PandaGarage","text-panda-pwd":"Contraseña por defecto","text-verify-connection":"Verificando conexión, por favor espera...","text-verify-mqtt-connection":"Probando MQTT...","text-connection-failed":"¡Conexión fallida!","text-connection-success":"¡Conexión exitosa!","text-connect-ssid":"Nombre de red (SSID)","text-connect-pwd":"Contraseña de red (dejar vacío si no hay)","text-other-network":"Otra red","text-device-name":"Nombre dispositivo","text-wifi-strength":"Intensidad señal WiFi","text-ip":"Dirección IP","text-mac":"Dirección MAC","text-uptime":"Tiempo de actividad","text-local-time":"Hora local","text-version-fw":"Versión firmware","text-version-fs":"Versión sistema archivos","text-version-hw":"Versión hardware","text-serial":"Número de serie","text-author":"Autor","text-github":"GitHub","text-docs":"Documentación","text-changelog":"Changelog","text-sensor-threshold":"Estos valores definen el umbral de registro. Por ej., 1 °C registra cambios ≥±1 °C.","text-ota-update":"Instalando OTA (hasta 2 min)…","text-ota-failed":"Revisa logs, reiniciando...","text-restart-now":"Reiniciando…","text-timestamp":"Marca temporal","text-log-level":"Nivel de log","text-tag":"Etiqueta","text-message":"Mensaje","text-no-logs":"No se encontraron logs","text-restarting":"Se actualizará al reiniciar","text-door-state-nc":"No conectado","text-door-state-open":"Abierto","text-door-state-closed":"Cerrado","text-door-state-open-h":"Medio abierto","text-door-state-venting":"Ventilación","text-door-state-stopped":"Detenido","text-door-state-opening":"Opening","text-door-state-closing":"Closing"}
\ No newline at end of file
+{"nav-dashboard":"Tablero de control","nav-info":"Información","nav-logs":"Registros","nav-settings":"Configuración","nav-settings-device":"Dispositivo","nav-settings-garage-door":"Puerta de garaje","nav-settings-security":"Seguridad","nav-settings-wifi":"WiFi","nav-settings-ha":"Home Assistant","nav-settings-update":"Actualizar","nav-settings-restart":"Reiniciar","nav-settings-logout":"Cerrar sesión","title-info-device":"Información del dispositivo","title-info-general":"Información general","title-temp":"Temperatura","title-humidity":"Humedad","title-light":"Luz","title-404":"ups… la página que buscas no se pudo encontrar :(","title-wifi-change":"Cambiar WiFi","title-wifi-manual":"Método manual","title-wifi-ap":"Método hotspot","title-update":"Actualización OTA","title-security":"Seguridad","title-settings":"Configuración","title-ha":"Conexión Home Assistant","title-garage-door":"Configuración de puerta de garaje","title-device":"Configuración del dispositivo","title-sensors":"Sensores","title-sensors-ext":"Sensores externos","title-buzzer":"Zumbador","title-logging":"Registro","title-reset-device-1":"Restablecer dispositivo","title-reset-device-2":"Restablecer a configuración de fábrica","title-welcome":"Bienvenido a tu PandaGarage","title-lets-started":"¡Comencemos!","title-set-device-name":"Define el nombre del dispositivo","title-connect-wifi-1":"Conéctate a tu red local","title-connect-wifi-2":"Conectar al WiFi","title-verify-connection":"Verificar conexión","title-found-networks":"Redes encontradas","title-ready":"Listo para usar","title-test-ha-connection":"Probar conexión Home Assistant","title-ota-complete":"Update installed!","title-ota-failed":"Update failed!","btn-up":"Subir","btn-down":"Bajar","btn-stop":"Detener","btn-light":"Luz","btn-half":"Mitad","btn-vent":"Ventilar","btn-close":"Cerrar","btn-delete-log-debug":"Eliminar registro de depuración","btn-delete-log-access":"Eliminar registro de acceso","btn-download-log-debug":"Descargar registro de depuración","btn-download-log-access":"Descargar registro de acceso","btn-login":"Iniciar sesión","btn-return-settings":"❮ Configuración","btn-save-connect":"Guardar y conectar","btn-save":"Guardar","btn-restart-ap":"Reiniciar en hotspot","btn-update":"Actualizar","btn-test-connection":"Probar conexión","btn-play":"Reproducir","btn-reset":"Restablecer","btn-reset-verify":"Sí, restablecer","btn-go":"¡Vamos!","btn-next-step":"Siguiente paso","btn-scan-networks":"Buscar redes","btn-restart-now":"Reiniciar ahora","btn-diagnose":"Descargar diagnóstico","alert-error":"Error: ","alert-no-auth":"No estás autenticado, ¡por favor inicia sesión!","alert-wrong-pwd":"¡La contraseña ingresada es incorrecta!","alert-logs":"¡Archivo de registro eliminado!","alert-security":"¡Configuración de seguridad guardada con éxito!","alert-ha":"¡Configuración de Home Assistant guardada con éxito!","alert-garage-door":"¡Configuración de puerta de garaje guardada con éxito!","alert-device":"¡Configuración del dispositivo guardada con éxito!","alert-fw-update-title":"¡Actualización disponible!","alert-fw-update-text":"Nueva versión del firmware disponible.","alert-fw-update-link":"Revisar aquí","input-device-name":"Nombre del dispositivo","input-device-language":"Idioma de la interfaz","input-temp":"Temperatura","input-sensor-update":"Intervalo de actualización (ms)","input-threshold-temp":"Umbral de temperatura","input-threshold-hum":"Umbral de humedad","input-threshold-lux":"Umbral de luz","input-activate":"Activar","input-sensor-ext":"Sensor externo","input-buzzer-tune":"Tono","input-buzzer-open":"Reproducir al abrir","input-buzzer-close":"Reproducir al cerrar","input-log-access":"Registro de acceso: ","input-log-debug":"Registro de depuración: ","input-ip":"Dirección IP","input-port":"Puerto","input-user":"Usuario","input-pwd":"Contraseña","input-ssid":"SSID","input-new-pwd":"Nueva contraseña","input-use-auth":"Usar autenticación","text-sensor-ext-1":"Si has conectado un sensor externo al conector I2C, activa esta opción y elige tu sensor en la lista desplegable.","text-sensor-ext-2":"¿No encuentras tu sensor? Puede que necesites actualizar el firmware tú mismo o abrir un issue en GitHub para que se añada en una futura actualización.","text-buzzer":"Activa el zumbador integrado y selecciona los diferentes sonidos y opciones.","text-log-access":"Registra cada interacción con la puerta de garaje a través de PandaGarage","text-log-debug":"Registra diversas acciones internas de PandaGarage para ayudar en la resolución de problemas y depuración","text-reset-device-1":"Restablece tu dispositivo a la configuración de fábrica.","text-reset-device-2":"¡ESTO ELIMINARÁ TUS CONFIGURACIONES!","text-reset-device-3":"¿Realmente quieres restablecer tu PandaGarage a la configuración de fábrica?","text-ha":"Después de ingresar tus credenciales, haz clic en 'Probar conexión' para verificarlas y guardarlas.","text-security":"La contraseña se usa para iniciar sesión tanto en la WebUI como en la API.","text-wifi-1":"Tienes dos formas de cambiar la conexión WiFi:","text-wifi-2":"Introduce manualmente los nuevos datos de WiFi","text-wifi-3":"Puedes escribir el nombre (SSID) y la contraseña del nuevo WiFi. Pero ten en cuenta: el dispositivo se reiniciará e intentará conectarse. Si falla, volverá al WiFi actual.","text-wifi-4":"Usar el método de hotspot de configuración","text-wifi-5":"PandaGarage puede reiniciarse y crear su propio hotspot WiFi temporal (como en la primera configuración). Deberás estar cerca del dispositivo y conectarte a este hotspot con tu teléfono u ordenador para elegir la nueva red WiFi.","text-lets-start":"Antes de conectar tu puerta de garaje, completemos la configuración del dispositivo.","text-set-device-name":"A continuación está el nombre de dispositivo predeterminado. Puedes cambiarlo si lo deseas: así aparecerá en tu red local y en tu sistema de hogar inteligente. También puedes actualizarlo más tarde en la configuración.","text-connect-wifi":"Por favor, conecta tu PandaGarage a tu red local para continuar.","text-ready-1":"¡Tu PandaGarage se ha conectado correctamente a tu red local!","text-ready-2":"Después de hacer clic en 'Reiniciar ahora', deberás reconectar usando la dirección IP e iniciar sesión con la contraseña mostrada a continuación.","text-panda-ssid":"SSID de la red","text-panda-ip":"IP de PandaGarage","text-panda-pwd":"Contraseña predeterminada de inicio de sesión","text-verify-connection":"Comprobando conexión, por favor espera…","text-verify-mqtt-connection":"Probando conexión MQTT…","text-connection-failed":"¡Conexión fallida!","text-connection-success":"¡Conexión exitosa!","text-connect-ssid":"Nombre de la red (SSID)","text-connect-pwd":"Contraseña de la red (dejar en blanco si no hay)","text-other-network":"Otra red","text-device-name":"Nombre del dispositivo","text-wifi-strength":"Intensidad de la señal WiFi","text-ip":"Dirección IP","text-mac":"Dirección MAC","text-uptime":"Tiempo de actividad","text-local-time":"Hora local","text-version-fw":"Versión de firmware","text-version-fs":"Versión del sistema de archivos","text-version-hw":"Versión de hardware","text-serial":"Número de serie","text-author":"Autor","text-github":"GitHub","text-docs":"Documentación","text-changelog":"Registro de cambios","text-sensor-threshold":"Estos valores definen los umbrales para registrar los cambios. Por ejemplo, un umbral de temperatura de 1 significa que las fluctuaciones de temperatura solo se registrarán y mostrarán cuando la lectura varíe al menos un grado Celsius.","text-ota-update":"Installing OTA Update. This may take up to 2 minutes.","text-ota-complete":"Will restart now...","text-ota-failed":"Check logs, will restart now ..."}
\ No newline at end of file
diff --git a/data/assets/js/i18n/fr.json b/data/assets/js/i18n/fr.json
index 4a5f15c1..a721338f 100644
--- a/data/assets/js/i18n/fr.json
+++ b/data/assets/js/i18n/fr.json
@@ -1 +1 @@
-{"nav-dashboard":"Tableau de bord","nav-info":"Info","nav-logs":"Journaux","nav-settings":"Paramètres","nav-settings-device":"Appareil","nav-settings-garage-door":"Porte de garage","nav-settings-security":"Sécurité","nav-settings-wifi":"Wi-Fi","nav-settings-ha":"Home Assistant","nav-settings-update":"Mise à jour","nav-settings-restart":"Redémarrer","nav-settings-logout":"Déconnexion","title-info-device":"Informations appareil","title-info-general":"Informations générales","title-temp":"Température","title-humidity":"Humidité","title-light":"Lumière","title-404":"Oups… la page recherchée est introuvable :(","title-wifi-change":"Modifier le Wi-Fi","title-wifi-manual":"Méthode manuelle","title-wifi-ap":"Méthode Hotspot","title-update":"MàJ OTA","title-security":"Sécurité","title-settings":"Paramètres","title-ha":"Connexion Home Assistant","title-garage-door":"Configuration porte garage","title-device":"Configuration appareil","title-sensors":"Capteurs","title-sensors-ext":"Capteurs externes","title-buzzer":"Buzzer","title-logging":"Journalisation","title-reset-device-1":"Réinitialiser l’appareil","title-reset-device-2":"Réinitialiser aux paramètres usine","title-welcome":"Bienvenue sur votre PandaGarage","title-lets-started":"Commençons !","title-set-device-name":"Définir le nom de l’appareil","title-connect-wifi-1":"Connectez-vous à votre réseau","title-connect-wifi-2":"Connectez-vous au Wi-Fi","title-verify-connection":"Vérifier la connexion","title-found-networks":"Réseaux trouvés","title-ready":"Prêt à l’emploi","title-test-ha-connection":"Tester la connexion Home Assistant","title-ota-complete":"Mise à jour installée !","title-ota-failed":"Échec de la mise à jour !","title-saved-security":"Paramètres sécurité enregistrés !","title-saved-ha":"Paramètres Home Assistant enregistrés !","title-saved-device":"Paramètres appareil enregistrés !","title-pressure":"Pression","title-restarting":"Redémarrage…","btn-up":"Haut","btn-down":"Bas","btn-stop":"Stop","btn-half":"Moitié","btn-vent":"Ventiler","btn-close":"Fermer","btn-delete-log-debug":"Supprimer log debug","btn-delete-log-access":"Supprimer log accès","btn-download-log-debug":"Télécharger log debug","btn-download-log-access":"Télécharger log accès","btn-login":"Connexion","btn-return-settings":"❮ Paramètres","btn-save-connect":"Enregistrer & connecter","btn-save":"Enregistrer","btn-restart-ap":"Redémarrer en hotspot","btn-update":"Mettre à jour","btn-test-connection":"Tester la connexion","btn-play":"Lire","btn-reset":"Réinitialiser","btn-reset-verify":"Oui, réinitialiser","btn-go":"C’est parti !","btn-next-step":"Étape suivante","btn-scan-networks":"Scanner les réseaux","btn-restart-now":"Redémarrer maintenant","btn-diagnose":"Télécharger diagnostic","alert-error":"Erreur : ","alert-no-auth":"Vous n’êtes pas authentifié, veuillez vous connecter !","alert-wrong-pwd":"Mot de passe incorrect !","alert-logs":"Fichier journal supprimé !","alert-fw-update-title":"Mise à jour disponible !","alert-fw-update-text":"Une nouvelle version du firmware est disponible.","alert-fw-update-link":"Vérifier ici","input-device-name":"Nom de l’appareil","input-device-language":"Langue WebUI","input-temp":"Température","input-sensor-update":"Intervalle de mise à jour (ms)","input-threshold-temp":"Seuil température","input-threshold-hum":"Seuil humidité","input-threshold-pres":"Seuil pression","input-threshold-lux":"Seuil luminosité","input-activate":"Activer","input-sensor-ext":"Capteur externe","input-combine-sensors":"Combiner capteurs","input-buzzer-tune":"Son","input-buzzer-open":"Jouer à l’ouverture","input-buzzer-close":"Jouer à la fermeture","input-log-access":"Journal accès : ","input-log-level":"Niveau journal","input-ip":"Adresse IP","input-port":"Port","input-user":"Nom utilisateur","input-pwd":"Mot de passe","input-ssid":"SSID","input-new-pwd":"Nouveau mot de passe","input-use-auth":"Utiliser authentification","text-sensor-ext-1":"Si vous avez raccordé un capteur externe à l’en-tête I2C, activez cette option et sélectionnez votre capteur.","text-sensor-ext-2":"Vous ne trouvez pas votre capteur ? Mettez à jour le firmware vous-même ou ouvrez un issue sur GitHub pour l’ajouter ultérieurement.","text-buzzer":"Activez le buzzer intégré et choisissez sons et options.","text-log-access":"Enregistre chaque interaction avec la porte de garage via PandaGarage.","text-reset-device-1":"Réinitialisez l’appareil aux paramètres usine.","text-reset-device-2":"CETTE ACTION SUPPRIMERA VOS PARAMÈTRES !","text-reset-device-3":"Voulez-vous vraiment réinitialiser PandaGarage ?","text-ha":"Après avoir saisi vos identifiants, cliquez sur « Tester la connexion » pour vérifier et enregistrer.","text-security":"Le mot de passe sert pour la WebUI et l’API.","text-wifi-1":"Vous pouvez changer le Wi-Fi de deux façons :","text-wifi-2":"Saisir manuellement les nouvelles données","text-wifi-3":"Entrez SSID et mot de passe. L’appareil redémarrera ; si la connexion échoue, il reviendra au réseau actuel.","text-wifi-4":"Utiliser la méthode hotspot","text-wifi-5":"PandaGarage peut créer un hotspot temporaire. Connectez-vous pour choisir le nouveau réseau.","text-lets-start":"Avant de connecter la porte, complétez la configuration.","text-set-device-name":"Voici le nom par défaut. Vous pouvez le modifier ; c’est ainsi que votre appareil apparaît. Modifiable plus tard dans Paramètres.","text-connect-wifi":"Veuillez connecter PandaGarage à votre réseau local.","text-ready-1":"PandaGarage est connecté avec succès !","text-ready-2":"Après « Redémarrer maintenant », reconnectez-vous via l’IP et le mot de passe ci-dessous.","text-panda-ssid":"SSID réseau","text-panda-ip":"IP PandaGarage","text-panda-pwd":"Mot de passe par défaut","text-verify-connection":"Vérification en cours, patientez…","text-verify-mqtt-connection":"Test MQTT en cours…","text-connection-failed":"Connexion échouée !","text-connection-success":"Connexion réussie !","text-connect-ssid":"Nom réseau (SSID)","text-connect-pwd":"Mot de passe (laisser vide si aucun)","text-other-network":"Autre réseau","text-device-name":"Nom de l’appareil","text-wifi-strength":"Puissance du signal","text-ip":"Adresse IP","text-mac":"Adresse MAC","text-uptime":"Uptime","text-local-time":"Heure locale","text-version-fw":"Version firmware","text-version-fs":"Version système de fichiers","text-version-hw":"Version hardware","text-serial":"Numéro de série","text-author":"Auteur","text-github":"GitHub","text-docs":"Documentation","text-changelog":"Changelog","text-sensor-threshold":"Ces valeurs définissent les seuils de déclenchement. Par ex. seuil 1 °C n’enregistre que ≥±1 °C.","text-ota-update":"Installation OTA en cours (jusqu’à 2 min).","text-ota-failed":"Vérifiez les logs, redémarrage…","text-restart-now":"Redémarrage…","text-timestamp":"Horodatage","text-log-level":"Niveau journal","text-tag":"Tag","text-message":"Message","text-no-logs":"Aucun journal trouvé","text-restarting":"À jour après redémarrage","text-door-state-nc":"Non connecté","text-door-state-open":"Ouvert","text-door-state-closed":"Fermé","text-door-state-open-h":"Ouvert à moitié","text-door-state-venting":"Ventilation","text-door-state-stopped":"Arrêté","text-door-state-opening":"Opening","text-door-state-closing":"Closing"}
\ No newline at end of file
+{"nav-dashboard":"Tableau de bord","nav-info":"Info","nav-logs":"Journaux","nav-settings":"Paramètres","nav-settings-device":"Appareil","nav-settings-garage-door":"Porte de garage","nav-settings-security":"Sécurité","nav-settings-wifi":"Wi-Fi","nav-settings-ha":"Home Assistant","nav-settings-update":"Mise à jour","nav-settings-restart":"Redémarrage","nav-settings-logout":"Se déconnecter","title-info-device":"Infos appareil","title-info-general":"Informations générales","title-temp":"Température","title-humidity":"Humidité","title-light":"Lumière","title-404":"oups… la page que vous cherchez est introuvable :(","title-wifi-change":"Modifier le Wi-Fi","title-wifi-manual":"Méthode manuelle","title-wifi-ap":"Méthode hotspot","title-update":"Mise à jour OTA","title-security":"Sécurité","title-settings":"Paramètres","title-ha":"Connexion Home Assistant","title-garage-door":"Configuration porte de garage","title-device":"Configuration de l’appareil","title-sensors":"Capteurs","title-sensors-ext":"Capteurs externes","title-buzzer":"Buzzer","title-logging":"Journalisation","title-reset-device-1":"Réinitialiser l’appareil","title-reset-device-2":"Réinitialiser aux paramètres d’usine","title-welcome":"Bienvenue sur votre PandaGarage","title-lets-started":"Commençons !","title-set-device-name":"Définir le nom de l’appareil","title-connect-wifi-1":"Connectez-vous à votre réseau local","title-connect-wifi-2":"Connecter au Wi-Fi","title-verify-connection":"Vérifier la connexion","title-found-networks":"Réseaux trouvés","title-ready":"Prêt à partir","title-test-ha-connection":"Tester la connexion Home Assistant","title-ota-complete":"Update installed!","title-ota-failed":"Update failed!","btn-up":"Haut","btn-down":"Bas","btn-stop":"Arrêter","btn-light":"Lumière","btn-half":"Mi-haut","btn-vent":"Ventiler","btn-close":"Fermer","btn-delete-log-debug":"Supprimer le journal de débogage","btn-delete-log-access":"Supprimer le journal d’accès","btn-download-log-debug":"Télécharger le journal de débogage","btn-download-log-access":"Télécharger le journal d’accès","btn-login":"Connexion","btn-return-settings":"❮ Paramètres","btn-save-connect":"Enregistrer & connecter","btn-save":"Enregistrer","btn-restart-ap":"Redémarrer en hotspot","btn-update":"Mettre à jour","btn-test-connection":"Tester la connexion","btn-play":"Jouer","btn-reset":"Réinitialiser","btn-reset-verify":"Oui, réinitialiser","btn-go":"C’est parti !","btn-next-step":"Étape suivante","btn-scan-networks":"Scanner les réseaux","btn-restart-now":"Redémarrer maintenant","btn-diagnose":"Télécharger les diagnostics","alert-error":"Erreur : ","alert-no-auth":"Vous n’êtes pas authentifié, veuillez vous connecter !","alert-wrong-pwd":"Le mot de passe saisi est incorrect !","alert-logs":"Fichier journal supprimé !","alert-security":"Paramètres de sécurité enregistrés avec succès !","alert-ha":"Paramètres Home Assistant enregistrés avec succès !","alert-garage-door":"Paramètres porte de garage enregistrés avec succès !","alert-device":"Paramètres de l’appareil enregistrés avec succès !","alert-fw-update-title":"Mise à jour disponible !","alert-fw-update-text":"Une nouvelle version du firmware est disponible.","alert-fw-update-link":"Vérifiez ici","input-device-name":"Nom de l’appareil","input-device-language":"Langue de l’interface","input-temp":"Température","input-sensor-update":"Intervalle de mise à jour (ms)","input-threshold-temp":"Seuil de température","input-threshold-hum":"Seuil d'humidité","input-threshold-lux":"Seuil de lumière","input-activate":"Activer","input-sensor-ext":"Capteur externe","input-buzzer-tune":"Son","input-buzzer-open":"Jouer à l’ouverture","input-buzzer-close":"Jouer à la fermeture","input-log-access":"Journal d’accès: ","input-log-debug":"Journal de débogage: ","input-ip":"Adresse IP","input-port":"Port","input-user":"Nom d’utilisateur","input-pwd":"Mot de passe","input-ssid":"SSID","input-new-pwd":"Nouveau mot de passe","input-use-auth":"Utiliser l’authentification","text-sensor-ext-1":"Si vous avez branché un capteur externe sur l’en-tête I2C, activez cette option et choisissez votre capteur dans la liste déroulante.","text-sensor-ext-2":"Vous ne trouvez pas votre capteur ? Vous devrez peut-être mettre à jour le firmware vous-même ou ouvrir un ticket GitHub pour qu’il soit ajouté dans une future mise à jour.","text-buzzer":"Activez le buzzer intégré et sélectionnez les différents sons et options.","text-log-access":"Enregistre chaque interaction avec la porte de garage via PandaGarage","text-log-debug":"Enregistre diverses actions internes de PandaGarage pour aider au dépannage et au débogage","text-reset-device-1":"Réinitialisez votre appareil aux paramètres d’usine.","text-reset-device-2":"CETTE ACTION SUPPRIMERA VOS PARAMÈTRES !","text-reset-device-3":"Voulez-vous vraiment réinitialiser votre PandaGarage aux paramètres d’usine ?","text-ha":"Après avoir saisi vos identifiants, cliquez sur « Tester la connexion » pour les vérifier et les enregistrer.","text-security":"Le mot de passe sert à se connecter à l’interface WebUI et à l’API.","text-wifi-1":"Vous avez deux façons de changer la connexion Wi-Fi :","text-wifi-2":"Saisissez manuellement les nouvelles informations Wi-Fi","text-wifi-3":"Vous pouvez taper le nom (SSID) et le mot de passe du nouveau Wi-Fi. Attention : l’appareil redémarrera et tentera de s’y connecter. En cas d’échec, il reviendra au Wi-Fi actuel.","text-wifi-4":"Utiliser la méthode hotspot de configuration","text-wifi-5":"PandaGarage peut redémarrer et créer un hotspot Wi-Fi temporaire (comme lors du premier réglage). Vous devrez être près de l’appareil et vous connecter à ce hotspot avec votre téléphone ou ordinateur pour choisir le nouveau réseau Wi-Fi.","text-lets-start":"Avant de connecter votre porte de garage, terminons la configuration de l’appareil.","text-set-device-name":"Voici le nom d’appareil par défaut. Vous pouvez le changer si vous le souhaitez — c’est ainsi que l’appareil apparaîtra sur votre réseau local et dans votre système domotique. Vous pouvez également le modifier plus tard dans les paramètres.","text-connect-wifi":"Veuillez connecter votre PandaGarage à votre réseau local pour continuer.","text-ready-1":"Votre PandaGarage s’est connecté avec succès à votre réseau local !","text-ready-2":"Après avoir cliqué sur « Redémarrer maintenant », vous devrez vous reconnecter en utilisant l’adresse IP et vous connecter avec le mot de passe indiqué ci-dessous.","text-panda-ssid":"SSID du réseau","text-panda-ip":"IP de PandaGarage","text-panda-pwd":"Mot de passe de connexion par défaut","text-verify-connection":"Vérification de la connexion, veuillez patienter…","text-verify-mqtt-connection":"Test de la connexion MQTT…","text-connection-failed":"Connexion échouée !","text-connection-success":"Connexion réussie !","text-connect-ssid":"Nom du réseau (SSID)","text-connect-pwd":"Mot de passe du réseau (laisser vide si aucun)","text-other-network":"Autre réseau","text-device-name":"Nom de l’appareil","text-wifi-strength":"Force du signal Wi-Fi","text-ip":"Adresse IP","text-mac":"Adresse MAC","text-uptime":"Temps de fonctionnement","text-local-time":"Heure locale","text-version-fw":"Version du firmware","text-version-fs":"Version du système de fichiers","text-version-hw":"Version matérielle","text-serial":"Numéro de série","text-author":"Auteur","text-github":"GitHub","text-docs":"Documentation","text-changelog":"Journal des modifications","text-sensor-threshold":"Ces valeurs définissent les seuils de prise en compte des variations. Par exemple, un seuil de température de 1 signifie que les fluctuations de température ne seront enregistrées et affichées que lorsque la valeur mesurée varie d’au moins un degré Celsius.","text-ota-update":"Installing OTA Update. This may take up to 2 minutes.","text-ota-complete":"Will restart now...","text-ota-failed":"Check logs, will restart now ..."}
\ No newline at end of file
diff --git a/data/assets/js/i18n/it.json b/data/assets/js/i18n/it.json
index d3450d86..8dda4baa 100644
--- a/data/assets/js/i18n/it.json
+++ b/data/assets/js/i18n/it.json
@@ -1 +1 @@
-{"nav-dashboard":"Dashboard","nav-info":"Informazioni","nav-logs":"Log","nav-settings":"Impostazioni","nav-settings-device":"Dispositivo","nav-settings-garage-door":"Porta del Garage","nav-settings-security":"Sicurezza","nav-settings-wifi":"WiFi","nav-settings-ha":"Home Assistant","nav-settings-update":"Aggiornamento","nav-settings-restart":"Riavvia","nav-settings-logout":"Disconnetti","title-info-device":"Info Dispositivo","title-info-general":"Info Generali","title-temp":"Temperatura","title-humidity":"Umidità","title-light":"Luce","title-404":"Ops… la pagina richiesta non esiste :(","title-wifi-change":"Cambia WiFi","title-wifi-manual":"Metodo Manuale","title-wifi-ap":"Metodo Hotspot","title-update":"Aggiornamento OTA","title-security":"Sicurezza","title-settings":"Impostazioni","title-ha":"Connessione Home Assistant","title-garage-door":"Configurazione Porta Garage","title-device":"Configurazione Dispositivo","title-sensors":"Sensori","title-sensors-ext":"Sensori Esterni","title-buzzer":"Cicalino","title-logging":"Registrazione","title-reset-device-1":"Reset Dispositivo","title-reset-device-2":"Ripristina ai valori di fabbrica","title-welcome":"Benvenuto nel tuo PandaGarage","title-lets-started":"Iniziamo!","title-set-device-name":"Imposta nome dispositivo","title-connect-wifi-1":"Connettiti alla tua rete","title-connect-wifi-2":"Connettiti al WiFi","title-verify-connection":"Verifica Connessione","title-found-networks":"Reti Trovate","title-ready":"Pronto all’uso","title-test-ha-connection":"Test Connessione Home Assistant","title-ota-complete":"Aggiornamento installato!","title-ota-failed":"Aggiornamento fallito!","title-saved-security":"Impostazioni sicurezza salvate!","title-saved-ha":"Impostazioni Home Assistant salvate!","title-saved-device":"Impostazioni dispositivo salvate!","title-pressure":"Pressione","title-restarting":"Riavvio in corso...","btn-up":"Su","btn-down":"Giù","btn-stop":"Stop","btn-half":"Metà","btn-vent":"Ventila","btn-close":"Chiudi","btn-delete-log-debug":"Elimina Log Debug","btn-delete-log-access":"Elimina Log Accessi","btn-download-log-debug":"Scarica Log Debug","btn-download-log-access":"Scarica Log Accessi","btn-login":"Accedi","btn-return-settings":"❮ Impostazioni","btn-save-connect":"Salva & Connetti","btn-save":"Salva","btn-restart-ap":"Riavvia in Hotspot","btn-update":"Aggiorna","btn-test-connection":"Test Connessione","btn-play":"Riproduci","btn-reset":"Reset","btn-reset-verify":"Sì, resetta","btn-go":"Andiamo!","btn-next-step":"Passo Successivo","btn-scan-networks":"Scansiona Reti","btn-restart-now":"Riavvia ora","btn-diagnose":"Scarica Diagnostica","alert-error":"Errore: ","alert-no-auth":"Non sei autenticato, effettua il login!","alert-wrong-pwd":"Password inserita errata!","alert-logs":"File di log eliminato!","alert-fw-update-title":"Aggiornamento disponibile!","alert-fw-update-text":"È disponibile una nuova versione del firmware.","alert-fw-update-link":"Verifica qui","input-device-name":"Nome Dispositivo","input-device-language":"Lingua WebUI","input-temp":"Temperatura","input-sensor-update":"Intervallo Aggiornamento (ms)","input-threshold-temp":"Soglia Temperatura","input-threshold-hum":"Soglia Umidità","input-threshold-pres":"Soglia Pressione","input-threshold-lux":"Soglia Luce","input-activate":"Attiva","input-sensor-ext":"Sensore Esterno","input-combine-sensors":"Combina Sensori","input-buzzer-tune":"Tono","input-buzzer-open":"Suona all’apertura","input-buzzer-close":"Suona alla chiusura","input-log-access":"Registrazione Accessi: ","input-log-level":"Livello Log","input-ip":"Indirizzo IP","input-port":"Porta","input-user":"Nome utente","input-pwd":"Password","input-ssid":"SSID","input-new-pwd":"Nuova Password","input-use-auth":"Usa autenticazione","text-sensor-ext-1":"Se hai collegato un sensore esterno all’header I2C, abilita questa opzione e seleziona il sensore dal menu a tendina.","text-sensor-ext-2":"Non trovi il tuo sensore? Potrebbe essere necessario aggiornare il firmware manualmente o aprire un issue su GitHub per aggiungerlo in futuro.","text-buzzer":"Attiva il cicalino integrato e seleziona suoni e opzioni.","text-log-access":"Registra ogni interazione con la porta del garage tramite PandaGarage.","text-reset-device-1":"Ripristina il dispositivo alle impostazioni di fabbrica.","text-reset-device-2":"QUESTO ELIMINERÀ LE TUE IMPOSTAZIONI!","text-reset-device-3":"Vuoi davvero ripristinare PandaGarage alle impostazioni di fabbrica?","text-ha":"Inserisci le credenziali e clicca “Test Connessione” per verificarle e salvarle.","text-security":"La password viene usata per WebUI e API.","text-wifi-1":"Hai due modi per cambiare la connessione WiFi:","text-wifi-2":"Inserisci manualmente i dati WiFi","text-wifi-3":"Digita SSID e password. Il dispositivo si riavvierà: se la connessione fallisce, torna alla rete attuale.","text-wifi-4":"Usa il metodo hotspot","text-wifi-5":"PandaGarage può riavviarsi e creare un hotspot temporaneo. Collegati per scegliere la nuova rete.","text-lets-start":"Prima di collegare il garage, completa la configurazione del dispositivo.","text-set-device-name":"Di seguito trovi il nome dispositivo predefinito. Puoi cambiarlo: così apparirà nella rete e nello smart home. Modificabile sempre in Impostazioni.","text-connect-wifi":"Connetti PandaGarage alla tua rete locale per continuare.","text-ready-1":"PandaGarage è connesso con successo!","text-ready-2":"Dopo “Riavvia ora” riconnettiti via IP e accedi con la password sottostante.","text-panda-ssid":"SSID di rete","text-panda-ip":"IP PandaGarage","text-panda-pwd":"Password di default","text-verify-connection":"Verifico la connessione, attendere...","text-verify-mqtt-connection":"Test connessione MQTT...","text-connection-failed":"Connessione fallita!","text-connection-success":"Connessione riuscita!","text-connect-ssid":"Nome rete (SSID)","text-connect-pwd":"Password rete (lascia vuoto se nessuna)","text-other-network":"Altra rete","text-device-name":"Nome dispositivo","text-wifi-strength":"Segnale WiFi","text-ip":"Indirizzo IP","text-mac":"Indirizzo MAC","text-uptime":"Uptime","text-local-time":"Ora locale","text-version-fw":"Versione firmware","text-version-fs":"Versione file system","text-version-hw":"Versione hardware","text-serial":"Seriale","text-author":"Autore","text-github":"GitHub","text-docs":"Documentazione","text-changelog":"Changelog","text-sensor-threshold":"Questi valori definiscono le soglie di registrazione. Es. soglia 1 °C registra variazioni ≥1 °C.","text-ota-update":"Installazione OTA in corso (fino a 2 min).","text-ota-failed":"Controlla i log, riavvio in corso ...","text-restart-now":"Riavvio in corso...","text-timestamp":"Timestamp","text-log-level":"Livello log","text-tag":"Tag","text-message":"Messaggio","text-no-logs":"Nessun log trovato","text-restarting":"Si aggiornerà al riavvio","text-door-state-nc":"Non connesso","text-door-state-open":"Aperto","text-door-state-closed":"Chiuso","text-door-state-open-h":"Aperto a metà","text-door-state-venting":"Ventilazione","text-door-state-stopped":"Fermato","text-door-state-opening":"Opening","text-door-state-closing":"Closing"}
\ No newline at end of file
+{"nav-dashboard":"Cruscotto","nav-info":"Informazioni","nav-logs":"Registri","nav-settings":"Impostazioni","nav-settings-device":"Dispositivo","nav-settings-garage-door":"Porta del garage","nav-settings-security":"Sicurezza","nav-settings-wifi":"Wi-Fi","nav-settings-ha":"Home Assistant","nav-settings-update":"Aggiornamento","nav-settings-restart":"Riavvia","nav-settings-logout":"Disconnettersi","title-info-device":"Informazioni dispositivo","title-info-general":"Informazioni generali","title-temp":"Temperatura","title-humidity":"Umidità","title-light":"Luce","title-404":"ops… la pagina che stavi cercando non è stata trovata :(","title-wifi-change":"Modifica Wi-Fi","title-wifi-manual":"Metodo manuale","title-wifi-ap":"Metodo hotspot","title-update":"Aggiornamento OTA","title-security":"Sicurezza","title-settings":"Impostazioni","title-ha":"Connessione Home Assistant","title-garage-door":"Configurazione porta garage","title-device":"Configurazione dispositivo","title-sensors":"Sensori","title-sensors-ext":"Sensori esterni","title-buzzer":"Cicalino","title-logging":"Registrazione","title-reset-device-1":"Reimposta dispositivo","title-reset-device-2":"Ripristina impostazioni di fabbrica","title-welcome":"Benvenuto su PandaGarage","title-lets-started":"Iniziamo!","title-set-device-name":"Imposta il nome del dispositivo","title-connect-wifi-1":"Connettiti alla tua rete locale","title-connect-wifi-2":"Connetti al Wi-Fi","title-verify-connection":"Verifica connessione","title-found-networks":"Reti trovate","title-ready":"Pronto all’uso","title-test-ha-connection":"Test connessione Home Assistant","title-ota-complete":"Aggiornamento installato!","title-ota-failed":"Aggiornamento non riuscito!","btn-up":"Su","btn-down":"Giù","btn-stop":"Stop","btn-light":"Luce","btn-half":"Metà","btn-vent":"Ventila","btn-close":"Chiudi","btn-delete-log-debug":"Elimina log di debug","btn-delete-log-access":"Elimina log di accesso","btn-download-log-debug":"Scarica log di debug","btn-download-log-access":"Scarica log di accesso","btn-login":"Accedi","btn-return-settings":"❮ Impostazioni","btn-save-connect":"Salva e connetti","btn-save":"Salva","btn-restart-ap":"Riavvia in hotspot","btn-update":"Aggiorna","btn-test-connection":"Test connessione","btn-play":"Riproduci","btn-reset":"Reimposta","btn-reset-verify":"Sì, reimposta","btn-go":"Andiamo!","btn-next-step":"Passo successivo","btn-scan-networks":"Scansiona reti","btn-restart-now":"Riavvia ora","btn-diagnose":"Scarica diagnostica","alert-error":"Errore: ","alert-no-auth":"Non sei autenticato, effettua il login!","alert-wrong-pwd":"Password inserita errata!","alert-logs":"File di log eliminato!","alert-security":"Impostazioni di sicurezza salvate con successo!","alert-ha":"Impostazioni Home Assistant salvate con successo!","alert-garage-door":"Impostazioni porta garage salvate con successo!","alert-device":"Impostazioni dispositivo salvate con successo!","alert-fw-update-title":"Aggiornamento disponibile!","alert-fw-update-text":"È disponibile una nuova versione del firmware.","alert-fw-update-link":"Controlla qui","input-device-name":"Nome dispositivo","input-device-language":"Lingua interfaccia","input-temp":"Temperatura","input-sensor-update":"Intervallo di aggiornamento (ms)","input-threshold-temp":"Soglia di temperatura","input-threshold-hum":"Soglia di umidità","input-threshold-lux":"Soglia di luce","input-activate":"Attiva","input-sensor-ext":"Sensore esterno","input-buzzer-tune":"Suono","input-buzzer-open":"Riproduci all’apertura","input-buzzer-close":"Riproduci alla chiusura","input-log-access":"Log di accesso: ","input-log-debug":"Log di debug: ","input-ip":"Indirizzo IP","input-port":"Porta","input-user":"Nome utente","input-pwd":"Password","input-ssid":"SSID","input-new-pwd":"Nuova password","input-use-auth":"Usa autenticazione","text-sensor-ext-1":"Se hai collegato un sensore esterno all’intestazione I2C, attiva questa opzione e seleziona il tuo sensore dal menu a tendina.","text-sensor-ext-2":"Non trovi il tuo sensore? Potrebbe essere necessario aggiornare il firmware manualmente o aprire un issue su GitHub affinché venga aggiunto in un futuro aggiornamento.","text-buzzer":"Attiva il cicalino integrato e seleziona i diversi suoni e opzioni.","text-log-access":"Registra ogni interazione con la porta del garage tramite PandaGarage.","text-log-debug":"Registra varie azioni interne di PandaGarage per facilitare la risoluzione dei problemi e il debug.","text-reset-device-1":"Ripristina il dispositivo alle impostazioni di fabbrica.","text-reset-device-2":"QUESTA OPERAZIONE CANCELLA LE TUE IMPOSTAZIONI!","text-reset-device-3":"Vuoi davvero ripristinare PandaGarage alle impostazioni di fabbrica?","text-ha":"Dopo aver inserito le tue credenziali, clicca su 'Test connessione' per verificarle e salvarle.","text-security":"La password viene utilizzata per accedere sia all’interfaccia WebUI che all’API.","text-wifi-1":"Hai due modi per cambiare la connessione Wi-Fi:","text-wifi-2":"Inserisci manualmente i nuovi dettagli del Wi-Fi","text-wifi-3":"Puoi digitare il nome (SSID) e la password del nuovo Wi-Fi. Tieni presente che il dispositivo si riavvierà e tenterà di connettersi. Se la connessione fallisce, tornerà al Wi-Fi attuale.","text-wifi-4":"Usa il metodo hotspot di configurazione","text-wifi-5":"PandaGarage può riavviarsi e creare un hotspot Wi-Fi temporaneo (come durante la prima configurazione). Dovrai avvicinarti al dispositivo e connetterti a questo hotspot con il telefono o il computer per scegliere la nuova rete Wi-Fi.","text-lets-start":"Prima di collegare la porta del garage, completiamo la configurazione del dispositivo.","text-set-device-name":"Di seguito è riportato il nome del dispositivo predefinito. Puoi cambiarlo se vuoi: così apparirà sulla tua rete locale e nel tuo sistema di casa intelligente. Puoi anche aggiornarlo in seguito nelle impostazioni.","text-connect-wifi":"Collega PandaGarage alla tua rete locale per procedere.","text-ready-1":"PandaGarage si è connesso correttamente alla tua rete locale!","text-ready-2":"Dopo aver cliccato su 'Riavvia ora', dovrai riconnetterti utilizzando l’indirizzo IP e accedere con la password mostrata di seguito.","text-panda-ssid":"SSID della rete","text-panda-ip":"IP di PandaGarage","text-panda-pwd":"Password predefinita di accesso","text-verify-connection":"Verifica della connessione in corso, attendere…","text-verify-mqtt-connection":"Test connessione MQTT in corso…","text-connection-failed":"Connessione fallita!","text-connection-success":"Connessione riuscita!","text-connect-ssid":"Nome rete (SSID)","text-connect-pwd":"Password rete (lasciare vuoto se nessuna)","text-other-network":"Altra rete","text-device-name":"Nome dispositivo","text-wifi-strength":"Intensità del segnale Wi-Fi","text-ip":"Indirizzo IP","text-mac":"Indirizzo MAC","text-uptime":"Tempo di attività","text-local-time":"Ora locale","text-version-fw":"Versione firmware","text-version-fs":"Versione filesystem","text-version-hw":"Versione hardware","text-serial":"Numero di serie","text-author":"Autore","text-github":"GitHub","text-docs":"Documentazione","text-changelog":"Registro delle modifiche","text-sensor-threshold":"Questi valori definiscono le soglie per registrare le variazioni. Ad esempio, una soglia di temperatura di 1 significa che le fluttuazioni di temperatura verranno registrate e visualizzate solo quando la lettura varia di almeno un grado Celsius.","text-ota-update":"Installazione dell'aggiornamento OTA. Questo può richiedere fino a 2 minuti.","text-ota-complete":"Riavvio in corso...","text-ota-failed":"Controlla i log, riavvio in corso..."}
\ No newline at end of file
diff --git a/data/assets/js/i18n/nl.json b/data/assets/js/i18n/nl.json
index 88bde603..4da04e0b 100644
--- a/data/assets/js/i18n/nl.json
+++ b/data/assets/js/i18n/nl.json
@@ -1 +1 @@
-{"nav-dashboard":"Dashboard","nav-info":"Info","nav-logs":"Logboeken","nav-settings":"Instellingen","nav-settings-device":"Apparaat","nav-settings-garage-door":"Garagedeur","nav-settings-security":"Beveiliging","nav-settings-wifi":"WiFi","nav-settings-ha":"Home Assistant","nav-settings-update":"Bijwerken","nav-settings-restart":"Herstarten","nav-settings-logout":"Uitloggen","title-info-device":"Apparaatinformatie","title-info-general":"Algemene informatie","title-temp":"Temperatuur","title-humidity":"Vochtigheid","title-light":"Licht","title-404":"Oeps... de gevraagde pagina kon niet gevonden worden :(","title-wifi-change":"WiFi wijzigen","title-wifi-manual":"Handmatige methode","title-wifi-ap":"Hotspot-methode","title-update":"OTA-update","title-security":"Beveiliging","title-settings":"Instellingen","title-ha":"Home Assistant-verbinding","title-garage-door":"Configuratie garagedeur","title-device":"Apparaatconfiguratie","title-sensors":"Sensoren","title-sensors-ext":"Externe sensoren","title-buzzer":"Zoemer","title-logging":"Logboekregistratie","title-reset-device-1":"Apparaat resetten","title-reset-device-2":"Terug naar fabrieksinstellingen","title-welcome":"Welkom bij je PandaGarage","title-lets-started":"Aan de slag!","title-set-device-name":"Apparaatnaam instellen","title-connect-wifi-1":"Verbind met je netwerk","title-connect-wifi-2":"Verbind met WiFi","title-verify-connection":"Verbinding controleren","title-found-networks":"Gevonden netwerken","title-ready":"Klaar voor gebruik","title-test-ha-connection":"Test Home Assistant-verbinding","title-ota-complete":"Update geïnstalleerd!","title-ota-failed":"Update mislukt!","title-saved-security":"Beveiligingsinstellingen opgeslagen!","title-saved-ha":"Home Assistant-instellingen opgeslagen!","title-saved-device":"Apparaatinstellingen opgeslagen!","title-pressure":"Druk","title-restarting":"Bezig met herstarten...","btn-up":"Omhoog","btn-down":"Omlaag","btn-stop":"Stop","btn-half":"Half","btn-vent":"Ventileren","btn-close":"Sluiten","btn-delete-log-debug":"Debug-log verwijderen","btn-delete-log-access":"Toegangslog verwijderen","btn-download-log-debug":"Debug-log downloaden","btn-download-log-access":"Toegangslog downloaden","btn-login":"Inloggen","btn-return-settings":"❮ Instellingen","btn-save-connect":"Opslaan & verbinden","btn-save":"Opslaan","btn-restart-ap":"Herstarten (Hotspot)","btn-update":"Bijwerken","btn-test-connection":"Verbinding testen","btn-play":"Afspelen","btn-reset":"Resetten","btn-reset-verify":"Ja, resetten","btn-go":"Aan de slag!","btn-next-step":"Volgende stap","btn-scan-networks":"Netwerken scannen","btn-restart-now":"Nu herstarten","btn-diagnose":"Diagnosesturingsbestand downloaden","alert-error":"Fout: ","alert-no-auth":"Je bent niet geauthenticeerd, log in alstublieft!","alert-wrong-pwd":"Het ingevoerde wachtwoord is onjuist!","alert-logs":"Logbestand verwijderd!","alert-fw-update-title":"Update beschikbaar!","alert-fw-update-text":"Er is een nieuwe firmware-versie beschikbaar.","alert-fw-update-link":"Hier controleren","input-device-name":"Apparaatnaam","input-device-language":"WebUI-taal","input-temp":"Temperatuur","input-sensor-update":"Update-interval (ms)","input-threshold-temp":"Temperatuurdrempel","input-threshold-hum":"Vochtigheidsdrempel","input-threshold-pres":"Drukdrempel","input-threshold-lux":"Lichtdrempel","input-activate":"Activeren","input-sensor-ext":"Externe sensor","input-combine-sensors":"Combineer sensoren","input-buzzer-tune":"Toon","input-buzzer-open":"Afspelen bij openen","input-buzzer-close":"Afspelen bij sluiten","input-log-access":"Toegangsregistratie: ","input-log-level":"Logniveau","input-ip":"IP-adres","input-port":"Poort","input-user":"Gebruikersnaam","input-pwd":"Wachtwoord","input-ssid":"SSID","input-new-pwd":"Nieuw wachtwoord","input-use-auth":"Authenticatie gebruiken","text-sensor-ext-1":"Als je een externe sensor op de I2C-header hebt aangesloten, zet dan deze optie aan en kies je sensor uit de lijst.","text-sensor-ext-2":"Je sensor niet gevonden? Mogelijk moet je zelf de firmware updaten of een issue openen op GitHub voor een toekomstige toevoeging.","text-buzzer":"Activeer de ingebouwde zoemer en kies de gewenste tonen en opties.","text-log-access":"Registreert elke garagedeur-interactie via PandaGarage.","text-reset-device-1":"Reset je apparaat naar fabrieksinstellingen.","text-reset-device-2":"DIT VERWIJDERT JE INSTELLINGEN!","text-reset-device-3":"Weet je zeker dat je PandaGarage wilt terugzetten naar de fabrieksinstellingen?","text-ha":"Voer je gegevens in en klik op „Verbinding testen” om te verifiëren en op te slaan.","text-security":"Het wachtwoord wordt gebruikt voor zowel de WebUI als de API.","text-wifi-1":"Je hebt twee manieren om de WiFi-verbinding te wijzigen:","text-wifi-2":"Voer de nieuwe WiFi-gegevens handmatig in","text-wifi-3":"Voer de SSID en het wachtwoord in. Het apparaat herstart en probeert verbinding te maken. Bij mislukking keert het terug naar de oude WiFi.","text-wifi-4":"Gebruik de hotspot-setupmethode","text-wifi-5":"PandaGarage kan een tijdelijk WiFi-hotspot aanmaken. Verbind daarmee om het nieuwe netwerk te selecteren.","text-lets-start":"Voordat je de garagedeur aansluit, rond eerst de apparaatinstelling af.","text-set-device-name":"Onder zie je de standaard apparaatnaam. Je kunt deze wijzigen – zo verschijnt je apparaat in je netwerk en smart home. Later aanpasbaar in Instellingen.","text-connect-wifi":"Verbind je PandaGarage met je lokale netwerk om door te gaan.","text-ready-1":"Je PandaGarage is succesvol verbonden met je netwerk!","text-ready-2":"Na „Nu herstarten” maak je opnieuw verbinding via het IP en log je in met het getoonde wachtwoord.","text-panda-ssid":"Netwerk-SSID","text-panda-ip":"PandaGarage IP","text-panda-pwd":"Standaard wachtwoord","text-verify-connection":"Verbinding controleren, even geduld ...","text-verify-mqtt-connection":"MQTT-verbinding testen ...","text-connection-failed":"Verbinding mislukt!","text-connection-success":"Verbinding succesvol!","text-connect-ssid":"Netwerknaam (SSID)","text-connect-pwd":"Netwerkwachtwoord (leeg laten indien geen)","text-other-network":"Ander netwerk","text-device-name":"Apparaatnaam","text-wifi-strength":"WiFi-s signaalsterkte","text-ip":"IP-adres","text-mac":"MAC-adres","text-uptime":"Uptime","text-local-time":"Lokale tijd","text-version-fw":"Firmware-versie","text-version-fs":"Bestandssysteem-versie","text-version-hw":"Hardware-versie","text-serial":"Serienummer","text-author":"Auteur","text-github":"GitHub","text-docs":"Documentatie","text-changelog":"Changelog","text-sensor-threshold":"Deze waarden bepalen bij welke wijziging een registratie plaatsvindt. Een drempel van 1 °C betekent bijv. dat alleen afwijkingen ≥1 °C worden vastgelegd.","text-ota-update":"OTA-update installeren (kan tot 2 min duren).","text-ota-failed":"Controleer logs, herstart nu ...","text-restart-now":"Nu herstarten...","text-timestamp":"Tijdstempel","text-log-level":"Logniveau","text-tag":"Tag","text-message":"Bericht","text-no-logs":"Geen logs gevonden","text-restarting":"Wordt ververst na herstart","text-door-state-nc":"Niet verbonden","text-door-state-open":"Open","text-door-state-closed":"Gesloten","text-door-state-open-h":"Half open","text-door-state-venting":"Ventilatie","text-door-state-stopped":"Gestopt","text-door-state-opening":"Opening","text-door-state-closing":"Closing"}
\ No newline at end of file
+{"nav-dashboard":"Dashboard","nav-info":"Info","nav-logs":"Logboeken","nav-settings":"Instellingen","nav-settings-device":"Apparaat","nav-settings-garage-door":"Garagedeur","nav-settings-security":"Beveiliging","nav-settings-wifi":"WiFi","nav-settings-ha":"Home Assistant","nav-settings-update":"Bijwerken","nav-settings-restart":"Herstarten","nav-settings-logout":"Afmelden","title-info-device":"Apparaatinformatie","title-info-general":"Algemene informatie","title-temp":"Temperatuur","title-humidity":"Vochtigheid","title-light":"Licht","title-404":"ojee… de pagina die je zocht kon niet worden gevonden :(","title-wifi-change":"WiFi wijzigen","title-wifi-manual":"Handmatige methode","title-wifi-ap":"Hotspot-methode","title-update":"OTA-update","title-security":"Beveiliging","title-settings":"Instellingen","title-ha":"Home Assistant-verbinding","title-garage-door":"Configuratie garagedeur","title-device":"Apparaatconfiguratie","title-sensors":"Sensoren","title-sensors-ext":"Externe sensoren","title-buzzer":"Buzzer","title-logging":"Logging","title-reset-device-1":"Apparaat resetten","title-reset-device-2":"Terug naar fabrieksinstellingen","title-welcome":"Welkom bij je PandaGarage","title-lets-started":"Laten we beginnen!","title-set-device-name":"Stel de apparaatnaam in","title-connect-wifi-1":"Verbind met je lokale netwerk","title-connect-wifi-2":"Verbind met WiFi","title-verify-connection":"Verbinding verifiëren","title-found-networks":"Gevonden netwerken","title-ready":"Klaar voor gebruik","title-test-ha-connection":"Test Home Assistant-verbinding","title-ota-complete":"Update installed!","title-ota-failed":"Update failed!","btn-up":"Omhoog","btn-down":"Omlaag","btn-stop":"Stop","btn-light":"Licht","btn-half":"Half","btn-vent":"Ventileren","btn-close":"Sluiten","btn-delete-log-debug":"Verwijder debuglog","btn-delete-log-access":"Verwijder toeganglog","btn-download-log-debug":"Download debuglog","btn-download-log-access":"Download toeganglog","btn-login":"Inloggen","btn-return-settings":"❮ Instellingen","btn-save-connect":"Opslaan & verbinden","btn-save":"Opslaan","btn-restart-ap":"Herstart naar hotspot","btn-update":"Bijwerken","btn-test-connection":"Verbinding testen","btn-play":"Afspelen","btn-reset":"Resetten","btn-reset-verify":"Ja, resetten","btn-go":"Laten we gaan!","btn-next-step":"Volgende stap","btn-scan-networks":"Netwerken scannen","btn-restart-now":"Nu herstarten","btn-diagnose":"Diagnostische gegevens downloaden","alert-error":"Fout: ","alert-no-auth":"Je bent niet geverifieerd, log in aub!","alert-wrong-pwd":"Het ingevoerde wachtwoord is onjuist!","alert-logs":"Logbestand verwijderd!","alert-security":"Beveiligingsinstellingen succesvol opgeslagen!","alert-ha":"Home Assistant-instellingen succesvol opgeslagen!","alert-garage-door":"Garagedeurinstellingen succesvol opgeslagen!","alert-device":"Apparaatinstellingen succesvol opgeslagen!","alert-fw-update-title":"Update beschikbaar!","alert-fw-update-text":"Nieuwe firmwareversie beschikbaar.","alert-fw-update-link":"Hier controleren","input-device-name":"Apparaatnaam","input-device-language":"Taal WebUI","input-temp":"Temperatuur","input-sensor-update":"Bijwerkinterval (ms)","input-threshold-temp":"Temperatuurdrempel","input-threshold-hum":"Vochtigheidsdrempel","input-threshold-lux":"Lichtdrempel","input-activate":"Activeren","input-sensor-ext":"Externe sensor","input-buzzer-tune":"Melodie","input-buzzer-open":"Speel bij openen","input-buzzer-close":"Speel bij sluiten","input-log-access":"Toegangslog: ","input-log-debug":"Debuglog: ","input-ip":"IP-adres","input-port":"Poort","input-user":"Gebruikersnaam","input-pwd":"Wachtwoord","input-ssid":"SSID","input-new-pwd":"Nieuw wachtwoord","input-use-auth":"Gebruik authenticatie","text-sensor-ext-1":"Als je een externe sensor op de I2C-header hebt aangesloten, schakel dan deze optie in en kies je sensor uit de dropdown-lijst.","text-sensor-ext-2":"Kun je je sensor niet vinden? Mogelijk moet je de firmware zelf bijwerken of een issue openen op GitHub zodat deze in een toekomstige update kan worden toegevoegd.","text-buzzer":"Activeer de ingebouwde buzzer en selecteer de verschillende geluiden en opties.","text-log-access":"Registreert elke interactie met de garagedeur via PandaGarage","text-log-debug":"Registreert diverse interne acties van PandaGarage om te helpen bij het oplossen van problemen en debuggen","text-reset-device-1":"Reset je apparaat naar de fabrieksinstellingen.","text-reset-device-2":"DIT ZAL JE INSTELLINGEN VERWIJDEREN!","text-reset-device-3":"Wil je je PandaGarage echt terugzetten naar de fabrieksinstellingen?","text-ha":"Nadat je je inloggegevens hebt ingevoerd, klik je op 'Verbinding testen' om ze te verifiëren en op te slaan.","text-security":"Het wachtwoord wordt gebruikt voor inloggen op zowel de WebUI als de API.","text-wifi-1":"Je hebt twee manieren om de WiFi-verbinding te wijzigen:","text-wifi-2":"Voer handmatig de nieuwe WiFi-gegevens in","text-wifi-3":"Je kunt de naam (SSID) en het wachtwoord van de nieuwe WiFi typen. Houd er rekening mee dat het apparaat opnieuw opstart en probeert verbinding te maken. Als de verbinding mislukt, keert het terug naar de huidige WiFi.","text-wifi-4":"Gebruik de hotspot-setupmethode","text-wifi-5":"PandaGarage kan opnieuw opstarten en zijn eigen tijdelijke WiFi-hotspot maken (zoals tijdens de eerste installatie). Je moet in de buurt van het apparaat zijn en verbinding maken met deze hotspot met je telefoon of computer om het nieuwe WiFi-netwerk te kiezen.","text-lets-start":"Voordat je verbinding maakt met je garagedeur, voltooien we eerst de apparaatconfiguratie.","text-set-device-name":"Hieronder zie je de standaard apparaatnaam. Je kunt deze naar wens wijzigen — zo verschijnt het apparaat in je lokale netwerk en in je slimme thuis-systeem. Je kunt het later ook bijwerken in de instellingen.","text-connect-wifi":"Verbind je PandaGarage met je lokale netwerk om door te gaan.","text-ready-1":"Je PandaGarage is met succes verbonden met je lokale netwerk!","text-ready-2":"Na het klikken op 'Nu herstarten' moet je opnieuw verbinden met het IP-adres en inloggen met het onderstaande wachtwoord.","text-panda-ssid":"Netwerk-SSID","text-panda-ip":"PandaGarage IP","text-panda-pwd":"Standaard inlogwachtwoord","text-verify-connection":"Verbinding wordt gecontroleerd, even geduld…","text-verify-mqtt-connection":"MQTT-verbinding wordt getest…","text-connection-failed":"Verbinding mislukt!","text-connection-success":"Verbinding geslaagd!","text-connect-ssid":"Netwerknaam (SSID)","text-connect-pwd":"Netwwachtwoord (leeg laten indien geen)","text-other-network":"Ander netwerk","text-device-name":"Apparaatnaam","text-wifi-strength":"WiFi-signaalsterkte","text-ip":"IP-adres","text-mac":"MAC-adres","text-uptime":"Uptime","text-local-time":"Lokale tijd","text-version-fw":"Firmwareversie","text-version-fs":"Bestandssysteemversie","text-version-hw":"Hardwareversie","text-serial":"Apparaatserie","text-author":"Auteur","text-github":"GitHub","text-docs":"Documentatie","text-changelog":"Wijzigingslogboek","text-sensor-threshold":"Deze waarden bepalen de drempel voor het registreren van veranderingen. Een temperatuurdrempel van 1 betekent bijvoorbeeld dat temperatuurschommelingen alleen worden vastgelegd en weergegeven wanneer de waarde met minimaal één graad Celsius verandert.","text-ota-update":"Installing OTA Update. This may take up to 2 minutes.","text-ota-complete":"Will restart now...","text-ota-failed":"Check logs, will restart now ..."}
\ No newline at end of file
diff --git a/data/assets/js/logs-live.min.js b/data/assets/js/logs-live.min.js
new file mode 100644
index 00000000..6a765389
--- /dev/null
+++ b/data/assets/js/logs-live.min.js
@@ -0,0 +1 @@
+let btnClearLog,btnDownloadLog,logContainer;async function init(){cacheElements(),bindEvents(),connectToLiveLogs()}function cacheElements(){btnClearLog=document.getElementById("btn-log-live-clear"),btnDownloadLog=document.getElementById("btn-log-live-download"),logContainer=document.getElementById("container-log-live")}function bindEvents(){btnClearLog.addEventListener("click",clearLogs),btnDownloadLog.addEventListener("click",downloadLogs)}function connectToLiveLogs(){const e=new EventSource("/api/events");e.addEventListener("open",(function(e){console.log("Connected to live logs."),logContainer.textContent="Connected to live logs. Waiting for updates..."}),!1),e.addEventListener("log",(function(e){const n=(new Date).toLocaleTimeString(),t=document.createElement("div");t.textContent="["+n+"] - "+e.data,logContainer.appendChild(t),logContainer.scrollTop=logContainer.scrollHeight}),!1),e.addEventListener("error",(function(e){setTimeout(connectToLiveLogs,50)}),!1)}function clearLogs(){logContainer.textContent=""}function downloadLogs(){const e=logContainer.textContent,n=new Blob([e],{type:"text/plain"}),t=URL.createObjectURL(n),o=document.createElement("a");o.href=t,o.download="live-log.txt",document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(t)}document.addEventListener("DOMContentLoaded",init);
\ No newline at end of file
diff --git a/data/assets/js/logs.min.js b/data/assets/js/logs.min.js
index 80a5e2d5..de6b1fcb 100644
--- a/data/assets/js/logs.min.js
+++ b/data/assets/js/logs.min.js
@@ -1 +1 @@
-let alertContainer,logAccessContainer,tableLogBody,noLogMessage,noLogMessageAccess,deleteDebugLogBtn,deleteAccessLogBtn;document.addEventListener("DOMContentLoaded",init);const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),initializeView(),loadDebugLog()}function cacheElements(){alertContainer=document.getElementById("alert-log-deleted"),noLogMessage=document.getElementById("no-log"),tableLogBody=document.getElementById("table-log-body"),logAccessContainer=document.getElementById("container-log-access"),deleteDebugLogBtn=document.getElementById("btn-log-debug-delete"),deleteAccessLogBtn=document.getElementById("btn-log-access-delete"),noLogMessageAccess=document.getElementById("no-log-access")}function bindEvents(){deleteDebugLogBtn.addEventListener("click",deleteDebugLog),deleteAccessLogBtn.addEventListener("click",deleteAccessLog)}function initializeView(){alertContainer.style.display="none",noLogMessage.style.display="none",noLogMessageAccess.style.display="none","empty"==logAccessContainer.textContent&&(logAccessContainer.style.display="none",noLogMessageAccess.style.display="block")}function parseLogLine(e){const t=e.split(";",3),n=e.slice(t.join(";").length+1),o=n.startsWith('"')&&n.endsWith('"')?n.slice(1,-1).replace(/""/g,'"'):n;return[...t,o]}async function loadDebugLog(){try{const e=await fetch("/api/log/debug");if(!e.ok)throw new Error("Response was not ok");const t=await e.text();if(!t.trim())return void(noLogMessage.style.display="block");tableLogBody.innerHTML="";t.trim().split("\n").reverse().forEach((e=>{const[t,n,o,s]=parseLogLine(e);if(!t||!n||!o)return;const l=document.createElement("tr");l.innerHTML=`\n
${t}
\n
${["None","Debug","Info","Warning","Error"][n]}
\n
${o}
\n
${s}
\n `,tableLogBody.appendChild(l)}))}catch(e){console.error("Failed to load log data:",e)}}async function deleteDebugLog(){deleteDebugLogBtn.disabled=!0;try{(await fetch("/api/log/debug",{method:"DELETE",headers:{Authorization:savedToken}})).ok&&(alertContainer.style.display="block",logDebugContainer.textContent="Debug Log file has been deleted.",setTimeout((()=>{alertContainer.style.display="none"}),5e3))}catch(e){console.error("Error deleting log:",e)}finally{deleteDebugLogBtn.disabled=!1}}async function deleteAccessLog(){deleteAccessLogBtn.disabled=!0;try{(await fetch("/api/log/access",{method:"DELETE",headers:{Authorization:savedToken}})).ok&&(alertContainer.style.display="block",logAccessContainer.textContent="Access Log file has been deleted.",setTimeout((()=>{alertContainer.style.display="none"}),5e3))}catch(e){console.error("Error deleting log:",e)}finally{deleteAccessLogBtn.disabled=!1}}
\ No newline at end of file
+let alertContainer,logDebugContainer,logAccessContainer,deleteDebugLogBtn,deleteAccessLogBtn;document.addEventListener("DOMContentLoaded",init);const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),initializeView()}function cacheElements(){alertContainer=document.getElementById("alert-log-deleted"),logDebugContainer=document.getElementById("container-log-debug"),logAccessContainer=document.getElementById("container-log-access"),deleteDebugLogBtn=document.getElementById("btn-log-debug-delete"),deleteAccessLogBtn=document.getElementById("btn-log-access-delete")}function bindEvents(){deleteDebugLogBtn.addEventListener("click",deleteDebugLog),deleteAccessLogBtn.addEventListener("click",deleteAccessLog)}function initializeView(){alertContainer.style.display="none"}async function deleteDebugLog(){deleteDebugLogBtn.disabled=!0;try{(await fetch("/api/log/debug",{method:"DELETE",headers:{Authorization:savedToken}})).ok&&(alertContainer.style.display="block",logDebugContainer.textContent="Debug Log file has been deleted.",setTimeout((()=>{alertContainer.style.display="none"}),5e3))}catch(e){console.error("Error deleting log:",e)}finally{deleteDebugLogBtn.disabled=!1}}async function deleteAccessLog(){deleteAccessLogBtn.disabled=!0;try{(await fetch("/api/log/access",{method:"DELETE",headers:{Authorization:savedToken}})).ok&&(alertContainer.style.display="block",logAccessContainer.textContent="Access Log file has been deleted.",setTimeout((()=>{alertContainer.style.display="none"}),5e3))}catch(e){console.error("Error deleting log:",e)}finally{deleteAccessLogBtn.disabled=!1}}
\ No newline at end of file
diff --git a/data/assets/js/settings-device.min.js b/data/assets/js/settings-device.min.js
index 8cb44a90..a056a98c 100644
--- a/data/assets/js/settings-device.min.js
+++ b/data/assets/js/settings-device.min.js
@@ -1 +1 @@
-let deviceNameField,deviceLanguageSelect,diagnoseBtn,sensorUnitSelect,sensorUpdateInterval,sensorThresholdTemp,sensorThresholdHumidity,sensorThresholdPressure,sensorThresholdLight,externalSetCheckbox,externalSensorGroup,externalSensorSelect,combineSensorsCheckbox,buzzerSetCheckbox,buzzerGroup,buzzerTuneSelect,buzzerPlayBtn,buzzerOpeningCheckbox,buzzerClosingCheckbox,accessLoggingCheckbox,logLevelSelect,saveBtn,resetBtn,modalSettingsSaved,modalReset,modalCloseBtn,resetModalBtn;document.addEventListener("DOMContentLoaded",init);const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),initModal(),await loadSettings()}function cacheElements(){deviceNameField=document.getElementById("pref-device-name"),deviceLanguageSelect=document.getElementById("pref-device-language"),diagnoseBtn=document.getElementById("btn-diagnose"),sensorUnitSelect=document.getElementById("pref-device-sensor-unit"),sensorUpdateInterval=document.getElementById("pref-device-sensor-update"),sensorThresholdTemp=document.getElementById("pref-device-threshold-temp"),sensorThresholdHumidity=document.getElementById("pref-device-threshold-hum"),sensorThresholdPressure=document.getElementById("pref-device-threshold-pres"),sensorThresholdLight=document.getElementById("pref-device-threshold-lux"),externalSetCheckbox=document.getElementById("pref-device-sensor-external-set"),externalSensorGroup=document.getElementById("pref-device-sensor-external-group"),externalSensorSelect=document.getElementById("pref-device-sensor-external"),combineSensorsCheckbox=document.getElementById("pref-device-sensor-external-combine"),buzzerSetCheckbox=document.getElementById("pref-device-buzzer-set"),buzzerGroup=document.getElementById("pref-device-buzzer-group"),buzzerTuneSelect=document.getElementById("pref-device-buzzer-tune"),buzzerPlayBtn=document.getElementById("btn-buzzer-play"),buzzerOpeningCheckbox=document.getElementById("pref-device-buzzer-opening"),buzzerClosingCheckbox=document.getElementById("pref-device-buzzer-closing"),accessLoggingCheckbox=document.getElementById("pref-device-log-level"),logLevelSelect=document.getElementById("pref-device-log-level"),saveBtn=document.getElementById("btn-save"),resetBtn=document.getElementById("btn-reset"),modalCloseBtn=document.getElementById("btn-modal-close"),resetModalBtn=document.getElementById("btn-reset-modal")}function bindEvents(){saveBtn.addEventListener("click",handleSave),diagnoseBtn.addEventListener("click",downloadDiagnose),deviceLanguageSelect.addEventListener("change",changeLanguage),externalSetCheckbox.addEventListener("change",toggleExternalSensor),buzzerSetCheckbox.addEventListener("change",toggleBuzzerSet),buzzerPlayBtn.addEventListener("click",buzzerPlay),resetBtn.addEventListener("click",showResetModal),modalCloseBtn.addEventListener("click",(()=>modalReset.hide())),resetModalBtn.addEventListener("click",handleReset)}function initModal(){const e=document.getElementById("modal-saved");modalSettingsSaved=new bootstrap.Modal(e,{keyboard:!1});const t=document.getElementById("modal-reset");modalReset=new bootstrap.Modal(t,{keyboard:!1})}async function loadSettings(){try{const e=await fetch("/api/settings/device",{headers:{Authorization:savedToken}}),t=await e.json();deviceNameField.value=t.name||"",deviceLanguageSelect.value=t.lang||"en",sensorUnitSelect.value=(t.tempUnit??0).toString(),sensorUpdateInterval.value=t.sensorUpdateInterval??6e5,sensorThresholdTemp.value=t.thresholdTemp??0,sensorThresholdHumidity.value=t.thresholdHumidity??0,sensorThresholdPressure.value=t.thresholdPressure??0,sensorThresholdLight.value=t.thresholdLight??0,externalSetCheckbox.checked=Boolean(t.externalSensorSet),toggleExternalSensor(),externalSensorSelect.value=(t.externalSensor??0).toString(),combineSensorsCheckbox.checked=Boolean(t.combineSensors),buzzerSetCheckbox.checked=Boolean(t.buzzerSet),toggleBuzzerSet(),buzzerTuneSelect.value=(t.buzzerTune??0).toString(),buzzerOpeningCheckbox.checked=Boolean(t.buzzerOpening),buzzerClosingCheckbox.checked=Boolean(t.buzzerClosing),accessLoggingCheckbox.checked=Boolean(t.logAccess),logLevelSelect.value=(t.logLevel??0).toString()}catch(e){console.error("Error loading device settings:",e)}}function toggleExternalSensor(){externalSetCheckbox.checked?externalSensorGroup.style.display="block":externalSensorGroup.style.display="none"}function toggleBuzzerSet(){buzzerSetCheckbox.checked?buzzerGroup.style.display="block":buzzerGroup.style.display="none"}async function buzzerPlay(e){e.preventDefault();const t=buzzerTuneSelect.value,n=new URLSearchParams({tune:t});if(t>0)try{if(!(await fetch("/api/buzzer/play",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:n})).ok)return void console.error("Play failed")}catch(e){console.error("Error playing tune: ",e)}else console.warn("No tune selected for buzzer play")}async function handleSave(e){e.preventDefault();const t=new URLSearchParams({name:deviceNameField.value,lang:deviceLanguageSelect.value,tempUnit:sensorUnitSelect.value,sensorUpdateInterval:sensorUpdateInterval.value,thresholdTemp:sensorThresholdTemp.value,thresholdHumidity:sensorThresholdHumidity.value,thresholdPressure:sensorThresholdPressure.value,thresholdLight:sensorThresholdLight.value,externalSensorSet:externalSetCheckbox.checked?"true":"false",externalSensor:externalSensorSelect.value,combineSensors:combineSensorsCheckbox.checked?"true":"false",buzzerSet:buzzerSetCheckbox.checked?"true":"false",buzzerTune:buzzerTuneSelect.value,buzzerOpening:buzzerOpeningCheckbox.checked?"true":"false",buzzerClosing:buzzerClosingCheckbox.checked?"true":"false",logAccess:accessLoggingCheckbox.checked?"true":"false",logLevel:logLevelSelect.value});try{if(!(await fetch("/api/settings/device",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:t})).ok)return void console.error("Save failed");showSavedModal()}catch(e){console.error("Error saving device settings:",e)}}function showSavedModal(){modalSettingsSaved.show(),scrollToTop(),setTimeout((()=>{modalSettingsSaved.hide()}),3e3)}function scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}function showResetModal(){modalReset.show()}async function handleReset(){try{if(!(await fetch("/api/reset",{method:"POST",headers:{Authorization:savedToken}})).ok)return void console.error("Reset failed");modalReset.hide()}catch(e){console.error("Error resetting device:",e)}}function changeLanguage(){const e=deviceLanguageSelect.value;localStorage.setItem("lang",e),loadLanguage(e)}async function downloadDiagnose(e){e.preventDefault();const t=new JSZip,n=[{url:"/api/diagnose",name:"diagnostics.json"},{url:"/api/log/debug",name:"log.csv"},{url:"/api/log/access",name:"log-access.txt"}];for(const e of n){const n=await fetch(e.url);if(!n.ok){console.error(`Failed to fetch ${e.url}`);continue}const o=await n.blob();t.file(e.name,o)}const o=await t.generateAsync({type:"blob"}),r=document.createElement("a");r.href=URL.createObjectURL(o),r.download="PandaGarage-Diagnostics.zip",r.click(),URL.revokeObjectURL(r.href)}
\ No newline at end of file
+let alertSavedDevice,deviceNameField,deviceLanguageSelect,diagnoseBtn,sensorUnitSelect,sensorUpdateInterval,sensorThresholdTemp,sensorThresholdHumidity,sensorThresholdLight,externalSetCheckbox,externalSensorGroup,externalSensorSelect,buzzerSetCheckbox,buzzerGroup,buzzerTuneSelect,buzzerPlayBtn,buzzerOpeningCheckbox,buzzerClosingCheckbox,accessLoggingCheckbox,debugLoggingCheckbox,saveBtn,resetBtn,modalReset,modalInstance,modalCloseBtn,resetModalBtn;document.addEventListener("DOMContentLoaded",init);const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),initModal(),await loadSettings()}function cacheElements(){alertSavedDevice=document.getElementById("alert-saved-device"),deviceNameField=document.getElementById("pref-device-name"),deviceLanguageSelect=document.getElementById("pref-device-language"),diagnoseBtn=document.getElementById("btn-diagnose"),sensorUnitSelect=document.getElementById("pref-device-sensor-unit"),sensorUpdateInterval=document.getElementById("pref-device-sensor-update"),sensorThresholdTemp=document.getElementById("pref-device-threshold-temp"),sensorThresholdHumidity=document.getElementById("pref-device-threshold-hum"),sensorThresholdLight=document.getElementById("pref-device-threshold-lux"),externalSetCheckbox=document.getElementById("pref-device-sensor-external-set"),externalSensorGroup=document.getElementById("pref-device-sensor-external-group"),externalSensorSelect=document.getElementById("pref-device-sensor-external"),buzzerSetCheckbox=document.getElementById("pref-device-buzzer-set"),buzzerGroup=document.getElementById("pref-device-buzzer-group"),buzzerTuneSelect=document.getElementById("pref-device-buzzer-tune"),buzzerPlayBtn=document.getElementById("btn-buzzer-play"),buzzerOpeningCheckbox=document.getElementById("pref-device-buzzer-opening"),buzzerClosingCheckbox=document.getElementById("pref-device-buzzer-closing"),accessLoggingCheckbox=document.getElementById("pref-device-access-logging"),debugLoggingCheckbox=document.getElementById("pref-device-debug-logging"),saveBtn=document.getElementById("btn-save"),resetBtn=document.getElementById("btn-reset"),modalReset=document.getElementById("modal-reset"),modalCloseBtn=document.getElementById("btn-modal-close"),resetModalBtn=document.getElementById("btn-reset-modal"),alertSavedDevice.style.display="none"}function bindEvents(){saveBtn.addEventListener("click",handleSave),diagnoseBtn.addEventListener("click",downloadDiagnose),deviceLanguageSelect.addEventListener("change",changeLanguage),externalSetCheckbox.addEventListener("change",toggleExternalSensor),buzzerSetCheckbox.addEventListener("change",toggleBuzzerSet),buzzerPlayBtn.addEventListener("click",buzzerPlay),resetBtn.addEventListener("click",showResetModal),modalCloseBtn.addEventListener("click",(()=>modalInstance.hide())),resetModalBtn.addEventListener("click",handleReset)}function initModal(){modalInstance=new bootstrap.Modal(modalReset,{backdrop:"static",keyboard:!1})}async function loadSettings(){try{const e=await fetch("/api/settings/device",{headers:{Authorization:savedToken}}),t=await e.json();deviceNameField.value=t.name||"",deviceLanguageSelect.value=t.lang||"en",sensorUnitSelect.value=(t.tempUnit??0).toString(),sensorUpdateInterval.value=t.sensorUpdateInterval??6e5,sensorThresholdTemp.value=t.thresholdTemp??0,sensorThresholdHumidity.value=t.thresholdHumidity??0,sensorThresholdLight.value=t.thresholdLight??0,externalSetCheckbox.checked=Boolean(t.externalSensorSet),toggleExternalSensor(),externalSensorSelect.value=(t.externalSensor??0).toString(),buzzerSetCheckbox.checked=Boolean(t.buzzerSet),toggleBuzzerSet(),buzzerTuneSelect.value=(t.buzzerTune??0).toString(),buzzerOpeningCheckbox.checked=Boolean(t.buzzerOpening),buzzerClosingCheckbox.checked=Boolean(t.buzzerClosing),accessLoggingCheckbox.checked=Boolean(t.logAccess),debugLoggingCheckbox.checked=Boolean(t.logDebug)}catch(e){console.error("Error loading device settings:",e)}}function toggleExternalSensor(){externalSetCheckbox.checked?externalSensorGroup.style.display="block":externalSensorGroup.style.display="none"}function toggleBuzzerSet(){buzzerSetCheckbox.checked?buzzerGroup.style.display="block":buzzerGroup.style.display="none"}async function buzzerPlay(e){e.preventDefault();const t=buzzerTuneSelect.value,n=new URLSearchParams({tune:t});if(t>0)try{if(!(await fetch("/api/buzzer/play",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:n})).ok)return void console.error("Play failed")}catch(e){console.error("Error playing tune: ",e)}else console.warn("No tune selected for buzzer play")}async function handleSave(e){e.preventDefault();const t=new URLSearchParams({name:deviceNameField.value,lang:deviceLanguageSelect.value,tempUnit:sensorUnitSelect.value,sensorUpdateInterval:sensorUpdateInterval.value,thresholdTemp:sensorThresholdTemp.value,thresholdHumidity:sensorThresholdHumidity.value,thresholdLight:sensorThresholdLight.value,externalSensorSet:externalSetCheckbox.checked?"true":"false",externalSensor:externalSensorSelect.value,buzzerSet:buzzerSetCheckbox.checked?"true":"false",buzzerTune:buzzerTuneSelect.value,buzzerOpening:buzzerOpeningCheckbox.checked?"true":"false",buzzerClosing:buzzerClosingCheckbox.checked?"true":"false",logAccess:accessLoggingCheckbox.checked?"true":"false",logDebug:debugLoggingCheckbox.checked?"true":"false"});try{if(!(await fetch("/api/settings/device",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:t})).ok)return void console.error("Save failed");showSavedAlert()}catch(e){console.error("Error saving device settings:",e)}}function showSavedAlert(){alertSavedDevice.style.display="block",scrollToTop(),setTimeout((()=>{alertSavedDevice.style.display="none"}),3e3)}function scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}function showResetModal(){modalInstance.show()}async function handleReset(){try{if(!(await fetch("/api/reset",{method:"POST",headers:{Authorization:savedToken}})).ok)return void console.error("Reset failed");modalInstance.hide()}catch(e){console.error("Error resetting device:",e)}}function changeLanguage(){const e=deviceLanguageSelect.value;localStorage.setItem("lang",e),loadLanguage(e)}async function downloadDiagnose(e){e.preventDefault();const t=new JSZip,n=[{url:"/api/diagnose",name:"diagnostics.json"},{url:"/api/log/debug",name:"log-debug.txt"},{url:"/api/log/access",name:"log-access.txt"}];for(const e of n){const n=await fetch(e.url);if(!n.ok){console.error(`Failed to fetch ${e.url}`);continue}const o=await n.blob();t.file(e.name,o)}const o=await t.generateAsync({type:"blob"}),a=document.createElement("a");a.href=URL.createObjectURL(o),a.download="PandaGarage-Diagnostics.zip",a.click(),URL.revokeObjectURL(a.href)}
\ No newline at end of file
diff --git a/data/assets/js/settings-ha.min.js b/data/assets/js/settings-ha.min.js
index 31858a0a..d24924ba 100644
--- a/data/assets/js/settings-ha.min.js
+++ b/data/assets/js/settings-ha.min.js
@@ -1 +1 @@
-document.addEventListener("DOMContentLoaded",init);let haSetField,haIpField,haPortField,haUserField,haPwdField,togglePwdBtn,pwdIcon,modalSettingsSaved,btnSave,isPwdVisible=!1;const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),initView(),await loadSettings()}function cacheElements(){haSetField=document.getElementById("pref-ha"),haIpField=document.getElementById("pref-ha-ip"),haPortField=document.getElementById("pref-ha-port"),haUserField=document.getElementById("pref-ha-user"),haPwdField=document.getElementById("pref-ha-pwd"),togglePwdBtn=document.getElementById("btn-toggle-pwd"),pwdIcon=document.getElementById("pwd-icon"),btnSave=document.getElementById("btn-save");const e=document.getElementById("modal-saved");modalSettingsSaved=new bootstrap.Modal(e,{keyboard:!1})}function bindEvents(){togglePwdBtn.addEventListener("click",togglePasswordVisibility),btnSave.addEventListener("click",saveSettings),haSetField.addEventListener("change",toggleReadOnly)}function initView(){haPwdField.type="password",haSetField.value="false",haIpField.value="",haPortField.value="1883",haUserField.value="",haPwdField.value=""}async function loadSettings(){try{const e=await fetch("/api/settings/ha",{headers:{Authorization:savedToken}});if(!e.ok)throw new Error(`Load failed: ${e.status}`);const t=await e.json();haSetField.checked=Boolean(t.activate),haIpField.value=t.ip||"1883",haPortField.value=t.port||"",haUserField.value=t.user||"",haPwdField.value=t.pwd||"",toggleReadOnly()}catch(e){console.error("Error loading HA settings:",e)}}function togglePasswordVisibility(){isPwdVisible?(haPwdField.type="password",pwdIcon.src="../assets/img/eye.svg"):(haPwdField.type="text",pwdIcon.src="../assets/img/eye-slash.svg"),isPwdVisible=!isPwdVisible}function toggleReadOnly(){const e=haSetField.checked;haIpField.readOnly=!e,haPortField.readOnly=!e,haUserField.readOnly=!e,haPwdField.readOnly=!e}async function saveSettings(e){e.preventDefault();try{const e=await fetch("/api/settings/ha",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:new URLSearchParams({activate:haSetField.checked?"true":"false",ip:haIpField.value,port:haPortField.value,user:haUserField.value,pwd:haPwdField.value})});if(!e.ok)throw new Error(`HTTP ${e.status}`);showSavedModal()}catch(e){console.error("Error saving details:",e)}}function showSavedModal(){modalSettingsSaved.show(),scrollToTop(),setTimeout((()=>{modalSettingsSaved.hide()}),3e3)}function scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}
\ No newline at end of file
+document.addEventListener("DOMContentLoaded",init);let haSetField,haIpField,haPortField,haUserField,haPwdField,togglePwdBtn,pwdIcon,alertSaved,btnSave,isPwdVisible=!1;const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),initView(),await loadSettings()}function cacheElements(){haSetField=document.getElementById("pref-ha"),haIpField=document.getElementById("pref-ha-ip"),haPortField=document.getElementById("pref-ha-port"),haUserField=document.getElementById("pref-ha-user"),haPwdField=document.getElementById("pref-ha-pwd"),togglePwdBtn=document.getElementById("btn-toggle-pwd"),pwdIcon=document.getElementById("pwd-icon"),alertSaved=document.getElementById("alert-saved-ha-settings"),btnSave=document.getElementById("btn-save")}function bindEvents(){togglePwdBtn.addEventListener("click",togglePasswordVisibility),btnSave.addEventListener("click",saveSettings),haSetField.addEventListener("change",toggleReadOnly)}function initView(){alertSaved.style.display="none",haPwdField.type="password",haSetField.value="false",haIpField.value="",haPortField.value="1883",haUserField.value="",haPwdField.value=""}async function loadSettings(){try{const e=await fetch("/api/settings/ha",{headers:{Authorization:savedToken}});if(!e.ok)throw new Error(`Load failed: ${e.status}`);const t=await e.json();haSetField.checked=Boolean(t.activate),haIpField.value=t.ip||"1883",haPortField.value=t.port||"",haUserField.value=t.user||"",haPwdField.value=t.pwd||"",toggleReadOnly()}catch(e){console.error("Error loading HA settings:",e)}}function togglePasswordVisibility(){isPwdVisible?(haPwdField.type="password",pwdIcon.src="../assets/img/eye.svg"):(haPwdField.type="text",pwdIcon.src="../assets/img/eye-slash.svg"),isPwdVisible=!isPwdVisible}function toggleReadOnly(){const e=haSetField.checked;haIpField.readOnly=!e,haPortField.readOnly=!e,haUserField.readOnly=!e,haPwdField.readOnly=!e}async function saveSettings(e){e.preventDefault();try{const e=await fetch("/api/settings/ha",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:new URLSearchParams({activate:haSetField.checked?"true":"false",ip:haIpField.value,port:haPortField.value,user:haUserField.value,pwd:haPwdField.value})});if(!e.ok)throw new Error(`HTTP ${e.status}`);showSavedAlert()}catch(e){console.error("Error saving details:",e)}}function showSavedAlert(){alertSaved.style.display="block",scrollToTop(),setTimeout((()=>{alertSaved.style.display="none"}),3e3)}function scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}
\ No newline at end of file
diff --git a/data/assets/js/settings-security.min.js b/data/assets/js/settings-security.min.js
index b756153d..9aad1fee 100644
--- a/data/assets/js/settings-security.min.js
+++ b/data/assets/js/settings-security.min.js
@@ -1 +1 @@
-let modalSettingsSaved,useAuthField,securityContainer,adminPwdField,saveBtn,togglePwdBtn,pwdIcon;document.addEventListener("DOMContentLoaded",init);let isPwdVisible=!1;const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),await loadSettings()}function cacheElements(){securityContainer=document.getElementById("security-container"),useAuthField=document.getElementById("pref-use-auth"),adminPwdField=document.getElementById("pref-main-pwd"),saveBtn=document.getElementById("btn-save"),togglePwdBtn=document.getElementById("btn-toggle-pwd"),pwdIcon=document.getElementById("pwd-icon");const e=document.getElementById("modal-saved");modalSettingsSaved=new bootstrap.Modal(e,{keyboard:!1}),adminPwdField.type="password"}function bindEvents(){togglePwdBtn.addEventListener("click",togglePasswordVisibility),saveBtn.addEventListener("click",handleSave),useAuthField.addEventListener("change",(e=>{securityContainer.style.display=e.target.checked?"block":"none"}))}async function loadSettings(){try{const e=await fetch("/api/settings/security",{headers:{Authorization:savedToken}});if(!e.ok)throw new Error(`Load failed: ${e.status}`);const t=await e.json();useAuthField.checked=Boolean(t.useAuth),securityContainer.style.display=useAuthField.checked?"block":"none",adminPwdField.value=t.pwd||""}catch(e){console.error("Error loading security settings:",e)}}function togglePasswordVisibility(){isPwdVisible?(adminPwdField.type="password",pwdIcon.src="../assets/img/eye.svg"):(adminPwdField.type="text",pwdIcon.src="../assets/img/eye-slash.svg"),isPwdVisible=!isPwdVisible}async function handleSave(e){e.preventDefault();const t=new URLSearchParams({pwd:adminPwdField.value.trim(),useAuth:useAuthField.checked?"true":"false"});try{const e=await fetch("/api/settings/security",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:t});if(!e.ok)return console.error(`Save failed: ${e.status}`),void(adminPwdField.value="");showSavedModal()}catch(e){console.error("Error saving security settings:",e)}}function showSavedModal(){modalSettingsSaved.show(),scrollToTop(),setTimeout((()=>{modalSettingsSaved.hide()}),3e3)}function scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}
\ No newline at end of file
+let alertSavedSecurity,useAuthField,securityContainer,adminPwdField,saveBtn,togglePwdBtn,pwdIcon;document.addEventListener("DOMContentLoaded",init);let isPwdVisible=!1;const savedToken=localStorage.getItem("token");async function init(){cacheElements(),bindEvents(),await loadSettings()}function cacheElements(){alertSavedSecurity=document.getElementById("alert-saved-security"),securityContainer=document.getElementById("security-container"),useAuthField=document.getElementById("pref-use-auth"),adminPwdField=document.getElementById("pref-main-pwd"),saveBtn=document.getElementById("btn-save"),togglePwdBtn=document.getElementById("btn-toggle-pwd"),pwdIcon=document.getElementById("pwd-icon"),alertSavedSecurity.style.display="none",adminPwdField.type="password"}function bindEvents(){togglePwdBtn.addEventListener("click",togglePasswordVisibility),saveBtn.addEventListener("click",handleSave),useAuthField.addEventListener("change",(e=>{securityContainer.style.display=e.target.checked?"block":"none"}))}async function loadSettings(){try{const e=await fetch("/api/settings/security",{headers:{Authorization:savedToken}});if(!e.ok)throw new Error(`Load failed: ${e.status}`);const t=await e.json();useAuthField.checked=Boolean(t.useAuth),securityContainer.style.display=useAuthField.checked?"block":"none",adminPwdField.value=t.pwd||""}catch(e){console.error("Error loading security settings:",e)}}function togglePasswordVisibility(){isPwdVisible?(adminPwdField.type="password",pwdIcon.src="../assets/img/eye.svg"):(adminPwdField.type="text",pwdIcon.src="../assets/img/eye-slash.svg"),isPwdVisible=!isPwdVisible}async function handleSave(e){e.preventDefault();const t=new URLSearchParams({pwd:adminPwdField.value.trim(),useAuth:useAuthField.checked?"true":"false"});try{const e=await fetch("/api/settings/security",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:savedToken},body:t});if(!e.ok)return console.error(`Save failed: ${e.status}`),void(adminPwdField.value="");showSavedAlert()}catch(e){console.error("Error saving security settings:",e)}}function showSavedAlert(){alertSavedSecurity.style.display="block",scrollToTop(),setTimeout((()=>{alertSavedSecurity.style.display="none"}),3e3)}function scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}
\ No newline at end of file
diff --git a/data/assets/js/settings-update.min.js b/data/assets/js/settings-update.min.js
index ad13260f..8e7ec20f 100644
--- a/data/assets/js/settings-update.min.js
+++ b/data/assets/js/settings-update.min.js
@@ -1 +1 @@
-let btnFw,btnFs,selectorFw,selectorFs,modalOta,modalFail,modalSuccess,modalProgressTxt,modalProgressBar;document.addEventListener("DOMContentLoaded",init);const Savedtoken=localStorage.getItem("token");function init(){cacheElements(),bindEvents()}function cacheElements(){btnFw=document.getElementById("ota-upload-fw"),btnFs=document.getElementById("ota-upload-fs"),selectorFw=document.getElementById("ota-selector-fw"),selectorFs=document.getElementById("ota-selector-fs"),modalProgressBar=document.getElementById("ota-progress-bar"),modalOta=new bootstrap.Modal(document.getElementById("modal-ota"),{backdrop:"static",keyboard:!1}),modalFail=new bootstrap.Modal(document.getElementById("modal-ota-failed"),{backdrop:"static",keyboard:!1}),modalSuccess=new bootstrap.Modal(document.getElementById("modal-ota-complete"),{backdrop:"static",keyboard:!1})}function bindEvents(){btnFw.addEventListener("click",btnFwClick),btnFs.addEventListener("click",btnFsClick)}function btnFwClick(){uploadOtaFw()}function btnFsClick(){uploadOtaFs()}async function uploadOtaFw(){showOtaProgress();const o=selectorFw.files[0],e=new FormData;e.append("file",o);try{const o=await fetch("/api/ota/fw",{method:"POST",headers:{Authorization:Savedtoken},body:e});o.ok?console.log(o.text()):(console.error("Error uploading OTA FW file: ",o),showErrorModal())}catch(o){console.error("Error uploading OTA FW file: ",o)}}async function uploadOtaFs(){showOtaProgress();const o=selectorFs.files[0],e=new FormData;e.append("file",o);try{const o=await fetch("/api/ota/fs",{method:"POST",headers:{Authorization:Savedtoken},body:e});o.ok?console.log(o.text()):(console.error("Error uploading OTA FS file: ",o),showErrorModal())}catch(o){console.error("Error uploading OTA FS file: ",o)}}async function showOtaProgress(){if(modalProgressBar.style.width="0%",modalProgressBar.innerText="0%",modalProgressBar.classList.remove("bg-danger"),modalProgressBar.classList.add("bg-success"),modalProgressBar.classList.add("progress-bar-striped"),modalProgressBar.classList.add("progress-bar-animated"),modalOta.show(),window.EventSource){var o=new EventSource("/api/events");o.addEventListener("open",(function(o){console.log("Events Connected")}),!1),o.addEventListener("ota-progress",(function(o){console.log("OTA Progress: "+o.data+"%"),modalProgressBar.style.width=o.data+"%",modalProgressBar.innerText=o.data+"%",modalProgressBar.setAttribute("aria-valuenow",o.data),100==o.data&&(modalProgressBar.classList.remove("progress-bar-striped"),modalProgressBar.classList.remove("progress-bar-animated"),modalOta.hide(),modalSuccess.show(),setTimeout((()=>{window.location.reload()}),8e3))}),!1),o.addEventListener("error",(function(o){o.readyState==EventSource.CLOSED&&(console.error("Connection closed"),modalProgressBar.style.width="100%",modalProgressBar.innerText="Error",modalProgressBar.classList.remove("bg-success"),modalProgressBar.classList.add("bg-danger"),modalProgressBar.classList.remove("progress-bar-striped"),modalProgressBar.classList.remove("progress-bar-animated"),showErrorModal())}),!1)}}function showErrorModal(){modalOta.hide(),modalFail.show(),setTimeout((()=>{window.location.reload()}),8e3)}
\ No newline at end of file
+let btnFw,btnFs,selectorFw,selectorFs,modalOta,modalFail,modalSuccess,modalProgressTxt,modalProgressBar;document.addEventListener("DOMContentLoaded",init);const Savedtoken=localStorage.getItem("token");function init(){cacheElements(),bindEvents()}function cacheElements(){btnFw=document.getElementById("ota-upload-fw"),btnFs=document.getElementById("ota-upload-fs"),selectorFw=document.getElementById("ota-selector-fw"),selectorFs=document.getElementById("ota-selector-fs"),modalProgressTxt=document.getElementById("ota-progress-txt"),modalProgressBar=document.getElementById("ota-progress-bar"),modalOta=new bootstrap.Modal(document.getElementById("modal-ota")),modalFail=new bootstrap.Modal(document.getElementById("modal-ota-failed")),modalSuccess=new bootstrap.Modal(document.getElementById("modal-ota-complete"))}function bindEvents(){btnFw.addEventListener("click",btnFwClick),btnFs.addEventListener("click",btnFsClick)}function btnFwClick(){uploadOtaFw()}function btnFsClick(){uploadOtaFs()}async function uploadOtaFw(){showOtaProgress();const e=selectorFw.files[0],o=new FormData;o.append("file",e);try{const e=await fetch("/api/ota/fw",{method:"POST",headers:{Authorization:Savedtoken},body:o});e.ok?console.log(e.text()):(console.error("Error uploading OTA FW file: ",e),showErrorModal())}catch(e){console.error("Error uploading OTA FW file: ",e)}}async function uploadOtaFs(){showOtaProgress();const e=selectorFs.files[0],o=new FormData;o.append("file",e);try{const e=await fetch("/api/ota/fs",{method:"POST",headers:{Authorization:Savedtoken},body:o});e.ok?console.log(e.text()):(console.error("Error uploading OTA FS file: ",e),showErrorModal())}catch(e){console.error("Error uploading OTA FS file: ",e)}}async function showOtaProgress(){if(modalProgressTxt.innerText="",modalProgressBar.style.width="0%",modalProgressBar.innerText="0%",modalProgressBar.classList.remove("bg-danger"),modalProgressBar.classList.add("bg-success"),modalProgressBar.classList.add("progress-bar-striped"),modalProgressBar.classList.add("progress-bar-animated"),modalOta.show(),window.EventSource){var e=new EventSource("/api/events");e.addEventListener("open",(function(e){console.log("Events Connected")}),!1),e.addEventListener("ota-progress",(function(e){console.log("OTA Progress: "+e.data+"%"),modalProgressBar.style.width=e.data+"%",modalProgressBar.innerText=e.data+"%",modalProgressBar.setAttribute("aria-valuenow",e.data),100==e.data&&(modalProgressBar.classList.remove("progress-bar-striped"),modalProgressBar.classList.remove("progress-bar-animated"),modalOta.hide(),modalSuccess.show(),setTimeout((()=>{window.location.reload()}),8e3))}),!1),e.addEventListener("error",(function(e){e.readyState==EventSource.CLOSED&&(console.error("Connection closed"),modalProgressBar.style.width="100%",modalProgressBar.innerText="Error",modalProgressBar.classList.remove("bg-success"),modalProgressBar.classList.add("bg-danger"),modalProgressBar.classList.remove("progress-bar-striped"),modalProgressBar.classList.remove("progress-bar-animated"),showErrorModal())}),!1)}}function showErrorModal(){modalOta.hide(),modalFail.show(),setTimeout((()=>{window.location.reload()}),8e3)}
\ No newline at end of file
diff --git a/data/assets/js/settings.min.js b/data/assets/js/settings.min.js
index ad75a691..3ee725cf 100644
--- a/data/assets/js/settings.min.js
+++ b/data/assets/js/settings.min.js
@@ -1 +1 @@
-document.addEventListener("DOMContentLoaded",(async function(){const t=localStorage.getItem("token");document.getElementById("btn-restart").addEventListener("click",(async function(e){e.preventDefault(),restartModal=document.getElementById("modal-restart");new bootstrap.Modal(restartModal,{backdrop:"static",keyboard:!1}).show();try{await fetch("/api/restart",{method:"POST",headers:{Authorization:t}})}catch(t){console.error("Error sending restart command:",t)}finally{setTimeout((()=>{window.location.href="/"}),5e3)}}));document.getElementById("btn-logout").addEventListener("click",(function(t){t.preventDefault(),localStorage.removeItem("token"),localStorage.removeItem("lastAuthCheck"),window.location.href="/"}))}));
\ No newline at end of file
+document.addEventListener("DOMContentLoaded",(async function(){const e=localStorage.getItem("token");document.getElementById("btn-restart").addEventListener("click",(async function(t){t.preventDefault();try{await fetch("/api/restart",{method:"POST",headers:{Authorization:e}})}catch(e){console.error("Error sending restart command:",e)}finally{setTimeout((()=>{window.location.href="/"}),5e3)}}));document.getElementById("btn-logout").addEventListener("click",(function(e){e.preventDefault(),localStorage.removeItem("token"),localStorage.removeItem("lastAuthCheck"),window.location.href="/"}))}));
\ No newline at end of file
diff --git a/data/assets/js/x-last.min.js b/data/assets/js/x-last.min.js
index e9dbe32a..601b768c 100644
--- a/data/assets/js/x-last.min.js
+++ b/data/assets/js/x-last.min.js
@@ -1 +1 @@
-document.addEventListener("DOMContentLoaded",(()=>{initX()}));let translations={};function initX(){const n=localStorage.getItem("lang");n?loadLanguage(n):(localStorage.setItem("lang","en"),loadLanguage("en"))}function loadLanguage(n){fetch(`/assets/js/i18n/${n}.json`).then((n=>n.json())).then((n=>{translations=n,applyTranslations()})).catch((()=>console.error(`Language file "${n}.json" not found`)))}function applyTranslations(){document.querySelectorAll("[i18n]").forEach((n=>{const t=n.getAttribute("i18n");translations[t]&&(n.textContent=translations[t])}))}window.translateString=function(n){if(0!==translations.length)return translations[n]||n;fetch(`/assets/js/i18n/${lang}.json`).then((n=>n.json())).then((t=>(translations=t,translations[n]||n))).catch((()=>console.error(`Language file "${lang}.json" not found`)))};
\ No newline at end of file
+document.addEventListener("DOMContentLoaded",(()=>{initX()}));let translations={};function initX(){const n=localStorage.getItem("lang");n?loadLanguage(n):(localStorage.setItem("lang","en"),loadLanguage("en"))}function loadLanguage(n){fetch(`/assets/js/i18n/${n}.json`).then((n=>n.json())).then((n=>{translations=n,applyTranslations()})).catch((()=>console.error(`Language file "${n}.json" not found`)))}function applyTranslations(){document.querySelectorAll("[i18n]").forEach((n=>{const t=n.getAttribute("i18n");translations[t]&&(n.textContent=translations[t])}))}
\ No newline at end of file
diff --git a/data/index.html b/data/index.html
index 4add46be..040a78f0 100644
--- a/data/index.html
+++ b/data/index.html
@@ -50,7 +50,7 @@
These values define the thresholds for registering changes. For example, a temperature threshold of 1 means that temperature fluctuations will only be recorded and displayed when the reading varies by at least one degree Celsius.
Temperature Threshold
Humidity Threshold
-
Pressure Threshold
Light Threshold
@@ -72,10 +72,8 @@
Ex
-
-
+
-
@@ -99,19 +97,13 @@
Buzzer<
Logging
-
-
Log Level
+
+
-
Reset Device
+
Reset Device
Reset your device to factory settings.THIS WILL DELETE YOUR SETTINGS!