type: custom:stack-in-card variables: {theme_override: light, lang_override: ''} card_mod: style: | ha-card { --a:#1976D2;--a2:#29B6F6;--ad:rgba(25,118,210,0.4);--ic:#1565C0;--tx:#000000;--mu:#444444; --gd:#2E7D32;--wn:#E65100;--bd2:#C62828;--pu:#6A1B9A; --sf:rgba(25,118,210,0.06);--sf2:rgba(25,118,210,0.04);--b:rgba(25,118,210,0.18);--b2:rgba(25,118,210,0.10); --lv:rgba(25,118,210,0.08);--lvb:rgba(25,118,210,0.35);--hl:#FFF;--sh:rgba(25,118,210,0.20); border:3px solid var(--a);border-radius:20px; background:radial-gradient(circle at 15% 0%,rgba(25,118,210,0.10),transparent 55%),radial-gradient(circle at 85% 100%,rgba(25,118,210,0.14),transparent 55%),linear-gradient(135deg,#F5FAFE 0%,#E8F2FB 55%,#DCEBFA 100%); box-shadow:0 10px 28px var(--sh),inset 0 1px 0 rgba(255,255,255,0.5); overflow:visible;color:var(--tx) !important; } :host-context(html[data-dk-theme="dark"]) ha-card { --a:#00A0E9;--a2:#29B6F6;--ad:rgba(0,160,233,0.42);--ic:#B3E5FC;--tx:#FFFFFF;--mu:#B0C4DE; --gd:#4ADE80;--wn:#FBBF24;--bd2:#F87171;--pu:#C084FC; --sf:rgba(255,255,255,0.045);--sf2:rgba(255,255,255,0.03);--b:rgba(179,229,252,0.14);--b2:rgba(179,229,252,0.08); --lv:rgba(0,160,233,0.14);--lvb:rgba(0,160,233,0.42);--hl:#001B3D;--sh:rgba(0,160,233,0.30); background:radial-gradient(circle at 15% 0%,rgba(0,160,233,0.20),transparent 55%),radial-gradient(circle at 85% 100%,rgba(0,58,112,0.45),transparent 55%),linear-gradient(135deg,#001B3D 0%,#003A70 55%,#005a9c 100%); box-shadow:0 12px 40px var(--sh),inset 0 1px 0 rgba(255,255,255,0.08); } cards: - type: custom:mushroom-template-card primary: >- {%- set s = states.sensor | selectattr('entity_id','search','(hp_specs|wp_specs)$') | list | first -%} Daikin Cycle ML{% if s and s.state not in ['unknown','unavailable','none'] %} · {{ s.state | upper }}{% endif %} secondary: >- {%- set s = states.sensor | selectattr('entity_id','search','(hp_specs|wp_specs)$') | list | first -%} {%- if s and s.attributes -%}{{ s.attributes.kw }}kW {{ s.attributes.family }} · {{ s.attributes.refrigerant }} · {{ 'COP et énergie' if state_attr('sensor.daikin_cycle_ml_cycle_state','configured_language') == 'fr' else 'COP & Energie' }}{%- else -%}COP · Energie · live{%- endif -%} icon: mdi:heat-pump multiline_secondary: true card_mod: style: | ha-card{background:none !important;box-shadow:none !important;border-bottom:2px solid var(--ad) !important;border-radius:0 !important;padding:10px 16px !important} .primary{color:var(--a) !important;font-weight:900 !important;font-size:1.02em !important;text-transform:uppercase !important;letter-spacing:1.1px !important;text-shadow:0 0 16px var(--ad) !important} .secondary{color:var(--ic) !important;opacity:0.85 !important;font-size:0.76em !important;font-weight:700 !important} mushroom-shape-icon{--icon-color:var(--a) !important} - type: custom:button-card show_name: false show_icon: false styles: grid: [{grid-template-areas: '"content"'}, {grid-template-columns: 1fr}] card: [{background: none}, {box-shadow: none}, {border: none}, {padding: '8px 10px 6px'}, {overflow: visible}] custom_fields: {content: [{width: 100%}]} custom_fields: content: | [[[ try { var v=(typeof variables!=='undefined'&&variables)||{}; var tv=String(v.theme_override||'light').toLowerCase(), lv=String(v.lang_override||'').toLowerCase(); var mm=window.matchMedia?window.matchMedia('(prefers-color-scheme:dark)').matches:false; var dk=tv==='dark'||(tv==='auto'&&mm); try{var H=document.documentElement;if(dk)H.setAttribute('data-dk-theme','dark');else H.removeAttribute('data-dk-theme');}catch(e){} var hl=String((typeof hass!=='undefined'&&hass.language)||'en').toLowerCase(); var NL=(lv==='en'||lv==='nl')?lv==='nl':hl.indexOf('nl')===0; var A0=function(e,k){var x=states[e];return (x&&x.attributes)?x.attributes[k]:null;}; var LANG=NL?'nl':((lv==='fr'||(lv===''&&(hl.indexOf('fr')===0||String(A0('sensor.daikin_cycle_ml_cycle_state','configured_language'))==='fr')))?'fr':'en'); /* FR-I18N (azsono03) */ var FRM={" cycles in IDEAL zone":" cycles dans la zone IDÉALE"," cycles in PENDULUM zone":" cycles dans la zone TROP COURTE"," cycles over ":" cycles sur ","24h vs 7d":"24 h / 7 j","30d":"30 j","365d":"365 j","Last 7d":"7 derniers jours","SHORT 20-60m":"COURT 20-60 min","GOOD 60-180m":"BON 60-180 min","LONG >180m":"LONG >180 min","40-70 mid":"40-70 moyen","<40 low":"<40 faible","ACTION REQUIRED":"ACTION REQUISE","ATTENTION":"ATTENTION","AVG DURATION":"DURÉE MOY.","Average quality ":"Qualité moyenne ","Average quality low (":"Qualité moyenne faible (","Avg duration":"Durée moy.","Avg off":"Arrêt moy.","Avg quality":"Qualité moy.","Avg ratio":"Taux moy.","Avg/day":"Moy./jour","BUH":"Appoint","BUH >":"Appoint >","Band":"Plage","Best day":"Meilleur jour","Boiler COP":"COP chaudière","Bucket":"Tranche","CARNOT EFF.":"RENDEMENT CARNOT","COMPRESSOR":"COMPRESSEUR","COOLING":"RAFRAÎCHISSEMENT","COP":"COP","COP TODAY":"COP DU JOUR","COP TREND":"TENDANCE COP","COP above datasheet reference":"COP au-dessus de la fiche technique","CYCLES PER DAY":"CYCLES PAR JOUR","CYCLES/DAY":"CYCLES/JOUR","Comfort":"Confort","Compressor off":"Compresseur arrêté","Contribution":"Part","Cool":"Froid","Cooling":"Rafraîchissement","Cycles":"Cycles","Cycles per day":"Cycles par jour","DEFROST":"DÉGIVRAGE","DEFROST IMPACT":"EFFET DES DÉGIVRAGES","DHW":"ECS","DURATION/DAY":"DURÉE/JOUR","Days":"Jours","Defrost":"Dégivrage","Duration":"Durée","Duration per day":"Durée par jour","Duty":"Taux de marche","ELEC":"ÉLEC","ELECTRICAL":"ÉLECTRIQUE","EMITTER":"RADIATEURS","ENERGY TODAY":"ÉNERGIE DU JOUR","Elapsed":"Écoulé","Energy":"Énergie","Event counts per day":"Événements par jour","Event ratio per day":"Taux d'événements par jour","Good days":"Bons jours","Good ratio":"Taux de bons cycles","HEAT BALANCE":"BILAN DE CHALEUR","HEAT PUMP":"PAC","HEATING":"CHAUFFAGE","HEATING OFF":"CHAUFFAGE COUPÉ","HP → EMITTER":"PAC → RADIATEURS","Heat":"Chauffage","Heating":"Chauffage","IDLE":"À L'ARRÊT","IN":"ENTRÉE","INFO":"INFO","Insufficient data":"Pas assez de données","LWT":"Départ","LWT NOW":"DÉPART ACTUEL","LWT OPT":"DÉPART OPTIMAL","Last defrost":"Dernier dégivrage","Last: ":"Dernier : ","Live cycle · COP · quality · alerts":"Cycle en direct · COP · qualité · alertes","Longest":"Le plus long","Longest day":"Jour le plus long","Low days":"Jours faibles","MAX LWT":"DÉPART MAX","MIN LWT":"DÉPART MIN","MODES":"MODES","Max day":"Jour max","Mid days":"Jours moyens","Mode":"Mode","Month":"Mois","No COP data":"Pas de COP","No data":"Pas de données","OUT":"SORTIE","OUTDOOR TEMPERATURE (°C)":"TEMPÉRATURE EXTÉRIEURE (°C)","Outdoor":"Extérieur","PENDULUM <20m":"TROP COURT <20 min","Phase":"Phase","Power":"Puissance","QUALITY":"QUALITÉ","Quality":"Qualité","Quality dropping (":"Qualité en baisse (","Quality per day":"Qualité par jour","Quality rising (+":"Qualité en hausse (+","RPS":"tr/s","RUNNING":"EN MARCHE","Range":"Plage","Reliability":"Fiabilité","Runs":"Cycles","Runtime":"Durée de marche","SAVINGS":"ÉCONOMIE","SPF SEASON":"SPF SAISON","STANDBY":"EN ATTENTE","SUPPLY LWT (°C)":"DÉPART D'EAU (°C)","Samples":"Échantillons","Savings":"Économie","Share":"Part","Short runs":"Cycles courts","Since midnight":"Depuis minuit","Source":"Source","Span":"Période","Starts":"Démarrages","Starts today":"Démarrages du jour","State":"État","Step":"Pas","Sum":"Somme","System performing normally":"Le système fonctionne normalement","THERM":"CHALEUR","THERMAL":"CHALEUR","THERMAL SPLIT":"RÉPARTITION DE LA CHALEUR","Today":"Aujourd'hui","Total":"Total","Total BUH":"Appoint total","Total defrost":"Dégivrage total","Total runtime":"Marche totale","Trends":"Tendances","VS DATASHEET":"VS FICHE TECHNIQUE","WEEK TREND":"TENDANCE SEMAINE","Week":"Semaine","Worst day":"Pire jour","Y-axis max":"Échelle max","Year":"Année","act":"act.","active":"active","ago":"plus tôt","avg":"moy.","buckets":"tranches","cycles":"cycles","datasheet":"fiche technique","day":"jour","defrost <":"dégivrage <","demand":"demande","duration":"durée","events":"événements","heating OFF >":"chauffage coupé >","high":"élevé","in bucket":"dans la tranche","insufficient buckets":"pas assez de tranches","last":"dernier","low":"faible","max":"max","min":"min","month":"mois","more":"de plus","nominal":"normal","nominal COP":"COP nominal","of cycles":"des cycles","outdoor":"extérieur","per day":"par jour","samples":"échantillons","state":"état","supply":"départ","today":"aujourd'hui","total":"total","week":"semaine","Ø duration":"Ø durée","Ø/cycle":"Ø/cycle","← 💧 RETURN":"← 💧 RETOUR","≥70 good":"≥70 bon","⏮️ Last cycle":"⏮️ Dernier cycle","⏱️ DURATION":"⏱️ DURÉE","♻️ Hydraulic circuit":"♻️ Circuit hydraulique","⚠ BUH ASSIST":"⚠ APPOINT","⚡ BUH":"⚡ Appoint","⚡ EVENTS":"⚡ ÉVÉNEMENTS","✅ System OK — no active warnings":"✅ Système OK — aucune alerte active","❄ DEFROST":"❄ DÉGIVRAGE","❄ Defrost":"❄ Dégivrage","⭐ QUALITY":"⭐ QUALITÉ","🎯 COP":"🎯 COP","🎯 COP Efficiency":"🎯 Efficacité COP","🎯 Cycles vs Duration":"🎯 Cycles / durée","🎯 SCATTER":"🎯 NUAGE","💡 COP = efficiency · ~ref = approximate datasheet comparison (A7/W35) · duration/cycle trends per day":"💡 COP = efficacité · ~réf = comparaison approximative avec la fiche (A7/W35) · tendances durée/cycles par jour","💡 Cycle = continuous compressor run · <15m = inefficient cycling · >48h = safety limit":"💡 Cycle = marche continue du compresseur · <15 min = cycles trop courts · >48 h = limite de sécurité","💡 Duration = total compressor runtime per day · split per mode · ⚠ = clipped":"💡 Durée = marche totale du compresseur par jour · par mode · ⚠ = tronqué","💡 Higher COP = better · Q = quality 0-100 · Alerts on top = action":"💡 COP élevé = mieux · Q = qualité 0-100 · Alertes en haut = à traiter","💡 Ratio = events per cycle × 100 · green = nominal (15%) · red = elevated (35%)":"💡 Taux = événements par cycle × 100 · vert = normal (15 %) · rouge = élevé (35 %)","💡 Tap a bar for details — buckets by avg cycle duration per mode":"💡 Toucher une barre pour le détail — tranches par durée moyenne de cycle et par mode","💡 Tap a dot for details — X: cycles/day · Y: avg duration · color: quality":"💡 Toucher un point pour le détail — X : cycles/jour · Y : durée moy. · couleur : qualité","💡 Tap a dot or stat for day details":"💡 Toucher un point ou une valeur pour le détail du jour","💡 Tap an item for details":"💡 Toucher un élément pour le détail","📅 Today":"📅 Aujourd'hui","📈 Heating curve advice":"📈 Conseil de loi d'eau","📈 Regression":"📈 Régression","📊 Cycle duration distribution":"📊 Répartition des durées de cycle","📊 DISTRIBUTION":"📊 RÉPARTITION","📊 OVERVIEW":"📊 VUE D'ENSEMBLE","📊 historical":"📊 historique","🔄 CYCLES":"🔄 CYCLES","🔍 auto-discovery":"🔍 détection auto","🔥 SUPPLY →":"🔥 DÉPART →"," below datasheet":" sous la fiche technique"," well above target":" bien au-dessus de l'objectif","% week":" % / semaine","BUH active":"Appoint en marche","COP dropping ":"COP en baisse ","COP heating ":"COP chauffage ","COP low":"COP bas","DHW cycling":"Cycles d'eau chaude","High cycle rate":"Fréquence de cycles élevée","Missing attributes":"Valeurs manquantes","Pendulum/day":"Cycles trop fréquents/jour","Pendulum/hour":"Cycles trop fréquents/heure","Previous: BUH":"Précédent : appoint","Previous: defrost":"Précédent : dégivrage","SPF ":"SPF ","Setpoint oscillation":"Consigne instable","Short off-time":"Arrêt court","Short run":"Marche courte","Source stale":"Source muette","Too many cycles (target ":"Trop de cycles (objectif ","Update available":"Mise à jour disponible","is_stale flag":"Source en retard"}; var FR=function(x){ return (LANG==='fr' && typeof x==='string' && Object.prototype.hasOwnProperty.call(FRM,x)) ? FRM[x] : x; }; var FRO=function(o){ if(typeof o==='string') return Object.prototype.hasOwnProperty.call(FRM,o)?FRM[o]:o; if(o&&typeof o==='object'){ var r=Array.isArray(o)?[]:{}; for(var k in o){ r[k]=FRO(o[k]); } return r; } return o; }; var T=function(n,e){return NL?n:FR(e);}; var C=dk?{a:'#00A0E9',a2:'#29B6F6',ic:'#B3E5FC',tx:'#FFFFFF',mu:'#B0C4DE',gd:'#4ADE80',wn:'#FBBF24',bd:'#F87171',pu:'#C084FC',sf:'rgba(255,255,255,0.045)',sf2:'rgba(255,255,255,0.03)',b:'rgba(179,229,252,0.14)',b2:'rgba(179,229,252,0.08)',lv:'rgba(0,160,233,0.14)',lvb:'rgba(0,160,233,0.42)',hl:'#001B3D'} :{a:'#1976D2',a2:'#29B6F6',ic:'#1565C0',tx:'#000000',mu:'#444444',gd:'#2E7D32',wn:'#E65100',bd:'#C62828',pu:'#6A1B9A',sf:'rgba(25,118,210,0.06)',sf2:'rgba(25,118,210,0.04)',b:'rgba(25,118,210,0.18)',b2:'rgba(25,118,210,0.10)',lv:'rgba(25,118,210,0.08)',lvb:'rgba(25,118,210,0.35)',hl:'#FFF'}; var S=function(e,d){d=d||0;var x=states[e];if(!x||x.state==='unknown'||x.state==='unavailable')return d;var n=parseFloat(x.state);return isNaN(n)?d:n;}; var A=function(e,k,d){var x=states[e];if(!x||!x.attributes)return d;var n=x.attributes[k];return(n==null||n==='None'||n==='unknown')?d:n;}; var f1=function(n){n=parseFloat(n);return isFinite(n)?n.toFixed(1).replace('.',','):'—';}; var f2=function(n){n=parseFloat(n);return isFinite(n)?n.toFixed(2).replace('.',','):'—';}; var fi=function(n){n=parseFloat(n);return isFinite(n)?Math.round(n).toLocaleString(NL?'nl-BE':(LANG==='fr'?'fr-FR':'en-US')):'—';}; var fk=function(n){n=parseFloat(n);if(!isFinite(n))return '—';if(n>=1000)return (n/1000).toFixed(1).replace('.',',')+'k';return Math.round(n);}; var pc=function(n){n=parseFloat(n);return isFinite(n)?(n>=0?'+':'')+f1(n)+'%':'—';}; var gd=function(n){n=parseFloat(n);return n>=5.5?'A+++':n>=5?'A++':n>=4.5?'A+':n>=4?'A':n>=3.5?'B':n>=3?'C':n>0?'D':'—';}; var gc=function(n){n=parseFloat(n);return n>=5.5?C.a:n>=5?'#29B6F6':n>=4.5?'#4FC3F7':n>=4?'#81D4FA':n>=3.5?C.wn:n>=3?'#FB923C':n>0?C.bd:C.mu;}; var arc=function(cx,cy,r,a1,a2){var r1=(a1-90)*Math.PI/180,r2=(a2-90)*Math.PI/180,x1=cx+r*Math.cos(r1),y1=cy+r*Math.sin(r1),x2=cx+r*Math.cos(r2),y2=cy+r*Math.sin(r2);return 'M '+x1.toFixed(1)+' '+y1.toFixed(1)+' A '+r+' '+r+' 0 '+((a2-a1)>180?1:0)+' 1 '+x2.toFixed(1)+' '+y2.toFixed(1);}; var thS='sensor.daikin_cycle_ml_thermal_power_live'; var th=S(thS), elW=S('sensor.daikin_cycle_ml_electrical_power_estimated')||A(thS,'input_power_w',0); var inCop=A(thS,'input_cop',null); var iC=(inCop!=null&&inCop>0)?inCop:(elW>0.5?th/(elW/1000):0); var rp=A(thS,'input_rps',0)||0, dtK=A(thS,'input_dt_k',0)||0, fl=A(thS,'input_flow_lmin',0)||0; var stS=states['sensor.daikin_cycle_ml_cycle_state'], run=stS&&stS.state==='running'; var cur=states['sensor.daikin_cycle_ml_current_cycle']; var cm=cur?cur.state:'idle', du=A('sensor.daikin_cycle_ml_current_cycle','duration_min',0); var eR='sensor.daikin_cycle_ml_thermal_energy_heating_today'; var E={thH:A(eR,'heating_th_kwh',0),elH:A(eR,'heating_el_kwh',0),thD:A(eR,'dhw_th_kwh',0),elD:A(eR,'dhw_el_kwh',0),thC:A(eR,'cooling_th_kwh',0),elC:A(eR,'cooling_el_kwh',0),thT:A(eR,'total_th_kwh',0),elT:A(eR,'total_el_kwh',0)}; var copT=E.elT>0?E.thT/E.elT:0; var P4=[ {l:T('24u','24h'),v:S('sensor.daikin_cycle_ml_cop_mean_day'),n:A('sensor.daikin_cycle_ml_cop_mean_day','n_samples',0),ic:'⏱'}, {l:T('Week','Week'),v:S('sensor.daikin_cycle_ml_cop_mean_week'),n:A('sensor.daikin_cycle_ml_cop_mean_week','n_samples',0),ic:'📅'}, {l:T('Maand','Month'),v:S('sensor.daikin_cycle_ml_cop_mean_month'),n:A('sensor.daikin_cycle_ml_cop_mean_month','n_samples',0),ic:'🗓'}, {l:T('Jaar','Year'),v:S('sensor.daikin_cycle_ml_spf_ytd'),n:A('sensor.daikin_cycle_ml_spf_ytd','spf_ytd_n',0),ic:'📊'} ]; var spf=S('sensor.daikin_cycle_ml_spf_season'), y365=S('sensor.daikin_cycle_ml_scop_running_365d'); var vd=S('sensor.daikin_cycle_ml_cop_vs_datasheet_pct'), tr=S('sensor.daikin_cycle_ml_cop_trend_30d'), dw=S('sensor.daikin_cycle_ml_cop_degradation_week_pct'); var cpH=S('sensor.daikin_cycle_ml_cop_heating_day'), cpD=S('sensor.daikin_cycle_ml_cop_dhw_day'), cpC=S('sensor.daikin_cycle_ml_cop_cooling_day'); var pts=A('sensor.daikin_cycle_ml_cop_curve_recent','points',[]), sn={}, spk=[]; if(Array.isArray(pts)){pts.forEach(function(p){if(p.mode==='heating'&&p.cop_mean>0&&!sn[p.ts]){sn[p.ts]=1;spk.push(p.cop_mean);}});spk=spk.slice(-24);} var css=''; var r='