Files
budget-tracker/ha_ws_lovelace.mjs
T

50 lines
1.5 KiB
JavaScript

// Node 22 a WebSocket natif
const HA_WS = process.env.HA_URL.replace('http://', 'ws://').replace('https://', 'wss://') + '/api/websocket';
const TOKEN = process.env.HA_TOKEN;
let msgId = 1;
const pending = {};
const ws = new WebSocket(HA_WS);
function send(msg) {
return new Promise((resolve) => {
const id = msgId++;
msg.id = id;
pending[id] = resolve;
ws.send(JSON.stringify(msg));
});
}
ws.addEventListener('message', ({ data }) => {
const msg = JSON.parse(data);
if (msg.type === 'auth_required') {
ws.send(JSON.stringify({ type: 'auth', access_token: TOKEN }));
} else if (msg.type === 'auth_ok') {
console.log('✅ Auth OK, HA:', msg.ha_version);
main().catch(console.error);
} else if (msg.id && pending[msg.id]) {
pending[msg.id](msg);
delete pending[msg.id];
}
});
async function main() {
// Lister les dashboards
const dashboards = await send({ type: 'lovelace/dashboards/list' });
console.log('\n📋 Dashboards:', JSON.stringify(dashboards.result || dashboards.error, null, 2));
// Config dashboard par défaut
const config = await send({ type: 'lovelace/config' });
if (config.result) {
console.log('\n📄 Mode: storage');
console.log('Views:', config.result.views?.map(v => v.title || v.path));
} else {
console.log('\n📄 Config défaut:', JSON.stringify(config, null, 2).substring(0, 600));
}
ws.close();
}
ws.addEventListener('error', (e) => { console.error('WS Error:', e.message); process.exit(1); });
setTimeout(() => { console.error('Timeout'); process.exit(1); }, 10000);