├── config ├── scenes.yaml ├── scripts.yaml ├── binary_sensors │ ├── misc.yaml │ └── environment.yaml ├── sensors │ ├── network.yaml │ ├── energy.yaml │ ├── neighborhood.yaml │ ├── weather.yaml │ ├── monitors.yaml │ ├── powercalc.yaml │ ├── misc.yaml │ ├── database.yaml │ ├── social.yaml │ ├── switchbot.yaml │ └── astrometrics.yaml ├── templates │ ├── switchbot.yaml │ ├── misc.yaml │ ├── kitchen.yaml │ ├── environment.yaml │ └── chores.yaml ├── groups │ ├── media-players.yaml │ ├── switches.yaml │ ├── chores.yaml │ ├── lights.yaml │ ├── env-sensors.yaml │ └── energy.yaml ├── influxdb.yaml ├── utility_meter.yaml ├── calendar.yaml ├── lock.yaml ├── panel_custom.yaml ├── plant.yaml ├── recorder.yaml ├── rest_command.yaml ├── camera.yaml ├── switch.yaml ├── chores.yaml └── multiscrape │ └── weather.yaml ├── www ├── sun.png ├── segoeui.ttf ├── seguibl.ttf ├── seguisb.ttf ├── segoeuib.ttf ├── segoeuil.ttf ├── segoeuisl.ttf ├── SegoeUI-VF.ttf ├── logos │ ├── hbomax.png │ ├── hot97.png │ ├── hulu.png │ ├── plex.png │ ├── wfmu.jpg │ ├── wfuv.png │ ├── wnyc.png │ ├── wqxr.png │ ├── peacock.png │ ├── youtube.jpg │ ├── disneyplus.png │ ├── primevideo.png │ └── paramountplus.png ├── plants │ ├── plant-jade.png │ ├── plant-basil.png │ ├── plant-zamia.png │ ├── plant-cilantro.png │ ├── plant-lavender.png │ └── plant-rosemary.png ├── psychrometry-chart.css ├── ha-floorplan.css └── metro.css ├── ui ├── smartdisplays │ ├── slides │ │ ├── blank.yaml │ │ ├── traffic-map.yaml │ │ ├── weather-daily.yaml │ │ ├── weather-hourly.yaml │ │ ├── waze-driving-time.yaml │ │ ├── waqi.yaml │ │ ├── allergy-index.yaml │ │ ├── gasbuddy.yaml │ │ ├── astronomy-calendar.yaml │ │ ├── power-usage.yaml │ │ ├── vacuum.yaml │ │ ├── nyc311-alt-side-parking.yaml │ │ ├── subway-status.yaml │ │ ├── sun.yaml │ │ ├── last-fm-artist.yaml │ │ ├── plex-new-shows.yaml │ │ ├── nws-alerts.yaml │ │ ├── temp-outdoor.yaml │ │ ├── temp-indoor.yaml │ │ ├── wind.yaml │ │ ├── notify-nyc.yaml │ │ ├── big-clock.yaml │ │ ├── chores.yaml │ │ ├── weather-current.yaml │ │ └── big-clock-space-theme.yaml │ ├── snippets │ │ ├── slideshow-tiles-layout-options.yaml │ │ ├── topbar-start-button.yaml │ │ ├── topbar-back-button.yaml │ │ ├── topbar-clock-simple.yaml │ │ ├── slideshow-mod-card-bg.yaml │ │ └── topbar-clock.yaml │ ├── views │ │ ├── home-bedroom-clock-only.yaml │ │ ├── home-minimal.yaml │ │ ├── home.yaml │ │ ├── lights.yaml │ │ └── start.yaml │ ├── slides-bedroom.yaml │ └── slides.yaml ├── shared │ ├── snippets │ │ ├── layout-live-tile.yaml │ │ ├── layout-live-tile-mini.yaml │ │ ├── layout-page-columns-one.yaml │ │ ├── style-page-title-swipe-card.yaml │ │ ├── layout-page-columns.yaml │ │ ├── style-page-title-swipe-card-tile.yaml │ │ ├── style-markdown-page-title.yaml │ │ ├── layout-page-margin.yaml │ │ ├── parameters-page-title-swipe-card.yaml │ │ ├── layout-page-title.yaml │ │ └── layout-page-title-with-2-badges.yaml │ ├── cards │ │ ├── chores-kitchen.yaml │ │ ├── chores-living-room.yaml │ │ ├── nws-alerts.yaml │ │ ├── energy-current-total.yaml │ │ ├── energy-living-room.yaml │ │ ├── traffic-cameras.yaml │ │ ├── energy-kitchen.yaml │ │ ├── energy-daily-total.yaml │ │ └── traffic-bridges-and-tunnels.yaml │ ├── columns │ │ ├── energy-kitchen.yaml │ │ ├── energy-workspace.yaml │ │ ├── energy-living-room.yaml │ │ ├── energy-bedroom.yaml │ │ ├── energy-kitchen-power-strip.yaml │ │ ├── lights-bedroom.yaml │ │ ├── lights-living-room-accents.yaml │ │ ├── lights-living-room.yaml │ │ ├── lights-kitchen.yaml │ │ ├── lights-workspace-accents.yaml │ │ ├── lights-workspace-studio.yaml │ │ ├── chores-all-list.yaml │ │ ├── me-music-top-albums.yaml │ │ ├── me-music-top-artists.yaml │ │ └── lights-workspace-desk.yaml │ └── popups │ │ └── scenes.yaml ├── views │ ├── subviews │ │ ├── unison.yaml │ │ ├── genesis.yaml │ │ ├── illinoise.yaml │ │ ├── transit.yaml │ │ ├── plex.yaml │ │ ├── sensor.nws_alert_rss_feed.yaml │ │ ├── chores.yaml │ │ ├── group.all_on_off.yaml │ │ └── sensor.notify_nyc.yaml │ ├── machines │ │ ├── unison.yaml │ │ ├── genesis.yaml │ │ ├── dorothy.yaml │ │ ├── illinoise.yaml │ │ ├── terpsichora.yaml │ │ ├── illinoise-plex-library.yaml │ │ └── printers.yaml │ └── rooms │ │ ├── workspace.yaml │ │ ├── kitchen.yaml │ │ └── living-room.yaml ├── templates │ └── button-card │ │ ├── sensors │ │ ├── waqi-scale.yaml │ │ ├── nws-alerts.yaml │ │ ├── plex.yaml │ │ ├── chores.yaml │ │ ├── noaa-space-weather-scale.yaml │ │ ├── plant.yaml │ │ └── sun.yaml │ │ ├── base.yaml │ │ └── header-cards.yaml ├── ui-rooms.yaml ├── ui-smartdisplays-minimal.yaml ├── ui-hassagent.yaml ├── ui-machines.yaml ├── ui-smartdisplays-bedroom.yaml ├── ui-lovelace.yaml └── ui-smartdisplays.yaml ├── lovelace-dashboards.yaml └── lovelace-resources.yaml /config/scenes.yaml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/scripts.yaml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /www/sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/sun.png -------------------------------------------------------------------------------- /www/segoeui.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/segoeui.ttf -------------------------------------------------------------------------------- /www/seguibl.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/seguibl.ttf -------------------------------------------------------------------------------- /www/seguisb.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/seguisb.ttf -------------------------------------------------------------------------------- /config/binary_sensors/misc.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: car_wash 3 | weather: weather.valhalla_2 4 | -------------------------------------------------------------------------------- /www/segoeuib.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/segoeuib.ttf -------------------------------------------------------------------------------- /www/segoeuil.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/segoeuil.ttf -------------------------------------------------------------------------------- /www/segoeuisl.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/segoeuisl.ttf -------------------------------------------------------------------------------- /www/SegoeUI-VF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/SegoeUI-VF.ttf -------------------------------------------------------------------------------- /www/logos/hbomax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/hbomax.png -------------------------------------------------------------------------------- /www/logos/hot97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/hot97.png -------------------------------------------------------------------------------- /www/logos/hulu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/hulu.png -------------------------------------------------------------------------------- /www/logos/plex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/plex.png -------------------------------------------------------------------------------- /www/logos/wfmu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/wfmu.jpg -------------------------------------------------------------------------------- /www/logos/wfuv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/wfuv.png -------------------------------------------------------------------------------- /www/logos/wnyc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/wnyc.png -------------------------------------------------------------------------------- /www/logos/wqxr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/wqxr.png -------------------------------------------------------------------------------- /www/logos/peacock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/peacock.png -------------------------------------------------------------------------------- /www/logos/youtube.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/youtube.jpg -------------------------------------------------------------------------------- /www/logos/disneyplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/disneyplus.png -------------------------------------------------------------------------------- /www/logos/primevideo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/primevideo.png -------------------------------------------------------------------------------- /www/plants/plant-jade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/plants/plant-jade.png -------------------------------------------------------------------------------- /www/logos/paramountplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/logos/paramountplus.png -------------------------------------------------------------------------------- /www/plants/plant-basil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/plants/plant-basil.png -------------------------------------------------------------------------------- /www/plants/plant-zamia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/plants/plant-zamia.png -------------------------------------------------------------------------------- /www/plants/plant-cilantro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/plants/plant-cilantro.png -------------------------------------------------------------------------------- /www/plants/plant-lavender.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/plants/plant-lavender.png -------------------------------------------------------------------------------- /www/plants/plant-rosemary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madelena/hass-config-public/HEAD/www/plants/plant-rosemary.png -------------------------------------------------------------------------------- /config/sensors/network.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: rest 3 | resource: http://ip.jsontest.com 4 | name: External IP 5 | value_template: "{{ value_json.ip }}" 6 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/blank.yaml: -------------------------------------------------------------------------------- 1 | # Spacer 2 | 3 | type: 'custom:button-card' 4 | template: slide_basic 5 | styles: 6 | card: 7 | - background: none 8 | -------------------------------------------------------------------------------- /ui/shared/snippets/layout-live-tile.yaml: -------------------------------------------------------------------------------- 1 | grid-template-columns: 'repeat(auto-fill, [col-start] minmax(112px, 1fr) [col-end])' 2 | grid-template-rows: auto 3 | margin: -1 -------------------------------------------------------------------------------- /ui/shared/snippets/layout-live-tile-mini.yaml: -------------------------------------------------------------------------------- 1 | grid-template-columns: 'repeat(auto-fill, [col-start] minmax(56px, 1fr) [col-end])' 2 | grid-template-rows: auto 3 | margin: -1 -------------------------------------------------------------------------------- /config/templates/switchbot.yaml: -------------------------------------------------------------------------------- 1 | 2 | - sensor: 3 | - name: "Front Door Switchbot Sensor" 4 | state: "OK" 5 | attributes: 6 | motion: "OK" 7 | last_updated: "OK" -------------------------------------------------------------------------------- /ui/shared/snippets/layout-page-columns-one.yaml: -------------------------------------------------------------------------------- 1 | grid-template-columns: 1fr 2 | grid-template-rows: auto 3 | grid-column-gap: 32px 4 | margin: -1px 5 | mediaquery: 6 | '(max-width: 799.99px)': 7 | margin: -1 -------------------------------------------------------------------------------- /ui/views/subviews/unison.yaml: -------------------------------------------------------------------------------- 1 | # Unison Subview 2 | # Made by Madelena Mak 2022 3 | 4 | path: unison 5 | subview: true 6 | 7 | type: panel 8 | cards: 9 | - !include ../machines/unison-cards.yaml 10 | -------------------------------------------------------------------------------- /ui/views/subviews/genesis.yaml: -------------------------------------------------------------------------------- 1 | # Genesis Subview 2 | # Made by Madelena Mak 2022 3 | 4 | path: genesis 5 | subview: true 6 | 7 | type: panel 8 | cards: 9 | - !include ../machines/genesis-cards.yaml 10 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/traffic-map.yaml: -------------------------------------------------------------------------------- 1 | # Bing Traffic Map 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_basic 6 | - slide_with_live_camera 7 | entity: camera.bing_maps_traffic 8 | name: Traffic Map 9 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/weather-daily.yaml: -------------------------------------------------------------------------------- 1 | # Daily Weather Forecast slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_weather_forecast 6 | entity: weather.valhalla_2 7 | name: Daily Weather Forecast 8 | -------------------------------------------------------------------------------- /ui/views/machines/unison.yaml: -------------------------------------------------------------------------------- 1 | # MADELENA + THE MACHINES 2 | # Unison View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Unison 6 | path: unison 7 | 8 | type: panel 9 | cards: 10 | - !include unison-cards.yaml 11 | -------------------------------------------------------------------------------- /ui/views/machines/genesis.yaml: -------------------------------------------------------------------------------- 1 | # MADELENA + THE MACHINES 2 | # Genesis View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Genesis 6 | path: genesis 7 | 8 | type: panel 9 | cards: 10 | - !include genesis-cards.yaml 11 | -------------------------------------------------------------------------------- /ui/views/subviews/illinoise.yaml: -------------------------------------------------------------------------------- 1 | # Dorothy Illinoise Subview 2 | # Made by Madelena Mak 2022 3 | 4 | path: illinoise 5 | subview: true 6 | 7 | type: panel 8 | cards: 9 | - !include ../machines/illinoise-cards.yaml 10 | -------------------------------------------------------------------------------- /ui/views/machines/dorothy.yaml: -------------------------------------------------------------------------------- 1 | # MADELENA + THE MACHINES 2 | # Dorothy View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Dorothy 6 | path: dorothy 7 | 8 | type: panel 9 | cards: 10 | - !include dorothy-cards.yaml 11 | -------------------------------------------------------------------------------- /ui/smartdisplays/snippets/slideshow-tiles-layout-options.yaml: -------------------------------------------------------------------------------- 1 | grid-template-columns: 'repeat(auto-fit, [col-start] 33.33vh [col-end])' 2 | grid-template-rows: auto auto 3 | grid-auto-flow: column 4 | grid-auto-columns: 33.33vh 5 | margin: 0 -------------------------------------------------------------------------------- /ui/smartdisplays/views/home-bedroom-clock-only.yaml: -------------------------------------------------------------------------------- 1 | # AMBIENT DASHBOARD 2 | # Clock Page 3 | # Made by Madelena Mak 2022 4 | 5 | title: Clock 6 | path: clock 7 | type: panel 8 | cards: 9 | - !include ../slides/big-clock-space-theme.yaml 10 | -------------------------------------------------------------------------------- /ui/views/machines/illinoise.yaml: -------------------------------------------------------------------------------- 1 | # MADELENA + THE MACHINES 2 | # Dorothy Illinoise View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Illinoise 6 | path: illinoise 7 | 8 | type: panel 9 | cards: 10 | - !include illinoise-cards.yaml 11 | -------------------------------------------------------------------------------- /ui/views/machines/terpsichora.yaml: -------------------------------------------------------------------------------- 1 | # MADELENA + THE MACHINES 2 | # Terpsichora View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Terpsichora 6 | path: terpsichora 7 | 8 | type: panel 9 | cards: 10 | - !include terpsichora-cards.yaml 11 | -------------------------------------------------------------------------------- /ui/shared/snippets/style-page-title-swipe-card.yaml: -------------------------------------------------------------------------------- 1 | .: | 2 | @media screen and (max-width: 799.99px) { 3 | .swiper-slide {width: auto !important;} 4 | } 5 | @media screen and (min-width: 1024px) { 6 | .swiper-slide {width: auto !important;} 7 | } -------------------------------------------------------------------------------- /ui/shared/snippets/layout-page-columns.yaml: -------------------------------------------------------------------------------- 1 | grid-template-columns: 'repeat(auto-fill, [col-start] minmax(356px, 1fr) [col-end])' 2 | grid-template-rows: auto 3 | grid-column-gap: 32px 4 | margin: -1px 5 | mediaquery: 6 | '(max-width: 799.99px)': 7 | margin: -1 -------------------------------------------------------------------------------- /ui/smartdisplays/slides/weather-hourly.yaml: -------------------------------------------------------------------------------- 1 | # Hourly Weather Forecast slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_weather_forecast 6 | entity: weather.valhalla_hourly 7 | name: Hourly Weather Forecast 8 | variables: 9 | format: 'H:mm' 10 | -------------------------------------------------------------------------------- /ui/shared/snippets/style-page-title-swipe-card-tile.yaml: -------------------------------------------------------------------------------- 1 | .: | 2 | ha-card {background: none;} 3 | @media screen and (max-width: 799.99px), @media screen and (min-width: 1024px) { 4 | ha-card, mushroom-card, mushroom-state-item, mushroom-state-info {width: fit-content;} 5 | } -------------------------------------------------------------------------------- /ui/smartdisplays/slides/waze-driving-time.yaml: -------------------------------------------------------------------------------- 1 | # Waze Driving Time slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_graph 7 | - slide_with_state_unit 8 | entity: sensor.waze_travel_time 9 | name: Driving Time to Union Square 10 | -------------------------------------------------------------------------------- /ui/shared/snippets/style-markdown-page-title.yaml: -------------------------------------------------------------------------------- 1 | .: | 2 | ha-card { 3 | background: none; 4 | } 5 | ha-markdown$: | 6 | h1 { 7 | font-size: var(--title-font-size); 8 | font-weight: 600; 9 | line-height: 1.1; 10 | margin-left: -2px; 11 | margin-block-end: -8px; 12 | } -------------------------------------------------------------------------------- /ui/shared/snippets/layout-page-margin.yaml: -------------------------------------------------------------------------------- 1 | grid-template-rows: auto 32px 2 | grid-template-columns: 32px auto 32px 3 | grid-template-areas: | 4 | ". cc ." 5 | grid-column-gap: 0 6 | margin: 0 7 | card_margin: 0 8 | mediaquery: 9 | '(max-width: 869.99px)': 10 | grid-template-columns: 8px auto 8px -------------------------------------------------------------------------------- /ui/smartdisplays/slides/waqi.yaml: -------------------------------------------------------------------------------- 1 | # WAQI slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_graph 7 | - waqi_scale 8 | entity: sensor.waqi_newyork_air_quality_index 9 | show_label: true 10 | name: Air Quality 11 | label: '[[[ return variables.level ]]]' 12 | -------------------------------------------------------------------------------- /ui/shared/snippets/parameters-page-title-swipe-card.yaml: -------------------------------------------------------------------------------- 1 | enabled: true 2 | slidesPerView: auto 3 | width: 480 4 | # spaceBetween: 16 5 | breakpoints: 6 | '800': 7 | enabled: false 8 | slidesPerView: 3 9 | width: 360 10 | '1024': 11 | enabled: false 12 | slidesPerView: auto 13 | width: 600 -------------------------------------------------------------------------------- /ui/smartdisplays/slides/allergy-index.yaml: -------------------------------------------------------------------------------- 1 | # Allergy Index slide 2 | 3 | type: 'custom:button-card' 4 | template: slide_with_big_state 5 | entity: sensor.allergy_index_forecasted_average 6 | show_label: true 7 | state_display: '[[[ return entity.attributes.rating ]]]' 8 | label: '[[[ return entity.attributes.outlook ]]]' 9 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/gasbuddy.yaml: -------------------------------------------------------------------------------- 1 | # GasBuddy Average Gas Price card 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_graph 7 | - slide_with_state_unit 8 | entity: sensor.gasbuddy_average_gas_price 9 | name: Gas Price Average 10 | variables: 11 | hours_to_show: 120 12 | points_per_hour: .125 13 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/astronomy-calendar.yaml: -------------------------------------------------------------------------------- 1 | # Astronomy Calendar slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_basic 6 | entity: sensor.ics_1 7 | state_display: '[[[ return entity.attributes.description ]]]' 8 | show_label: true 9 | label: '[[[ return moment(entity.attributes.start).fromNow() ]]]' 10 | icon: mdi:weather-night 11 | -------------------------------------------------------------------------------- /ui/shared/snippets/layout-page-title.yaml: -------------------------------------------------------------------------------- 1 | grid-template-columns: auto max-content 2 | grid-template-rows: auto 3 | mediaquery: 4 | '(min-width: 1024px)': 5 | grid-template-columns: auto max-content 6 | '(min-width: 800px)': 7 | grid-template-columns: auto max-content 8 | '(max-width: 799.99px)': 9 | grid-template-columns: calc(100vw - 32px) 10 | margin: 0 -------------------------------------------------------------------------------- /ui/smartdisplays/slides/power-usage.yaml: -------------------------------------------------------------------------------- 1 | # Power Usage slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_graph 7 | - slide_with_state_unit 8 | entity: sensor.total_energy_use 9 | name: Current Total Energy Use 10 | icon: mdi:home-lightning-bolt 11 | variables: 12 | hours_to_show: 4 13 | points_per_hour: 6 14 | -------------------------------------------------------------------------------- /ui/shared/cards/chores-kitchen.yaml: -------------------------------------------------------------------------------- 1 | type: 'custom:auto-entities' 2 | filter: 3 | include: 4 | - group: group.chore_kitchen 5 | options: 6 | type: 'custom:button-card' 7 | template: chore_tile 8 | card: 9 | type: 'custom:layout-card' 10 | layout_type: 'custom:grid-layout' 11 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml -------------------------------------------------------------------------------- /ui/shared/cards/chores-living-room.yaml: -------------------------------------------------------------------------------- 1 | type: 'custom:auto-entities' 2 | filter: 3 | include: 4 | - group: group.chore_living_room 5 | options: 6 | type: 'custom:button-card' 7 | template: chore_tile 8 | card: 9 | type: 'custom:layout-card' 10 | layout_type: 'custom:grid-layout' 11 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml -------------------------------------------------------------------------------- /ui/shared/snippets/layout-page-title-with-2-badges.yaml: -------------------------------------------------------------------------------- 1 | grid-template-columns: auto max-content 2 | grid-template-rows: auto 3 | mediaquery: 4 | '(min-width: 1024px)': 5 | grid-template-columns: auto max-content 6 | '(min-width: 800px)': 7 | grid-template-columns: auto max-content 8 | '(max-width: 799.99px)': 9 | grid-template-columns: calc(100vw - 32px) 10 | margin: 0 -------------------------------------------------------------------------------- /config/groups/media-players.yaml: -------------------------------------------------------------------------------- 1 | 2 | living_room_media_players: 3 | name: Living Room Media Players 4 | entities: 5 | - media_player.terpsichora 6 | - media_player.terpsichora_mini_alexa 7 | - media_player.terpsichora_mini_dlna 8 | - media_player.terpsichora_shield_androidtv 9 | - media_player.terpsichora_shield_cast 10 | - media_player.kitchen_echo_show 11 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/vacuum.yaml: -------------------------------------------------------------------------------- 1 | # Vacuum slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_colored_conditional 7 | variables: 8 | condition: '[[[ return (entity.attributes.bin_full) ]]]' 9 | entity: vacuum.peanut_hamper 10 | show_label: true 11 | label: '[[[ if (entity.attributes.bin_full) { return "The bin is full." } ]]]' 12 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/nyc311-alt-side-parking.yaml: -------------------------------------------------------------------------------- 1 | # NYC 311 Alt Side Parking slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_colored_on_state 7 | entity: sensor.nyc_311_alternate_side_parking_0d 8 | name: Alternate Side Parking - Today 9 | icon: mdi:car-brake-parking 10 | show_label: true 11 | label: '[[[ return entity.attributes.details ]]]' -------------------------------------------------------------------------------- /config/sensors/energy.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: integration 3 | source: sensor.total_energy_use 4 | name: Total Energy Use Over Time 5 | scan_interval: 120 6 | unit_time: h 7 | 8 | - platform: statistics 9 | name: "Total Energy Use (Hourly Max)" 10 | entity_id: sensor.total_energy_use_hourly 11 | state_characteristic: value_max 12 | max_age: 13 | hours: 1 14 | sampling_size: 360 15 | -------------------------------------------------------------------------------- /config/influxdb.yaml: -------------------------------------------------------------------------------- 1 | 2 | host: localhost 3 | port: 8086 4 | database: unison 5 | username: !secret influxdb_user 6 | password: !secret influxdb_pw 7 | max_retries: 3 8 | default_measurement: state 9 | measurement_attr: entity_id 10 | include: 11 | domains: 12 | - sensor 13 | - binary_sensor 14 | - light 15 | exclude: 16 | entity_globs: 17 | - sensor.valhalla_* 18 | - sensor.netatmo_brooklyn_* 19 | -------------------------------------------------------------------------------- /config/utility_meter.yaml: -------------------------------------------------------------------------------- 1 | 2 | daily_energy: 3 | name: Total Energy Use (Daily) 4 | source: sensor.total_energy_use_over_time 5 | cycle: daily 6 | quarter_hourly_energy: 7 | name: Total Energy Use (Hourly) 8 | source: sensor.total_energy_use_over_time 9 | cycle: hourly 10 | daily_co2: 11 | name: Total Energy Use (Daily CO₂) 12 | source: sensor.total_energy_use_hourly_co2_equivalent 13 | cycle: daily 14 | 15 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/subway-status.yaml: -------------------------------------------------------------------------------- 1 | # Subway Status slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - subway_service_status 7 | - slide_with_colored_conditional 8 | variables: 9 | condition: '[[[ return ( entity.attributes.direction_statuses.north != "Good Service") ]]]' 10 | show_label: true 11 | name: L Train - Manhattan Bound 12 | icon: 'mdi:train' 13 | entity: sensor.mta_subway_l_service_status 14 | -------------------------------------------------------------------------------- /config/calendar.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: ics_calendar 3 | calendars: 4 | 5 | - name: "Astronomy Calendar" 6 | url: "https://cantonbecker.com/astronomy-calendar/astrocal.ics" 7 | include_all_day: true 8 | download_interval: 21600 9 | 10 | - name: "Chinese Lunar Calendar" 11 | url: "https://lwlsw.github.io/Chinese-Lunar-Calendar-ics/chinese_lunar_my.ics" 12 | include_all_day: true 13 | download_interval: 21600 14 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/sun.yaml: -------------------------------------------------------------------------------- 1 | # Sunrise / Sunset Times slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_basic 6 | - sun_variables 7 | state_display: '[[[ return variables.next_state + " in " + variables.time_to_next_sun + (variables.time_to_next_sun_unit == "hr" ? " hours" : " minutes") ]]]' 8 | show_name: false 9 | show_label: true 10 | label: '[[[ return "at " + variables.next_sun_time ]]]' 11 | icon: '[[[ return variables.next_state_icon ]]]' 12 | -------------------------------------------------------------------------------- /config/sensors/neighborhood.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: feedparser 3 | name: Notify NYC 4 | feed_url: 'https://a858-nycnotify.nyc.gov/RSS/NotifyNYC?lang=en' 5 | date_format: '%d/%b/%Y %H:%M:%S' 6 | show_topn: 5 7 | scan_interval: 8 | hours: .5 9 | 10 | - platform: tgtg 11 | username: !secret tgtg_username 12 | access_token: !secret tgtg_access_token 13 | refresh_token: !secret tgtg_refresh_token 14 | user_id: !secret tgtg_user_id 15 | scan_interval: 900 16 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/last-fm-artist.yaml: -------------------------------------------------------------------------------- 1 | # Last.fm Top Artist slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_colored_conditional 7 | - slide_with_picture 8 | entity: sensor.last_fm_top_artists 9 | show_label: true 10 | name: Most Played Music Artist 11 | label: '[[[ return (entity.attributes.artist_1_playcount) + " plays" ]]]' 12 | variables: 13 | picture: '[[[ return states["sensor.last_fm_top_artist_photo"].state ]]]' 14 | -------------------------------------------------------------------------------- /ui/views/subviews/transit.yaml: -------------------------------------------------------------------------------- 1 | # Transit Subview 2 | # Made by Madelena Mak 2022 3 | 4 | path: transit 5 | subview: true 6 | 7 | type: 'custom:grid-layout' 8 | layout: !include ../../shared/snippets/layout-page-margin.yaml 9 | 10 | cards: 11 | - type: 'custom:layout-card' 12 | layout_type: 'custom:grid-layout' 13 | layout: !include ../../shared/snippets/layout-page-columns.yaml 14 | view_layout: 15 | grid-area: cc 16 | 17 | cards: !include ../../shared/secret/neighborhood-subway.yaml 18 | -------------------------------------------------------------------------------- /config/lock.yaml: -------------------------------------------------------------------------------- 1 | 2 | # - platform: template 3 | # name: Front Door Lock 4 | # value_template: "{{ is_state('sensor.front_door_lock_status', 'locked') }}" 5 | # lock: 6 | # service: rest_command.switchbot_device_command 7 | # data: 8 | # deviceId: !secret switchbot_front_door_lock_deviceID 9 | # command: "lock" 10 | # unlock: 11 | # service: rest_command.switchbot_device_command 12 | # data: 13 | # deviceId: !secret switchbot_front_door_lock_deviceID 14 | # command: "unlock" 15 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/plex-new-shows.yaml: -------------------------------------------------------------------------------- 1 | # New Shows on Plex slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_basic 6 | - slide_with_picture 7 | - plex_variables 8 | name: '[[[ return "New to Plex - " + variables.plex_last_added_time ]]]' 9 | entity: sensor.recently_added_shows 10 | state_display: '[[[ return entity.attributes.data[1].title ]]]' 11 | show_label: true 12 | label: '[[[ return entity.attributes.data[1].episode ]]]' 13 | variables: 14 | picture: '[[[ return entity.attributes.data[1].poster ]]]' 15 | -------------------------------------------------------------------------------- /ui/smartdisplays/snippets/topbar-start-button.yaml: -------------------------------------------------------------------------------- 1 | # Start Menu Button 2 | 3 | type: 'custom:button-card' 4 | icon: mdi:view-grid 5 | aspect_ratio: 1/1 6 | styles: 7 | card: 8 | - background: none 9 | - width: 15vw 10 | - height: 15vw 11 | - z-index: 100 12 | - padding: 0 13 | icon: 14 | - height: 9vw 15 | - color: var(--primary-text-color) 16 | tap_action: 17 | action: navigate 18 | navigation_path: start 19 | hold_action: 20 | action: navigate 21 | navigation_path: '[[[ window.history.back() ]]]' 22 | -------------------------------------------------------------------------------- /ui/smartdisplays/snippets/topbar-back-button.yaml: -------------------------------------------------------------------------------- 1 | # Back Button 2 | 3 | type: 'custom:button-card' 4 | icon: mdi:arrow-left-circle 5 | aspect_ratio: 1/1 6 | styles: 7 | card: 8 | - background: none 9 | - width: 15vw 10 | - height: 15vw 11 | - z-index: 100 12 | - padding: 0 13 | icon: 14 | - height: 9vw 15 | - color: var(--primary-text-color) 16 | tap_action: 17 | action: navigate 18 | navigation_path: slides 19 | hold_action: 20 | action: navigate 21 | navigation_path: '[[[ window.history.back() ]]]' 22 | -------------------------------------------------------------------------------- /ui/views/subviews/plex.yaml: -------------------------------------------------------------------------------- 1 | # Plex Library Subview 2 | # Made by Madelena Mak 2022 3 | 4 | title: Plex Library 5 | path: plex 6 | subview: true 7 | 8 | type: 'custom:grid-layout' 9 | layout: !include ../../shared/snippets/layout-page-margin.yaml 10 | 11 | cards: 12 | - type: 'custom:layout-card' 13 | layout_type: 'custom:grid-layout' 14 | layout: !include ../../shared/snippets/layout-page-columns-one.yaml 15 | view_layout: 16 | grid-area: cc 17 | 18 | cards: 19 | - !include ../machines/illinoise-plex-library.yaml 20 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/nws-alerts.yaml: -------------------------------------------------------------------------------- 1 | # NWS Alerts slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_basic 6 | - slide_with_colored_conditional 7 | variables: 8 | condition: '[[[ return states["sensor.nws_alerts"].state > 1 ]]]' 9 | entity: sensor.nws_alert_rss_feed 10 | show_state: true 11 | show_label: true 12 | name: NWS ALERTS 13 | state_display: '[[[ return states["sensor.nws_alerts"].state + " Alert" + (states["sensor.nws_alerts"].state != 1 ? "s" : "") ]]]' 14 | label: '[[[ return entity.attributes.entries[0].title ]]]' 15 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/temp-outdoor.yaml: -------------------------------------------------------------------------------- 1 | # Outdoor Temperature slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_graph 7 | - slide_with_state_unit 8 | entity: sensor.accuweather_temperature 9 | icon: mdi:thermometer 10 | show_label: true 11 | label: '[[[ return "It is " + states["sensor.thermal_comfort_outside_perception"].state.replace(/_/g, " ") + " and " + states["sensor.thermal_comfort_outside_simmerzone"].state.replace(/_/g, " ") + "." ]]]' 12 | variables: 13 | hours_to_show: 4 14 | points_per_hour: 3 15 | -------------------------------------------------------------------------------- /ui/views/subviews/sensor.nws_alert_rss_feed.yaml: -------------------------------------------------------------------------------- 1 | # NWS Alerts Subview 2 | # Made by Madelena Mak 2022 3 | 4 | title: NWS Alerts 5 | path: sensor.nws_alert_rss_feed 6 | subview: true 7 | 8 | type: 'custom:grid-layout' 9 | layout: !include ../../shared/snippets/layout-page-margin.yaml 10 | 11 | cards: 12 | - type: 'custom:layout-card' 13 | layout_type: 'custom:grid-layout' 14 | layout: !include ../../shared/snippets/layout-page-columns-one.yaml 15 | view_layout: 16 | grid-area: cc 17 | 18 | cards: 19 | - !include ../../shared/cards/nws-alerts.yaml -------------------------------------------------------------------------------- /config/panel_custom.yaml: -------------------------------------------------------------------------------- 1 | - name: Integrations 2 | sidebar_title: Integrations 3 | sidebar_icon: mdi:devices 4 | js_url: /api/hassio/app/entrypoint.js 5 | url_path: config/integrations/dashboard 6 | embed_iframe: true 7 | require_admin: true 8 | config: 9 | ingress: core_configurator 10 | 11 | - name: Automations 12 | sidebar_title: Automations 13 | sidebar_icon: mdi:cog-transfer 14 | js_url: /api/hassio/app/entrypoint.js 15 | url_path: config/automation/dashboard 16 | embed_iframe: true 17 | require_admin: true 18 | config: 19 | ingress: core_configurator -------------------------------------------------------------------------------- /ui/smartdisplays/slides/temp-indoor.yaml: -------------------------------------------------------------------------------- 1 | # Indoor Average Temperature slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_with_big_state 6 | - slide_with_graph 7 | - slide_with_state_unit 8 | entity: sensor.indoor_average_temperature 9 | icon: mdi:thermometer 10 | show_label: true 11 | label: '[[[ return "It is " + states["sensor.thermal_comfort_indoor_average_perception"].state.replace(/_/g, " ") + " and " + states["sensor.thermal_comfort_indoor_average_simmerzone"].state.replace(/_/g, " ") + "." ]]]' 12 | variables: 13 | hours_to_show: 4 14 | points_per_hour: 6 15 | -------------------------------------------------------------------------------- /ui/templates/button-card/sensors/waqi-scale.yaml: -------------------------------------------------------------------------------- 1 | 2 | waqi_scale: 3 | variables: 4 | level: | 5 | [[[ 6 | if (entity.state > 300) { 7 | return "Hazardous" 8 | } else if (entity.state > 200) { 9 | return "Very Unhealthy" 10 | } else if (entity.state > 150) { 11 | return "Unhealthy" 12 | } else if (entity.state > 100) { 13 | return "Unhealthy for Sensitive Groups" 14 | } else if (entity.state > 50) { 15 | return "Moderate" 16 | } else { 17 | return "Good" 18 | } 19 | ]]] -------------------------------------------------------------------------------- /ui/ui-rooms.yaml: -------------------------------------------------------------------------------- 1 | # Rooms Dashboard 2 | # Made by Madelena Mak 2022 3 | # https://mmak.es 4 | 5 | title: Rooms 6 | 7 | views: 8 | # - !include views/rooms/summary.yaml 9 | - !include views/rooms/living-room.yaml 10 | - !include views/rooms/kitchen.yaml 11 | - !include views/rooms/workspace.yaml 12 | - !include views/rooms/bedroom.yaml 13 | # - !include views/rooms/bathroom.yaml 14 | 15 | decluttering_templates: !include templates/decluttering-card.yaml 16 | button_card_templates: !include_dir_merge_named templates/button-card/ 17 | 18 | swipe_nav: 19 | animate: swipe 20 | prevent_default: true 21 | -------------------------------------------------------------------------------- /ui/views/subviews/chores.yaml: -------------------------------------------------------------------------------- 1 | # All On Off Switches Subview 2 | # Made by Madelena Mak 2022 3 | 4 | title: Chores 5 | path: 'chores' 6 | subview: true 7 | 8 | type: 'custom:grid-layout' 9 | layout: !include ../../shared/snippets/layout-page-margin.yaml 10 | 11 | cards: 12 | - type: 'custom:layout-card' 13 | layout_type: 'custom:masonry-layout' 14 | layout: 15 | width: 328 16 | max_width: 655 17 | max_cols: 10 18 | card_margin: 16px 16px 32px 16px 19 | margin: 0 -16px 20 | view_layout: 21 | grid-area: cc 22 | 23 | cards: !include ../../shared/columns/chores-all-list.yaml 24 | -------------------------------------------------------------------------------- /config/sensors/weather.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: noaa_tides 3 | station_id: 8518750 4 | 5 | - platform: nws_alerts 6 | zone_id: "NYZ075" 7 | 8 | - platform: feedparser 9 | name: NWS Alert RSS Feed 10 | feed_url: !secret nws_alert_feed 11 | date_format: "%a, %b %d %I:%M %p" 12 | inclusions: 13 | - title 14 | - summary 15 | - cap_expires 16 | 17 | # - platform: waqi 18 | # token: !secret waqi_token 19 | # locations: 20 | # - New York 21 | 22 | # - platform: worldtidesinfo 23 | # api_key: !secret worldtidesinfo_api_key 24 | 25 | - platform: illuminance 26 | entity_id: sensor.valhalla_cloud_cover 27 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/wind.yaml: -------------------------------------------------------------------------------- 1 | # Wind slide 2 | # This needed to convert from km/h to mph because I set my Hass to metric but I'm used to mph. 3 | 4 | type: 'custom:button-card' 5 | template: 6 | - slide_with_big_state 7 | - slide_with_graph 8 | entity: sensor.valhalla_wind 9 | name: Wind 10 | show_label: true 11 | label: '[[[ return states["sensor.wind_strength"].state + " from " + states["sensor.wind_direction"].state ]]]' 12 | state_display: | 13 | [[[ 14 | return (Math.round(parseFloat(states["sensor.valhalla_wind"].state) * 0.6213712 * 10) / 10) + 15 | " MPH" 16 | ]]] 17 | -------------------------------------------------------------------------------- /config/sensors/monitors.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: systemmonitor 3 | entity_namespace: unison 4 | resources: 5 | - type: disk_use_percent 6 | arg: / 7 | - type: memory_use_percent 8 | - type: load_1m 9 | - type: network_in 10 | arg: eth0 11 | - type: network_out 12 | arg: eth0 13 | - type: throughput_network_in 14 | arg: eth0 15 | - type: throughput_network_out 16 | arg: eth0 17 | - type: ipv4_address 18 | arg: eth0 19 | - type: processor_use 20 | - type: processor_temperature 21 | - type: last_boot 22 | 23 | - platform: openhardwaremonitor 24 | host: !secret dorothy_ip 25 | -------------------------------------------------------------------------------- /ui/shared/cards/nws-alerts.yaml: -------------------------------------------------------------------------------- 1 | type: 'custom:list-card' 2 | entity: sensor.nws_alert_rss_feed 3 | feed_attribute: entries 4 | columns: 5 | - title: '' 6 | field: title 7 | style: 8 | - display: block 9 | - font-weight: 600 10 | - font-size: var(--h5-font-size) 11 | - line-height: 1.5 12 | - padding: 16px 0 4px 13 | - title: '' 14 | field: summary 15 | style: 16 | - display: block 17 | - padding: 0 18 | style: > 19 | xha-card { background: none; } 20 | 21 | table tbody:first-child { display: none; } 22 | 23 | tbody tr:nth-child(odd), tbody tr:nth-child(even) { 24 | background: none; } -------------------------------------------------------------------------------- /config/sensors/powercalc.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: powercalc 3 | entity_id: light.kitchen_spot_lights 4 | linear: 5 | max_power: 18 6 | - platform: powercalc 7 | entity_id: light.kitchen_counter_lights 8 | linear: 9 | max_power: 17 10 | - platform: powercalc 11 | entity_id: light.kitchen_sink_lights 12 | linear: 13 | max_power: 13 14 | - platform: powercalc 15 | entity_id: light.living_room_chandelier_main 16 | linear: 17 | max_power: 40 18 | - platform: powercalc 19 | entity_id: light.living_room_decor_lights 20 | linear: 21 | max_power: 3.5 22 | - platform: powercalc 23 | entity_id: light.bedroom_ceiling_lights 24 | linear: 25 | max_power: 45 26 | -------------------------------------------------------------------------------- /ui/ui-smartdisplays-minimal.yaml: -------------------------------------------------------------------------------- 1 | # The Ambient Smart Displays Dashboard - Minimal Version 2 | # For use on smaller Echo Show and Google Home displays 3 | # Made by Madelena Mak 2022 4 | # https://mmak.es 5 | 6 | 7 | title: Smart Display (Minimal) 8 | 9 | decluttering_templates: !include templates/decluttering-card.yaml 10 | button_card_templates: !include_dir_merge_named templates/button-card/ 11 | 12 | views: 13 | - !include smartdisplays/views/home-minimal.yaml 14 | 15 | # 16 | # background: var(--primary-color) 17 | animated_background: 18 | default_url: 'https://cdn.flixel.com/flixel/7a0iejyutuuc9p8rdss3.hd.mp4' 19 | # default_url: "/local/pexels-rostislav-uzunov-10613972.mp4" 20 | 21 | -------------------------------------------------------------------------------- /ui/ui-hassagent.yaml: -------------------------------------------------------------------------------- 1 | # Home Assistant Agent Menu 2 | # Made by Madelena Mak 2022 3 | # https://mmak.es 4 | 5 | title: Home Assistant Agent 6 | 7 | views: 8 | - title: Workspace 9 | 10 | type: 'custom:grid-layout' 11 | layout: !include shared/snippets/layout-page-margin.yaml 12 | cards: 13 | - type: 'custom:layout-card' 14 | layout_type: 'custom:grid-layout' 15 | layout: !include shared/snippets/layout-page-columns.yaml 16 | view_layout: 17 | grid-area: cc 18 | cards: !include views/rooms/workspace-cards.yaml 19 | 20 | decluttering_templates: !include templates/decluttering-card.yaml 21 | button_card_templates: !include_dir_merge_named templates/button-card/ 22 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/notify-nyc.yaml: -------------------------------------------------------------------------------- 1 | type: 'custom:button-card' 2 | template: slide_basic 3 | entity: sensor.notify_nyc 4 | variables: 5 | slide: 0 6 | show_state: true 7 | show_label: true 8 | name: | 9 | [[[ 10 | return "Notify NYC - " + moment(entity.attributes.entries[variables.slide].published, "DD/MMM/YYYY HH:mm:ss").fromNow() 11 | ]]] 12 | state_display: >- 13 | [[[ return 14 | entity.attributes.entries[variables.slide].title.replaceAll("Notify NYC 15 | - ", "") ]]] 16 | label: >- 17 | [[[ return 18 | entity.attributes.entries[variables.slide].summary.replaceAll(/Notification 19 | issued .*/g, "").replaceAll(/For more information, .*/g, 20 | "").replaceAll(/To view this message in.*/g, "") ]]] 21 | -------------------------------------------------------------------------------- /ui/shared/columns/energy-kitchen.yaml: -------------------------------------------------------------------------------- 1 | - type: sensor 2 | entity: sensor.kitchen_microwave_plug_smartenergy_metering 3 | graph: line 4 | detail: 2 5 | name: Kitchen Microwave 6 | hours_to_show: 48 7 | 8 | - type: sensor 9 | entity: sensor.kitchen_fridge_plug_smartenergy_metering 10 | graph: line 11 | detail: 2 12 | name: Kitchen Fridge 13 | hours_to_show: 48 14 | 15 | - type: sensor 16 | entity: sensor.kitchen_aerogardens_plug_smartenergy_metering 17 | graph: line 18 | detail: 2 19 | name: Kitchen Aerogardens 20 | hours_to_show: 48 21 | 22 | - graph: line 23 | type: sensor 24 | entity: sensor.kitchen_lights_energy_use 25 | detail: 2 26 | icon: 'mdi:lightbulb-group' 27 | name: Kitchen Lights 28 | hours_to_show: 48 -------------------------------------------------------------------------------- /config/sensors/misc.yaml: -------------------------------------------------------------------------------- 1 | 2 | # - platform: opensky 3 | # radius: 5 4 | # latitude: !secret opensky_latitude 5 | # longitude: !secret opensky_longitude 6 | 7 | - platform: google_fit 8 | name: Google Fit 9 | client_id: !secret google_client_id 10 | client_secret: !secret google_client_secret 11 | 12 | # - platform: torque 13 | # email: !secret torque_email 14 | 15 | - platform: ics 16 | name: Astronomy Calendar 17 | url: https://cantonbecker.com/astronomy-calendar/astrocal.ics 18 | icon: mdi:weather-night 19 | 20 | - platform: plex_recently_added 21 | name: Recently Added Shows 22 | token: !secret plex_token 23 | host: !secret plex_host 24 | port: 32400 25 | section_types: 26 | - movie 27 | - show 28 | image_resolution: 800 29 | -------------------------------------------------------------------------------- /ui/shared/columns/energy-workspace.yaml: -------------------------------------------------------------------------------- 1 | - hours_to_show: 48 2 | graph: line 3 | type: sensor 4 | detail: 2 5 | entity: sensor.astralplane_plug_smartenergy_metering 6 | name: Astralplane 7 | icon: 'mdi:desktop-classic' 8 | 9 | - hours_to_show: 48 10 | graph: line 11 | type: sensor 12 | entity: sensor.quattro_plug_smartenergy_metering 13 | detail: 2 14 | name: Quattro 15 | icon: 'mdi:television' 16 | 17 | - type: sensor 18 | entity: sensor.makery_plug_smartenergy_metering 19 | graph: line 20 | detail: 2 21 | name: Makery 22 | hours_to_show: 48 23 | 24 | - graph: line 25 | type: sensor 26 | entity: sensor.workspace_lights_energy_use 27 | detail: 2 28 | icon: 'mdi:lightbulb-group' 29 | name: Workspace Lights 30 | hours_to_show: 48 -------------------------------------------------------------------------------- /ui/smartdisplays/slides-bedroom.yaml: -------------------------------------------------------------------------------- 1 | 2 | - !include slides/big-clock-space-theme.yaml 3 | 4 | 5 | # Chores 6 | - !include slides/chores.yaml 7 | 8 | 9 | # Weather 10 | - !include slides/sun.yaml 11 | - !include slides/nws-alerts.yaml 12 | - !include slides/weather-current.yaml 13 | - !include slides/temp-outdoor.yaml 14 | - !include slides/temp-indoor.yaml 15 | - !include slides/weather-daily.yaml 16 | - !include slides/weather-hourly.yaml 17 | 18 | 19 | # Fun Stuff 20 | - !include slides/last-fm-artist.yaml 21 | - !include slides/plex-new-shows.yaml 22 | 23 | 24 | # Commute 25 | - !include slides/subway-status.yaml 26 | - !include slides/gasbuddy.yaml 27 | - !include slides/nyc311-alt-side-parking.yaml 28 | - !include slides/waze-driving-time.yaml 29 | 30 | 31 | - !include slides/blank.yaml 32 | -------------------------------------------------------------------------------- /ui/shared/columns/energy-living-room.yaml: -------------------------------------------------------------------------------- 1 | - hours_to_show: 48 2 | graph: line 3 | type: sensor 4 | entity: sensor.terpsichora_plug_smartenergy_metering 5 | detail: 2 6 | name: Terpsichora 7 | icon: 'mdi:speaker-multiple' 8 | 9 | - type: sensor 10 | entity: sensor.living_room_projector_plug_smartenergy_metering 11 | graph: line 12 | hours_to_show: 48 13 | detail: 2 14 | name: Living Room Projector 15 | 16 | - type: sensor 17 | entity: sensor.living_room_air_conditioner_plug_smartenergy_metering 18 | graph: line 19 | hours_to_show: 48 20 | detail: 2 21 | name: Living Room Air Conditioner 22 | 23 | - graph: line 24 | type: sensor 25 | hours_to_show: 48 26 | entity: sensor.living_room_lights_energy_use 27 | detail: 2 28 | icon: 'mdi:lightbulb-group' 29 | name: Living Room Lights -------------------------------------------------------------------------------- /ui/smartdisplays/slides/big-clock.yaml: -------------------------------------------------------------------------------- 1 | # Big Ass Clock 2 | 3 | type: 'custom:button-card' 4 | template: slide_basic 5 | show_state: true 6 | show_label: true 7 | triggers_update: all 8 | name: " " 9 | state_display: >- 10 | [[[ return moment().format("H:mm") ]]] 11 | label: >- 12 | [[[ return moment().format("dddd, MMMM D") ]]] 13 | styles: 14 | grid: 15 | - grid-template-areas: '""n" "s" "l"' 16 | - grid-template-columns: auto 17 | - grid-template-rows: auto 60vh auto 18 | card: 19 | - background: var(--accent-color) 20 | state: 21 | - font-size: 60vh 22 | - justify-content: center 23 | - place-self: center 24 | - padding: 0 25 | label: 26 | - font-size: 10vh 27 | - font-weight: 700 28 | - text-transform: uppercase 29 | - place-self: start center 30 | - padding: 2vh 0 0 -------------------------------------------------------------------------------- /ui/ui-machines.yaml: -------------------------------------------------------------------------------- 1 | # Madelena + The Machines 2 | # Made by Madelena Mak 2022 3 | # https://mmak.es 4 | 5 | title: My Machines 6 | # Yes, it's the one by Battles ft. Gary Numan 7 | 8 | views: 9 | - !include views/machines/all-devices.yaml 10 | - !include views/machines/unison.yaml 11 | - !include views/machines/terpsichora.yaml 12 | - !include views/machines/genesis.yaml 13 | - !include views/machines/dorothy.yaml 14 | - !include views/machines/illinoise.yaml 15 | - !include views/machines/astralplane.yaml 16 | - !include views/machines/printers.yaml 17 | # Car, and maybe Fridge, Microwave 18 | 19 | decluttering_templates: !include templates/decluttering-card.yaml 20 | button_card_templates: !include_dir_merge_named templates/button-card/ 21 | 22 | swipe_nav: 23 | animate: swipe 24 | prevent_default: true 25 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/chores.yaml: -------------------------------------------------------------------------------- 1 | # Chores slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_basic 6 | - slide_with_big_state 7 | - slide_with_colored_conditional 8 | - chores_variables 9 | show_state: true 10 | show_label: true 11 | name: '[[[ return variables.chores_count_text ]]]' 12 | state_display: '[[[ return variables.chores_all_done_text ]]]' 13 | label: '[[[ return variables.chores_to_do_list ]]]' 14 | icon: mdi:clipboard-check-outline 15 | variables: 16 | condition: '[[[ return (states["sensor.chores_overdue"].attributes.entities.length > 0) ]]]' 17 | extra_styles: | 18 | li { 19 | list-style: square; 20 | margin-left: .5vw; 21 | } 22 | li:before { 23 | content: ""; 24 | margin-left: -2.5vw; 25 | } 26 | tap_action: 27 | action: navigate 28 | navigation_path: /ui-smart-displays/chores 29 | -------------------------------------------------------------------------------- /ui/shared/cards/energy-current-total.yaml: -------------------------------------------------------------------------------- 1 | type: vertical-stack 2 | in_card: true 3 | cards: 4 | - type: entity 5 | entity: sensor.total_energy_use 6 | name: Current Total 7 | icon: 'mdi:lightning-bolt' 8 | - type: history-graph 9 | hours_to_show: 48 10 | entities: 11 | - entity: sensor.total_energy_use 12 | card_mod: 13 | style: 14 | .: | 15 | ha-card { overflow: hidden; } 16 | .content { 17 | margin: 4px -13px -8px -66px !important; 18 | padding: 0 0 12px 0 !important; 19 | overflow: hidden; 20 | filter: hue-rotate( calc( var(--hue-primary-color) - 215deg) ) saturate(2) opacity(.66) 21 | } 22 | state-history-charts$state-history-chart-line$ha-chart-base$: | 23 | .chartLegend { display: none;} 24 | card_mod: 25 | style: | 26 | ha-card { aspect-ratio: 1; } -------------------------------------------------------------------------------- /ui/views/subviews/group.all_on_off.yaml: -------------------------------------------------------------------------------- 1 | # All On Off Switches Subview 2 | # Made by Madelena Mak 2022 3 | 4 | title: All On Off Switches 5 | path: 'group.all-on-off' 6 | type: panel 7 | subview: true 8 | cards: 9 | 10 | - type: 'custom:auto-entities' 11 | filter: 12 | include: 13 | - group: group.all_on_off 14 | options: 15 | type: 'custom:button-card' 16 | template: 17 | - live_tile_card 18 | - require_confirmation 19 | entity: this.entity_id 20 | - type: 'custom:button-card' 21 | template: live_tile_card 22 | entity: switch.kitchen_uv_light 23 | exclude: [] 24 | sort: 25 | method: friendly_name 26 | card: 27 | type: 'custom:layout-card' 28 | layout_type: horizontal 29 | layout_options: 30 | width: 100 31 | max_cols: 6 32 | -------------------------------------------------------------------------------- /www/psychrometry-chart.css: -------------------------------------------------------------------------------- 1 | .line-marker { 2 | stroke: var(--primary-text-color) !important; 3 | stroke-width: 3 !important; 4 | } 5 | 6 | .data-scale { filter: var(--dark-mode-filter) hue-rotate(calc(-245deg + var(--hue-primary-color))); } 7 | 8 | .text-axis { 9 | fill:var(--primary-text-color); 10 | font-size: 2em; 11 | } 12 | .text-grid { 13 | font-size: 1.2em !important; 14 | 15 | } 16 | .data { filter: var(--dark-mode-filter) hue-rotate(calc(-245deg + var(--hue-primary-color))); } 17 | 18 | .fill-white { fill: transparent !important; } 19 | 20 | .font-overlay { 21 | fill:var(--primary-text-color) !important; 22 | font-family: var(--font-stack); 23 | font-size: 1.2em !important; 24 | font-weight: 600; 25 | text-shadow:none !important; 26 | } 27 | 28 | .overlay polygon, .overlay polyline { 29 | stroke: var(--primary-text-color) !important; 30 | opacity: .33; 31 | } -------------------------------------------------------------------------------- /config/templates/misc.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Run when Home Assistant starts. 3 | 4 | - trigger: 5 | - platform: homeassistant 6 | event: start 7 | sensor: 8 | 9 | - name: Zero 10 | state: "0" 11 | 12 | - name: OpenSky Flight in Vicinity 13 | state: '' 14 | 15 | - name: Crashplan Status 16 | state: '' 17 | attributes: 18 | body: '' 19 | date: '' 20 | 21 | 22 | # Run every minute. 23 | 24 | - trigger: 25 | platform: time_pattern 26 | minutes: "/1" 27 | sensor: 28 | 29 | # My First Template! 30 | # - name: Active NWS Alert 31 | # state: > 32 | # {% if states('sensor.nws_alerts') | int > 0 %} 33 | # on 34 | # {% else %} 35 | # off 36 | # {% endif %} 37 | 38 | - name: Sun Elevation 39 | state: > 40 | {{ state_attr('sun.sun', 'elevation') | float }} 41 | unit_of_measurement: "°" 42 | -------------------------------------------------------------------------------- /ui/shared/columns/energy-bedroom.yaml: -------------------------------------------------------------------------------- 1 | - type: sensor 2 | entity: sensor.bedroom_devices_plug_smartenergy_metering 3 | graph: line 4 | detail: 2 5 | name: Bedroom Devices 6 | hours_to_show: 48 7 | 8 | - hours_to_show: 48 9 | graph: line 10 | type: sensor 11 | entity: sensor.dorothy_plug_smartenergy_metering 12 | detail: 2 13 | name: Dorothy 14 | icon: 'mdi:server-network' 15 | 16 | - type: sensor 17 | entity: sensor.dorothy_devices_plug_smartenergy_metering 18 | detail: 2 19 | graph: line 20 | name: Dorothy Devices 21 | hours_to_show: 48 22 | 23 | - type: sensor 24 | entity: sensor.bedroom_air_conditioner_plug_smartenergy_metering 25 | graph: line 26 | detail: 2 27 | name: Bedroom Air Conditioner 28 | hours_to_show: 48 29 | 30 | - graph: line 31 | type: sensor 32 | entity: sensor.bedroom_lights_energy_use 33 | detail: 2 34 | icon: 'mdi:lightbulb-group' 35 | name: Bedroom Lights 36 | hours_to_show: 48 -------------------------------------------------------------------------------- /ui/smartdisplays/slides/weather-current.yaml: -------------------------------------------------------------------------------- 1 | # Current Weather slide 2 | 3 | type: 'custom:button-card' 4 | template: 5 | - slide_basic 6 | - slide_with_big_state 7 | - slide_with_colored_conditional 8 | - weather_variables 9 | variables: 10 | condition: '[[[ return (entity.attributes.forecast.some(e => e.condition.includes("rain"))) ]]]' 11 | entity: weather.valhalla_2 12 | show_state: true 13 | show_label: true 14 | name: Current Weather 15 | icon: '[[[ return variables.weather_icon ]]]' 16 | state_display: '[[[ return variables.weather_condition ]]]' 17 | label: | 18 | [[[ 19 | var precip = states['weather.valhalla_2'].attributes.forecast[0].precipitation_probability 20 | if (variables.condition) { 21 | return "You " + ((precip > 75) ? "" : "might ") + "need an umbrella. There is a " + precip + "% chance of rain." 22 | } else { 23 | return "" 24 | } 25 | ]]] 26 | styles: 27 | state: 28 | - text-transform: capitalize 29 | -------------------------------------------------------------------------------- /ui/ui-smartdisplays-bedroom.yaml: -------------------------------------------------------------------------------- 1 | # The Ambient Smart Displays Dashboard 2 | # For use on tablets, Echo Show, and Google Home displays 3 | # Made by Madelena Mak 2022 4 | # https://mmak.es 5 | 6 | 7 | title: Smart Display (Bedroom) 8 | 9 | decluttering_templates: !include templates/decluttering-card.yaml 10 | button_card_templates: !include_dir_merge_named templates/button-card/ 11 | 12 | views: 13 | - !include smartdisplays/views/home-bedroom.yaml 14 | - !include smartdisplays/views/home-bedroom-clock-only.yaml 15 | - !include smartdisplays/views/start.yaml 16 | - !include smartdisplays/views/chores.yaml 17 | - !include smartdisplays/views/lights.yaml 18 | - !include smartdisplays/views/climate.yaml 19 | - !include smartdisplays/views/vacuum.yaml 20 | - !include smartdisplays/views/music.yaml 21 | - !include smartdisplays/views/tv.yaml 22 | - !include smartdisplays/views/energy.yaml 23 | - !include smartdisplays/views/weather.yaml 24 | 25 | 26 | -------------------------------------------------------------------------------- /ui/shared/cards/energy-living-room.yaml: -------------------------------------------------------------------------------- 1 | type: 'custom:auto-entities' 2 | filter: 3 | template: | 4 | {% for sensor in expand('group.energy_living_room') -%} 5 | {%- set name = state_attr(sensor.entity_id,"friendly_name") | regex_replace(find='Living Room ', replace='') | regex_replace(find='smartenergy_metering', replace='') | regex_replace(find=' Plug', replace='') | regex_replace(find='Energy Use', replace='') -%} 6 | {{ 7 | { 'entity': sensor.entity_id, 8 | 'type': 'custom:button-card', 9 | 'template': ['live_tile_with_graph', 'live_tile_with_state_unit'], 10 | 'name': name, 11 | 'variables': { 12 | 'lower_bound': 0, 13 | 'upper_bound': '~200' 14 | } 15 | } 16 | }}, 17 | {%- endfor %} 18 | sort: 19 | method: state 20 | reverse: true 21 | numeric: true 22 | card: 23 | type: 'custom:layout-card' 24 | layout_type: 'custom:grid-layout' 25 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml -------------------------------------------------------------------------------- /ui/smartdisplays/snippets/topbar-clock-simple.yaml: -------------------------------------------------------------------------------- 1 | # Clock 2 | 3 | type: 'custom:button-card' 4 | show_state: true 5 | show_name: false 6 | state_display: >- 7 | [[[ return moment().format("H:mm") ]]] 8 | triggers_update: all 9 | styles: 10 | grid: 11 | - grid-template-areas: '"s" "n"' 12 | - grid-template-columns: auto min-content 13 | - grid-template-rows: min-content min-content auto 14 | - align-content: center 15 | - overflow: visible 16 | card: 17 | - background: none 18 | - position: absolute 19 | - top: 0 20 | - right: -15vw 21 | - padding: 0 22 | - z-index: 0 23 | - opacity: 0.75 24 | - color: var(--primary-text-color) 25 | - width: 25vw 26 | - height: 15vw 27 | - overflow-x: visible 28 | state: 29 | - font-size: 7.5vw 30 | - font-weight: 100 31 | - line-height: 1 32 | - place-self: end 33 | - text-align: right 34 | - white-space: nowrap 35 | - padding: 0 4vw 0 0 36 | - overflow: visible 37 | tap_action: 38 | action: none 39 | -------------------------------------------------------------------------------- /config/sensors/database.yaml: -------------------------------------------------------------------------------- 1 | 2 | # From https://www.home-assistant.io/integrations/sql/ 3 | - platform: sql 4 | db_url: !secret mariadb_url 5 | scan_interval: 3600 6 | queries: 7 | - name: MariaDB size 8 | query: 'SELECT table_schema "homeassistant", Round(Sum(data_length + index_length) / POWER(1024,2), 1) "value" FROM information_schema.tables WHERE table_schema="homeassistant" GROUP BY table_schema;' 9 | column: "value" 10 | unit_of_measurement: MB 11 | 12 | # - platform: influxdb 13 | # host: localhost 14 | # port: 8086 15 | # username: !secret influxdb_user 16 | # password: !secret influxdb_pw 17 | # scan_interval: 3600 18 | # queries: 19 | # - name: InfluxDB Database Size 20 | # unit_of_measurement: MB 21 | # value_template: "{{ (value | float(0) / 1024 /1024) | round(1) }}" 22 | # group_function: sum 23 | # measurement: '"monitor"."shard"' 24 | # database: _internal 25 | # where: '"database"=''unison'' AND time > now() - 5m' 26 | # field: diskBytes 27 | -------------------------------------------------------------------------------- /ui/views/rooms/workspace.yaml: -------------------------------------------------------------------------------- 1 | # MAXIMALIST DASHBOARD 2 | # Workspace View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Workspace 6 | path: workspace 7 | 8 | type: 'custom:grid-layout' 9 | layout: !include ../../shared/snippets/layout-page-margin.yaml 10 | 11 | cards: 12 | - type: 'custom:layout-card' 13 | layout_type: 'custom:grid-layout' 14 | layout: 15 | margin: -1px 16 | view_layout: 17 | grid-area: cc 18 | cards: 19 | 20 | # [Header] Summary 21 | 22 | - type: 'custom:layout-card' 23 | layout_type: 'custom:grid-layout' 24 | layout: !include ../../shared/snippets/layout-page-title.yaml 25 | cards: 26 | 27 | - type: markdown 28 | style: !include ../../shared/snippets/style-markdown-page-title.yaml 29 | content: > 30 | # Workspace 31 | 32 | - type: 'custom:layout-card' 33 | layout_type: 'custom:grid-layout' 34 | layout: !include ../../shared/snippets/layout-page-columns.yaml 35 | cards: !include workspace-cards.yaml 36 | -------------------------------------------------------------------------------- /ui/shared/columns/energy-kitchen-power-strip.yaml: -------------------------------------------------------------------------------- 1 | - type: sensor 2 | entity: sensor.kitchen_counter_kettle_current_consumption 3 | graph: line 4 | name: Kettle 5 | detail: 2 6 | hours_to_show: 48 7 | 8 | - type: sensor 9 | graph: line 10 | entity: sensor.kitchen_counter_toaster_current_consumption 11 | name: Toaster 12 | detail: 2 13 | hours_to_show: 48 14 | 15 | - type: sensor 16 | entity: sensor.kitchen_counter_rice_cooker_current_consumption 17 | name: Rice Cooker 18 | graph: line 19 | detail: 2 20 | hours_to_show: 48 21 | 22 | - type: sensor 23 | entity: sensor.kitchen_counter_hand_blender_current_consumption 24 | name: Hand Blender 25 | graph: line 26 | detail: 2 27 | hours_to_show: 48 28 | 29 | - type: sensor 30 | graph: line 31 | entity: sensor.kitchen_counter_echo_plug_current_consumption 32 | name: Echo Show 33 | detail: 2 34 | hours_to_show: 48 35 | 36 | - type: sensor 37 | entity: sensor.kitchen_counter_plug_3_current_consumption 38 | name: Plug 3 39 | graph: line 40 | detail: 2 41 | hours_to_show: 48 -------------------------------------------------------------------------------- /ui/shared/cards/traffic-cameras.yaml: -------------------------------------------------------------------------------- 1 | square: false 2 | columns: 2 3 | type: grid 4 | cards: 5 | - show_state: false 6 | show_name: true 7 | camera_view: live 8 | type: picture-entity 9 | entity: camera.511ny_i278_at_morgan_ave 10 | - show_state: false 11 | show_name: true 12 | camera_view: live 13 | type: picture-entity 14 | entity: camera.511ny_i495_at_84th_street 15 | - show_state: false 16 | show_name: true 17 | camera_view: live 18 | type: picture-entity 19 | entity: camera.511ny_i278_at_state_street_upper_lvl 20 | - show_state: false 21 | show_name: true 22 | camera_view: live 23 | type: picture-entity 24 | entity: camera.511ny_i495_at_queens_midtown_tunnel 25 | - show_state: false 26 | show_name: true 27 | camera_view: auto 28 | type: picture-entity 29 | entity: camera.511ny_broadway_at_46_street 30 | name: Broadway @ 46 Street 31 | - show_state: false 32 | show_name: true 33 | camera_view: auto 34 | type: picture-entity 35 | entity: camera.511ny_canal_street_at_baxter_street 36 | -------------------------------------------------------------------------------- /config/binary_sensors/environment.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Get indoor temperature and humidity trends. 3 | 4 | - platform: trend 5 | sensors: 6 | 7 | netatmo_indoor_temperature_rising: 8 | entity_id: sensor.netatmo_strawberry_land_indoor_temperature 9 | sample_duration: 7200 10 | max_samples: 120 11 | min_gradient: 0.00002755 12 | device_class: heat 13 | 14 | netatmo_indoor_temperature_falling: 15 | entity_id: sensor.netatmo_strawberry_land_indoor_temperature 16 | sample_duration: 7200 17 | max_samples: 120 18 | min_gradient: -0.00002755 19 | device_class: cold 20 | 21 | netatmo_indoor_humidity_wetting: 22 | entity_id: sensor.netatmo_strawberry_land_indoor_humidity 23 | sample_duration: 7200 24 | max_samples: 120 25 | min_gradient: 0.0008 26 | device_class: moisture 27 | 28 | netatmo_indoor_humidity_drying: 29 | entity_id: sensor.netatmo_strawberry_land_indoor_humidity 30 | sample_duration: 7200 31 | max_samples: 120 32 | min_gradient: -0.0008 33 | device_class: moisture 34 | -------------------------------------------------------------------------------- /ui/shared/columns/lights-bedroom.yaml: -------------------------------------------------------------------------------- 1 | - view_layout: 2 | grid-column: span 2 3 | type: 'custom:button-card' 4 | template: 5 | - light_button_card_group 6 | entity: group.bedroom_lights 7 | name: All Bedroom Lights 8 | icon: 'mdi:lightbulb-multiple' 9 | variables: 10 | aspect_ratio: 2/1 11 | 12 | - type: 'custom:button-card' 13 | template: 14 | - live_tile_with_graph 15 | - live_tile_with_state_unit 16 | entity: sensor.bedroom_hue_sensor_light_level 17 | name: Light Level 18 | 19 | - type: 'custom:decluttering-card' 20 | template: light_card 21 | variables: 22 | - entity: light.bedroom_ceiling_lights 23 | - name: Ceiling 24 | 25 | - type: 'custom:decluttering-card' 26 | template: light_card 27 | variables: 28 | - entity: light.bedroom_cloud_light 29 | - name: Cloud Light 30 | 31 | - type: 'custom:decluttering-card' 32 | template: light_card 33 | variables: 34 | - entity: light.bedroom_hue_bowl 35 | - name: Hue Bowl 36 | 37 | - type: 'custom:decluttering-card' 38 | template: light_card 39 | variables: 40 | - entity: light.bedroom_salt_lamp 41 | - name: Salt Lamp -------------------------------------------------------------------------------- /www/ha-floorplan.css: -------------------------------------------------------------------------------- 1 | .fp-profile,.fp-line { stroke-miterlimit:10; } 2 | .fp-bg { fill:var(--primary-background-color); } 3 | .icon,.tile-text,.group-name-text { fill:var(--primary-text-color); } 4 | .bg-off { fill:var(--primary-text-color); opacity:.125; } 5 | .bg-on { fill:var(--primary-color); } 6 | .bg-urgent { fill: var(--error-color); } 7 | .group-name-text { font-size:96px; } 8 | .tile-text,.group-name-text { font-family:var(--font-stack);font-weight:600; } 9 | .tile-text { 10 | font-size:56px; 11 | text-transform:uppercase; 12 | } 13 | .fp-profile,.fp-line { fill:none;stroke:var(--primary-text-color); } 14 | .fp-profile { stroke-width:4px; } 15 | .fp-line { stroke-width:2px; } 16 | 17 | .icon-spinning { 18 | fill:var(--primary-text-color); 19 | animation-name: spin; 20 | animation-duration: 10s; 21 | animation-iteration-count: infinite; 22 | animation-timing-function: linear; 23 | transform-origin: 50% 50%; 24 | transform-box: fill-box; 25 | } 26 | 27 | @keyframes spin { 28 | from { 29 | transform: rotate(0deg); 30 | } 31 | to { 32 | transform: rotate(360deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ui/shared/cards/energy-kitchen.yaml: -------------------------------------------------------------------------------- 1 | type: 'custom:auto-entities' 2 | filter: 3 | template: | 4 | {% for sensor in expand('group.energy_kitchen', 'group.energy_kitchen_power_strip') -%} 5 | {%- set name = state_attr(sensor.entity_id,"friendly_name") | regex_replace(find='Kitchen ', replace='') | regex_replace(find='smartenergy_metering', replace='') | regex_replace(find=' Plug', replace='') | regex_replace(find='Counter ', replace='') | regex_replace(find=' Current Consumption', replace='') | regex_replace(find='Energy Use', replace='') -%} 6 | {{ 7 | { 'entity': sensor.entity_id, 8 | 'type': 'custom:button-card', 9 | 'template': ['live_tile_with_graph', 'live_tile_with_state_unit'], 10 | 'name': name, 11 | 'variables': { 12 | 'lower_bound': 0, 13 | 'upper_bound': '~200' 14 | } 15 | } 16 | }}, 17 | {%- endfor %} 18 | sort: 19 | method: state 20 | reverse: true 21 | numeric: true 22 | card: 23 | type: 'custom:layout-card' 24 | layout_type: 'custom:grid-layout' 25 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml -------------------------------------------------------------------------------- /ui/smartdisplays/snippets/slideshow-mod-card-bg.yaml: -------------------------------------------------------------------------------- 1 | style: | 2 | ha-card { background: none; position: relative; 3 | height: 100vh; width: 100vw; margin: -1px; overflow: hidden; 4 | } 5 | layout-card { background: none; position: relative; opacity: 0; left: 100%; 6 | animation-name: fade-in2; 7 | animation-duration: 2s; 8 | animation-fill-mode: forwards; 9 | animation-iteration-count: 1; 10 | } 11 | @keyframes fade-in2 { 12 | 0% {opacity: 0; left: 100%;} 13 | 100% {opacity: 1; left: 0;} 14 | } 15 | 16 | # Extravagant 3D transition 17 | # style: | 18 | # ha-card { background: none; position: relative; 19 | # height: 100vh; width: 100vw; margin: -1px; overflow: hidden; opacity: 0; left: 100%; 20 | # animation-name: fade-in2; 21 | # animation-duration: 2s; 22 | # animation-fill-mode: forwards; 23 | # animation-iteration-count: 1; 24 | # } 25 | # layout-card { background: none; position: relative; 26 | # } 27 | # @keyframes fade-in2 { 28 | # 0% {opacity: 0; left: 100%; transform: perspective(1000px) rotateY(-90deg);} 29 | # 100% {opacity: 1; left: 0; transform: perspective(1000px) rotateY(0deg);} 30 | # } 31 | -------------------------------------------------------------------------------- /config/templates/kitchen.yaml: -------------------------------------------------------------------------------- 1 | 2 | - binary_sensor: 3 | - name: Kitchen Counter Kettle Boiling 4 | state: > 5 | {% if states('sensor.kitchen_counter_kettle_current_consumption') | float >= 1000 %} 6 | on 7 | {% else %} 8 | off 9 | {% endif %} 10 | delay_on: '0:00:05' 11 | delay_off: '0:00:02' 12 | icon: mdi:kettle-pour-over 13 | 14 | - binary_sensor: 15 | - name: Kitchen Counter Toaster Toasting 16 | state: > 17 | {% if states('sensor.kitchen_counter_toaster_current_consumption') | float >= 1000 %} 18 | on 19 | {% else %} 20 | off 21 | {% endif %} 22 | delay_on: '0:00:05' 23 | delay_off: '0:00:02' 24 | icon: mdi:toaster 25 | 26 | - binary_sensor: 27 | - name: Kitchen Stove Smokey 28 | state: > 29 | {% if states('sensor.kitchen_stove_monitor_voc_level') | float >= 100 %} 30 | on 31 | {% else %} 32 | off 33 | {% endif %} 34 | delay_on: '0:00:05' 35 | delay_off: '0:00:02' 36 | device_class: smoke 37 | icon: mdi:stove 38 | 39 | # Rice Cooker left on for too long 40 | # Rice Cooker cooking 41 | # Left someone in the microwave 42 | -------------------------------------------------------------------------------- /ui/smartdisplays/snippets/topbar-clock.yaml: -------------------------------------------------------------------------------- 1 | # Clock 2 | 3 | type: 'custom:button-card' 4 | show_state: true 5 | state_display: >- 6 | [[[ return moment().format("H:mm") ]]] 7 | name: >- 8 | [[[ return moment().format("dddd, MMM D") ]]] 9 | triggers_update: all 10 | styles: 11 | grid: 12 | - grid-template-areas: '"s" "n"' 13 | - grid-template-columns: auto min-content 14 | - grid-template-rows: min-content min-content auto 15 | - align-content: center 16 | - overflow: visible 17 | card: 18 | - background: none 19 | - position: absolute 20 | - top: 0 21 | - right: -15vw 22 | - padding: 0 23 | - z-index: 100 24 | - opacity: 0.75 25 | - color: var(--primary-text-color) 26 | - width: 25vw 27 | - height: 15vw 28 | - overflow-x: visible 29 | name: 30 | - font-size: 1.5vw 31 | - font-weight: 700 32 | - text-transform: uppercase 33 | - place-self: end 34 | - text-align: right 35 | - padding: .5vw 4vw .5vw 0 36 | - white-space: nowrap 37 | - overflow: visible 38 | state: 39 | - font-size: 6vw 40 | - font-weight: 100 41 | - line-height: 1 42 | - place-self: end 43 | - text-align: right 44 | - white-space: nowrap 45 | - padding: 0 4vw 0 0 46 | - overflow: visible 47 | tap_action: 48 | action: none 49 | -------------------------------------------------------------------------------- /ui/templates/button-card/base.yaml: -------------------------------------------------------------------------------- 1 | # METROLOGY FOR HOME ASSISTANT 2 | # Button Card Templates 3 | # Made by Madelena Mak 2022 4 | 5 | 6 | ## BASES AND COMPONENTS 7 | 8 | # VanillaTilt 9 | # Add tilting effects on the live tiles 10 | # Code from https://github.com/matt8707/hass-config/blob/master/button_card_templates.yaml 11 | 12 | tilt: 13 | custom_fields: 14 | tilt: > 15 | [[[ 16 | try { 17 | setTimeout(() => { 18 | let elt = this.shadowRoot, 19 | card = elt.getElementById('card'), 20 | ignore = window.navigator.userAgent; 21 | if (elt && card && !ignore.match(/iPhone/i) && !ignore.match(/Android/i)) { 22 | VanillaTilt.init(card, variables.tilt_options); 23 | } 24 | }, 0); 25 | } 26 | catch (e) { 27 | } 28 | ]]] 29 | 30 | 31 | # Require Confirmation Dialog 32 | 33 | require_confirmation: 34 | confirmation: 35 | text: >- 36 | [[[ return `Are you sure you want to toggle 37 | ${entity.attributes.friendly_name}?` ]]] 38 | 39 | 40 | # Blank Card 41 | 42 | blank: 43 | show_name: false 44 | show_state: false 45 | show_label: false 46 | show_icon: false 47 | tap_action: 48 | action: none 49 | styles: 50 | card: 51 | - background: none 52 | -------------------------------------------------------------------------------- /ui/shared/columns/lights-living-room-accents.yaml: -------------------------------------------------------------------------------- 1 | - view_layout: 2 | grid-column: span 2 3 | type: 'custom:button-card' 4 | template: light_button_card_group 5 | entity: group.living_room_accents 6 | name: All Accents Lights 7 | icon: 'mdi:lightbulb-multiple' 8 | variables: 9 | aspect_ratio: 2/1 10 | state: 11 | - value: 'on' 12 | label: >- 13 | [[[ return 14 | states["group.living_room_accents"].attributes.entity_id.filter(entity 15 | => states[entity].state == "on").length + " lights are on" 16 | ]]] 17 | 18 | - type: 'custom:decluttering-card' 19 | template: light_card 20 | variables: 21 | - entity: light.living_room_decor_lights 22 | - name: Decor Lights 23 | 24 | - type: 'custom:decluttering-card' 25 | template: light_card 26 | variables: 27 | - entity: light.living_room_ball_light 28 | - name: Ball Light 29 | 30 | - type: 'custom:decluttering-card' 31 | template: light_card 32 | variables: 33 | - entity: light.living_room_hue_bowl 34 | - name: Hue Bowl 35 | 36 | - type: 'custom:decluttering-card' 37 | template: light_card 38 | variables: 39 | - entity: light.living_room_table_lights 40 | - name: Dining Table 41 | 42 | - type: 'custom:decluttering-card' 43 | template: light_card 44 | variables: 45 | - entity: light.living_room_couch_lamp 46 | - name: Couch Lamp -------------------------------------------------------------------------------- /config/sensors/social.yaml: -------------------------------------------------------------------------------- 1 | 2 | # - platform: rest 3 | # name: My Twitter Followers Count 4 | # json_attributes_path: "$.[0]" 5 | # json_attributes: 6 | # - name 7 | # - screen_name 8 | # resource: https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=MadelenaMak 9 | # value_template: "{{ value_json[0].followers_count | int }}" 10 | # unit_of_measurement: "followers" 11 | 12 | - platform: rest 13 | name: Reddit Profile (mmakes) 14 | resource: http://reddit.com/user/mmakes/about.json 15 | value_template: "{{ value_json.data.total_karma | int }}" 16 | unit_of_measurement: "karma" 17 | json_attributes_path: "$.data" 18 | json_attributes: 19 | - total_karma 20 | - link_karma 21 | - comment_karma 22 | - awardee_karma 23 | - awarder_karma 24 | 25 | - platform: filter 26 | name: Reddit Profile (mmakes) Filtered 27 | entity_id: sensor.reddit_profile_mmakes 28 | filters: 29 | - filter: outlier 30 | window_size: 5 31 | radius: 500.0 32 | precision: 0 33 | 34 | - platform: rest 35 | name: Mastodon (@madelena@mastodon.online) 36 | resource: https://mastodon.online/api/v1/accounts/109268768615203874 37 | value_template: "{{ value_json.followers_count | int }}" 38 | unit_of_measurement: "followers" 39 | json_attributes: 40 | - following_count 41 | - statuses_count 42 | - last_status_at 43 | -------------------------------------------------------------------------------- /www/metro.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "SegoeUIVariable"; 3 | font-weight: 100 900; 4 | src: url("/local/SegoeUI-VF.ttf"); 5 | } 6 | 7 | @font-face { 8 | font-family: "SegoeUI"; 9 | font-weight: normal; 10 | src: url("/local/segoeui.ttf"); 11 | } 12 | 13 | @font-face { 14 | font-family: "SegoeUI"; 15 | font-weight: 100; 16 | src: url("/local/segoeuil.ttf"); 17 | } 18 | 19 | @font-face { 20 | font-family: "SegoeUI"; 21 | font-weight: 200; 22 | src: url("/local/segoeuisl.ttf"); 23 | } 24 | 25 | @font-face { 26 | font-family: "SegoeUI"; 27 | font-weight: 600; 28 | src: url("/local/seguisb.ttf"); 29 | } 30 | 31 | @font-face { 32 | font-family: "SegoeUI"; 33 | font-weight: bold; 34 | src: url("/local/segoeuib.ttf"); 35 | } 36 | 37 | @font-face { 38 | font-family: "SegoeUI"; 39 | font-weight: 900; 40 | src: url("/local/seguibl.ttf"); 41 | } 42 | 43 | body { 44 | font-family: Segoe UI Variable Static Text, SegoeUIVariable, Segoe UI, SegoeUI, -apple-system,BlinkMacSystemFont, sans-serif; 45 | } 46 | 47 | html { 48 | font-family: Segoe UI Variable Static Text, SegoeUIVariable, Segoe UI, SegoeUI, -apple-system,BlinkMacSystemFont, sans-serif; 49 | --paper-font-common-base_-_font-family: Segoe UI Variable Static Text, SegoeUIVariable, Segoe UI, SegoeUI, -apple-system,BlinkMacSystemFont, sans-serif; 50 | } 51 | -------------------------------------------------------------------------------- /config/groups/switches.yaml: -------------------------------------------------------------------------------- 1 | 2 | # SWITCHES 3 | 4 | switches_bedroom: 5 | name: Bedroom Switches 6 | entities: 7 | - switch.bedroom_air_conditioner_on_off 8 | - switch.bedroom_devices_plug_on_off 9 | - switch.dorothy_devices_plug_on_off 10 | - switch.dorothy_plug_on_off 11 | 12 | switches_workspace: 13 | name: Workspace Switches 14 | entities: 15 | - switch.astralplane_plug_on_off 16 | - switch.makery_plug_on_off 17 | - switch.quattro_plug_on_off 18 | 19 | switches_living_room: 20 | name: Living Room Switches 21 | entities: 22 | - switch.living_room_air_conditioner_plug_on_off 23 | - switch.living_room_projector_plug_on_off 24 | - switch.terpsichora_plug_on_off 25 | 26 | switches_kitchen: 27 | name: Kitchen Switches 28 | entities: 29 | - switch.kitchen_aerogardens_plug_on_off 30 | - switch.kitchen_counter_echo_plug_on_off 31 | - switch.kitchen_counter_hand_blender_on_off 32 | - switch.kitchen_counter_kettle_on_off 33 | - switch.kitchen_counter_plug_3_on_off 34 | - switch.kitchen_counter_rice_cooker_on_off 35 | - switch.kitchen_counter_toaster_on_off 36 | - switch.kitchen_fridge_plug_on_off 37 | - switch.kitchen_microwave_plug_on_off 38 | 39 | switches_storage: 40 | name: Storage Switches 41 | entities: 42 | - switch.valhalla_plug_on_off 43 | - switch.valhalla_rainbow_plug_switch 44 | - switch.valhalla_insteon_plug_switch 45 | -------------------------------------------------------------------------------- /ui/shared/columns/lights-living-room.yaml: -------------------------------------------------------------------------------- 1 | - view_layout: 2 | grid-column: span 2 3 | type: 'custom:button-card' 4 | template: 5 | - light_button_card_group 6 | entity: group.living_room_lights 7 | name: All Main Lights 8 | icon: 'mdi:ceiling-light-multiple' 9 | variables: 10 | aspect_ratio: 2/1 11 | 12 | - type: 'custom:button-card' 13 | template: 14 | - live_tile_with_graph 15 | - live_tile_with_state_unit 16 | entity: sensor.living_room_hue_sensor_light_level 17 | name: Light Level 18 | 19 | - type: 'custom:decluttering-card' 20 | template: light_card 21 | variables: 22 | - entity: light.living_room_chandelier_main 23 | - name: Chandelier Main 24 | 25 | - type: 'custom:decluttering-card' 26 | template: light_card 27 | variables: 28 | - entity: light.living_room_random_light 29 | - name: Random Light 30 | 31 | - type: 'custom:decluttering-card' 32 | template: light_card 33 | variables: 34 | - entity: light.living_room_ramsele_light 35 | - name: Ramsele Light 36 | 37 | - type: 'custom:decluttering-card' 38 | template: light_card 39 | variables: 40 | - entity: light.living_room_strala_light 41 | - name: Strala Light 42 | 43 | - type: 'custom:decluttering-card' 44 | template: light_card 45 | variables: 46 | - entity: light.hallway_light 47 | - name: Hallway 48 | 49 | - type: 'custom:decluttering-card' 50 | template: light_card 51 | variables: 52 | - entity: light.bathroom_light 53 | - name: Bathroom -------------------------------------------------------------------------------- /ui/shared/columns/lights-kitchen.yaml: -------------------------------------------------------------------------------- 1 | - view_layout: 2 | grid-column: span 2 3 | type: 'custom:button-card' 4 | template: 5 | - light_button_card_group 6 | entity: group.kitchen_lights 7 | name: All Kitchen Lights 8 | icon: 'mdi:lightbulb-multiple' 9 | variables: 10 | aspect_ratio: 2/1 11 | 12 | - type: 'custom:button-card' 13 | template: 14 | - live_tile_with_graph 15 | - live_tile_with_state_unit 16 | entity: sensor.kitchen_counter_motion_sensor_light_level 17 | name: Light Level 18 | 19 | - type: 'custom:decluttering-card' 20 | template: light_card 21 | variables: 22 | - entity: light.kitchen_counter_lights 23 | - name: Counter 24 | 25 | - type: 'custom:decluttering-card' 26 | template: light_card 27 | variables: 28 | - entity: light.kitchen_spot_lights 29 | - name: Spot Lights 30 | 31 | - type: 'custom:decluttering-card' 32 | template: light_card 33 | variables: 34 | - entity: light.kitchen_sink_lights 35 | - name: Kitchen Sink 36 | 37 | - type: 'custom:decluttering-card' 38 | template: light_card 39 | variables: 40 | - entity: light.kitchen_counter_accent_lights 41 | - name: Counter Accent 42 | 43 | - type: 'custom:decluttering-card' 44 | template: light_card 45 | variables: 46 | - entity: switch.kitchen_uv_light 47 | - name: UV Light 48 | 49 | - type: 'custom:decluttering-card' 50 | template: light_card 51 | variables: 52 | - entity: switch.kitchen_aerogardens_plug_on_off 53 | - name: Aerogardens -------------------------------------------------------------------------------- /ui/templates/button-card/sensors/nws-alerts.yaml: -------------------------------------------------------------------------------- 1 | 2 | nws_alerts: 3 | variables: 4 | slide: 1 5 | name: | 6 | [[[ 7 | if (entity.state == 0) { return "NWS Alerts" } 8 | if (entity.attributes.entries[0].title.includes('no active')) { entity.state = 0; return "NWS Alerts" } 9 | if (entity.state > 1) { return entity.state + " NWS Alerts" } else { return "1 NWS Alert" } 10 | ]]] 11 | icon: mdi:weather-sunny-alert 12 | state_display: '[[[ 13 | if (entity.state == 0) { return "No Active Alerts" } 14 | if ( entity.state > (variables.slide) ) { return entity.attributes.entries[variables.slide].title.replace(/ issue.*/g, "") } 15 | return " " 16 | ]]]' 17 | label: '[[[ 18 | if (entity.state == 0) { return " " } 19 | if ( entity.state > (variables.slide) ) { return entity.attributes.entries[variables.slide].summary } 20 | return " " 21 | ]]]' 22 | styles: 23 | card: 24 | - color: | 25 | [[[ 26 | if (entity.attributes.entries[0].title.includes('no active')) { return "var(--disabled-text-color)" } 27 | if (entity.state >= 1) { return "var(--primary-text-color)" } else { return "var(--disabled-text-color)" } 28 | ]]] 29 | - background: | 30 | [[[ 31 | if (entity.attributes.entries[0].title.includes('no active')) { return "var(--ha-card-background)" } 32 | if (entity.state >= 1) { return "var(--primary-color)" } else { return "var(--ha-card-background)" } 33 | ]]] 34 | -------------------------------------------------------------------------------- /ui/shared/columns/lights-workspace-accents.yaml: -------------------------------------------------------------------------------- 1 | - view_layout: 2 | grid-column: span 2 3 | type: 'custom:button-card' 4 | template: 5 | - light_button_card_group 6 | entity: group.workspace_accents_lights 7 | name: All Accents Lights 8 | icon: 'mdi:lightbulb-multiple' 9 | variables: 10 | aspect_ratio: 2/1 11 | 12 | - type: 'custom:button-card' 13 | template: 14 | - live_tile_with_graph 15 | - live_tile_with_state_unit 16 | entity: sensor.workspace_room_hue_sensor_light_level 17 | name: Light Level 18 | 19 | - type: 'custom:decluttering-card' 20 | template: light_card 21 | variables: 22 | - entity: light.workspace_back_ledge_lights 23 | - name: Back Ledge 24 | 25 | - type: 'custom:decluttering-card' 26 | template: light_card 27 | variables: 28 | - entity: light.workspace_back_shelf_lights 29 | - name: Back Shelf 30 | 31 | - type: 'custom:decluttering-card' 32 | template: light_card 33 | variables: 34 | - entity: light.workspace_desk_bottom_lights 35 | - name: Desk Bottom 36 | 37 | - type: 'custom:decluttering-card' 38 | template: light_card 39 | variables: 40 | - entity: light.workspace_bench_bottom_lights 41 | - name: Bench Bottom 42 | 43 | - type: 'custom:decluttering-card' 44 | template: light_card 45 | variables: 46 | - entity: light.workspace_bloom_left 47 | - name: Bloom Left 48 | 49 | - type: 'custom:decluttering-card' 50 | template: light_card 51 | variables: 52 | - entity: light.workspace_bloom_right 53 | - name: Bloom Right -------------------------------------------------------------------------------- /ui/ui-lovelace.yaml: -------------------------------------------------------------------------------- 1 | # Maximalist Dashboard for Home Assistant 2 | # For use on Astralplane 3 | # Made by Madelena Mak 2022 4 | # https://mmak.es 5 | 6 | title: Dashboard 7 | 8 | views: 9 | - !include views/summary.yaml 10 | - !include views/energy.yaml 11 | - !include views/lights.yaml 12 | - !include views/security.yaml 13 | - !include views/maintenance.yaml 14 | - !include views/environment.yaml 15 | - !include views/network.yaml 16 | - !include views/neighborhood.yaml 17 | - !include views/weather.yaml 18 | - !include views/media.yaml 19 | - !include views/me.yaml 20 | - !include views/astrometrics.yaml 21 | 22 | - !include views/subviews/chores.yaml 23 | - !include views/subviews/group.all_on_off.yaml 24 | - !include views/subviews/genesis.yaml 25 | - !include views/subviews/unison.yaml 26 | - !include views/subviews/illinoise.yaml 27 | - !include views/subviews/plex.yaml 28 | - !include views/subviews/sensor.notify_nyc.yaml 29 | - !include views/subviews/binary_sensor.iss.yaml 30 | - !include views/subviews/sensor.nws_alert_rss_feed.yaml 31 | - !include views/subviews/transit.yaml 32 | 33 | decluttering_templates: !include templates/decluttering-card.yaml 34 | button_card_templates: !include_dir_merge_named templates/button-card/ 35 | apexcharts_card_templates: !include templates/apexcharts-card.yaml 36 | 37 | swipe_nav: 38 | animate: swipe 39 | prevent_default: true 40 | 41 | 42 | # Remove the x for background. 43 | xbackground: >- 44 | linear-gradient(to bottom, rgba(var(--rgb-primary-color),.2), 45 | var(--primary-background-color)) 46 | -------------------------------------------------------------------------------- /config/sensors/switchbot.yaml: -------------------------------------------------------------------------------- 1 | 2 | # - platform: rest 3 | # name: "Front Door Contact Sensor Open Close" 4 | # resource: !secret switchbot_contact_sensor_get 5 | # method: GET 6 | # scan_interval: 300 7 | # headers: 8 | # Authorization: !secret switchbot_api_token 9 | # Content-Type: "application/json" 10 | # value_template: "{{ value_json.body.openState }}" 11 | # json_attributes_path: "$.body" 12 | # json_attributes: 13 | # - openState 14 | # - moveDetected 15 | # - brightness 16 | 17 | - platform: rest 18 | name: "Bedroom Humidifier Power" 19 | resource: !secret switchbot_humidifier_get 20 | method: GET 21 | scan_interval: 60 22 | headers: 23 | Authorization: !secret switchbot_api_token 24 | Content-Type: "application/json" 25 | value_template: "{{ value_json.body.power }}" 26 | json_attributes_path: "$.body" 27 | json_attributes: 28 | - nebulizationEfficiency 29 | - humidity 30 | - auto 31 | - childLock 32 | - sound 33 | - power 34 | - temperature 35 | - lackWater 36 | 37 | # - platform: rest 38 | # name: "Front Door Lock Status" 39 | # resource: !secret switchbot_front_door_lock_get 40 | # method: GET 41 | # scan_interval: 60 42 | # headers: 43 | # Authorization: !secret switchbot_api_token 44 | # Content-Type: "application/json" 45 | # value_template: "{{ value_json.body.lockState }}" 46 | # json_attributes_path: "$.body" 47 | # json_attributes: 48 | # - deviceId 49 | # - deviceType 50 | # - hubDeviceId 51 | # - lockState 52 | # - doorState 53 | # - calibrate 54 | -------------------------------------------------------------------------------- /ui/views/subviews/sensor.notify_nyc.yaml: -------------------------------------------------------------------------------- 1 | # Notify NYC Subview 2 | # Made by Madelena Mak 2022 3 | 4 | title: Notify NYC 5 | path: 'sensor.notify_nyc' 6 | subview: true 7 | 8 | type: 'custom:grid-layout' 9 | layout: !include ../../shared/snippets/layout-page-margin.yaml 10 | 11 | cards: 12 | - type: 'custom:layout-card' 13 | layout_type: 'custom:grid-layout' 14 | layout: !include ../../shared/snippets/layout-page-columns-one.yaml 15 | view_layout: 16 | grid-area: cc 17 | 18 | cards: 19 | - type: 'custom:list-card' 20 | entity: sensor.notify_nyc 21 | feed_attribute: entries 22 | columns: 23 | - title: '' 24 | field: title 25 | style: 26 | - display: block 27 | - font-weight: 600 28 | - font-size: var(--h4-font-size) 29 | - xwhite-space: nowrap 30 | - padding: 8px 0 2px 31 | regex: (?<=- ).* 32 | - title: '' 33 | field: published 34 | style: 35 | - display: block 36 | - font-size: var(--h6-font-size) 37 | - padding: 0 0 4px 38 | - opacity: 0.5 39 | - text-transform: uppercase 40 | - title: '' 41 | field: summary 42 | style: 43 | - display: block 44 | - padding: 0 0 8px 45 | regex: (?<=.*\.\s\n+)(.|\n)*(?=\n+To view this message) 46 | style: > 47 | xha-card { background: none; } 48 | 49 | table tbody:first-child { display: none; } 50 | 51 | tbody tr:nth-child(odd), tbody tr:nth-child(even) { background: 52 | none; } 53 | -------------------------------------------------------------------------------- /config/sensors/astrometrics.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: feedparser 3 | name: NASA ISS Station Report 4 | feed_url: https://blogs.nasa.gov/stationreport/feed/ 5 | date_format: '%a, %d %b %Y %H:%M:%S %z' 6 | show_topn: 10 7 | scan_interval: 8 | hours: 1 9 | 10 | # - platform: rest 11 | # name: NOAA Space Weather - Noon 10.7cm Radio Flux 12 | # resource: https://services.swpc.noaa.gov/products/summary/10cm-flux.json 13 | # scan_interval: 3600 14 | # value_template: "{{ value_json.Flux | int }}" 15 | # unit_of_measurement: "sfu" 16 | # json_attributes_path: "$" 17 | # json_attributes: 18 | # - Timestamp 19 | 20 | # - platform: rest 21 | # name: NOAA Space Weather - Solar Wind Magnetic Fields - Bt 22 | # resource: https://services.swpc.noaa.gov/products/summary/solar-wind-mag-field.json 23 | # value_template: "{{ value_json.Bt | int }}" 24 | # unit_of_measurement: "nT" 25 | # json_attributes_path: "$" 26 | # json_attributes: 27 | # - Timestamp 28 | # scan_interval: 3600 29 | 30 | # - platform: rest 31 | # name: NOAA Space Weather - Solar Wind Magnetic Fields - Bz 32 | # resource: https://services.swpc.noaa.gov/products/summary/solar-wind-mag-field.json 33 | # value_template: "{{ value_json.Bz | int }}" 34 | # unit_of_measurement: "nT" 35 | # json_attributes_path: "$" 36 | # json_attributes: 37 | # - Timestamp 38 | # scan_interval: 3600 39 | 40 | # - platform: rest 41 | # name: NOAA Space Weather - Solar Wind Speed 42 | # resource: https://services.swpc.noaa.gov/products/summary/solar-wind-speed.json 43 | # value_template: "{{ value_json.WindSpeed | int }}" 44 | # unit_of_measurement: "km/sec" 45 | # json_attributes_path: "$" 46 | # json_attributes: 47 | # - Timestamp 48 | # scan_interval: 3600 49 | 50 | # - platform: ha_skyfield 51 | 52 | -------------------------------------------------------------------------------- /lovelace-dashboards.yaml: -------------------------------------------------------------------------------- 1 | # MY LOVELACE DASHBOARDS 2 | # Made by Madelena Mak 2022 3 | 4 | # Main Dashboard 5 | ui-dashboard: 6 | require_admin: false 7 | show_in_sidebar: true 8 | icon: mdi:gauge 9 | title: Dashboard 10 | filename: ui/ui-lovelace.yaml 11 | mode: yaml 12 | 13 | # My Machines 14 | ui-machines: 15 | show_in_sidebar: true 16 | icon: mdi:robot-excited 17 | title: My Machines 18 | require_admin: false 19 | mode: yaml 20 | filename: ui/ui-machines.yaml 21 | 22 | # Rooms + Areas 23 | ui-rooms: 24 | show_in_sidebar: true 25 | icon: mdi:sofa 26 | title: Rooms 27 | require_admin: false 28 | mode: yaml 29 | filename: ui/ui-rooms.yaml 30 | 31 | # Dashboard for Smart Displays 32 | ui-smart-displays: 33 | show_in_sidebar: false 34 | icon: mdi:devices 35 | title: For Smart Displays 36 | require_admin: false 37 | mode: yaml 38 | filename: ui/ui-smartdisplays.yaml 39 | 40 | ui-smart-displays-bedroom: 41 | show_in_sidebar: false 42 | icon: mdi:devices 43 | title: For Smart Displays (Bedroom) 44 | require_admin: false 45 | mode: yaml 46 | filename: ui/ui-smartdisplays-bedroom.yaml 47 | 48 | ui-smart-displays-minimal: 49 | show_in_sidebar: false 50 | icon: mdi:devices 51 | title: For Smart Displays (Minimal) 52 | require_admin: false 53 | mode: yaml 54 | filename: ui/ui-smartdisplays-minimal.yaml 55 | 56 | # Experiments 57 | ui-experiments: 58 | show_in_sidebar: false 59 | title: Experiments 60 | require_admin: false 61 | mode: yaml 62 | filename: ui/ui-lovelace-experiments.yaml 63 | icon: mdi:flask-outline 64 | 65 | # For Hass.Agent Use 66 | ui-hassagent: 67 | show_in_sidebar: false 68 | title: Home Assistant Agent Menu 69 | require_admin: false 70 | mode: yaml 71 | filename: ui/ui-hassagent.yaml 72 | icon: mdi:microsoft-windows 73 | -------------------------------------------------------------------------------- /ui/shared/columns/lights-workspace-studio.yaml: -------------------------------------------------------------------------------- 1 | - type: 'custom:mushroom-light-card' 2 | entity: light.workspace_studio_light_left 3 | show_brightness_control: true 4 | show_color_temp_control: true 5 | show_color_control: true 6 | use_light_color: true 7 | 8 | - type: 'custom:mushroom-light-card' 9 | entity: light.workspace_studio_light_center 10 | show_brightness_control: true 11 | use_light_color: true 12 | show_color_temp_control: true 13 | show_color_control: true 14 | 15 | - type: 'custom:mushroom-light-card' 16 | entity: light.workspace_studio_light_right 17 | show_brightness_control: true 18 | show_color_temp_control: true 19 | show_color_control: true 20 | use_light_color: true 21 | 22 | - type: 'custom:mushroom-light-card' 23 | entity: light.workspace_makery_lights 24 | use_light_color: true 25 | 26 | - type: 'custom:layout-card' 27 | layout_type: 'custom:grid-layout' 28 | layout: !include ../../shared/snippets/layout-live-tile.yaml 29 | entities: 30 | 31 | - type: 'custom:button-card' 32 | template: hue_scene_card 33 | entity: scene.workbench_studio_lights_energize 34 | variables: 35 | name: Energize 36 | color: 'rgb(222,222,222)' 37 | 38 | - type: 'custom:button-card' 39 | template: hue_scene_card 40 | entity: scene.workbench_studio_lights_bright 41 | variables: 42 | name: Bright 43 | color: 'rgb(250, 207, 125)' 44 | 45 | - type: 'custom:button-card' 46 | template: hue_scene_card 47 | entity: scene.workbench_studio_lights_relax 48 | variables: 49 | name: Relax 50 | color: 'rgb(195, 150, 71)' 51 | 52 | - type: 'custom:button-card' 53 | template: hue_scene_card 54 | entity: scene.workbench_studio_lights_soho 55 | variables: 56 | name: Soho 57 | color: 'rgb(107, 28, 203)' -------------------------------------------------------------------------------- /ui/smartdisplays/views/home-minimal.yaml: -------------------------------------------------------------------------------- 1 | # AMBIENT DASHBOARD - Minimal Version 2 | # Home Page 3 | # Made by Madelena Mak 2022 4 | 5 | title: Home 6 | path: home 7 | type: 'custom:grid-layout' 8 | layout: 9 | margin: -1px 10 | grid-template-areas: '"topbar" "slides"' 11 | grid-template-rows: 0 100% 12 | grid-template-columns: 100% 13 | cards: 14 | 15 | # Top Bar 16 | 17 | - type: 'custom:layout-card' 18 | layout_type: 'custom:grid-layout' 19 | view_layout: 20 | grid-area: topbar 21 | card_margin: 0 22 | layout: 23 | grid-template-rows: auto 24 | grid-template-columns: 'auto 15vw' 25 | margin: '0 0 0 0' 26 | cards: 27 | - type: custom:button-card 28 | template: blank 29 | - !include ../snippets/topbar-clock-simple.yaml 30 | 31 | 32 | # The Slides 33 | 34 | - type: 'custom:swipe-card' 35 | view_layout: 36 | grid-area: slides 37 | parameters: 38 | effect: cube 39 | speed: 2000 40 | cubeEffect: 41 | - slideShadows: false 42 | loop: true 43 | autoHeight: true 44 | autoplay: 45 | delay: 8000 46 | disableOnInteraction: false 47 | pagination: 48 | type: progressbar 49 | keyboard: 50 | enabled: true 51 | card_mod: 52 | style: | 53 | .swiper-container-cube { overflow: hidden !important; z-index: 100 !important; } 54 | .swiper-slide { transition: opacity 2s, transform !important; } 55 | .swiper-slide-prev, .swiper-slide-next { opacity: 0; } 56 | .swiper-slide-active { opacity: 1; } 57 | .swiper-container-horizontal > .swiper-pagination-progressbar, .swiper-container-vertical > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite { 58 | top: auto !important; bottom: -1px !important; height: 1vh !important; 59 | } 60 | cards: !include ../slides-bedroom.yaml 61 | 62 | 63 | -------------------------------------------------------------------------------- /ui/smartdisplays/views/home.yaml: -------------------------------------------------------------------------------- 1 | # AMBIENT DASHBOARD 2 | # Home Page 3 | # Made by Madelena Mak 2022 4 | 5 | title: Home 6 | path: slides 7 | type: 'custom:grid-layout' 8 | layout: 9 | margin: -1px 10 | grid-template-areas: '"slides" "topbar"' 11 | grid-template-rows: 100% 0 12 | grid-template-columns: 100% 13 | cards: 14 | 15 | # The Slides 16 | 17 | - type: 'custom:swipe-card' 18 | view_layout: 19 | grid-area: slides 20 | parameters: 21 | effect: cube 22 | speed: 2000 23 | cubeEffect: 24 | - slideShadows: false 25 | loop: true 26 | autoHeight: true 27 | autoplay: 28 | delay: 8000 29 | disableOnInteraction: false 30 | pagination: 31 | type: progressbar 32 | keyboard: 33 | enabled: true 34 | card_mod: 35 | style: | 36 | .swiper-container-cube { overflow: hidden !important; z-index: 100 !important; } 37 | .swiper-slide { transition: opacity 2s, transform !important; } 38 | .swiper-slide-prev, .swiper-slide-next { opacity: 0; } 39 | .swiper-slide-active { opacity: 1; } 40 | .swiper-container-horizontal > .swiper-pagination-progressbar, .swiper-container-vertical > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite { 41 | top: auto !important; bottom: -1px !important; height: 1vh !important; 42 | } 43 | cards: !include ../slides.yaml 44 | 45 | 46 | # Top Bar 47 | 48 | - type: 'custom:layout-card' 49 | layout_type: 'custom:grid-layout' 50 | view_layout: 51 | grid-area: topbar 52 | card_margin: 0 53 | layout: 54 | grid-template-rows: auto 55 | grid-template-columns: '15vw auto 15vw' 56 | margin: '-100vh 0 0 0' 57 | padding: 0 58 | cards: 59 | - !include ../snippets/topbar-start-button.yaml 60 | - !include ../snippets/topbar-badges.yaml 61 | - !include ../snippets/topbar-clock.yaml 62 | 63 | 64 | -------------------------------------------------------------------------------- /ui/templates/button-card/sensors/plex.yaml: -------------------------------------------------------------------------------- 1 | 2 | plex_variables: 3 | variables: 4 | plex_last_added_item: >- 5 | [[[ 6 | let movieUpdate = new Date(states["sensor.dorothy_library_movies"].attributes.last_added_timestamp) 7 | let tvUpdate = new Date(states["sensor.dorothy_library_tv_shows"].attributes.last_added_timestamp) 8 | let flacUpdate = new Date(states["sensor.dorothy_library_flacs"].attributes.last_added_timestamp) 9 | var newest_library = '' 10 | if (flacUpdate > movieUpdate) { 11 | if (flacUpdate > tvUpdate) { newest_library = "flacs" } else { newest_library = "tv_shows" } 12 | } else { 13 | if (movieUpdate > tvUpdate) { newest_library = "movies" } else {newest_library = "tv_shows" } 14 | } 15 | 16 | return states["sensor.dorothy_library_" + newest_library].attributes.last_added_item 17 | ]]] 18 | 19 | plex_last_added_time: |- 20 | [[[ 21 | let movieUpdate = new Date(states["sensor.dorothy_library_movies"].attributes.last_added_timestamp) 22 | let tvUpdate = new Date(states["sensor.dorothy_library_tv_shows"].attributes.last_added_timestamp) 23 | let flacUpdate = new Date(states["sensor.dorothy_library_flacs"].attributes.last_added_timestamp) 24 | var newest_library = '' 25 | if (flacUpdate > movieUpdate) { 26 | if (flacUpdate > tvUpdate) { newest_library = "flacs" } else { newest_library = "tv_shows" } 27 | } else { 28 | if (movieUpdate > tvUpdate) { newest_library = "movies" } else {newest_library = "tv_shows" } 29 | } 30 | 31 | var diff = (-(new Date(states["sensor.dorothy_library_" + 32 | newest_library].attributes.last_added_timestamp) - new Date()) / 33 | 1000 / 60 / 60 / 24) 34 | if (diff > 1.5) {return Math.round(diff) + " days ago" } 35 | if (diff < .03) {return "Just now" } 36 | if (diff <= 1.5) {return Math.round(diff * 24) + " hours ago" } 37 | ]]] 38 | -------------------------------------------------------------------------------- /config/plant.yaml: -------------------------------------------------------------------------------- 1 | living_room_garden_jade_plant: 2 | sensors: 3 | moisture: sensor.living_room_garden_jade_plant_moisture 4 | battery: sensor.living_room_garden_jade_plant_battery 5 | temperature: sensor.living_room_garden_jade_plant_temperature 6 | conductivity: sensor.living_room_garden_jade_plant_conductivity 7 | brightness: sensor.living_room_garden_jade_plant_illuminance 8 | min_conductivity: 0 9 | 10 | living_room_garden_lavender_tree: 11 | sensors: 12 | moisture: sensor.living_room_garden_lavender_tree_moisture 13 | battery: sensor.living_room_garden_lavender_tree_battery 14 | temperature: sensor.living_room_garden_lavender_tree_temperature 15 | conductivity: sensor.living_room_garden_lavender_tree_conductivity 16 | brightness: sensor.living_room_garden_lavender_tree_illuminance 17 | min_moisture: 15 18 | min_conductivity: 0 19 | 20 | kitchen_garden_cilantro: 21 | sensors: 22 | moisture: sensor.kitchen_garden_cilantro_moisture 23 | battery: sensor.kitchen_garden_cilantro_battery 24 | temperature: sensor.kitchen_garden_cilantro_temperature 25 | conductivity: sensor.kitchen_garden_cilantro_conductivity 26 | brightness: sensor.kitchen_garden_cilantro_illuminance 27 | min_conductivity: 0 28 | 29 | kitchen_garden_basil: 30 | sensors: 31 | moisture: sensor.kitchen_garden_basil_moisture 32 | battery: sensor.kitchen_garden_basil_battery 33 | temperature: sensor.kitchen_garden_basil_temperature 34 | conductivity: sensor.kitchen_garden_basil_conductivity 35 | brightness: sensor.kitchen_garden_basil_illuminance 36 | min_conductivity: 0 37 | 38 | bathroom_garden_zamia: 39 | sensors: 40 | moisture: sensor.bathroom_garden_zamia_moisture 41 | battery: sensor.bathroom_garden_zamia_battery 42 | temperature: sensor.bathroom_garden_zamia_temperature 43 | conductivity: sensor.bathroom_garden_zamia_conductivity 44 | brightness: sensor.bathroom_garden_zamia_illuminance 45 | min_moisture: 10 46 | min_conductivity: 0 47 | -------------------------------------------------------------------------------- /config/recorder.yaml: -------------------------------------------------------------------------------- 1 | 2 | db_url: !secret mariadb_url 3 | purge_keep_days: 30 4 | commit_interval: 30 5 | exclude: 6 | domains: 7 | - automation 8 | - updater 9 | - button 10 | - camera 11 | - device_tracker 12 | - input_text 13 | - number 14 | - scene 15 | - weather 16 | entities: 17 | - sun.sun 18 | - binary_sensor.backups_stale 19 | - sensor.noaa_tides 20 | - sensor.moon 21 | - sensor.load_15m 22 | - sensor.load_5m 23 | - sensor.zero 24 | - sensor.asuswrt_load_avg_5m 25 | - sensor.asuswrt_load_avg_10m 26 | - sensor.notify_nyc 27 | entity_globs: 28 | - binary_sensor.nyc311_* 29 | - binary_sensor.octoprint_* 30 | - media_player.plex_* 31 | - sensor.citi_bike_nyc_* 32 | - sensor.*_battery 33 | - sensor.*_today_s_consumption 34 | - sensor.*_total_consumption 35 | - sensor.*_smartenergy_metering_summation_delivered 36 | - sensor.load_* 37 | - sensor.mta_subway_* 38 | - sensor.nws_* 39 | - sensor.nzbget_* 40 | - sensor.sonarr_* 41 | - sensor.waqi_*_humidity 42 | - sensor.waqi_*_temperature 43 | - sensor.waqi_*_wind_speed 44 | - sensor.zuneth_* 45 | - sensor.nullaby_* 46 | - switch.adguard_* 47 | - switch.*_do_not_disturb_switch 48 | - switch.*_repeat_switch 49 | - switch.*_shuffle_switch 50 | - sensor.lga_* 51 | - sensor.jfk_* 52 | - sensor.gasbuddy_station_* 53 | - sensor.tgtg_* 54 | - sensor.goodserviceio_* 55 | - sensor.last_fm_* 56 | - sensor.anniversary_* 57 | - sensor.*_glances_* 58 | - sensor.etherealm_* 59 | include: 60 | entities: 61 | - weather.valhalla_2 62 | - sensor.valhalla_apparent_temperature 63 | - sensor.valhalla_cloud_cover 64 | - sensor.valhalla_ups_battery_runtime 65 | - sensor.valhalla_ups_load 66 | - sensor.valhalla_wind 67 | - sensor.valhalla_plug_smartenergy_metering 68 | - sensor.unison_glances_ram_used_percent 69 | - sensor.etherealm_sessionstate 70 | - sensor.nzbget_speed -------------------------------------------------------------------------------- /ui/templates/button-card/sensors/chores.yaml: -------------------------------------------------------------------------------- 1 | 2 | chores_variables: 3 | variables: 4 | chores_count_text: | 5 | [[[ 6 | var choresOverdue = states["sensor.chores_overdue"].attributes.entities.length 7 | var choresToDo = states["sensor.chores_to_do"].attributes.entities.length 8 | var choresText = "" 9 | var choresToDoNoun = true 10 | if (choresOverdue > 0) { 11 | if (choresOverdue == 1) { choresText += "1 Chore Overdue" } else { choresText += choresOverdue + " Chores Overdue" } 12 | } 13 | if (choresToDo > 0 && choresOverdue > 0) { 14 | choresText += " + " 15 | choresToDoNoun = false 16 | } 17 | if (choresToDo > 0) { 18 | if (choresToDo == 1) { choresText += "1 " + (choresToDoNoun ? "Chore " : "") + "To Do" } else { choresText += choresToDo + (choresToDoNoun ? " Chores " : " ") + "To Do" } 19 | } 20 | if (choresText != "") { return choresText } else { return "Chores" } 21 | ]]] 22 | chores_all_done_text: | 23 | [[[ 24 | if (states["sensor.chores_overdue"].attributes.entities.length < 1 && states["sensor.chores_to_do"].attributes.entities.length < 1) { return "🦄 All Done!" } 25 | ]]] 26 | chores_to_do_list: | 27 | [[[ 28 | var chores = '' 29 | var choresOverdue = states["sensor.chores_overdue"].attributes.entities 30 | var choresToDo = states["sensor.chores_to_do"].attributes.entities 31 | if (choresOverdue.length > 0) { 32 | for (let e in choresOverdue) { 33 | chores = chores + "