wifi wizard mostly done #31

pull/1/head
Thomas Ballmann 4 years ago
parent 380d16baf4
commit 3e2a6c51cc

@ -4,9 +4,17 @@
// eslint-disable-next-line // eslint-disable-next-line
const _settings = { const _settings = {
system: {
country: "AT",
language: "de",
timezone: "",
utc: 0,
dst: 0,
wifi: ""
},
device: { device: {
angle: 0,
theme: "black", theme: "black",
name: "dummy"
}, },
playlist: { playlist: {
timer: 60 timer: 60
@ -17,9 +25,6 @@ const _settings = {
lang: "de", lang: "de",
unit: "metric" unit: "metric"
}, },
datetime: {
gmt_offset: 3600
},
cloud: { cloud: {
mode: "active", mode: "active",
url: "http://", url: "http://",
@ -65,7 +70,7 @@ const _stats = {
} }
// eslint-disable-next-line // eslint-disable-next-line
const _wifiScan = [{ "rssi": -59, "ssid": "xd-design.info", "bssid": "38:10:D5:34:80:1B", "channel": 11, "secure": 3 }, { "rssi": -75, "ssid": "FRITZ!Box 7430 JI", "bssid": "38:10:D5:5D:FE:7C", "channel": 1, "secure": 3 }, { "rssi": -87, "ssid": "Vodafone Hotspot", "bssid": "AA:0E:14:BD:50:ED", "channel": 1, "secure": 0 }, { "rssi": -88, "ssid": "WLAN-548426", "bssid": "E0:60:66:55:7F:C5", "channel": 1, "secure": 3 }, { "rssi": -89, "ssid": "Familie Kalinowski", "bssid": "C8:0E:14:BD:50:ED", "channel": 1, "secure": 3 }, { "rssi": -91, "ssid": "WLAN-507287", "bssid": "E0:60:66:48:6C:6B", "channel": 1, "secure": 3 }, { "rssi": -94, "ssid": "TP-LINK_7238", "bssid": "A4:2B:B0:D8:72:38", "channel": 3, "secure": 3 }] const _wifiScan = [{ "rssi": -59, "ssid": "paperdash.io", "bssid": "38:10:D5:34:80:1B", "channel": 11, "secure": 3 }, { "rssi": -75, "ssid": "FRITZ!Box 7430 JI", "bssid": "38:10:D5:5D:FE:7C", "channel": 1, "secure": 3 }, { "rssi": -87, "ssid": "Vodafone Hotspot", "bssid": "AA:0E:14:BD:50:ED", "channel": 1, "secure": 0 }, { "rssi": -88, "ssid": "WLAN-548426", "bssid": "E0:60:66:55:7F:C5", "channel": 1, "secure": 3 }, { "rssi": -89, "ssid": "Familie Kalinowski", "bssid": "C8:0E:14:BD:50:ED", "channel": 1, "secure": 3 }, { "rssi": -91, "ssid": "WLAN-507287", "bssid": "E0:60:66:48:6C:6B", "channel": 1, "secure": 3 }, { "rssi": -94, "ssid": "TP-LINK_7238", "bssid": "A4:2B:B0:D8:72:38", "channel": 3, "secure": 3 }]
import axios from 'axios' import axios from 'axios'
@ -104,9 +109,6 @@ export default {
* @param {*} cb * @param {*} cb
*/ */
wifiScan(cb) { wifiScan(cb) {
return cb(_wifiScan)
// eslint-disable-next-line
return axios return axios
.get('/api/wifi/scan') .get('/api/wifi/scan')
.then(response => cb(response.data)) .then(response => cb(response.data))

@ -1,7 +1,7 @@
<template> <template>
<v-card flat> <v-card flat>
<v-toolbar dark color="primary"> <v-toolbar dark color="primary">
<v-btn icon dark @click="dialog = false"> <v-btn icon dark @click="$emit('cancel')">
<v-icon>$close</v-icon> <v-icon>$close</v-icon>
</v-btn> </v-btn>
<v-toolbar-title class="pl-0">Enter the password for "{{ ssid }}"</v-toolbar-title> <v-toolbar-title class="pl-0">Enter the password for "{{ ssid }}"</v-toolbar-title>
@ -18,7 +18,7 @@
<v-card-text class="pa-5"> <v-card-text class="pa-5">
<v-text-field <v-text-field
v-model="password" v-model="password"
:append-icon="show1 ? 'mdi-eye' : 'mdi-eye-off'" :append-icon="show1 ? '$visibility' : '$visibility_off'"
:type="show1 ? 'text' : 'password'" :type="show1 ? 'text' : 'password'"
label="i8n:Password" label="i8n:Password"
@click:append="show1 = !show1" @click:append="show1 = !show1"
@ -27,35 +27,32 @@
<v-card-actions> <v-card-actions>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn depressed :disabled="isConnecting" color="primary" @click="onWifiConnect()">i8n:Join</v-btn> <v-btn
depressed
:disabled="password === ''"
color="primary"
@click="onConnect(ssid, password)"
>i8n:Join</v-btn>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</template> </template>
<script> <script>
import apiDevice from "@/api/device";
export default { export default {
props: { props: {
ssid: { ssid: {
type: String, type: String,
required: true required: true
},
onConnect: {
type: Function,
required: true
} }
}, },
data: () => ({ data: () => ({
isConnecting: false, isConnecting: false,
//wifiAvailable: [], password: "",
//wifiConnectModal: false,
//wifiConnectSSID: null,
password: null,
show1: false show1: false
}), })
methods: {
onWifiConnect() {
this.isConnecting = true;
apiDevice.wifiConnect(this.ssid, this.password);
}
}
}; };
</script> </script>

@ -48,8 +48,10 @@ const MY_ICONS = {
//search: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/search/baseline.svg')}, //search: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/search/baseline.svg')},
memory: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/memory/baseline.svg')}, memory: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/memory/baseline.svg')},
lock: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/lock/baseline.svg')}, lock: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/lock/baseline.svg')},
settings: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/settings/baseline.svg')},
// wifi // wifi
signalWifiOff: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/signal_wifi_off/baseline.svg')},
signalWifi0: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/signal_wifi_0_bar/baseline.svg')}, signalWifi0: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/signal_wifi_0_bar/baseline.svg')},
signalWifi1: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/signal_wifi_1_bar/baseline.svg')}, signalWifi1: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/signal_wifi_1_bar/baseline.svg')},
signalWifi1Lock: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/signal_wifi_1_bar_lock/baseline.svg')}, signalWifi1Lock: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/signal_wifi_1_bar_lock/baseline.svg')},
@ -64,7 +66,10 @@ const MY_ICONS = {
wb_sunny: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/wb_sunny/baseline.svg')}, wb_sunny: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/wb_sunny/baseline.svg')},
open_in_new: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/open_in_new/baseline.svg')}, open_in_new: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/open_in_new/baseline.svg')},
face: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/face/baseline.svg')}, face: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/face/baseline.svg')},
autorenew: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/autorenew/baseline.svg')} autorenew: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/autorenew/baseline.svg')},
check: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/check/baseline.svg')},
visibility: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/visibility/baseline.svg')},
visibility_off: {component: () => import(/* webpackChunkName: "icons" */'!vue-svg-loader!@material-icons/svg/svg/visibility_off/baseline.svg')}
} }

