Skip to content

Instantly share code, notes, and snippets.

@paul-ridgway
Created April 9, 2023 20:41
Show Gist options
  • Save paul-ridgway/7ea6d1d44015af3265c5036bb04aae04 to your computer and use it in GitHub Desktop.
Save paul-ridgway/7ea6d1d44015af3265c5036bb04aae04 to your computer and use it in GitHub Desktop.
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