Created
April 9, 2023 20:41
-
-
Save paul-ridgway/7ea6d1d44015af3265c5036bb04aae04 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import axios from "axios"; | |
import axiosRetry from "axios-retry"; | |
import { statusById } from "./wallbox/chargerStatuses"; | |
class Wallbox { | |
private _token?: string; | |
private _client = axios.create({ | |
baseURL: "https://api.wall-box.com", | |
headers: { | |
'Accept': "application/json", | |
"Content-Type": "application/json;charset=UTF-8" | |
}, | |
}); | |
constructor(private _username: string, private _password: string) { | |
axiosRetry(this._client, { | |
retries: 3, | |
}); | |
} | |
async status(chargerId: number) { | |
if (!this._token) { | |
await this.login(); | |
} | |
console.log("Get Status"); | |
const { data } = await this._client.get(`/v2/charger/${chargerId}`); | |
console.log("Status:", statusById(data.data.chargerData.status).code); | |
return data.data; | |
} | |
async lock(chargerId: number) { | |
if (!this._token) { | |
await this.login(); | |
} | |
console.log("Lock"); | |
const unlock = await this._client.put(`/v2/charger/${chargerId}`, { locked: 1 }); | |
return unlock.data.data.chargerData.locked === 1 | |
} | |
async unlock(chargerId: number) { | |
if (!this._token) { | |
await this.login(); | |
} | |
console.log("Unlock"); | |
const unlock = await this._client.put(`/v2/charger/${chargerId}`, { locked: 0 }); | |
return unlock.data.data.chargerData.locked === 0 | |
} | |
async getDefaultCharger() { | |
if (!this._token) { | |
await this.login(); | |
} | |
console.log("Get group..."); | |
const groups = await this._client.get(`/v3/chargers/groups`); | |
const groupId = groups.data.result.groups[0].id; | |
console.log("Group ID", groupId); | |
const chargers = groups.data.result.groups[0].chargers; | |
const charger = chargers.filter((c: any): boolean => c.name === 'Home')[0]; | |
if (!charger) { | |
console.warn("Charger not found"); | |
return process.exit(2); | |
} | |
console.log("Charger ID:", charger.id); | |
return charger; | |
} | |
async login(): Promise<void> { | |
console.log("Wallbox login..."); | |
const login = await this._client.get("/auth/token/user", { | |
auth: { | |
username: this._username, | |
password: this._password | |
}, | |
}); | |
const { user_id, jwt, ttl, error, status } = login.data; | |
if (login.status !== 200) { | |
throw new Error(`Login failed, status: ${login.status}`); | |
} | |
this._token = jwt; | |
if (!this._client.defaults.headers.common) { | |
this._client.defaults.headers.common = {}; | |
} | |
this._client.defaults.headers.common.Authorization = `Bearer ${this._token}`; | |
} | |
} | |
export const wallbox = new Wallbox(process.env.WALLBOX_USERNAME!, process.env.WALLBOX_PASSWORD!); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment