From 67b0d8ae538e36bc17c5aaae69525b046feced43 Mon Sep 17 00:00:00 2001 From: AnasHost <41167157+Anashost@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:08:56 +0200 Subject: [PATCH] Update climate.md with support badges and weather card Added support badges, animated weather card template, and instructions for Home Assistant integration. --- climate.md | 649 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 649 insertions(+) create mode 100644 climate.md diff --git a/climate.md b/climate.md new file mode 100644 index 0000000..281f36f --- /dev/null +++ b/climate.md @@ -0,0 +1,649 @@ + + +[![Revolut.Me][revolut_me_shield]][revolut_me] +[![PayPal.Me][paypal_me_shield]][paypal_me] +[![ko_fi][ko_fi_shield]][ko_fi_me] +[![buymecoffee][buy_me_coffee_shield]][buy_me_coffee_me] +[![patreon][patreon_shield]][patreon_me] + + + +
+ + + +
+ +# Home Assistant Animated Climate Collection + +This [YouTube Video](https://youtu.be/xj5jhU1QD48) explains how to do it. + +## Weather Card + +

+ ezgif-5b0eb292c9c97807 +

+ +
+ +
+Animated Weather Card + +```yaml +type: custom:button-card +variables: + weather_entity: + temp_entity: + feels_like_entity: + cond_entity: + hum_entity: + wind_entity: + wind_gust_entity: + rain_entity: + sun_entity: sun.sun + cond_clear: sunny, sun + cond_clear_night: clear-night, clear night + cond_cloudy: cloudy, cloud, mostly cloudy, overcast + cond_partlycloudy: partlycloudy, partly-cloudy + cond_rainy: rainy, rain, drizzle, pouring, showers + cond_snowy: snowy, snow, sleet + cond_storm: storm, thunderstorm, lightning + cond_fog: fog, mist, hazy + temptrend_show: true + temptrend_entity: sensor.temptrend_24h +tap_action: + action: none +show_name: false +show_icon: false +show_state: false +styles: + card: + - padding: 0 + - border-radius: 20px + - box-shadow: 0 12px 30px -10px rgba(0,0,0,0.3), inset 0 1px 1px rgba(255,255,255,0.2) + - border: none + - color: white + - font-family: >- + -apple-system, BlinkMacSystemFont, "SF Pro Display", "Roboto", + sans-serif + - overflow: hidden + - position: relative + - background: "#1e293b" + - isolation: isolate + grid: + - grid-template-areas: "\"content\"" + - grid-template-columns: 1fr + - grid-template-rows: 1fr + custom_fields: + content: + - pointer-events: auto !important + - z-index: 99 !important +extra_styles: > + .bg-container { position:absolute; inset:0; z-index:0; width:100%; + height:100%; transition:background 1.2s ease-in-out; } + + .effect-layer { position:absolute; inset:0; width:100%; height:100%; + pointer-events:none; z-index:1; overflow:hidden; } + + @keyframes rain-fall { from { background-position:0 -200px; } to { + background-position:0 0; } } + + @keyframes snowflakes-sliding { 0% { background-position:0% 0%; } 100% { + background-position:0% 100%; } } + + @keyframes celestial-breathe { 0% { transform:scale(0.96); opacity:0.95; } + 100% { transform:scale(1.04); opacity:1; } } + + @keyframes aura-pulse { 0% { transform:scale(1); opacity:0.3; } 100% { + transform:scale(1.4); opacity:0.6; } } + + @keyframes cloud-drift-1 { 0% { transform:translateX(450px); opacity:0; } 15% + { opacity:0.9; } 75% { transform:translateX(180px); opacity:0.9; } 100% { + transform:translateX(110px); opacity:0; } } + + @keyframes cloud-drift-2 { 0% { transform:translateX(400px); opacity:0; } 20% + { opacity:0.5; } 70% { transform:translateX(200px); opacity:0.5; } 100% { + transform:translateX(130px); opacity:0; } } + + @keyframes fog-drift { 0% { transform:translateX(-50%) skewX(-15deg); } 100% { + transform:translateX(0%) skewX(-15deg); } } + + @keyframes storm-strike { 0%,21%,23%,56%,81%,100% { opacity:0; } 20% { + opacity:1; top:10%; left:10%; transform:scale(1) rotate(-10deg); + filter:brightness(2); } 22% { opacity:0.5; top:10%; left:10%; + transform:scale(1); } 55% { opacity:1; top:10%; left:40%; transform:scale(1.5) + rotate(0deg); } 80% { opacity:1; top:30%; left:70%; transform:scale(0.8) + rotate(10deg); } } + + @keyframes room-flash { 0%,21%,23%,56%,81%,100% { opacity:0; } 20% { + opacity:0.4; } 22% { opacity:0.1; } 55% { opacity:0.6; } 80% { opacity:0.3; } + } + + @keyframes shine { 0%,85%,100% { opacity:0.2; transform:scale(1); + box-shadow:none; } 92% { opacity:1; transform:scale(1.4); box-shadow:0 0 5px + 1px rgba(255,255,255,0.9); } } + + .celestial-shared { position:absolute; border-radius:50%; } + + .sun-core-day { width:100px; height:100px; top:-20px; right:-20px; + background:radial-gradient(circle,#fff9c4 0%,#ffca28 60%,#ff8f00 100%); + box-shadow:0 0 40px rgba(255,193,7,0.8); animation:celestial-breathe 5s + infinite alternate ease-in-out; } + + .sun-aura-day { width:160px; height:160px; top:-50px; right:-50px; + background:radial-gradient(circle,rgba(255,213,79,0.6) 0%,transparent 70%); + filter:blur(10px); animation:aura-pulse 6s infinite alternate ease-in-out; } + + .sun-core-twilight { width:100px; height:100px; top:-10px; right:-10px; + background:radial-gradient(circle,#fff3e0 0%,#ffcc80 60%,#ffb74d 100%); + box-shadow:0 0 50px rgba(255,183,77,0.7); animation:celestial-breathe 6s + infinite alternate ease-in-out; } + + .sun-aura-twilight { width:160px; height:160px; top:-40px; right:-40px; + background:radial-gradient(circle,rgba(255,183,77,0.5) 0%,transparent 70%); + filter:blur(12px); animation:aura-pulse 7s infinite alternate ease-in-out; } + + .moon-core-night { width:90px; height:90px; top:-15px; right:-15px; + background:radial-gradient(circle,#ffffff 0%,#e0e5db 50%,#9ca3af 100%); + box-shadow:0 0 30px rgba(200,220,255,0.6), inset -10px -10px 20px + rgba(0,0,0,0.3); animation:celestial-breathe 6s infinite alternate + ease-in-out; } + + .moon-aura-night { width:150px; height:150px; top:-45px; right:-45px; + background:radial-gradient(circle,rgba(200,220,255,0.3) 0%,transparent 70%); + filter:blur(10px); animation:aura-pulse 8s infinite alternate ease-in-out; } + + .stars { position:absolute; inset:0; overflow:hidden; pointer-events:none; } + + .star-layer { position:absolute; width:1.5px; height:1.5px; + background:transparent; border-radius:50%; box-shadow:12px 45px + rgba(255,255,255,0.8),88px 12px rgba(255,255,255,0.5),145px 80px #fff,210px + 25px rgba(255,255,255,0.6),280px 95px rgba(255,255,255,0.9),340px 15px + rgba(255,255,255,0.4),415px 70px #fff,490px 30px rgba(255,255,255,0.7),560px + 110px rgba(255,255,255,0.8),65px 120px rgba(255,255,255,0.5),180px 135px + #fff,310px 50px rgba(255,255,255,0.6),450px 140px rgba(255,255,255,0.9); } + + .star-layer::after { content:''; position:absolute; width:1px; height:1px; + background:transparent; border-radius:50%; box-shadow:35px 20px + rgba(255,255,255,0.7),105px 65px rgba(255,255,255,0.9),160px 15px + rgba(255,255,255,0.4),235px 115px #fff,295px 35px rgba(255,255,255,0.8),370px + 125px rgba(255,255,255,0.5),425px 45px rgba(255,255,255,0.6),485px 95px + #fff,530px 15px rgba(255,255,255,0.9),80px 100px rgba(255,255,255,0.4),195px + 60px rgba(255,255,255,0.7),260px 130px #fff,390px 85px + rgba(255,255,255,0.5),510px 125px rgba(255,255,255,0.8); } + + .t-star { position:absolute; width:1.5px; height:1.5px; background:white; + border-radius:50%; opacity:0.2; } + + .ts-1 { top:18%; left:22%; animation:shine 4.2s infinite; } + + .ts-2 { top:35%; left:68%; animation:shine 5.5s infinite 1.8s; } + + .ts-3 { top:12%; left:48%; animation:shine 3.6s infinite 2.5s; } + + .css-cloud { position:absolute; background:rgba(255,255,255,0.8); + border-radius:50px; filter:drop-shadow(0 8px 16px rgba(0,0,0,0.15)); } + + .css-cloud::before, .css-cloud::after { content:''; position:absolute; + background:inherit; border-radius:50%; } + + .cloud-twilight { background:rgba(255,220,210,0.85); filter:drop-shadow(0 8px + 16px rgba(100,0,0,0.1)); } + + .cloud-night { background:rgba(200,210,225,0.4); filter:drop-shadow(0 5px 10px + rgba(0,0,0,0.4)); } + + .cloud-shape-1 { width:140px; height:45px; top:40px; animation:cloud-drift-1 + 16s linear infinite; z-index:2; } + + .cloud-shape-1::before { width:70px; height:70px; top:-35px; left:25px; } + + .cloud-shape-1::after { width:50px; height:50px; top:-20px; right:20px; } + + .cloud-shape-2 { width:105px; height:34px; top:65px; animation:cloud-drift-2 + 22s linear infinite -10s; z-index:1; } + + .cloud-shape-2::before { width:52px; height:52px; top:-26px; left:19px; } + + .cloud-shape-2::after { width:37px; height:37px; top:-15px; right:15px; } + + .rain-1 { background-image:radial-gradient(ellipse at 30px + 20px,rgba(255,255,255,0.6) 1px,transparent 3px),radial-gradient(ellipse at + 80px 100px,rgba(255,255,255,0.6) 1px,transparent 3px),radial-gradient(ellipse + at 150px 60px,rgba(255,255,255,0.6) 1px,transparent + 3px),radial-gradient(ellipse at 250px 150px,rgba(255,255,255,0.6) + 1px,transparent 3px); background-size:300px 200px; animation:rain-fall 0.6s + linear infinite; opacity:0.8; } + + .rain-2 { background-image:radial-gradient(ellipse at 10px + 50px,rgba(255,255,255,0.4) 1px,transparent 2px),radial-gradient(ellipse at + 60px 120px,rgba(255,255,255,0.4) 1px,transparent 2px),radial-gradient(ellipse + at 120px 30px,rgba(255,255,255,0.4) 1px,transparent + 2px),radial-gradient(ellipse at 200px 90px,rgba(255,255,255,0.4) + 1px,transparent 2px); background-size:300px 180px; animation:rain-fall 1.2s + linear infinite; opacity:0.5; } + + .snow-1 { height:200%; background-image:radial-gradient(circle at 20% + 10%,rgba(255,255,255,0.4) 0%,transparent 6px),radial-gradient(circle at 80% + 30%,rgba(255,255,255,0.4) 0%,transparent 8px),radial-gradient(circle at 40% + 50%,rgba(255,255,255,0.4) 0%,transparent 6px),radial-gradient(circle at 70% + 75%,rgba(255,255,255,0.4) 0%,transparent 7px),radial-gradient(circle at 10% + 90%,rgba(255,255,255,0.4) 0%,transparent 5px),radial-gradient(circle at 60% + 15%,rgba(255,255,255,0.4) 0%,transparent 6px); background-size:100% 50%; + animation:snowflakes-sliding 2s linear infinite; opacity:0.8; } + + .snow-2 { height:200%; background-image:radial-gradient(circle at 15% + 5%,rgba(255,255,255,0.3) 0%,transparent 4px),radial-gradient(circle at 55% + 25%,rgba(255,255,255,0.3) 0%,transparent 3px),radial-gradient(circle at 85% + 45%,rgba(255,255,255,0.3) 0%,transparent 4px),radial-gradient(circle at 25% + 65%,rgba(255,255,255,0.3) 0%,transparent 3px),radial-gradient(circle at 65% + 85%,rgba(255,255,255,0.3) 0%,transparent 4px); background-size:100% 50%; + animation:snowflakes-sliding 1s linear infinite; opacity:0.6; } + + .fog-band { position:absolute; width:200%; height:40px; + background:linear-gradient(to + right,transparent,rgba(255,255,255,0.7),transparent); filter:blur(10px); } + + .fog-1 { top:40px; animation:fog-drift 18s linear infinite alternate; } + + .fog-2 { top:100px; opacity:0.6; animation:fog-drift 28s linear infinite + alternate-reverse; width:250%; } + + .storm-flash { background:white; animation:room-flash 7s steps(1) infinite; + mix-blend-mode:overlay; } + + .storm-bolt { width:80px; height:140px; background:#e0f2fe; + clip-path:polygon(55% 0%,80% 0%,50% 45%,85% 45%,20% 100%,40% 55%,10% 55%); + filter:drop-shadow(0 0 15px rgba(255,255,255,0.9)); animation:storm-strike 6s + steps(1) infinite; } + + .card-content { position:relative; z-index:5; padding:12px 16px; display:flex; + flex-direction:column; width:100%; box-sizing:border-box; } + + .top-row { display:flex; justify-content:space-between; align-items:center; + width:100%; } + + .glass-metric { pointer-events:auto; display:flex; align-items:center; + background:rgba(0,0,0,0.15); backdrop-filter:blur(20px) saturate(180%); + -webkit-backdrop-filter:blur(20px) saturate(180%); border:1px solid + rgba(255,255,255,0.2); border-radius:12px; padding:4px 8px; font-size:11px; + font-weight:600; color:white; text-shadow:0 1px 2px rgba(0,0,0,0.4); + box-shadow:0 2px 10px rgba(0,0,0,0.05); letter-spacing:0.2px; + white-space:nowrap; transition:all 0.2s ease; cursor:pointer; } + + .glass-metric:hover, .glass-metric:active { background:rgba(0,0,0,0.25); + transform:translateY(-1px); } + + .glass-metric ha-icon { opacity:0.9; width:14px; height:14px; + margin-right:4px; filter:drop-shadow(0 1px 1px rgba(0,0,0,0.3)); } + + .hover-text-block { pointer-events:auto; display:inline-flex; + align-items:center; cursor:pointer; border-radius:8px; padding:2px 6px; + margin-left:-6px; transition:background 0.2s ease; } + + .hover-text-block:hover, .hover-text-block:active { + background:rgba(255,255,255,0.15); } + + .temptrend-container { width:100%; margin-top:2px; padding-top:8px; + border-top:0px solid rgba(255,255,255,0.1); } + + .temptrend-bar { width:100%; height:6px; border-radius:4px; opacity:0.9; + box-shadow:inset 0 1px 2px rgba(0,0,0,0.4); } +custom_fields: + content: | + [[[ + const wE = variables.weather_entity, tE = variables.temp_entity, cE = variables.cond_entity; + const wV = wE && states[wE], tV = tE && states[tE], cV = cE && states[cE]; + + if (!wV && !tV && !cV) { + return ` +
+ + + Setup Required + + + Provide a valid weather_entity,
or both temp_entity and cond_entity. +
+
`; + } + + const wS = wV ? states[wE].state : null; + const tS = tV ? states[tE].state : null; + const cS = cV ? states[cE].state : null; + + const clk = e => e ? `ontouchstart="this.sX=event.touches[0].clientX;this.sY=event.touches[0].clientY;" + ontouchend="if(Math.abs(event.changedTouches[0].clientX-this.sX)<15&&Math.abs(event.changedTouches[0].clientY-this.sY)<15)this.dispatchEvent(new CustomEvent('hass-more-info',{bubbles:true,composed:true,detail:{entityId:'${e}'}}));" + onclick="this.dispatchEvent(new CustomEvent('hass-more-info',{bubbles:true,composed:true,detail:{entityId:'${e}'}}));"` : ''; + + const wTemp = v => ` + ${v}`; + + const wCond = v => ` + ${v}`; + + const tBdg = ` +
+ + - +
`; + + let tH = tBdg; + if (tV) { + if (tS === 'unavailable') tH = wTemp('-'); + else if (tS !== 'unknown') tH = wTemp(Math.round(tS) + '°'); + } else if (wV) { + if (wS === 'unavailable') tH = wTemp('-'); + else if (states[wE].attributes?.temperature !== undefined) + tH = wTemp(Math.round(states[wE].attributes.temperature) + '°'); + } + + const cBdg = ` +
+ + - +
`; + + let rC = '', cH = cBdg; + if (cV) { + if (cS === 'unavailable') cH = wCond('-'); + else if (cS !== 'unknown') rC = cS.toLowerCase(); + } else if (wV) { + if (wS === 'unavailable') cH = wCond('-'); + else if (wS !== 'unknown') rC = wS.toLowerCase(); + } + + if (rC && !isNaN(Number(rC))) { + rC = ''; + cH = cBdg; + } else if (rC) { + const fmtC = rC.replace(/[-_]/g, ' ').replace(/partlycloudy/gi, 'partly cloudy') + .split(' ').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' '); + cH = wCond(fmtC); + } + + const fE = variables.feels_like_entity, fV = fE && states[fE]; + const fS = fV ? states[fE].state : null; + let fH = ''; + + if (fV) { + if (fS === 'unavailable') fH = ` +
+ Feels like - +
`; + else if (fS !== 'unknown') fH = ` +
+ Feels like ${Math.round(fS)}° +
`; + } else if (wV) { + if (wS === 'unavailable') fH = ` +
+ Feels like - +
`; + else if (states[wE].attributes?.apparent_temperature !== undefined) fH = ` +
+ + Feels like ${Math.round(states[wE].attributes.apparent_temperature)}° + +
`; + } + + const bM = (e, a, uA, ic, p) => { + const eV = e && states[e], eS = eV ? states[e].state : null; + if (eV) { + if (eS === 'unavailable') return `
-
`; + if (eS !== 'unknown') { + const u = p ? '%' : ' ' + (states[e].attributes?.unit_of_measurement || ''); + return `
${Math.round(eS)}${u}
`; + } + } else if (wV) { + if (wS === 'unavailable') return `
-
`; + const val = states[wE].attributes?.[a]; + if (val !== undefined) { + const u = p ? '%' : ' ' + (states[wE].attributes?.[uA] || ''); + return `
${Math.round(val)}${u}
`; + } + } + return ''; + }; + + const mL = [ + [variables.hum_entity, 'humidity', '', 'mdi:water-percent', true], + [variables.wind_entity, 'wind_speed', 'wind_speed_unit', 'mdi:weather-windy', false], + [variables.wind_gust_entity, 'wind_gust', 'wind_speed_unit', 'mdi:weather-windy-variant', false], + [variables.rain_entity, 'precipitation', 'precipitation_unit', 'mdi:weather-pouring', false] + ]; + const mH = mL.map(m => bM(...m)).join(''); + + let cK = 'unknown'; + const cM = { + 'clear': variables.cond_clear, 'clear-night': variables.cond_clear_night, + 'cloudy': variables.cond_cloudy, 'partlycloudy': variables.cond_partlycloudy, + 'rainy': variables.cond_rainy, 'snowy': variables.cond_snowy, + 'storm': variables.cond_storm, 'fog': variables.cond_fog + }; + + if (rC) { + for (const [k, v] of Object.entries(cM)) { + if (v?.split(',').map(s => s.trim().toLowerCase()).includes(rC)) { cK = k; break; } + } + } + + let tD = 'day'; + const sE = variables.sun_entity, el = sE && states[sE]?.attributes?.elevation; + if (el !== undefined) { + tD = el < -4 ? 'night' : (el <= 10 ? (new Date().getHours() < 12 ? 'sunrise' : 'sunset') : 'day'); + } else if (cK.includes('night')) { + tD = 'night'; + } + + if (tD !== 'night' && cK.includes('night')) cK = cK.replace('-night', '').replace('night', 'clear'); + else if (tD === 'night' && cK === 'sunny') cK = 'clear-night'; + + const bG = { + sunny: { day: ['#29b6f6', '#0288d1'], twilight: ['#7986cb', '#e1bee7', '#ffe0b2'], night: ['#080c16', '#162032'] }, + partly: { day: ['#4fc3f7', '#1976d2'], twilight: ['#5c6bc0', '#ce93d8', '#ffccbc'], night: ['#111827', '#1e293b'] }, + cloudy: { day: ['#607d8b', '#455a64'], twilight: ['#455a64', '#78909c', '#ffebee'], night: ['#1f2937', '#374151'] }, + rain: { day: ['#2c3e50', '#4ca1af'], twilight: ['#3949ab', '#7e57c2', '#ffe0b2'], night: ['#0f172a', '#1e293b'] }, + snow: { day: ['#94a3b8', '#64748b'], twilight: ['#8b5cf6', '#d8b4fe', '#94a3b8'], night: ['#1e293b', '#0f172a'] }, + storm: { day: ['#64748b', '#334155'], twilight: ['#2b285b', '#1e1b4b', '#0f172a'], night: ['#0f172a', '#1e293b'] }, + fog: { day: ['#9ca3af', '#6b7280'], twilight: ['#8b5cf6', '#c084fc', '#9ca3af'], night: ['#1f2937', '#111827'] }, + unknown: { day: ['#475569', '#334155'], twilight: ['#334155', '#1e293b', '#0f172a'], night: ['#0f172a', '#020617'] } + }; + + const sh = { + rain: { day: 'inset 0 0 20px rgba(0,0,0,0.3)', night: 'inset 0 0 30px rgba(0,0,0,0.6)' }, + snow: { day: 'inset 0 0 50px rgba(200,220,255,0.2)', twilight: 'inset 0 0 30px rgba(200,220,255,0.2)', night: 'inset 0 0 40px rgba(200,220,255,0.1)' }, + storm: { day: 'inset 0 0 50px rgba(0,0,0,0.7)', twilight: 'inset 0 0 50px rgba(0,0,0,0.8)', night: 'inset 0 0 50px rgba(0,0,0,0.9)' } + }; + + let cat = 'sunny', eL = ''; + const sH = tD === 'night' ? `
+
` : ''; + const cC = tD === 'night' ? 'cloud-night' : (tD !== 'day' ? 'cloud-twilight' : ''); + const sC = tD !== 'day' ? 'twilight' : 'day'; + + if (cK === 'unknown') { + cat = 'unknown'; + } else if (cK.includes('storm') || cK.includes('thunder')) { + cat = 'storm'; + eL = `
`; + } else if (cK.includes('snow') || cK.includes('hail')) { + cat = 'snow'; + eL = `
`; + } else if (cK.includes('rain') || cK.includes('pour')) { + cat = 'rain'; + eL = `
`; + } else if (cK.includes('partly')) { + cat = 'partly'; + eL = tD === 'night' + ? `${sH}
+
` + : `
+
`; + } else if (cK.includes('cloud')) { + cat = 'cloudy'; + eL = `${sH}
+
`; + } else if (cK.includes('fog')) { + cat = 'fog'; + eL = `${sH}
`; + } else { + cat = 'sunny'; + eL = tD === 'night' + ? `${sH}
+
` + : `
+
`; + } + + const tK = tD === 'night' ? 'night' : (tD !== 'day' ? 'twilight' : 'day'); + const aC = (bG[cat] || bG.sunny)[tK].join(', '); + const aS = sh[cat]?.[tK] || 'none'; + const bgS = `background:linear-gradient(to bottom, ${aC});box-shadow:${aS};`; + + let trH = ''; + if (variables.temptrend_show && variables.temptrend_entity) { + const trE = variables.temptrend_entity; + const hs = states[trE]?.attributes?.history?.map(Number); + + if (hs?.length > 1) { + const isF = (tV && states[tE].attributes?.unit_of_measurement?.includes('F')) || + (wV && states[wE].attributes?.temperature_unit?.includes('F')); + const minSp = isF ? 16.2 : 9; + const mn = Math.min(...hs), mx = Math.max(...hs); + let sp = mx - mn, bs = mn; + + if (sp < minSp) { bs = ((mx + mn) / 2) - (minSp / 2); sp = minSp; } + + const st = hs.map((t, i) => { + const p = Math.max(0, Math.min(1, (t - bs) / (sp || 1))); + const sg = Math.min(4, Math.floor(p * 5)), lP = (p * 5) - sg; + let r = 0, g = 0, b = 0; + + if (sg === 0) { g = Math.round(50 + lP * 205); b = 255; } + else if (sg === 1) { g = 255; b = Math.round(255 - lP * 255); } + else if (sg === 2) { r = Math.round(lP * 255); g = 255; } + else if (sg === 3) { r = 255; g = Math.round(255 - lP * 127); } + else { r = 255; g = Math.round(128 - lP * 128); } + + return `rgb(${r},${g},${b}) ${(i / (hs.length - 1)) * 100}%`; + }); + + trH = ` +
+
+
`; + } + } + + return ` +
+ ${eL} +
+
+
+
+
+ ${tH} +
+ ${fH} +
+
+ ${cH} +
+
+ ${mH} +
+
+
+ ${trH} +
+ `; + ]]] + +``` +
+ +
+Template + + +- Replace `sensor.openweathermap_temperature` with your own `weather.xx` or `sensor.xx temperature`, in both places. + +```yaml + - trigger: + - platform: time_pattern + minutes: "/1" + - platform: homeassistant + event: start + condition: > + {{ (now().timestamp() - state_attr('sensor.temptrend_24h', 'last_update') | default(0, true) | float(0)) >= 3600 }} + sensor: + - name: "Temptrend 24h" + unique_id: temptrend_24h + state: > + {% set target = 'sensor.openweathermap_temperature' %} + {{ (state_attr(target, 'temperature') if target.startswith('weather.') else states(target)) | float(0) | round(1) }} + attributes: + last_update: "{{ now().timestamp() }}" + history: > + {% set target = 'sensor.openweathermap_temperature' %} + {% set current = (state_attr(target, 'temperature') if target.startswith('weather.') else states(target)) | float(0) | round(1) %} + {% set past = state_attr('sensor.temptrend_24h', 'history') | default([current] * 24, true) %} + {{ (past + [current])[-24:] }} +``` +
+ +
+ +> [!NOTE] +> More Climate Cards are coming soon. They're currently available to members for Testing, Patreon and YouTube. + +[paypal_me_shield]: https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white + +[paypal_me]: https://paypal.me/anasboxsupport + +[revolut_me_shield]: +https://img.shields.io/badge/revolut-FFFFFF?style=for-the-badge&logo=revolut&logoColor=black + +[revolut_me]: https://revolut.me/anas4e + +[ko_fi_shield]: https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white + +[ko_fi_me]: https://ko-fi.com/anasbox + +[buy_me_coffee_shield]: +https://img.shields.io/badge/Buy%20Me%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black + +[buy_me_coffee_me]: https://www.buymeacoffee.com/anasbox + +[patreon_shield]: +https://img.shields.io/badge/patreon-404040?style=for-the-badge&logo=patreon&logoColor=white + +[patreon_me]: https://patreon.com/AnasBox