SDB : seche-serviette et deshumidificateur en consommateurs de surplus solaire (chargeurs brides), arret a 28 °C
This commit is contained in:
12
HANDOFF.md
12
HANDOFF.md
@@ -2311,5 +2311,15 @@ batterie a 32 A et JEEP (branchee 13:01, 52 %) qui ne demarre pas. SOC 47 % a 12
|
|||||||
batterie < 50 % du courant ACM pendant 10 min (09/10 midi : 32 A pour 140 A). Carte : « Alerte envoyee par
|
batterie < 50 % du courant ACM pendant 10 min (09/10 midi : 32 A pour 140 A). Carte : « Alerte envoyee par
|
||||||
WhatsApp (rien a repondre) ». Service redemarre ~00:45. SPARK : envoyer l'alerte une fois par id, aucune reponse.
|
WhatsApp (rien a repondre) ». Service redemarre ~00:45. SPARK : envoyer l'alerte une fois par id, aucune reponse.
|
||||||
|
|
||||||
|
- **SDB, mode surplus solaire (accord du proprietaire, deploye 00:48, tests SDB 21/21, mutations qui mordent)** :
|
||||||
|
montage = prise SDB (maitre) -> multiprise -> deshumidificateur + seche-serviette (« radiateur » du workflow). Le
|
||||||
|
seche-serviette ne demarrait plus depuis le 05/06 : demarrage exige T < 20 °C (chauffage) ET batterie en charge
|
||||||
|
entre 2 et 5 A (08/10 : 162 A a 13 h puis 1-2 A une fois pleine, jamais dans la fenetre). Nouveau : les deux
|
||||||
|
appareils sont des CONSOMMATEURS DE SURPLUS — demarrage si >= 1 chargeur `voltage_current_limited`, SOC >= 90, EDF
|
||||||
|
ouvert, journee, pas de priorite borne, pas de voiture branchee qui attend (elle passe d'abord) ; maintien si SOC >= 85
|
||||||
|
et (chargeur bride ou batterie > -3 A) ; seche-serviette arrete a **28 °C** et jamais demarre sans temperature ;
|
||||||
|
deshumidificateur sur surplus meme humidite basse ; un appareil demarre pour le surplus s'arrete avec lui (drapeau
|
||||||
|
`sp=` de la signature). Le mode chauffage d'origine reste en dessous. Gabarit : modes MPPT, borne, etat controleur.
|
||||||
|
|
||||||
---
|
---
|
||||||
*Document mis a jour le : 10/10/2026 (~00:50) — conseiller relecteur de la journee (revue calculee + pistes) ; nuit : voiture qui profite d'EDF ferme pour la batterie, nuit qui prepare le soir les jours annonces faibles ; 08/10/2026 (~00:15) — jour faible : charge maximale en HC de midi (bilan 100 %, ACM plafond + solaire) ; 07/10/2026 (~22:45) — reprise de 16 h verifiee, EDF en HP a 18:03, bilan : reprise du soir et prevision recalee sur la matinee ; bilan HC de midi, reprise du soir apres coupure en pleine chauffe, mesure ECS sur 10 min ; recharge reseau HC : courant calcule (12 kVA) et consigne non tenue ; HC de midi : AUTO ne chauffe pas (BOOST), alerte v2, Jeep (contact, relecture, zone), recharge batterie bridee a 30 A par l'ACM ; jour faible = EDF les deux fenetres HC pour le chauffe-eau, alerte BOOST, Victron Mobile refait ; 1re decision jour faible en reel, mesure ECS reparee, douches 06:00/20:00, Grafana chauffe-eau, tableaux ECS ; chauffe-eau en HC de nuit les jours faibles (decision du bilan, workflow ECS sous controle du depot, VRM, V2.3 desactive) ; garde batterie reseau : voiture bridee a 6 A au lieu d'un arret ; garde-fou concierge 2 h ; allers-retours brefs de la borne retrouves dans l'historique HA (echange VW -> JEEP de 20 s), production 14,5 kWh contre 22 prevus, defaut garde batterie en mode reseau a trancher ; voiture a midi : la batterie n'est plus comptee comme du solaire (EDF automatique les jours de depart si le surplus ne couvre pas) ; nuit 05->06 : JEEP chargee sur EDF en complete (6,32 kWh), budget 0 du a la prevision, Windy/ECMWF contre VRM, a comparer ce soir ; concierge aligne sur la preuve fin de trajet ; a verifier : nuit 05->06 et mardi faible, comparaison VRM/Forecast.Solar ; JEEP identifiee aussi par sa fin de trajet, prevision de la nuit 05->06 ; identification JEEP reussie en reel, correction humaine qui prime (refus supprime), session du 04/10 coupee ; EVCS Master en quatre onglets ; Jeep lue par Uconnect et identifiee seule, capacite JEEP 10 kWh, concierge variante (a) ; releve par photo (SPARK), hass-uconnect en attente ; ecart semaine/week-end mesure (pas de profil week-end la nuit) ; nuit du budget : budget borne au plancher prudent, sans EDF = voiture bloquee meme EDF ferme (batterie seule) ; Energie : sauts corriges ; tableau Energie complete (Sud/Ouest, batterie par integration, borne ; aucun redemarrage HA) ; kilometrage des vehicules (km/kWh, capacite, releves de reference, agent cable 15/15) ; a verifier le 04/10 au matin : nuit du budget JEEP ; concierge : vehicule non confirme demande, heure de saisie ; Grafana vehicules en tableau ; Grafana vehicules : ZERO et Invite ajoutes, session 16:46 reetiquetee ZERO ; prevision SOC 10 h ~35 % ; concierge fiable : niveau note par le script, une ligne, dedoublonnage, simulation par drapeau ; agent : message incompris = question, bourse sur demande explicite (banc final 6/6) ; a verifier : nuit du samedi 03 au dimanche 04/10 (budget < besoin JEEP), cron orange-cloture lundi 05/10 apres 17:40, comparaison VRM / Forecast.Solar lundi 05/10*
|
*Document mis a jour le : 10/10/2026 (~00:55) — conseiller relecteur de la journee (revue calculee + pistes) ; nuit : voiture qui profite d'EDF ferme pour la batterie, nuit qui prepare le soir les jours annonces faibles ; 08/10/2026 (~00:15) — jour faible : charge maximale en HC de midi (bilan 100 %, ACM plafond + solaire) ; 07/10/2026 (~22:45) — reprise de 16 h verifiee, EDF en HP a 18:03, bilan : reprise du soir et prevision recalee sur la matinee ; bilan HC de midi, reprise du soir apres coupure en pleine chauffe, mesure ECS sur 10 min ; recharge reseau HC : courant calcule (12 kVA) et consigne non tenue ; HC de midi : AUTO ne chauffe pas (BOOST), alerte v2, Jeep (contact, relecture, zone), recharge batterie bridee a 30 A par l'ACM ; jour faible = EDF les deux fenetres HC pour le chauffe-eau, alerte BOOST, Victron Mobile refait ; 1re decision jour faible en reel, mesure ECS reparee, douches 06:00/20:00, Grafana chauffe-eau, tableaux ECS ; chauffe-eau en HC de nuit les jours faibles (decision du bilan, workflow ECS sous controle du depot, VRM, V2.3 desactive) ; garde batterie reseau : voiture bridee a 6 A au lieu d'un arret ; garde-fou concierge 2 h ; allers-retours brefs de la borne retrouves dans l'historique HA (echange VW -> JEEP de 20 s), production 14,5 kWh contre 22 prevus, defaut garde batterie en mode reseau a trancher ; voiture a midi : la batterie n'est plus comptee comme du solaire (EDF automatique les jours de depart si le surplus ne couvre pas) ; nuit 05->06 : JEEP chargee sur EDF en complete (6,32 kWh), budget 0 du a la prevision, Windy/ECMWF contre VRM, a comparer ce soir ; concierge aligne sur la preuve fin de trajet ; a verifier : nuit 05->06 et mardi faible, comparaison VRM/Forecast.Solar ; JEEP identifiee aussi par sa fin de trajet, prevision de la nuit 05->06 ; identification JEEP reussie en reel, correction humaine qui prime (refus supprime), session du 04/10 coupee ; EVCS Master en quatre onglets ; Jeep lue par Uconnect et identifiee seule, capacite JEEP 10 kWh, concierge variante (a) ; releve par photo (SPARK), hass-uconnect en attente ; ecart semaine/week-end mesure (pas de profil week-end la nuit) ; nuit du budget : budget borne au plancher prudent, sans EDF = voiture bloquee meme EDF ferme (batterie seule) ; Energie : sauts corriges ; tableau Energie complete (Sud/Ouest, batterie par integration, borne ; aucun redemarrage HA) ; kilometrage des vehicules (km/kWh, capacite, releves de reference, agent cable 15/15) ; a verifier le 04/10 au matin : nuit du budget JEEP ; concierge : vehicule non confirme demande, heure de saisie ; Grafana vehicules en tableau ; Grafana vehicules : ZERO et Invite ajoutes, session 16:46 reetiquetee ZERO ; prevision SOC 10 h ~35 % ; concierge fiable : niveau note par le script, une ligne, dedoublonnage, simulation par drapeau ; agent : message incompris = question, bourse sur demande explicite (banc final 6/6) ; a verifier : nuit du samedi 03 au dimanche 04/10 (budget < besoin JEEP), cron orange-cloture lundi 05/10 apres 17:40, comparaison VRM / Forecast.Solar lundi 05/10*
|
||||||
|
|||||||
@@ -395,6 +395,41 @@ let notifyTitle = 'SDB Climate & Surplus';
|
|||||||
let notifyMessage = '';
|
let notifyMessage = '';
|
||||||
let notifyWanted = false;
|
let notifyWanted = false;
|
||||||
|
|
||||||
|
// ======================================================
|
||||||
|
// MODE SURPLUS SOLAIRE (10/10/2026, proprietaire)
|
||||||
|
// ======================================================
|
||||||
|
// Les jours de grosse production, le seche-serviette (« radiateur ») ET le
|
||||||
|
// deshumidificateur prennent le solaire que personne ne prend. L'ancien
|
||||||
|
// demarrage exigeait un besoin de chauffage (T < 20 °C) et une batterie en
|
||||||
|
// charge entre 2 et 5 A : dernier demarrage le 05/06 ; le 08/10 la batterie
|
||||||
|
// passait de 162 A (13 h) a 1-2 A (15-17 h, solaire bride) sans jamais tenir
|
||||||
|
// dans la fenetre. Le bon signal est celui des chargeurs eux-memes (HANDOFF §37) :
|
||||||
|
// un chargeur qui se BRIDE prouve un solaire refuse.
|
||||||
|
// Demarrage : >= 1 chargeur bride, SOC >= 90, EDF ouvert, journee, pas de
|
||||||
|
// priorite borne, et pas de voiture branchee qui attend ce surplus (elle passe
|
||||||
|
// d'abord). Maintien : la batterie ne se decharge pas (> -3 A) ou un chargeur
|
||||||
|
// est encore bride, SOC >= 85. Seche-serviette : arret a 28 °C, et pas de
|
||||||
|
// demarrage si la temperature est inconnue.
|
||||||
|
const SURPLUS_SOC_START = 90;
|
||||||
|
const SURPLUS_SOC_HOLD = 85;
|
||||||
|
const SURPLUS_DECHARGE_MAX_A = -3;
|
||||||
|
const SURPLUS_TEMP_MAX_C = 28;
|
||||||
|
const mpptModes = String(input.mppt_operation_modes || '').split(',').map((x) => x.trim().toLowerCase()).filter(Boolean);
|
||||||
|
const mpptLimitedCount = mpptModes.filter((m) => m === 'voltage_current_limited').length;
|
||||||
|
const voitureAttendSurplus =
|
||||||
|
low(input.evcs_vehicle_connected || 'off') === 'on' &&
|
||||||
|
num(input.evcs_ac_power_w, 0) < 100 &&
|
||||||
|
!/full|done|complete|charged/.test(low(input.evcs_surplus_state || ''));
|
||||||
|
const surplusCommun = autoEnabled && inDayWindow && !gridIsOn && !evcsPriorityActive && !voitureAttendSurplus;
|
||||||
|
const surplusStart = surplusCommun && mpptLimitedCount >= 1 && soc >= SURPLUS_SOC_START;
|
||||||
|
const surplusHold = surplusCommun && soc >= SURPLUS_SOC_HOLD &&
|
||||||
|
(mpptLimitedCount >= 1 || (Number.isFinite(batteryCurrentA) && batteryCurrentA > SURPLUS_DECHARGE_MAX_A));
|
||||||
|
const surplusPrecedent = /\|sp=1/.test(lastSignature || '');
|
||||||
|
const radiateurTempOk = Number.isFinite(temperatureC) && temperatureC < SURPLUS_TEMP_MAX_C;
|
||||||
|
const deshumideSurplus = surplusStart || (surplusHold && (deshumideIsOn || deshumideLatchIsOn));
|
||||||
|
const radiateurSurplus = radiatorAutoEnabled && radiateurTempOk &&
|
||||||
|
(surplusStart || (surplusHold && (radiatorIsOn || radiatorLatchIsOn)));
|
||||||
|
|
||||||
// Energie disponible pour une charge reportable (calcule apres les entrees).
|
// Energie disponible pour une charge reportable (calcule apres les entrees).
|
||||||
const deshumideEnergyOk =
|
const deshumideEnergyOk =
|
||||||
gridIsOn ||
|
gridIsOn ||
|
||||||
@@ -409,6 +444,15 @@ if (!autoEnabled) {
|
|||||||
desiredDeshumide = deshumideIsOn;
|
desiredDeshumide = deshumideIsOn;
|
||||||
dehumActionReason = 'automation_disabled';
|
dehumActionReason = 'automation_disabled';
|
||||||
}
|
}
|
||||||
|
else if (deshumideSurplus) {
|
||||||
|
desiredDeshumide = deshumideIsOn || deshumideMinOffElapsed;
|
||||||
|
dehumActionReason = desiredDeshumide ? 'deshumide_surplus_solaire' : 'deshumide_wait_min_off';
|
||||||
|
}
|
||||||
|
else if (surplusPrecedent && !humidityNeed && (deshumideIsOn || deshumideLatchIsOn)) {
|
||||||
|
// Demarre pour le surplus, pas pour l'humidite : il s'arrete avec le surplus.
|
||||||
|
desiredDeshumide = !deshumideMinOnElapsed;
|
||||||
|
dehumActionReason = deshumideMinOnElapsed ? 'deshumide_stop_fin_surplus' : 'deshumide_hold_min_on';
|
||||||
|
}
|
||||||
else if (capteurMuet && (deshumideIsOn || deshumideLatchIsOn)) {
|
else if (capteurMuet && (deshumideIsOn || deshumideLatchIsOn)) {
|
||||||
// Sans mesure, on ne tient plus rien au-dela du temps minimum.
|
// Sans mesure, on ne tient plus rien au-dela du temps minimum.
|
||||||
desiredDeshumide = !deshumideMinOnElapsed;
|
desiredDeshumide = !deshumideMinOnElapsed;
|
||||||
@@ -485,6 +529,18 @@ else if (evcsPriorityActive) {
|
|||||||
radiatorActionReason = 'radiator_blocked_by_evcs_priority';
|
radiatorActionReason = 'radiator_blocked_by_evcs_priority';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (radiateurSurplus) {
|
||||||
|
desiredRadiator = radiatorIsOn || radiatorMinOffElapsed;
|
||||||
|
radiatorActionReason = desiredRadiator ? 'radiator_surplus_solaire' : 'radiator_wait_min_off';
|
||||||
|
}
|
||||||
|
else if ((radiatorIsOn || radiatorLatchIsOn) && Number.isFinite(temperatureC) && temperatureC >= SURPLUS_TEMP_MAX_C) {
|
||||||
|
desiredRadiator = !radiatorMinOnElapsed;
|
||||||
|
radiatorActionReason = radiatorMinOnElapsed ? 'radiator_stop_temperature_max' : 'radiator_hold_min_on';
|
||||||
|
}
|
||||||
|
else if (surplusPrecedent && !heatNeed && (radiatorIsOn || radiatorLatchIsOn)) {
|
||||||
|
desiredRadiator = !radiatorMinOnElapsed;
|
||||||
|
radiatorActionReason = radiatorMinOnElapsed ? 'radiator_stop_fin_surplus' : 'radiator_hold_min_on';
|
||||||
|
}
|
||||||
else if (heatNeed && radiatorStartConditionsOk) {
|
else if (heatNeed && radiatorStartConditionsOk) {
|
||||||
if (radiatorIsOn) {
|
if (radiatorIsOn) {
|
||||||
desiredRadiator = true;
|
desiredRadiator = true;
|
||||||
@@ -592,6 +648,7 @@ reason.push(`Besoin chauffage=${heatNeed ? 'oui' : 'non'} | Rétabli chauffage=$
|
|||||||
reason.push(`Besoin humidité=${humidityNeed ? 'oui' : 'non'} | Humidité rétablie=${humidityRecovered ? 'oui' : 'non'}`);
|
reason.push(`Besoin humidité=${humidityNeed ? 'oui' : 'non'} | Humidité rétablie=${humidityRecovered ? 'oui' : 'non'}`);
|
||||||
|
|
||||||
reason.push(`Déshumide: ${dehumActionReason}`);
|
reason.push(`Déshumide: ${dehumActionReason}`);
|
||||||
|
if (deshumideSurplus || radiateurSurplus) reason.push(`☀️ Surplus solaire : ${mpptLimitedCount} chargeur(s) bride(s), SOC ${round1(soc)}% -> ${[deshumideSurplus ? 'deshumidificateur' : '', radiateurSurplus ? 'seche-serviette' : ''].filter(Boolean).join(' + ')}`);
|
||||||
if (capteurMuet) reason.push(`⚠️ Capteur SDB muet${Number.isFinite(humidityAgeMin) && humidityAgeMin >= 0 ? ` depuis ${Math.round(humidityAgeMin)} min` : ''} (piles ?)`);
|
if (capteurMuet) reason.push(`⚠️ Capteur SDB muet${Number.isFinite(humidityAgeMin) && humidityAgeMin >= 0 ? ` depuis ${Math.round(humidityAgeMin)} min` : ''} (piles ?)`);
|
||||||
if (!deshumideEnergyOk) reason.push(`Batterie reservee : SOC ${round1(soc)}% < ${round1(balanceRequiredPrudent)}% (bilan, prudent), EDF ouvert, pas de surplus`);
|
if (!deshumideEnergyOk) reason.push(`Batterie reservee : SOC ${round1(soc)}% < ${round1(balanceRequiredPrudent)}% (bilan, prudent), EDF ouvert, pas de surplus`);
|
||||||
reason.push(`Radiateur: ${radiatorActionReason}`);
|
reason.push(`Radiateur: ${radiatorActionReason}`);
|
||||||
@@ -721,6 +778,7 @@ const signature = [
|
|||||||
`h=${Number.isFinite(humidityPct) ? round1(humidityPct) : 'na'}`,
|
`h=${Number.isFinite(humidityPct) ? round1(humidityPct) : 'na'}`,
|
||||||
`sx=${Math.round(estimatedSurplusW)}`,
|
`sx=${Math.round(estimatedSurplusW)}`,
|
||||||
`muet=${capteurMuet ? '1' : '0'}`,
|
`muet=${capteurMuet ? '1' : '0'}`,
|
||||||
|
`sp=${(deshumideSurplus || radiateurSurplus) ? '1' : '0'}`,
|
||||||
`nrj=${deshumideEnergyOk ? '1' : '0'}`
|
`nrj=${deshumideEnergyOk ? '1' : '0'}`
|
||||||
].join('|');
|
].join('|');
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,13 @@
|
|||||||
"sdb_humidity_age_min": ((as_timestamp(now()) - as_timestamp(states.sensor.sdb_temp_hygro_humidite.last_reported or states.sensor.sdb_temp_hygro_humidite.last_changed)) / 60) | round(0) if states.sensor.sdb_temp_hygro_humidite is not none else -1,
|
"sdb_humidity_age_min": ((as_timestamp(now()) - as_timestamp(states.sensor.sdb_temp_hygro_humidite.last_reported or states.sensor.sdb_temp_hygro_humidite.last_changed)) / 60) | round(0) if states.sensor.sdb_temp_hygro_humidite is not none else -1,
|
||||||
"balance_required_soc_prudent": states("input_number.evcs_balance_required_soc_prudent"),
|
"balance_required_soc_prudent": states("input_number.evcs_balance_required_soc_prudent"),
|
||||||
"balance_status": states("input_text.evcs_balance_status"),
|
"balance_status": states("input_text.evcs_balance_status"),
|
||||||
|
"mppt_operation_modes": states.sensor
|
||||||
|
| selectattr('entity_id','search','mppt')
|
||||||
|
| selectattr('entity_id','search','operation_mode')
|
||||||
|
| map(attribute='state') | join(','),
|
||||||
|
"evcs_vehicle_connected": states("binary_sensor.victron_evcs_vehicle_connected"),
|
||||||
|
"evcs_ac_power_w": states("sensor.victron_evcs_ac_power"),
|
||||||
|
"evcs_surplus_state": states("input_text.victron_evcs_surplus_state"),
|
||||||
|
|
||||||
"auto_enabled": states("input_boolean.sdb_climate_surplus_auto_enabled"),
|
"auto_enabled": states("input_boolean.sdb_climate_surplus_auto_enabled"),
|
||||||
"notifications_enabled": states("input_boolean.sdb_climate_surplus_notifications"),
|
"notifications_enabled": states("input_boolean.sdb_climate_surplus_notifications"),
|
||||||
|
|||||||
@@ -59,6 +59,40 @@ d = dec({ sdb_temperature_c: '26.3', sdb_humidity_pct: '56', sdb_humidity_age_mi
|
|||||||
ok('hysteresis-humidite-inchangee', d.deshumide_action === 'none', JSON.stringify(d));
|
ok('hysteresis-humidite-inchangee', d.deshumide_action === 'none', JSON.stringify(d));
|
||||||
d = dec({ sdb_temperature_c: '26.3', sdb_humidity_pct: '56', sdb_humidity_age_min: '400', soc_percent: '80' });
|
d = dec({ sdb_temperature_c: '26.3', sdb_humidity_pct: '56', sdb_humidity_age_min: '400', soc_percent: '80' });
|
||||||
ok('valeur-figee-3h-muet', d.deshumide_action === 'turn_off', JSON.stringify(d));
|
ok('valeur-figee-3h-muet', d.deshumide_action === 'turn_off', JSON.stringify(d));
|
||||||
|
// MODE SURPLUS (10/10) : releve du 08/10 16 h — SOC 96, batterie 2 A, solaire bride.
|
||||||
|
const D16 = class extends Date { constructor(...a) { super(...(a.length ? a : [Date.parse('2026-10-08T16:00:00+02:00')])); } static now() { return Date.parse('2026-10-08T16:00:00+02:00'); } };
|
||||||
|
const decAt = (o, DC = D16) => { const ctx = { $input: { first: () => ({ json: { data: JSON.stringify({ ...base, ...o }) } }) }, console, Date: DC, Intl, Math, Number, Object, String, JSON, Array, Boolean };
|
||||||
|
vm.createContext(ctx); return vm.runInContext(`(function(){\n${COMPUTE}\n})()`, ctx)[0].json.decision; };
|
||||||
|
const soleil = { soc_percent: '96', battery_current_a: '2', pv_power_w: '4646', pv_power_10m_avg_w: '4600', house_ac_power_w: '900',
|
||||||
|
sdb_temperature_c: '24', sdb_humidity_pct: '50', sdb_humidity_age_min: '3',
|
||||||
|
mppt_operation_modes: 'voltage_current_limited,voltage_current_limited,mppt_active,mppt_active,mppt_active,mppt_active,mppt_active',
|
||||||
|
sdb_master_power: 'off', deshumide_switch: 'off', radiator_switch: 'off', master_power_latch: 'off', deshumide_latch: 'off', radiator_latch: 'off',
|
||||||
|
deshumide_last_on_at: '2026-10-08 10:00:00', deshumide_last_off_at: '2026-10-08 10:30:00',
|
||||||
|
master_last_on_at: '2026-10-08 10:00:00', master_last_off_at: '2026-10-08 10:30:00',
|
||||||
|
evcs_vehicle_connected: 'off', evcs_ac_power_w: '0', evcs_surplus_state: 'vehicle_not_connected' };
|
||||||
|
d = decAt(soleil);
|
||||||
|
ok('surplus-0810-les-deux-demarrent', d.deshumide_action === 'turn_on' && d.radiator_action === 'turn_on' && d.master_action === 'turn_on', JSON.stringify(d));
|
||||||
|
d = decAt({ ...soleil, sdb_temperature_c: '28.2' });
|
||||||
|
ok('surplus-28c-seche-serviette-non', d.deshumide_action === 'turn_on' && d.radiator_action === 'none', JSON.stringify(d));
|
||||||
|
d = decAt({ ...soleil, sdb_temperature_c: 'unavailable', sdb_humidity_pct: 'unavailable' });
|
||||||
|
ok('surplus-temperature-inconnue-seche-serviette-non', d.radiator_action === 'none' && d.deshumide_action === 'turn_on', JSON.stringify(d));
|
||||||
|
d = decAt({ ...soleil, evcs_vehicle_connected: 'on', evcs_surplus_state: 'idle_wait_conditions' });
|
||||||
|
ok('surplus-voiture-branchee-passe-dabord', d.deshumide_action === 'none' && d.radiator_action === 'none', JSON.stringify(d));
|
||||||
|
d = decAt({ ...soleil, grid_state: 'on' });
|
||||||
|
ok('surplus-edf-ferme-non', d.radiator_action === 'none', JSON.stringify(d));
|
||||||
|
d = decAt({ ...soleil, mppt_operation_modes: 'mppt_active,mppt_active,mppt_active,mppt_active,mppt_active,mppt_active,mppt_active' });
|
||||||
|
ok('surplus-aucun-chargeur-bride-non', d.radiator_action === 'none' && d.deshumide_action === 'none', JSON.stringify(d));
|
||||||
|
const enMarche = { ...soleil, radiator_switch: 'on', radiator_latch: 'on', deshumide_switch: 'on', deshumide_latch: 'on', sdb_master_power: 'on', master_power_latch: 'on',
|
||||||
|
radiator_last_on_at: '2026-10-08 15:00:00', deshumide_last_on_at: '2026-10-08 15:00:00', master_last_on_at: '2026-10-08 15:00:00',
|
||||||
|
last_signature: '2026-10-08|deshumide_and_radiator_on|m=1|d=1|r=1|sp=1',
|
||||||
|
mppt_operation_modes: 'mppt_active,mppt_active,mppt_active,mppt_active,mppt_active,mppt_active,mppt_active' };
|
||||||
|
d = decAt({ ...enMarche, battery_current_a: '1' });
|
||||||
|
ok('surplus-maintien-batterie-ne-se-decharge-pas', d.radiator_action === 'none' && d.deshumide_action === 'none', JSON.stringify(d));
|
||||||
|
d = decAt({ ...enMarche, battery_current_a: '-12' });
|
||||||
|
ok('surplus-fin-batterie-se-decharge-tout-coupe', d.radiator_action === 'turn_off' && d.deshumide_action === 'turn_off' && d.master_action === 'turn_off', JSON.stringify(d));
|
||||||
|
d = decAt({ ...enMarche, battery_current_a: '1', sdb_temperature_c: '28.5' });
|
||||||
|
ok('surplus-28c-arrete-le-seche-serviette', d.radiator_action === 'turn_off' && d.deshumide_action === 'none', JSON.stringify(d));
|
||||||
|
|
||||||
const out = run(COMPUTE, { data: JSON.stringify(base) })[0].json;
|
const out = run(COMPUTE, { data: JSON.stringify(base) })[0].json;
|
||||||
const acts = run(BUILD, out).map((x) => x.json.action);
|
const acts = run(BUILD, out).map((x) => x.json.action);
|
||||||
ok('build-coupe-enfant-puis-master', acts.indexOf('deshumide') >= 0 && acts.indexOf('deshumide') < acts.indexOf('master_power'), acts.join(','));
|
ok('build-coupe-enfant-puis-master', acts.indexOf('deshumide') >= 0 && acts.indexOf('deshumide') < acts.indexOf('master_power'), acts.join(','));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user