Skip to content

Commit

Permalink
feat!: Split ValetudoWifiStatus from ValetudoWifiConfiguration
Browse files Browse the repository at this point in the history
  • Loading branch information
Hypfer committed Jan 18, 2022
1 parent 00d226e commit bbdf2ec
Show file tree
Hide file tree
Showing 17 changed files with 194 additions and 152 deletions.
4 changes: 2 additions & 2 deletions backend/lib/core/capabilities/WifiConfigurationCapability.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ const NotImplementedError = require("../NotImplementedError");
class WifiConfigurationCapability extends Capability {
/**
* @abstract
* @returns {Promise<import("../../entities/core/ValetudoWifiConfiguration")>}
* @returns {Promise<import("../../entities/core/ValetudoWifiStatus")>}
*/
async getWifiConfiguration() {
async getWifiStatus() {
throw new NotImplementedError();
}

Expand Down
35 changes: 2 additions & 33 deletions backend/lib/entities/core/ValetudoWifiConfiguration.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
const SerializableEntity = require("../SerializableEntity");


// noinspection JSCheckFunctionSignatures
class ValetudoWifiConfiguration extends SerializableEntity {
/**
* @param {object} options
* @param {string} [options.ssid]
* @param {object} [options.credentials]
* @param {string} options.ssid
* @param {object} options.credentials
* @param {ValetudoWifiConfigurationCredentialsType} options.credentials.type
* @param {object} options.credentials.typeSpecificSettings //e.g. key or user/password
* @param {object} [options.details]
* @param {ValetudoWifiConfigurationState} [options.details.state]
* @param {number} [options.details.downspeed] unit: mbps
* @param {number} [options.details.upspeed] unit: mbps
* @param {number} [options.details.signal] unit: dBm
* @param {Array<string>} [options.details.ips] all the ips that we can find
* @param {ValetudoWifiConfigurationFrequencyType} [options.details.frequency]
* @param {object} [options.metaData]
*
* @class
Expand All @@ -25,7 +17,6 @@ class ValetudoWifiConfiguration extends SerializableEntity {

this.ssid = options.ssid;
this.credentials = options.credentials;
this.details = options.details;
}
}

Expand All @@ -38,26 +29,4 @@ ValetudoWifiConfiguration.CREDENTIALS_TYPE = Object.freeze({
WPA2_PSK: "wpa2_psk"
});

/**
* @typedef {string} ValetudoWifiConfigurationFrequencyType
* @enum {string}
*
*/
ValetudoWifiConfiguration.FREQUENCY_TYPE = Object.freeze({
W2_4Ghz: "2.4ghz", //cannot start with a number. therefore prefixed with w
W5Ghz: "5ghz"
});

/**
* @typedef {string} ValetudoWifiConfigurationState
* @enum {string}
*
*/
ValetudoWifiConfiguration.STATE = Object.freeze({
CONNECTED: "connected",
NOT_CONNECTED: "not_connected",
UNKNOWN: "unknown"
});


module.exports = ValetudoWifiConfiguration;
49 changes: 49 additions & 0 deletions backend/lib/entities/core/ValetudoWifiStatus.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const SerializableEntity = require("../SerializableEntity");


class ValetudoWifiStatus extends SerializableEntity {
/**
* @param {object} options
* @param {ValetudoWifiState} options.state
* @param {object} options.details
* @param {string} [options.details.ssid]
* @param {number} [options.details.downspeed] unit: mbps
* @param {number} [options.details.upspeed] unit: mbps
* @param {number} [options.details.signal] unit: dBm
* @param {Array<string>} [options.details.ips] all the ips that we can find
* @param {ValetudoWifiStatusFrequencyType} [options.details.frequency]
* @param {object} [options.metaData]
*
* @class
*/
constructor(options) {
super(options);

this.state = options.state;
this.details = options.details;
}
}

/**
* @typedef {string} ValetudoWifiStatusFrequencyType
* @enum {string}
*
*/
ValetudoWifiStatus.FREQUENCY_TYPE = Object.freeze({
W2_4Ghz: "2.4ghz", //cannot start with a number. therefore prefixed with w
W5Ghz: "5ghz"
});

/**
* @typedef {string} ValetudoWifiState
* @enum {string}
*
*/
ValetudoWifiStatus.STATE = Object.freeze({
CONNECTED: "connected",
NOT_CONNECTED: "not_connected",
UNKNOWN: "unknown"
});


module.exports = ValetudoWifiStatus;
Original file line number Diff line number Diff line change
Expand Up @@ -20,42 +20,6 @@
}
}
},
"details": {
"type": "object",
"properties": {
"state": {
"type": "string",
"enum": [
"connected",
"not_connected",
"unknown"
]
},
"downspeed": {
"type": "number"
},
"upspeed": {
"type": "number"
},
"signal": {
"type": "number"
},
"ips": {
"type": "array",
"description": "IP addresses",
"items": {
"type": "string"
}
},
"frequency": {
"type": "string",
"enum": [
"2.4ghz",
"5ghz"
]
}
}
},
"metaData": {
"type": "object"
}
Expand Down
54 changes: 54 additions & 0 deletions backend/lib/entities/core/doc/ValetudoWifiStatus.openapi.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"components": {
"schemas": {
"ValetudoWifiStatus": {
"type": "object",
"properties": {
"state": {
"type": "string",
"enum": [
"connected",
"not_connected",
"unknown"
]
},
"details": {
"type": "object",
"properties": {
"ssid": {
"type": "string",
"description": "Wireless network name"
},
"downspeed": {
"type": "number"
},
"upspeed": {
"type": "number"
},
"signal": {
"type": "number"
},
"ips": {
"type": "array",
"description": "IP addresses",
"items": {
"type": "string"
}
},
"frequency": {
"type": "string",
"enum": [
"2.4ghz",
"5ghz"
]
}
}
},
"metaData": {
"type": "object"
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,11 @@ class WifiConfigurationCapabilityMqttHandle extends CapabilityMqttHandle {
}

async refresh() {
const wifiCfg = await this.capability.getWifiConfiguration();
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_SSID).post(wifiCfg.ssid ?? "");
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_IPS).post(wifiCfg.details?.ips ?? []);
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_FREQUENCY).post(wifiCfg.details?.frequency ?? "");
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_SIGNAL).post(wifiCfg.details?.signal ?? 0);
const wifiCfg = await this.capability.getWifiStatus();
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_SSID).post(wifiCfg.details.ssid ?? "");
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_IPS).post(wifiCfg.details.ips ?? []);
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_FREQUENCY).post(wifiCfg.details.frequency ?? "");
await HassAnchor.getAnchor(HassAnchor.ANCHOR.WIFI_SIGNAL).post(wifiCfg.details.signal ?? 0);

