feat: méthode WebSocket HA pour Lovelace + vue lumières créée
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user