@ -13,40 +13,49 @@
></v-skeleton-loader> ></v-skeleton-loader>
<v-list v-else> <v-list v-else>
<v-list-item-group v-model="settings.wifi" mandatory> <template v-for="(wifi, i) in wifiAvailable">
<template v-for="(wifi, i) in wifiAvailable"> <div :key="i">
<div :key="i"> <v-divider v-if="i > 0"></v-divider>
<v-divider v-if="i > 0"></v-divider>
<v-list-item class="px-1" @click="onWifiSelect(wifi)">
<v-list-item class="px-1" :value="wifi.ssid" @click.stop="wifiConnectModal = true"> <v-list-item-icon class="mr-2 ml-2">
<v-list-item-content dark> <v-icon v-if="wifi.ssid === settings.system.wifi">$check</v-icon>
<v-list-item-title v-text="wifi.ssid"></v-list-item-title>
<v-list-item-subtitle v-text="wifi.bssid"></v-list-item-subtitle> <v-progress-circular
</v-list-item-content> v-if="wifi.ssid === connectingSSID"
:size="24"
<v-list-item-icon> :width="2"
<v-icon class="mx-2" v-if="wifi.secure">$lock</v-icon> color="grey "
<v-icon class="mx-2">{{ wifi.rssi | wifiIcon(0) }}</v-icon> indeterminate
<v-icon class="ml-3">$next</v-icon> ></v-progress-circular>
</v-list-item-icon> </v-list-item-icon>
</v-list-item>
</div> <v-list-item-content dark>
</template> <v-list-item-title v-text="wifi.ssid"></v-list-item-title>
</v-list-item-group> <v-list-item-subtitle v-text="wifi.bssid"></v-list-item-subtitle>
</v-list-item-content>
<v-list-item-icon>
<v-icon class="mx-2" v-if="wifi.secure">$lock</v-icon>
<v-icon class="mx-2">{{ wifi.rssi | wifiIcon(0) }}</v-icon>
<v-icon class="ml-3">$next</v-icon>
</v-list-item-icon>
</v-list-item>
</div>
</template>
<v-divider></v-divider> <v-divider></v-divider>
<v-btn text color="primary" class="px-0 my-2">Choose Another Network</v-btn> <v-btn text color="primary" class="_px-0 my-2">Choose Another Network</v-btn>
</v-list> </v-list>
<v-dialog v-model="wifiConnectModal" max-width="450"> <v-dialog v-model="wifiPasswordModal" max-width="450">
<setup-wifi-connect <setup-wifi-connect
:ssid="settings.wifi" :ssid="connectSSID"
@connected="commitWifi()" :onConnect="onWifiConnect"
@cancel="wifiConnectModal = false" @cancel="wifiPasswordModal = false"
></setup-wifi-connect> ></setup-wifi-connect>
</v-dialog> </v-dialog>
</v-card> </v-card>
</v-container> </v-container>
</template> </template>
@ -63,8 +72,11 @@ export default {
isLoading: true, isLoading: true,
settings: null, settings: null,
connectSSID: null,
connectingSSID: "",
wifiAvailable: [], wifiAvailable: [],
wifiConnectModal: false wifiPasswordModal: false
}), }),
created() { created() {
apiDevice.getSettings(settings => { apiDevice.getSettings(settings => {
@ -77,6 +89,21 @@ export default {
}); });
}); });
}, },
methods: {} methods: {
onWifiSelect(wifi) {
if (wifi.secure) {
this.connectSSID = wifi.ssid;
this.wifiPasswordModal = true;
} else {
this.onWifiConnect(wifi.ssid, "");
}
},
onWifiConnect(ssid, password) {
this.connectingSSID = ssid;
this.wifiPasswordModal = false;
apiDevice.wifiConnect(ssid, password, () => {});
}
}
}; };
</script> </script>