await super.refresh();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const NotImplementedError = require("../../../core/NotImplementedError");
const os = require("os");
const spawnSync = require("child_process").spawnSync;
const ValetudoWifiConfiguration = require("../../../entities/core/ValetudoWifiConfiguration");
const ValetudoWifiStatus = require("../../../entities/core/ValetudoWifiStatus");
const WifiConfigurationCapability = require("../../../core/capabilities/WifiConfigurationCapability");

/**
Expand All @@ -10,7 +10,7 @@ const WifiConfigurationCapability = require("../../../core/capabilities/WifiConf
*/
class LinuxWifiConfigurationCapability extends WifiConfigurationCapability {
/**
* Implementations should provide or discover their own wireless interface which will be used in
* Implementations should provide or discover their own wireless interface, which will be used in
* getWifiConfiguration().
*
* @abstract
Expand All @@ -21,17 +21,16 @@ class LinuxWifiConfigurationCapability extends WifiConfigurationCapability {
}

/**
* @returns {Promise<ValetudoWifiConfiguration>}
* @returns {Promise<ValetudoWifiStatus>}
*/
async getWifiConfiguration() {
async getWifiStatus() {
if (this.robot.config.get("embedded") !== true) {
throw new NotImplementedError("Linux Wi-Fi configuration capability only works on the robot itself");
}

const output = {
details: {
state: ValetudoWifiConfiguration.STATE.UNKNOWN
}
state: ValetudoWifiStatus.STATE.UNKNOWN,
details: {}
};

/*
Expand All @@ -50,25 +49,25 @@ class LinuxWifiConfigurationCapability extends WifiConfigurationCapability {

const extractedWifiData = iwOutput.toString().match(WIFI_CONNECTED_IW_REGEX);
if (extractedWifiData) {
output.details.state = ValetudoWifiConfiguration.STATE.CONNECTED;
output.state = ValetudoWifiStatus.STATE.CONNECTED;
output.details.upspeed = parseFloat(extractedWifiData.groups.txbitrate);
output.details.signal = parseInt(extractedWifiData.groups.signal);
output.ssid = extractedWifiData.groups.ssid.trim();
output.details.ssid = extractedWifiData.groups.ssid.trim();
output.details.ips = Object.values(os.networkInterfaces()).map(i => {
return i.map(l => {
return l.address;
});
}).flat().sort().filter(ip => {
return ip !== "127.0.0.1" && ip !== "::1";
}); //lol this line
output.details.frequency = ValetudoWifiConfiguration.FREQUENCY_TYPE.W2_4Ghz;
output.details.frequency = ValetudoWifiStatus.FREQUENCY_TYPE.W2_4Ghz;

} else if (iwOutput.toString().trim().match(WIFI_NOT_CONNECTED_IW_REGEX)) {
output.details.state = ValetudoWifiConfiguration.STATE.NOT_CONNECTED;
output.state = ValetudoWifiStatus.STATE.NOT_CONNECTED;
}
}

return new ValetudoWifiConfiguration(output);
return new ValetudoWifiStatus(output);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
const LinuxWifiConfigurationCapability = require("../linuxCapabilities/LinuxWifiConfigurationCapability");
const ValetudoWifiConfiguration = require("../../../entities/core/ValetudoWifiConfiguration");
const ValetudoWifiStatus = require("../../../entities/core/ValetudoWifiStatus");

/**
* @extends LinuxWifiConfigurationCapability<import("../../MiioValetudoRobot")>
*/
class MiioWifiConfigurationCapability extends LinuxWifiConfigurationCapability {
/**
* @returns {Promise<ValetudoWifiConfiguration>}
* @returns {Promise<ValetudoWifiStatus>}
*/
async getWifiConfiguration() {
async getWifiStatus() {
if (this.robot.config.get("embedded") === true) {
return super.getWifiConfiguration();
return super.getWifiStatus();
}

const output = {
details: {
state: ValetudoWifiConfiguration.STATE.UNKNOWN
}
state: ValetudoWifiStatus.STATE.UNKNOWN,
details: {}
};

let res = await this.robot.sendCommand("miIO.info");

if (typeof res === "object") {
if (res.ap.bssid !== "") {
output.details.state = ValetudoWifiConfiguration.STATE.CONNECTED;
output.state = ValetudoWifiStatus.STATE.CONNECTED;
output.details.ips = [res.netif.localIp];
output.ssid = res.ap.ssid;
output.details.frequency = ValetudoWifiConfiguration.FREQUENCY_TYPE.W2_4Ghz;
output.details.ssid = res.ap.ssid;
output.details.frequency = ValetudoWifiStatus.FREQUENCY_TYPE.W2_4Ghz;
output.details.signal = res.ap.rssi;
} else {
output.details.state = ValetudoWifiConfiguration.STATE.NOT_CONNECTED;
output.state = ValetudoWifiStatus.STATE.NOT_CONNECTED;
}
}

return new ValetudoWifiConfiguration(output);
return new ValetudoWifiStatus(output);
}

/**
Expand Down
Loading

0 comments on commit bbdf2ec

Please sign in to comment.