Detect and reuse ESPHome wifi secrets in new screen wizard

This commit is contained in:
Max Gramser
2026-09-12 17:17:20 +02:00
parent 732a220df5
commit 7e7f597600
7 changed files with 121 additions and 7 deletions
+22 -2
View File
@@ -36,16 +36,36 @@ class Firmware:
raise ValueError('Profiel bestaat niet in de ESPHome-map.')
return p
def wifi_status(self):
# Return availability only; never send secret values to the browser.
path = self.root / 'secrets.yaml'
if not path.exists():
return {'state': 'new', 'missing': ['wifi_ssid', 'wifi_password']}
try:
values = yaml.safe_load(path.read_text())
if not isinstance(values, dict):
return {'state': 'invalid'}
missing = [key for key in ('wifi_ssid', 'wifi_password')
if not isinstance(values.get(key), str)]
if isinstance(values.get('wifi_ssid'), str) and not values['wifi_ssid'].strip():
missing.append('wifi_ssid')
return {'state': 'missing' if missing else 'ready', 'missing': missing}
except (OSError, yaml.YAMLError, UnicodeError):
return {'state': 'invalid'}
def status(self):
return {'available': bool(shutil.which('esphome')), 'profiles': self.profiles(),
'ports': self.ports(), 'job': self.job, 'logs': list(self.logs)}
'ports': self.ports(), 'job': self.job, 'logs': list(self.logs), 'wifi': self.wifi_status()}
def create(self, data):
content = installation_yaml(data)
self.root.mkdir(parents=True,exist_ok=True)
# Existing wifi secrets remain untouched. New owners can supply them once.
secret_path = self.root / 'secrets.yaml'
if not secret_path.exists():
wifi = self.wifi_status()
if wifi['state'] in ('missing', 'invalid'):
raise ValueError('Controleer wifi_ssid en wifi_password in ESPHome secrets.yaml. Bestaande secrets blijven behouden.')
if wifi['state'] == 'new':
ssid, password = data.get('wifi_ssid'), data.get('wifi_password')
if not isinstance(ssid,str) or not ssid.strip() or not isinstance(password,str):
raise ValueError('Vul wifi in voor deze eerste installatie.')
+26 -1
View File
@@ -569,8 +569,33 @@ for (const [value, label] of [
};
$("#filters").append(b);
}
$("#new-screen").onclick = $("#start").onclick = () =>
async function checkWifiSecrets() {
const fields = $("#wifi-fields"), status = $("#wifi-status");
fields.hidden = true;
fields.disabled = true;
$("#create-profile").disabled = true;
status.textContent = "ESPHome wifi-instellingen controleren…";
try {
const {wifi} = await (await api("firmware")).json();
if (wifi?.state === "ready") {
status.textContent = "✓ Bestaande ESPHome-wifi gevonden. Dit scherm gebruikt automatisch wifi_ssid en wifi_password uit je secrets.yaml.";
$("#create-profile").disabled = false;
} else if (wifi?.state === "new") {
status.textContent = "Nog geen ESPHome-secrets gevonden. Vul wifi één keer in; volgende schermen gebruiken deze gegevens automatisch.";
fields.hidden = false;
fields.disabled = false;
$("#create-profile").disabled = false;
} else {
status.textContent = "Controleer wifi_ssid en wifi_password in ESPHome secrets.yaml. Je bestaande bestand blijft behouden. Sluit en open deze wizard opnieuw na aanpassen.";
}
} catch {
status.textContent = "ESPHome-secrets konden niet worden gecontroleerd. Sluit en open de wizard opnieuw om het nogmaals te proberen.";
}
}
$("#new-screen").onclick = $("#start").onclick = () => {
$("#installer").showModal();
checkWifiSecrets();
};
$("#close-install").onclick = () => $("#installer").close();
let generatedName = "";
$("#install-form").onsubmit = async (e) => {
+7 -3
View File
@@ -202,9 +202,12 @@
/><small
>Kleine letters, cijfers en streepjes. Elk scherm een andere
naam.</small
></label
><label
>Wifi-naam (alleen bij eerste installatie)<input
></label>
<p id="wifi-status" role="status"></p>
<fieldset id="wifi-fields" hidden disabled>
<legend>Wifi voor je eerste ESPHome-apparaat</legend>
<label
>Wifi-naam<input
name="wifi_ssid"
autocomplete="off"
/></label>
@@ -214,6 +217,7 @@
type="password"
autocomplete="new-password"
/></label>
</fieldset>
<button type="button" id="create-profile">
Bewaar profiel in ESP Screens
</button>