@ -2447,6 +2447,16 @@ cosmiconfig@^5.0.0:
js-yaml "^3.13.1" js-yaml "^3.13.1"
parse-json "^4.0.0" parse-json "^4.0.0"
countries-and-timezones@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/countries-and-timezones/-/countries-and-timezones-2.2.0.tgz#4a37bd0997e5c9928c6f6958d33ca6814a3ac68a"
integrity sha512-Sk0Xo/f26nj+txU/Kau1V2rKg52tRUJSJoU2xSB/fRNOm266/gPhJhHzupP2czxj3o+XIoI3uwHnWA+T8a5jpA==
countries-list@^2.5.4:
version "2.5.4"
resolved "https://registry.yarnpkg.com/countries-list/-/countries-list-2.5.4.tgz#c1a0ab8f63c0972b266254d63e595ea86a6cfe1e"
integrity sha512-6+AIKth3MCOEWTLOVTgR7zTe6oH3JlL0MworsJwIyG0jQi+cKeChOEPvcKszNtGAuCp7p+OrqdxPWxjhu8LqoA==
create-ecdh@^4.0.0: create-ecdh@^4.0.0:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"

@ -69,11 +69,11 @@ void setupApp()
AsyncResponseStream *response = request->beginResponseStream("application/json"); AsyncResponseStream *response = request->beginResponseStream("application/json");
DynamicJsonDocument doc(668); // https://arduinojson.org/v6/assistant/ DynamicJsonDocument doc(668); // https://arduinojson.org/v6/assistant/
doc["wifi"]["rssi"] = WiFi.RSSI(); doc["wifi"]["mac"] = WiFi.macAddress();
doc["wifi"]["ssid"] = WiFi.SSID(); doc["wifi"]["ssid"] = WiFi.SSID();
doc["wifi"]["connected"] = WiFi.isConnected(); doc["wifi"]["connected"] = WiFi.isConnected();
doc["wifi"]["rssi"] = WiFi.RSSI();
doc["wifi"]["ip"] = WiFi.localIP().toString(); doc["wifi"]["ip"] = WiFi.localIP().toString();
doc["wifi"]["mac"] = WiFi.macAddress();
doc["wifi"]["channel"] = WiFi.channel(); doc["wifi"]["channel"] = WiFi.channel();
doc["wifi"]["dns"] = WiFi.dnsIP().toString(); doc["wifi"]["dns"] = WiFi.dnsIP().toString();
doc["wifi"]["gateway"] = WiFi.gatewayIP().toString(); doc["wifi"]["gateway"] = WiFi.gatewayIP().toString();
@ -141,6 +141,8 @@ void setupSettingsGet()
root["system"]["timezone"] = NVS.getString("system.timezone"); root["system"]["timezone"] = NVS.getString("system.timezone");
root["system"]["utc"] = NVS.getInt("system.utc"); root["system"]["utc"] = NVS.getInt("system.utc");
root["system"]["dst"] = NVS.getInt("system.dst"); root["system"]["dst"] = NVS.getInt("system.dst");
root["system"]["wifi"] = NVS.getString("wifi.ssid");
// gmtOffset_sec // gmtOffset_sec
// daylightOffset_sec // daylightOffset_sec
@ -280,44 +282,32 @@ void setupCurrentImage()
} }
/** /**
* @todo * scan for wifi
*/ */
void setupWifiScan() void setupWifiScan()
{ {
//First request will return 0 results unless you start scan from somewhere else (loop/setup)
//Do not request more often than 3-5 seconds
server.on("/api/wifi/scan", HTTP_GET, [](AsyncWebServerRequest *request) { server.on("/api/wifi/scan", HTTP_GET, [](AsyncWebServerRequest *request) {
String json = "["; String json = "[";
int n = WiFi.scanComplete();
if (n == -2) int n = WiFi.scanNetworks();
{ for (int i = 0; i < n; ++i)
WiFi.scanNetworks(true);
}
else if (n)
{ {
for (int i = 0; i < n; ++i) if (i)
{ {
if (i) json += ",";
{
json += ",";
}
json += "{";
json += "\"rssi\":" + String(WiFi.RSSI(i));
json += ",\"ssid\":\"" + WiFi.SSID(i) + "\"";
json += ",\"bssid\":\"" + WiFi.BSSIDstr(i) + "\"";
json += ",\"channel\":" + String(WiFi.channel(i));
json += ",\"secure\":" + String(WiFi.encryptionType(i));
json += "}";
} }
WiFi.scanDelete(); json += "{";
if (WiFi.scanComplete() == -2) json += "\"rssi\":" + String(WiFi.RSSI(i));
{ json += ",\"ssid\":\"" + WiFi.SSID(i) + "\"";
WiFi.scanNetworks(true); json += ",\"bssid\":\"" + WiFi.BSSIDstr(i) + "\"";
} json += ",\"channel\":" + String(WiFi.channel(i));
json += ",\"secure\":" + String(WiFi.encryptionType(i));
json += "}";
} }
WiFi.scanDelete();
json += "]"; json += "]";
request->send(200, "application/json", json); request->send(200, "application/json", json);
json = String(); json = String();
@ -338,10 +328,23 @@ void setupWifiConnect()
Serial.print(F("deserializeJson() failed with code ")); Serial.print(F("deserializeJson() failed with code "));
Serial.println(error.c_str()); Serial.println(error.c_str());
request->send(404, "text/plain", ""); request->send(404, "application/ld+json; charset=utf-8", "{}");
} }
else else
{ {
JsonVariant ssid = doc["ssid"];
if (!ssid.isNull()) {
NVS.setString("wifi.ssid", ssid);
Serial.println(ssid.as<char*>());
}
JsonVariant password = doc["password"];
if (!password.isNull()) {
NVS.setString("wifi.password", password);
Serial.println(password.as<char*>());
}
/*
if (doc.containsKey("ssid")) { if (doc.containsKey("ssid")) {
NVS.setString("wifi_ssid", doc["ssid"]); NVS.setString("wifi_ssid", doc["ssid"]);
Serial.println(doc["ssid"].as<char*>()); Serial.println(doc["ssid"].as<char*>());
@ -350,6 +353,7 @@ void setupWifiConnect()
NVS.setString("wifi_password", doc["password"]); NVS.setString("wifi_password", doc["password"]);
Serial.println(doc["password"].as<char*>()); Serial.println(doc["password"].as<char*>());
} }
*/
request->send(200, "application/ld+json; charset=utf-8", "{}"); request->send(200, "application/ld+json; charset=utf-8", "{}");

Loading…
Cancel
Save