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
const _settings = {
system: {
country: "AT",
language: "de",
timezone: "",
utc: 0,
dst: 0,
wifi: ""
},
device: {
angle: 0,
theme: "black",
name: "dummy"
},
playlist: {
timer: 60
@ -17,9 +25,6 @@ const _settings = {
lang: "de",
unit: "metric"
},
datetime: {
gmt_offset: 3600
},
cloud: {
mode: "active",
url: "http://",
@ -65,7 +70,7 @@ const _stats = {
}
// 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'
@ -104,9 +109,6 @@ export default {
* @param {*} cb
*/
wifiScan(cb) {
return cb(_wifiScan)
// eslint-disable-next-line
return axios
.get('/api/wifi/scan')
.then(response => cb(response.data))

@ -1,7 +1,7 @@
<template>
<v-card flat>
<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-btn>
<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-text-field
v-model="password"
:append-icon="show1 ? 'mdi-eye' : 'mdi-eye-off'"
:append-icon="show1 ? '$visibility' : '$visibility_off'"
:type="show1 ? 'text' : 'password'"
label="i8n:Password"
@click:append="show1 = !show1"
@ -27,35 +27,32 @@
<v-card-actions>
<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>
</template>
<script>
import apiDevice from "@/api/device";
export default {
props: {
ssid: {
type: String,
required: true
},
onConnect: {
type: Function,
required: true
}
},
data: () => ({
isConnecting: false,
//wifiAvailable: [],
//wifiConnectModal: false,
//wifiConnectSSID: null,
password: null,
password: "",
show1: false
}),
methods: {
onWifiConnect() {
this.isConnecting = true;
apiDevice.wifiConnect(this.ssid, this.password);
}
}
})
};
</script>

@ -48,8 +48,10 @@ const MY_ICONS = {
//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')},
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
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')},
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')},
@ -64,7 +66,10 @@ const MY_ICONS = {
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')},
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-list v-else>
<v-list-item-group v-model="settings.wifi" mandatory>
<template v-for="(wifi, i) in wifiAvailable">
<div :key="i">
<v-divider v-if="i > 0"></v-divider>
<v-list-item class="px-1" :value="wifi.ssid" @click.stop="wifiConnectModal = true">
<v-list-item-content dark>
<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-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-list-item-group>
<template v-for="(wifi, i) in wifiAvailable">
<div :key="i">
<v-divider v-if="i > 0"></v-divider>
<v-list-item class="px-1" @click="onWifiSelect(wifi)">
<v-list-item-icon class="mr-2 ml-2">
<v-icon v-if="wifi.ssid === settings.system.wifi">$check</v-icon>
<v-progress-circular
v-if="wifi.ssid === connectingSSID"
:size="24"
:width="2"
color="grey "
indeterminate
></v-progress-circular>
</v-list-item-icon>
<v-list-item-content dark>
<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-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-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-dialog v-model="wifiConnectModal" max-width="450">
<v-dialog v-model="wifiPasswordModal" max-width="450">
<setup-wifi-connect
:ssid="settings.wifi"
@connected="commitWifi()"
@cancel="wifiConnectModal = false"
:ssid="connectSSID"
:onConnect="onWifiConnect"
@cancel="wifiPasswordModal = false"
></setup-wifi-connect>
</v-dialog>
</v-card>
</v-container>
</template>
@ -63,8 +72,11 @@ export default {
isLoading: true,
settings: null,
connectSSID: null,
connectingSSID: "",
wifiAvailable: [],
wifiConnectModal: false
wifiPasswordModal: false
}),
created() {
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>

@ -2447,6 +2447,16 @@ cosmiconfig@^5.0.0:
js-yaml "^3.13.1"
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:
version "4.0.3"
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");
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"]["connected"] = WiFi.isConnected();
doc["wifi"]["rssi"] = WiFi.RSSI();
doc["wifi"]["ip"] = WiFi.localIP().toString();
doc["wifi"]["mac"] = WiFi.macAddress();
doc["wifi"]["channel"] = WiFi.channel();
doc["wifi"]["dns"] = WiFi.dnsIP().toString();
doc["wifi"]["gateway"] = WiFi.gatewayIP().toString();
@ -141,6 +141,8 @@ void setupSettingsGet()
root["system"]["timezone"] = NVS.getString("system.timezone");
root["system"]["utc"] = NVS.getInt("system.utc");
root["system"]["dst"] = NVS.getInt("system.dst");
root["system"]["wifi"] = NVS.getString("wifi.ssid");
// gmtOffset_sec
// daylightOffset_sec
@ -280,44 +282,32 @@ void setupCurrentImage()
}
/**
* @todo
* scan for wifi
*/
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) {
String json = "[";
int n = WiFi.scanComplete();
if (n == -2)
{
WiFi.scanNetworks(true);
}
else if (n)
int n = WiFi.scanNetworks();
for (int i = 0; i < n; ++i)
{
for (int i = 0; i < n; ++i)
if (i)
{
if (i)
{
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 += "}";
json += ",";
}
WiFi.scanDelete();
if (WiFi.scanComplete() == -2)
{
WiFi.scanNetworks(true);
}
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 += "]";
request->send(200, "application/json", json);
json = String();
@ -338,10 +328,23 @@ void setupWifiConnect()
Serial.print(F("deserializeJson() failed with code "));
Serial.println(error.c_str());
request->send(404, "text/plain", "");
request->send(404, "application/ld+json; charset=utf-8", "{}");
}
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")) {
NVS.setString("wifi_ssid", doc["ssid"]);
Serial.println(doc["ssid"].as<char*>());
@ -350,6 +353,7 @@ void setupWifiConnect()
NVS.setString("wifi_password", doc["password"]);
Serial.println(doc["password"].as<char*>());
}
*/
request->send(200, "application/ld+json; charset=utf-8", "{}");

Loading…
Cancel
Save