Files
budget-tracker/ha_ws_add_lights.mjs
T

150 lines
4.1 KiB
JavaScript

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') main().catch(e => { console.error(e); ws.close(); process.exit(1); });
else if (msg.id && pending[msg.id]) { pending[msg.id](msg); delete pending[msg.id]; }
});
const newView = {
title: "💡 Lumières",
path: "gestion-lumieres",
icon: "mdi:lightbulb-multiple",
badges: [],
cards: [
// Carte résumé "tout contrôler"
{
type: "entities",
title: "Toutes les lumières",
show_header_toggle: true,
entities: [
{ entity: "light.dimmer_2", name: "Entrée" },
{ entity: "light.bar", name: "Bar" },
{ entity: "light.bibliotheque", name: "Bibliothèque" },
{ entity: "light.dimmer_salon", name: "Salon" },
{ entity: "light.mezzanine", name: "Mezzanine" }
]
},
// Carte lumière individuelle avec curseur brightness
{
type: "light",
entity: "light.dimmer_2",
name: "Entrée"
},
{
type: "light",
entity: "light.bar",
name: "Bar"
},
{
type: "light",
entity: "light.bibliotheque",
name: "Bibliothèque"
},
{
type: "light",
entity: "light.dimmer_salon",
name: "Salon"
},
{
type: "light",
entity: "light.mezzanine",
name: "Mezzanine"
},
// Boutons rapides
{
type: "horizontal-stack",
cards: [
{
type: "button",
name: "Tout allumer",
icon: "mdi:lightbulb-on",
tap_action: {
action: "call-service",
service: "light.turn_on",
target: {
entity_id: [
"light.dimmer_2",
"light.bar",
"light.bibliotheque",
"light.dimmer_salon",
"light.mezzanine"
]
}
}
},
{
type: "button",
name: "Tout éteindre",
icon: "mdi:lightbulb-off",
tap_action: {
action: "call-service",
service: "light.turn_off",
target: {
entity_id: [
"light.dimmer_2",
"light.bar",
"light.bibliotheque",
"light.dimmer_salon",
"light.mezzanine"
]
}
}
}
]
}
]
};
async function main() {
// 1. Lire la config actuelle
const configResp = await send({ type: 'lovelace/config' });
if (!configResp.result) throw new Error('Impossible de lire la config: ' + JSON.stringify(configResp.error));
const config = configResp.result;
console.log(`Config lue : ${config.views.length} vues`);
// 2. Vérifier si "gestion-lumieres" existe déjà
const exists = config.views.find(v => v.path === 'gestion-lumieres');
if (exists) {
console.log('Vue gestion-lumieres existe déjà — on va la remplacer');
const idx = config.views.indexOf(exists);
config.views[idx] = newView;
} else {
config.views.push(newView);
console.log(`Nouvelle vue ajoutée → total: ${config.views.length} vues`);
}
// 3. Sauvegarder
const saveResp = await send({
type: 'lovelace/config/save',
config: config
});
if (saveResp.type === 'result' && saveResp.success) {
console.log('✅ Config sauvegardée avec succès !');
console.log('URL: ' + process.env.HA_URL + '/lovelace/gestion-lumieres');
} else {
console.log('❌ Erreur:', JSON.stringify(saveResp, null, 2));
}
ws.close();
}
ws.addEventListener('error', e => { console.error('WS Error:', e.message); process.exit(1); });
setTimeout(() => { console.error('Timeout'); process.exit(1); }, 15000);