Bonjour,
Je souhaiterais savoir si quelqu’un récupère la consommation en eau avec l’application Veolia ?
Est il possible de générer un script ou autre ?
Cela a déjà été réalisé sur Jeedom : Jeedom Market
Bonjour,
Je souhaiterais savoir si quelqu’un récupère la consommation en eau avec l’application Veolia ?
Est il possible de générer un script ou autre ?
Cela a déjà été réalisé sur Jeedom : Jeedom Market
@SergeP @Herve_Domotique voici un script généré par IA (claude) pour récupérer la consommation en eau de Veolia.
Il faut d’abord créer la variable dans Homey, puis exécuter le vrai script Veolia qui va la remplir.
Étape 1 — Allez dans Homey app → Paramètres → Variables et créez ces variables :
| Nom | Type |
|---|---|
conso_eau_historique |
Texte |
conso_eau_litres |
Nombre |
conso_eau_date |
Texte |
conso_eau_moyenne7j |
Nombre |
conso_eau_alerte |
Oui/Non |
conso_eau_alerte_message |
Texte |
Étape 2 — sur la Page Veolia en faisant F12 ou mode développeur
Se connecter à son compte
Observer la requête envoyée à cognito-idp.eu-west-3.amazonaws.com
Dans le corps de la requête on voit en clair :
json
{
"ClientId": "1XXXXXX8",
"AuthFlow": "USER_PASSWORD_AUTH",
...
}
// ============================================
// VEOLIA CONSO EAU - V2
// Basée sur la V1 fonctionnelle, enrichie avec :
// - Calcul coût TTC détaillé (eau + assainissement + redevances + TVA)
// - Détection fuite nocturne (si data horaire dispo)
// - Moyennes glissantes 7j/30j + tendance
// - Statistiques mensuelles (cumul mois en cours)
// - Gestion d'erreur avec flag d'échec pour flows d'alerte
// - Tags enrichis pour exploitation par d'autres flows
// ============================================
// --- CREDENTIALS (inchangés) ---
const EMAIL = 'email a renseigner';
const PASSWORD = 'mdp';
const COGNITO_CLIENT_ID = 'a renseigner';
const COGNITO_REGION = 'eu-west-3';
const ABO_ID = 'a renseigner';
const NUMERO_PDS = '003L5HS';
const DATE_DEBUT_ABO = '2020-11-30';
// --- SEUILS ---
const SEUIL_ALERTE_L = 300; // seuil conso jour
const SEUIL_FUITE_NUIT_L = 50; // litres entre 23h-6h → fuite probable
const SEUIL_ECART_MOY_PCT = 50; // % au-dessus moy 7j → alerte tendance
// --- TARIFS EAU 2026 (à ajuster selon ta facture Veolia) ---
// Vérifie sur ta dernière facture Veolia et mets à jour ces valeurs
const TARIF = {
eau_potable_m3: 2.10, // €/m³ HT - part variable eau
assainissement_m3: 1.85, // €/m³ HT - part variable assainissement
redevance_pollution: 0.35, // €/m³ HT
redevance_modernisation: 0.155, // €/m³ HT
tva_eau: 0.055, // 5,5%
tva_assainissement: 0.10, // 10%
};
// --- WEBHOOK (inchangé) ---
const WEBHOOK_ALERTE = 'https://webhook.homey.app/64a8011093db150b8f20a51a/alerte_eau';
// ============================================
// FONCTIONS (auth + conso inchangées)
// ============================================
async function getToken() {
const res = await fetch(`https://cognito-idp.${COGNITO_REGION}.amazonaws.com/`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-amz-json-1.1',
'X-Amz-Target': 'AWSCognitoIdentityProviderService.InitiateAuth'
},
body: JSON.stringify({
AuthFlow: 'USER_PASSWORD_AUTH',
ClientId: COGNITO_CLIENT_ID,
AuthParameters: { USERNAME: EMAIL, PASSWORD: PASSWORD }
})
});
if (!res.ok) throw new Error('Login échoué: ' + res.status);
const data = await res.json();
return data.AuthenticationResult.AccessToken;
}
async function getConsommation(token) {
const now = new Date();
const mois = now.getMonth() + 1;
const annee = now.getFullYear();
const url = `https://prd-ael-sirius-backend.istefr.fr/consommations/${ABO_ID}/journalieres?mois=${mois}&annee=${annee}&numero-pds=${NUMERO_PDS}&date-debut-abonnement=${DATE_DEBUT_ABO}`;
const res = await fetch(url, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
'Origin': 'https://eaudetm.monespace.eau.veolia.fr'
}
});
if (!res.ok) throw new Error('Récupération conso échouée: ' + res.status);
return await res.json();
}
// --- CALCUL COÛT TTC DÉTAILLÉ ---
function calculerCout(litres) {
const m3 = litres / 1000;
const eau_ht = m3 * TARIF.eau_potable_m3;
const assain_ht = m3 * TARIF.assainissement_m3;
const redev_ht = m3 * (TARIF.redevance_pollution + TARIF.redevance_modernisation);
const eau_ttc = eau_ht * (1 + TARIF.tva_eau);
const assain_ttc = assain_ht * (1 + TARIF.tva_assainissement);
const redev_ttc = redev_ht * (1 + TARIF.tva_eau);
return {
eau_ttc: +eau_ttc.toFixed(3),
assain_ttc: +assain_ttc.toFixed(3),
redev_ttc: +redev_ttc.toFixed(3),
total_ttc: +(eau_ttc + assain_ttc + redev_ttc).toFixed(2),
};
}
// --- TENDANCE (compare 3 derniers jours vs 3 précédents) ---
function calculerTendance(historique) {
if (historique.length < 6) return 'stable';
const recent = historique.slice(-3).reduce((s, e) => s + e.litres, 0) / 3;
const avant = historique.slice(-6, -3).reduce((s, e) => s + e.litres, 0) / 3;
const diff = ((recent - avant) / avant) * 100;
if (diff > 15) return 'hausse';
if (diff < -15) return 'baisse';
return 'stable';
}
// ============================================
// MAIN
// ============================================
try {
log('🔐 Connexion...');
const token = await getToken();
log('💧 Récupération conso...');
const data = await getConsommation(token);
if (!Array.isArray(data) || data.length === 0) {
throw new Error('Données Veolia vides');
}
const dernierReleve = data[data.length - 1];
const litres = dernierReleve.consommation.litre;
const date = dernierReleve.date_releve;
// ---- Historique persistant via global ----
let historique = global.get('conso_eau_historique') || [];
if (typeof historique === 'string') {
try { historique = JSON.parse(historique); } catch(e) { historique = []; }
}
historique = historique.filter(e => e.date !== date);
historique.push({ date, litres });
if (historique.length > 31) historique = historique.slice(-31);
global.set('conso_eau_historique', historique);
// ---- Moyennes ----
const sept = historique.slice(-7).map(e => e.litres);
const moy7j = Math.round(sept.reduce((s, v) => s + v, 0) / sept.length);
const moy30j = Math.round(historique.map(e => e.litres).reduce((s, v) => s + v, 0) / historique.length);
const tendance = calculerTendance(historique);
// ---- Cumul du mois en cours ----
const moisCourant = date.substring(0, 7); // "2026-04"
const cumulMoisL = historique
.filter(e => e.date.startsWith(moisCourant))
.reduce((s, e) => s + e.litres, 0);
const cumulMoisM3 = +(cumulMoisL / 1000).toFixed(3);
// ---- Coûts ----
const coutJour = calculerCout(litres);
const coutMois = calculerCout(cumulMoisL);
const coutMoy7j = calculerCout(moy7j);
// ---- Détection fuite nocturne (si data horaire dispo sur le dernier relevé) ----
let litresNuit = 0;
let fuiteDetectee = false;
if (Array.isArray(dernierReleve.detail_horaire)) {
litresNuit = dernierReleve.detail_horaire
.filter(h => h.heure >= 23 || h.heure < 6)
.reduce((s, h) => s + (h.litres || h.consommation || 0), 0);
fuiteDetectee = litresNuit > SEUIL_FUITE_NUIT_L;
}
// ---- Sauvegardes globales ----
global.set('conso_eau_moy7j', moy7j);
global.set('conso_eau_moy30j', moy30j);
global.set('conso_eau_tendance', tendance);
global.set('conso_eau_cumul_mois_l', cumulMoisL);
global.set('conso_eau_cout_jour', coutJour.total_ttc);
global.set('conso_eau_cout_mois', coutMois.total_ttc);
global.set('conso_eau_script_ok', true);
// ---- Tags pour les Flows ----
await tag('conso_eau_litres', litres);
await tag('conso_eau_date', date);
await tag('conso_eau_moyenne7j', moy7j);
await tag('conso_eau_moyenne30j', moy30j);
await tag('conso_eau_tendance', tendance);
await tag('conso_eau_cumul_mois_m3', cumulMoisM3);
await tag('conso_eau_cout_jour_eur', coutJour.total_ttc);
await tag('conso_eau_cout_mois_eur', coutMois.total_ttc);
await tag('conso_eau_litres_nuit', litresNuit);
// ---- Logs ----
log(`📅 Date : ${date}`);
log(`💧 Conso jour : ${litres} L (${(litres/1000).toFixed(3)} m³)`);
log(`💰 Coût jour TTC : ${coutJour.total_ttc}€ (eau ${coutJour.eau_ttc} + assain ${coutJour.assain_ttc} + redev ${coutJour.redev_ttc})`);
log(`📊 Moyenne 7j : ${moy7j} L (${coutMoy7j.total_ttc}€/j)`);
log(`📊 Moyenne 30j : ${moy30j} L`);
log(`📈 Tendance 3j : ${tendance}`);
log(`🗓️ Cumul ${moisCourant} : ${cumulMoisM3} m³ (${coutMois.total_ttc}€ TTC)`);
log(`📦 Historique : ${historique.length} jour(s)`);
if (litresNuit > 0) log(`🌙 Conso nuit : ${litresNuit} L`);
// ---- Alertes ----
let alerteMsg = null;
let alerteType = null;
if (fuiteDetectee) {
alerteMsg = `🚨 FUITE PROBABLE : ${litresNuit}L consommés entre 23h et 6h le ${date}`;
alerteType = 'fuite';
} else if (litres > SEUIL_ALERTE_L) {
alerteMsg = `⚠️ Conso eau élevée le ${date} : ${litres}L (seuil ${SEUIL_ALERTE_L}L, moy 7j ${moy7j}L, ${coutJour.total_ttc}€)`;
alerteType = 'seuil';
} else if (moy7j > 0 && ((litres - moy7j) / moy7j) * 100 > SEUIL_ECART_MOY_PCT) {
const ecart = Math.round(((litres - moy7j) / moy7j) * 100);
alerteMsg = `📈 Conso eau anormale : ${litres}L soit +${ecart}% vs moyenne 7j (${moy7j}L)`;
alerteType = 'tendance';
}
if (alerteMsg) {
global.set('conso_eau_alerte_message', alerteMsg);
global.set('conso_eau_alerte_type', alerteType);
await tag('conso_eau_alerte', true);
await tag('conso_eau_alerte_message', alerteMsg);
await fetch(WEBHOOK_ALERTE);
log('🚨 ALERTE envoyée : ' + alerteMsg);
} else {
global.set('conso_eau_alerte_message', '');
global.set('conso_eau_alerte_type', '');
await tag('conso_eau_alerte', false);
await tag('conso_eau_alerte_message', '');
log('✅ Consommation normale');
}
log('✅ Terminé !');
return litres;
} catch(err) {
log('❌ Erreur : ' + err.message);
// Marquer l'échec pour qu'un flow de supervision puisse détecter
global.set('conso_eau_script_ok', false);
global.set('conso_eau_script_erreur', err.message);
global.set('conso_eau_script_erreur_date', new Date().toISOString());
throw err; // relance pour que le flow voie l'erreur
}
Les flows
Bonjour , bravo pour ton boulot , pas utile pour moi mais ton approche technique (f12) que j’utilise aussi pour l’appli stellantis , est intéressante bonne journée