150 lines
4.1 KiB
JavaScript
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);
|