├── 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 + "
  • " + states[choresOverdue[e]].attributes.friendly_name + "
  • " 34 | } 35 | return chores 36 | } else { 37 | for (let e in choresToDo) { 38 | chores = chores + "
  • " + states[choresToDo[e]].attributes.friendly_name + "
  • " 39 | } 40 | return chores 41 | } 42 | ]]] 43 | triggers_update: 44 | - sensor.chores_overdue 45 | - sensor.chores_to_do 46 | -------------------------------------------------------------------------------- /config/rest_command.yaml: -------------------------------------------------------------------------------- 1 | 2 | switchbot_device_status: 3 | url: "https://api.switch-bot.com/v1.0/devices/{{ deviceId }}/status" 4 | method: get 5 | content_type: "application/json" 6 | headers: 7 | Authorization: !secret switchbot_api_token 8 | 9 | switchbot_device_command: 10 | url: "https://api.switch-bot.com/v1.0/devices/{{ deviceId }}/commands" 11 | method: post 12 | content_type: "application/json" 13 | headers: 14 | Authorization: !secret switchbot_api_token 15 | payload: '{"command": "{{ command }}","parameter": "{{ parameter }}"}' 16 | verify_ssl: false 17 | 18 | astralplane_marquee_dev_post_alexa_timer: 19 | url: !secret astralplane_marquee_dev_post_url 20 | method: POST 21 | payload: '{"alexa_timer": { "state": "{{ state }}", "process_timestamp": "{{ process_timestamp }}" }}' 22 | content_type: 'application/json; charset=utf-8' 23 | verify_ssl: false 24 | 25 | astralplane_marquee_dev_post_now_playing: 26 | url: !secret astralplane_marquee_dev_post_url 27 | method: POST 28 | payload: '{"now_playing": { "state": "{{ state }}", "media_content_type": "{{ media_content_type }}", "media_title": "{{ media_title | e }}", "media_album_name": "{{ media_album_name | e }}", "media_artist": "{{ media_artist | e }}", "entity_picture": "{{ entity_picture }}" }}' 29 | content_type: 'application/json; charset=utf-8' 30 | verify_ssl: false 31 | 32 | astralplane_marquee_post_alexa_timer: 33 | url: !secret astralplane_marquee_post_url 34 | method: POST 35 | payload: '{"alexa_timer": { "state": "{{ state }}", "process_timestamp": "{{ process_timestamp }}" }}' 36 | content_type: 'application/json; charset=utf-8' 37 | verify_ssl: false 38 | 39 | astralplane_marquee_post_now_playing: 40 | url: !secret astralplane_marquee_post_url 41 | method: POST 42 | payload: '{"now_playing": { "state": "{{ state }}", "media_content_type": "{{ media_content_type }}", "media_title": "{{ media_title | e }}", "media_album_name": "{{ media_album_name | e }}", "media_artist": "{{ media_artist | e }}", "entity_picture": "{{ entity_picture }}" }}' 43 | content_type: 'application/json; charset=utf-8' 44 | verify_ssl: false -------------------------------------------------------------------------------- /config/camera.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: xiaomi_cloud_map_extractor 3 | host: !secret peanut_hamper_host 4 | token: !secret peanut_hamper_token 5 | username: !secret xiaomi_cloud_username 6 | password: !secret xiaomi_cloud_password 7 | name: Peanut Hamper S7 8 | draw: ['all'] 9 | colors: 10 | color_map_outside: [0,0,0,0] 11 | color_map_wall_v2: [255,255,255] 12 | color_path: [195,0,82,128] 13 | room_colors: 14 | 1: [240, 178, 122] 15 | 2: [133, 193, 233] 16 | 3: [217, 136, 128] 17 | 4: [52, 152, 219] 18 | 5: [205, 97, 85] 19 | 6: [243, 156, 18] 20 | 7: [88, 214, 141] 21 | 8: [245, 176, 65] 22 | 9: [252, 212, 81] 23 | 10: [72, 201, 176] 24 | 11: [84, 153, 199] 25 | 12: [133, 193, 233] 26 | 13: [245, 176, 65] 27 | 14: [82, 190, 128] 28 | 15: [72, 201, 176] 29 | 16: [165, 105, 18] 30 | texts: 31 | - text: "Room 1" 32 | x: 25 33 | y: 25 34 | color: [125, 20, 213] 35 | - text: "Room 2" 36 | x: 25 37 | y: 75 38 | color: [125, 20, 213, 127] 39 | # font: "/local/segoeui.ttf" 40 | font_size: 25 41 | # map_transformation: 42 | # scale: 2 43 | # rotate: 180 44 | # trim: 45 | # top: 10 46 | # bottom: 20 47 | # left: 30 48 | # right: 10 49 | attributes: 50 | - calibration_points 51 | - charger 52 | - cleaned_rooms 53 | - country 54 | - goto 55 | - goto_path 56 | - goto_predicted_path 57 | - image 58 | - is_empty 59 | - map_name 60 | - no_go_areas 61 | - no_mopping_areas 62 | - obstacles 63 | - ignored_obstacles 64 | - obstacles_with_photo 65 | - ignored_obstacles_with_photo 66 | - path 67 | - room_numbers 68 | - rooms 69 | - vacuum_position 70 | - vacuum_room 71 | - vacuum_room_name 72 | - walls 73 | - zones 74 | 75 | # - platform: ffmpeg 76 | # name: Earthcam - NYC Times Square 77 | # input: http://video3.earthcam.com/fecnetwork/hdtimes10.flv/playlist.m3u8 78 | 79 | # - platform: ffmpeg 80 | # name: Earthcam - NYC Midtown 81 | # input: http://videos-3.earthcam.com/fecnetwork/13903.flv/playlist.m3u8 82 | -------------------------------------------------------------------------------- /ui/templates/button-card/sensors/noaa-space-weather-scale.yaml: -------------------------------------------------------------------------------- 1 | 2 | noaa_space_weather_scale: 3 | show_label: true 4 | state: 5 | - value: 5 6 | styles: 7 | card: 8 | - background: var(--accent-color) 9 | label: Extreme 10 | - value: 4 11 | styles: 12 | card: 13 | - background: var(--primary-color) 14 | label: Severe 15 | - value: 3 16 | styles: 17 | card: 18 | - background: rgba(var(--rgb-primary-color), .75) 19 | label: Strong 20 | - value: 2 21 | styles: 22 | card: 23 | - background: rgba(var(--rgb-primary-color), .5) 24 | label: Moderate 25 | - value: 1 26 | styles: 27 | card: 28 | - background: rgba(var(--rgb-primary-color), .25) 29 | label: Minor 30 | - value: 0 31 | styles: 32 | card: 33 | - background: var(--ha-card-background) 34 | - color: var(--disabled-text-color) 35 | label: None 36 | 37 | noaa_space_weather_prob: 38 | show_units: false 39 | state_display: | 40 | [[[ return entity.state + "%" ]]] 41 | state: 42 | - value: 100 43 | operator: '==' 44 | styles: 45 | card: 46 | - background: var(--accent-color) 47 | - value: 75 48 | operator: '>=' 49 | styles: 50 | card: 51 | - background: var(--primary-color) 52 | - value: 50 53 | operator: '>=' 54 | styles: 55 | card: 56 | - background: rgba(var(--rgb-primary-color), .75) 57 | - value: 25 58 | operator: '>=' 59 | styles: 60 | card: 61 | - background: rgba(var(--rgb-primary-color), .5) 62 | - value: 0 63 | operator: '>' 64 | styles: 65 | card: 66 | - background: rgba(var(--rgb-primary-color), .25) 67 | - value: 0 68 | operator: '==' 69 | styles: 70 | card: 71 | - background: var(--accent-color) 72 | extra_styles: | 73 | .unit { 74 | font-size: var(--h6-font-size); 75 | font-weight: var(--h6-font-weight); 76 | opacity: .5; 77 | } -------------------------------------------------------------------------------- /ui/shared/columns/chores-all-list.yaml: -------------------------------------------------------------------------------- 1 | - type: 'custom:auto-entities' 2 | filter: 3 | include: 4 | - group: group.chore_plants 5 | options: 6 | type: 'custom:button-card' 7 | template: chore_row 8 | card: 9 | type: entities 10 | title: Plants 11 | card_mod: 12 | style: | 13 | #states > div > * {overflow: visible !important;} 14 | 15 | - type: 'custom:auto-entities' 16 | filter: 17 | include: 18 | - group: group.chore_car 19 | options: 20 | type: 'custom:button-card' 21 | template: chore_row 22 | - entity_id: binary_sensor.car_wash 23 | card: 24 | type: entities 25 | title: Car 26 | card_mod: 27 | style: | 28 | #states > div > * {overflow: visible !important;} 29 | 30 | - type: 'custom:auto-entities' 31 | filter: 32 | include: 33 | - group: group.chore_kitchen 34 | options: 35 | type: 'custom:button-card' 36 | template: chore_row 37 | card: 38 | type: entities 39 | title: Kitchen 40 | card_mod: 41 | style: | 42 | #states > div > * {overflow: visible !important;} 43 | 44 | - type: 'custom:auto-entities' 45 | filter: 46 | include: 47 | - group: group.chore_bathroom 48 | options: 49 | type: 'custom:button-card' 50 | template: chore_row 51 | card: 52 | type: entities 53 | title: Bathroom 54 | card_mod: 55 | style: | 56 | #states > div > * {overflow: visible !important;} 57 | 58 | - type: 'custom:auto-entities' 59 | filter: 60 | include: 61 | - group: group.chore_living_room 62 | options: 63 | type: 'custom:button-card' 64 | template: chore_row 65 | card: 66 | type: entities 67 | title: Living Room 68 | card_mod: 69 | style: | 70 | #states > div > * {overflow: visible !important;} 71 | 72 | - type: 'custom:auto-entities' 73 | filter: 74 | include: 75 | - group: group.chore_personal 76 | options: 77 | type: 'custom:button-card' 78 | template: chore_row 79 | card: 80 | type: entities 81 | title: Personal 82 | card_mod: 83 | style: | 84 | #states > div > * {overflow: visible !important;} 85 | -------------------------------------------------------------------------------- /ui/shared/cards/energy-daily-total.yaml: -------------------------------------------------------------------------------- 1 | type: vertical-stack 2 | cards: 3 | - type: horizontal-stack 4 | cards: 5 | - type: entity 6 | entity: sensor.total_energy_use_daily_max 7 | name: Yesterday 8 | icon: none 9 | - type: entity 10 | entity: sensor.total_energy_use_hourly_max 11 | name: Last Hour 12 | icon: 'mdi:home-lightning-bolt' 13 | - type: 'custom:mini-graph-card' 14 | name: Daily Total 15 | show: 16 | graph: bar 17 | icon: false 18 | height: 150 19 | hours_to_show: 168 20 | aggregate_func: max 21 | group_by: date 22 | bar_spacing: 48 23 | unit: Wh 24 | update_interval: 30000 25 | line_color: 'rgba(var(--rgb-primary-color), .5)' 26 | lower_bound: 0 27 | upper_bound: ~0 28 | entities: 29 | - entity: sensor.total_energy_use_daily 30 | name: Total Energy Consumption 31 | card_mod: 32 | style: > 33 | ha-card {border-bottom: 1px solid 34 | rgba(var(--rgb-primary-text-color),.1);} .header { 35 | padding-bottom: 0; 36 | margin-top: -8px; 37 | } .name > span { 38 | font-size: var(--body-font-size) !important; 39 | font-weight: normal !important; 40 | max-height: none !important; 41 | opacity: 1 !important; 42 | } .states { 43 | margin-top: -8px; 44 | } .state__value { 45 | font-size: var(--h1-font-size) !important; 46 | font-weight: 100 !important; 47 | padding: 8px 0; 48 | } .state__uom { 49 | font-size: var(--h6-font-size) !important; 50 | text-transform: uppercase; 51 | margin-bottom: 2px !important; 52 | padding: 8px 0; 53 | } .state__time { 54 | font-size: var(--h6-font-size) !important; 55 | font-weight: normal !important; 56 | letter-spacing: normal !important; 57 | } .graph__legend { 58 | font-size: var(--h6-font-size) !important; 59 | font-weight: normal !important; 60 | justify-content: flex-start !important; 61 | padding-left: 8px !important; 62 | letter-spacing: normal !important; 63 | } .graph__legend__item { 64 | margin: 0 8px !important; 65 | } .icon { 66 | margin-top: 12px; 67 | } 68 | in_card: true -------------------------------------------------------------------------------- /config/groups/chores.yaml: -------------------------------------------------------------------------------- 1 | 2 | # CHORES 3 | 4 | chore_plants: 5 | name: Plant Chores 6 | entities: 7 | - input_button.chore_water_plants 8 | - input_button.chore_fertilize_plants 9 | - input_button.chore_refill_reservoir 10 | - input_button.chore_apply_insecticide 11 | 12 | chore_kitchen: 13 | name: Kitchen Chores 14 | entities: 15 | - input_button.chore_clean_kitchen_sink 16 | - input_button.chore_clean_kitchen_counter 17 | - input_button.chore_clean_kitchen_stove 18 | - input_button.chore_dust_lights 19 | - input_button.chore_replace_uv_lamp 20 | - input_button.chore_wipe_handles 21 | - input_button.chore_clean_kitchen_exhaust_fan 22 | - input_button.chore_change_sponge 23 | - input_button.chore_clean_kitchen_floor 24 | - input_button.chore_change_kitchen_hand_towels 25 | - input_button.chore_change_empty_trash 26 | - input_button.chore_change_water_filter 27 | - input_button.chore_pest_exterminator 28 | - input_button.chore_vacuum_mop_pad 29 | 30 | chore_bathroom: 31 | name: Bathroom Chores 32 | entities: 33 | - input_button.chore_clean_bathroom_floor 34 | - input_button.chore_clean_bathtub 35 | - input_button.chore_clean_toilet 36 | - input_button.chore_change_hand_towels 37 | - input_button.chore_change_bath_mat 38 | - input_button.chore_change_shower_curtain 39 | - input_button.chore_change_face_towel 40 | - input_button.chore_change_body_sponge 41 | 42 | chore_living_room: 43 | name: Living Room Chores 44 | entities: 45 | - input_button.chore_wipe_floors 46 | - input_button.chore_dust_bookshelves 47 | - input_button.chore_dust_stereos 48 | - input_button.chore_clean_windows 49 | - input_button.chore_clean_tables 50 | - input_button.chore_dust_window_blinds 51 | 52 | chore_personal: 53 | name: Personal Chores 54 | entities: 55 | - input_button.chore_clothes_laundry 56 | - input_button.chore_heavy_laundry 57 | - input_button.chore_change_bed_sheets 58 | - input_button.chore_wash_hair 59 | - input_button.chore_body_deep_clean 60 | - input_button.chore_clean_bedroom_floor 61 | - input_button.chore_pluck_eyebrows 62 | - input_button.chore_mouthwash 63 | - input_button.chore_facial 64 | 65 | chore_car: 66 | name: Car Chores 67 | entities: 68 | - input_button.chore_car_oil_change 69 | - input_button.chore_car_car_wash 70 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides/big-clock-space-theme.yaml: -------------------------------------------------------------------------------- 1 | # Space Theme 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 | # tap_action: 14 | # action: navigate 15 | # navigation_path: /ui-smart-displays-bedroom 16 | custom_fields: 17 | moon: '' 18 | moonshadow: '' 19 | glow: '' 20 | earth: '' 21 | styles: 22 | grid: 23 | - grid-template-areas: '"n" "s" "l" "glow" "earth" "moon" "moonshadow"' 24 | - grid-template-columns: 92vw 25 | - grid-template-rows: auto 60vh auto 0 0 0 0 26 | card: 27 | # - background: "linear-gradient(to bottom, black, #333333)" 28 | - background: "radial-gradient(circle 100vw at center calc(66.66vh + 50vw), rgba(0,30,121,1), black)" 29 | state: 30 | - font-size: 60vh 31 | - font-weight: 800 32 | - justify-content: center 33 | - place-self: center 34 | - padding: 0 35 | name: 36 | - font-size: 5vh 37 | - font-weight: 700 38 | - text-transform: uppercase 39 | - place-self: start center 40 | - padding: 1.5vh 0 0 41 | - letter-spacing: .75vw 42 | - z-index: 17 43 | label: 44 | - font-size: 5vh 45 | - font-weight: 700 46 | - text-transform: uppercase 47 | - place-self: start center 48 | - padding: 1.5vh 0 0 49 | - letter-spacing: .75vw 50 | - z-index: 17 51 | custom_fields: 52 | glow: 53 | - position: absolute 54 | - top: 0 55 | - left: 0 56 | - width: 100% 57 | - height: 100% 58 | - background: "radial-gradient(circle 100vw at center calc(66.66vh + 50vw), transparent 33%, rgba(0,20,40,.5) 45%, rgba(0,20,40,.8) 50%, rgba(0,60,121,.75) 50.01%, transparent 51%, rgba(0,60,121,.25) 55%, transparent 67%)" 59 | - z-index: 16 60 | earth: 61 | - position: absolute 62 | - top: 0 63 | - left: 0 64 | - width: 100% 65 | - height: 100% 66 | - background: | 67 | [[[ 68 | return "url(" + states["camera.cdn_star_nesdis_noaa_gov"].attributes.entity_picture + ")" 69 | ]]] 70 | - background-size: 100% auto 71 | - background-position: 0 66.66vh 72 | - background-repeat: no-repeat 73 | - clip-path: "circle(50vw at center calc(66.66vh + 50vw))" 74 | - z-index: 15 75 | -------------------------------------------------------------------------------- /ui/shared/columns/me-music-top-albums.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Using Pop Up Card to hide a card. 3 | - type: custom:popup-card 4 | card: 5 | &me-music-card-top-albums 6 | type: 'custom:button-card' 7 | template: 8 | - live_tile_card 9 | - live_tile_with_long_state 10 | variables: 11 | item: 0 12 | entity: sensor.last_fm_top_albums_json 13 | show_name: false 14 | color: black 15 | icon: 'mdi:numeric-2-box-multiple' 16 | state_display: '[[[ return entity.attributes.album[variables.item].name ]]]' 17 | label: >- 18 | [[[ return entity.attributes.album[variables.item].artist.name + 19 | "
    " + entity.attributes.album[variables.item].playcount + " Plays" 20 | ]]] 21 | styles: 22 | card: 23 | - background-image: > 24 | [[[ return "linear-gradient(to bottom, rgba(0,0,0,.8) 0%, rgba(0,0,0,.33) 100%), url('" + 25 | entity.attributes.album[variables.item].image[3]['#text'] + "')" 26 | ]]] 27 | - background-size: cover 28 | tap_action: 29 | action: call-service 30 | service: media_player.play_media 31 | service_data: 32 | media_content_type: TIDAL 33 | media_content_id: | 34 | [[[ return "play the album " + entity.attributes.album[variables.item].name + " by " + entity.attributes.album[variables.item].artist.name ]]] 35 | entity_id: media_player.terpsichora_mini_alexa 36 | 37 | - <<: *me-music-card-top-albums 38 | icon: 'mdi:numeric-1-box-multiple' 39 | template: large_tile_card 40 | variables: 41 | item: 0 42 | view_layout: 43 | grid-column: span 2 44 | grid-row: span 2 45 | name: Top Album 46 | show_name: true 47 | label: >- 48 | [[[ return "by " + entity.attributes.album[0].artist.name + 49 | "
    " + entity.attributes.album[0].playcount + " Plays" ]]] 50 | 51 | - <<: *me-music-card-top-albums 52 | icon: 'mdi:numeric-2-box-multiple' 53 | variables: 54 | item: 1 55 | 56 | - <<: *me-music-card-top-albums 57 | icon: 'mdi:numeric-3-box-multiple' 58 | variables: 59 | item: 2 60 | 61 | - <<: *me-music-card-top-albums 62 | icon: 'mdi:numeric-4-box-multiple' 63 | variables: 64 | item: 3 65 | 66 | - <<: *me-music-card-top-albums 67 | icon: 'mdi:numeric-5-box-multiple' 68 | variables: 69 | item: 4 70 | 71 | # - <<: *me-music-card-top-albums 72 | # icon: 'mdi:numeric-6-box-multiple' 73 | # variables: 74 | # item: 5 75 | 76 | # - <<: *me-music-card-top-albums 77 | # icon: 'mdi:numeric-7-box-multiple' 78 | # variables: 79 | # item: 6 -------------------------------------------------------------------------------- /config/templates/environment.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Change legal limit of indoor temperature according to NYC laws. 3 | 4 | - trigger: 5 | - platform: homeassistant 6 | event: start 7 | - platform: event 8 | event_type: event_template_reloaded 9 | - platform: state 10 | entity_id: sensor.valhalla_apparent_temperature 11 | sensor: 12 | - name: Indoor Temperature Legal Limit 13 | unit_of_measurement: "°C" 14 | state: > 15 | {% if (now() > today_at("06:00:00")) and (now() < today_at("22:00:00")) %} 16 | {% if states('sensor.valhalla_apparent_temperature') | float < 12.7778 %} 17 | 20 18 | {% else %} 19 | 0 20 | {% endif %} 21 | {% else %} 22 | {% if states('sensor.valhalla_apparent_temperature') | float < 20 %} 23 | 16.6667 24 | {% else %} 25 | 0 26 | {% endif %} 27 | {% endif %} 28 | 29 | # Change legal limit of indoor temperature according to NYC laws. 30 | 31 | - trigger: 32 | - platform: homeassistant 33 | event: start 34 | - platform: event 35 | event_type: event_template_reloaded 36 | - platform: state 37 | entity_id: sensor.indoor_average_humidity 38 | sensor: 39 | - name: Indoor Comfort Zone Temperature Minimum 40 | unit_of_measurement: "°C" 41 | state: > 42 | {% if (states('sensor.indoor_average_humidity') | float <= 80 ) and (states('sensor.indoor_average_humidity') | float >= 20 ) %} 43 | 20 44 | {% else %} 45 | null 46 | {% endif %} 47 | - name: Indoor Comfort Zone Temperature Maximum 48 | unit_of_measurement: "°C" 49 | state: > 50 | {% if (states('sensor.indoor_average_humidity') | float <= 80 ) and (states('sensor.indoor_average_humidity') | float >= 20 ) %} 51 | {% if (states('sensor.indoor_average_humidity') | float >= 50 ) %} 52 | {{ (2 - (states('sensor.indoor_average_humidity') | float - 50) / 30 * 2) + 25 }} 53 | {% else %} 54 | 27 55 | {% endif %} 56 | {% else %} 57 | null 58 | {% endif %} 59 | 60 | - trigger: 61 | - platform: state 62 | entity_id: sensor.bedroom_air_conditioner_plug_smartenergy_metering 63 | binary_sensor: 64 | - name: Bedroom Air Conditioner Power 65 | state: > 66 | {% if states('sensor.bedroom_air_conditioner_plug_smartenergy_metering') | float >= 30 %} 67 | on 68 | {% else %} 69 | off 70 | {% endif %} 71 | delay_on: '0:00:05' 72 | delay_off: '0:00:05' 73 | -------------------------------------------------------------------------------- /config/groups/lights.yaml: -------------------------------------------------------------------------------- 1 | 2 | # LIGHTS 3 | 4 | living_room_lights: 5 | name: Living Room Lights 6 | entities: 7 | - light.living_room_chandelier_main 8 | - light.living_room_ramsele_light 9 | - light.living_room_random_light 10 | - light.hallway_light 11 | - light.living_room_strala_light 12 | 13 | living_room_accents: 14 | name: Living Room Accents 15 | entities: 16 | - light.living_room_ball_light 17 | - light.living_room_table_lights 18 | - light.living_room_hue_bowl 19 | - light.living_room_decor_lights 20 | 21 | kitchen_lights: 22 | name: Kitchen Lights 23 | entities: 24 | - light.kitchen_counter_lights 25 | - light.kitchen_spot_lights 26 | - light.kitchen_sink_lights 27 | - light.kitchen_counter_accent_lights 28 | 29 | bedroom_lights: 30 | name: Bedroom Lights 31 | entities: 32 | - light.bedroom_ceiling_lights 33 | - light.bedroom_cloud_light 34 | - light.bedroom_hue_bowl 35 | 36 | workspace_lights: 37 | name: Workspace Lights 38 | entities: 39 | - group.workspace_desk_lights 40 | - group.workspace_accents_lights 41 | - group.workspace_studio_lights 42 | 43 | workspace_desk_lights: 44 | name: Workspace Desk Lights 45 | entities: 46 | - light.workspace_desk_spot_light_left 47 | - light.workspace_desk_spot_light_right 48 | 49 | workspace_accents_lights: 50 | name: Workspace Accents Lights 51 | entities: 52 | - light.workspace_back_ledge_lights 53 | - light.workspace_back_shelf_lights 54 | - light.workspace_desk_bottom_lights 55 | - light.workspace_bench_bottom_lights 56 | - light.workspace_bloom_left 57 | - light.workspace_bloom_right 58 | 59 | workspace_studio_lights: 60 | name: Workspace Studio Lights 61 | entities: 62 | - light.workspace_studio_light_left 63 | - light.workspace_studio_light_center 64 | - light.workspace_studio_light_right 65 | - light.workspace_makery_lights 66 | 67 | 68 | insteon_lights: 69 | name: Insteon Lights 70 | entities: 71 | - light.living_room_chandelier_main 72 | - light.living_room_decor_lights 73 | - light.kitchen_counter_lights 74 | - light.kitchen_spot_lights 75 | - light.kitchen_sink_lights 76 | - light.bedroom_ceiling_lights 77 | 78 | unaccounted_lights: 79 | name: Unaccounted Lights 80 | entities: 81 | - group.insteon_lights 82 | - light.living_room_table_lights 83 | - light.living_room_hue_bowl 84 | - light.living_room_ramsele_light 85 | - light.living_room_random_light 86 | - light.hallway_light 87 | - light.living_room_strala_light 88 | - light.bedroom_hue_bowl 89 | -------------------------------------------------------------------------------- /ui/shared/columns/me-music-top-artists.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Using Pop Up Card to hide a card. 3 | - type: custom:popup-card 4 | card: 5 | &me-music-card-top-artists 6 | type: 'custom:button-card' 7 | template: 8 | - live_tile_card 9 | - live_tile_with_long_state 10 | variables: 11 | item: 0 12 | entity: sensor.last_fm_top_artists_json 13 | show_name: false 14 | color: black 15 | icon: 'mdi:numeric-2-box-multiple' 16 | state_display: '[[[ return entity.attributes.artist[variables.item].name ]]]' 17 | label: >- 18 | [[[ return entity.attributes.artist[variables.item].name + 19 | "
    " + entity.attributes.artist[variables.item].playcount + " Plays" 20 | ]]] 21 | styles: 22 | card: 23 | - background-image: > 24 | [[[ return "linear-gradient(to bottom, rgba(0,0,0,.8) 0%, rgba(0,0,0,.33) 100%), url('" + 25 | entity.attributes.artist[variables.item].image[3]['#text'] + "')" 26 | ]]] 27 | - background-size: cover 28 | tap_action: 29 | action: call-service 30 | service: media_player.play_media 31 | service_data: 32 | media_content_type: TIDAL 33 | media_content_id: | 34 | [[[ return "play songs by " + entity.attributes.artist[variables.item].name ]]] 35 | entity_id: media_player.terpsichora_mini_alexa 36 | 37 | - <<: *me-music-card-top-artists 38 | icon: 'mdi:numeric-1-box-multiple' 39 | template: large_tile_card 40 | variables: 41 | item: 0 42 | view_layout: 43 | grid-column: span 2 44 | grid-row: span 2 45 | name: Top Artist 46 | show_name: true 47 | label: >- 48 | [[[ return "by " + entity.attributes.artist[0].name + 49 | "
    " + entity.attributes.artist[0].playcount + " Plays" ]]] 50 | styles: 51 | card: 52 | - background-image: | 53 | [[[ return "linear-gradient(to bottom, rgba(0,0,0,.66) 0%, rgba(0,0,0,0) 100%), url('" + 54 | states["sensor.last_fm_top_artist_photo"].state + "')" ]]] 55 | 56 | - <<: *me-music-card-top-artists 57 | icon: 'mdi:numeric-2-box-multiple' 58 | variables: 59 | item: 1 60 | 61 | - <<: *me-music-card-top-artists 62 | icon: 'mdi:numeric-3-box-multiple' 63 | variables: 64 | item: 2 65 | 66 | - <<: *me-music-card-top-artists 67 | icon: 'mdi:numeric-4-box-multiple' 68 | variables: 69 | item: 3 70 | 71 | - <<: *me-music-card-top-artists 72 | icon: 'mdi:numeric-5-box-multiple' 73 | variables: 74 | item: 4 75 | 76 | # - <<: *me-music-card-top-artists 77 | # icon: 'mdi:numeric-6-box-multiple' 78 | # variables: 79 | # item: 5 80 | 81 | # - <<: *me-music-card-top-artists 82 | # icon: 'mdi:numeric-7-box-multiple' 83 | # variables: 84 | # item: 6 -------------------------------------------------------------------------------- /ui/shared/columns/lights-workspace-desk.yaml: -------------------------------------------------------------------------------- 1 | - type: 'custom:mushroom-light-card' 2 | use_light_color: true 3 | show_brightness_control: true 4 | show_color_temp_control: true 5 | show_color_control: true 6 | entity: light.workspace_desk_spot_light_left 7 | 8 | - type: 'custom:mushroom-light-card' 9 | entity: light.workspace_desk_spot_light_right 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:layout-card' 16 | layout_type: 'custom:grid-layout' 17 | layout: !include ../../shared/snippets/layout-live-tile-mini.yaml 18 | entities: 19 | 20 | - type: 'custom:decluttering-card' 21 | template: light_card 22 | variables: 23 | - entity: switch.adaptive_lighting_workspace_desk_spot_lights 24 | - name: Adaptive Lighting 25 | view_layout: 26 | grid-column: span 2 27 | grid-row: span 2 28 | 29 | - type: 'custom:button-card' 30 | template: hue_scene_card_mini 31 | entity: scene.workspace_key_lights_energize 32 | variables: 33 | name: Energize 34 | color: 'rgb(64, 64, 64)' 35 | 36 | - type: 'custom:button-card' 37 | template: hue_scene_card_mini 38 | entity: scene.workspace_key_lights_concentrate 39 | variables: 40 | name: Concentrate 41 | color: 'rgb(251, 212, 180)' 42 | 43 | - type: 'custom:button-card' 44 | template: hue_scene_card_mini 45 | entity: scene.workspace_key_lights_bright 46 | variables: 47 | name: Bright 48 | color: 'rgb(250, 207, 125)' 49 | 50 | - type: 'custom:button-card' 51 | template: hue_scene_card_mini 52 | entity: scene.workspace_key_lights_read 53 | variables: 54 | name: Read 55 | color: 'rgb(248, 173, 107)' 56 | 57 | - type: 'custom:button-card' 58 | template: hue_scene_card_mini 59 | entity: scene.workspace_key_lights_relax 60 | variables: 61 | name: Relax 62 | color: 'rgb(195, 150, 71)' 63 | 64 | - type: 'custom:button-card' 65 | template: hue_scene_card_mini 66 | entity: scene.workspace_key_lights_lights_camera_action 67 | variables: 68 | name: 'Lights, Camera, Action!' 69 | color: 'rgb(141, 97, 59)' 70 | 71 | - type: 'custom:button-card' 72 | template: hue_scene_card_mini 73 | entity: scene.workspace_key_lights_dimmed 74 | variables: 75 | name: Dimmed 76 | color: 'rgb(64, 47, 33)' 77 | 78 | - type: 'custom:button-card' 79 | template: hue_scene_card_mini 80 | entity: scene.workspace_key_lights_nightlight 81 | variables: 82 | name: Nightlight 83 | color: 'rgb(63, 46, 25)' -------------------------------------------------------------------------------- /ui/templates/button-card/sensors/plant.yaml: -------------------------------------------------------------------------------- 1 | plant_status: 2 | state_display: | 3 | [[[ 4 | if (entity.state == "ok") { return "Good" } 5 | return entity.state 6 | ]]] 7 | state: 8 | - value: ok 9 | styles: 10 | card: 11 | - background-color: var(--ha-card-background) 12 | state: 13 | - color: var(--primary-text-color) 14 | name: 15 | - color: var(--primary-text-color) 16 | label: 17 | - color: var(--primary-text-color) 18 | - opacity: 0.67 19 | - value: problem 20 | styles: 21 | card: 22 | - background-color: var(--primary-color) 23 | state: 24 | - color: var(--accent-text-color) 25 | name: 26 | - color: var(--accent-text-color) 27 | label: 28 | - color: var(--accent-text-color) 29 | - opacity: 0.67 30 | label: | 31 | [[[ 32 | var problems = { low: [], high: [], unknown: [] } 33 | var problemString = { low: "", high: "", unknown: "" } 34 | for (const [key, value] of Object.entries(entity.attributes)) { 35 | if (key == "dli_status") { var problem = "light" } else { var problem = key.replace(/_status/, "") } 36 | if (value == "Low") { problems.low.push(problem) } 37 | if (value == "High") { problems.high.push(problem) } 38 | } 39 | for (const [key, value] of Object.entries(problems)) { 40 | if (problems[key].length > 1) { 41 | problems[key][problems[key].length-1] = "and " + problems[key][problems[key].length-1] 42 | if (problems[key].length > 2) { 43 | problemString[key] = key[0].toUpperCase() + key.slice(1) + " " + problems[key].join(", ") 44 | } else { 45 | problemString[key] = key[0].toUpperCase() + key.slice(1) + " " + problems[key].join(" ") 46 | } 47 | } else { 48 | if (problems[key].length == 1) { 49 | problemString[key] = key[0].toUpperCase() + key.slice(1) + " " + problems[key].join("") 50 | } 51 | } 52 | } 53 | return Object.values(problemString).filter(string => string != "").join("
    ") 54 | ]]] 55 | show_icon: false 56 | custom_fields: 57 | plant: '' 58 | styles: 59 | grid: 60 | - grid-template-areas: '"s s" "l l" "n i" "plant plant"' 61 | - grid-template-rows: min-content auto min-content 0 62 | custom_fields: 63 | plant: 64 | - background-image: | 65 | [[[ return "url('/local/plants/plant-" + variables.plant + ".png')" ]]] 66 | - background-size: cover 67 | - background-repeat: no-repeat 68 | - opacity: '[[[ return (entity.state == "problem") ? .67 : .5 ]]]' 69 | - position: absolute 70 | - top: 0 71 | - left: 33% 72 | - width: 100% 73 | - height: 100% 74 | - filter: ' [[[ return (entity.state == "problem") ? "invert(1)" : "var(--dark-mode-filter)" ]]]' 75 | -------------------------------------------------------------------------------- /ui/smartdisplays/slides.yaml: -------------------------------------------------------------------------------- 1 | 2 | - !include slides/blank.yaml 3 | 4 | 5 | # Chores 6 | - !include slides/chores.yaml 7 | 8 | 9 | # Weather 10 | - !include slides/sun.yaml 11 | - !include slides/astronomy-calendar.yaml 12 | - !include slides/nws-alerts.yaml 13 | - !include slides/weather-current.yaml 14 | - !include slides/temp-outdoor.yaml 15 | - !include slides/temp-indoor.yaml 16 | - !include slides/weather-daily.yaml 17 | - !include slides/weather-hourly.yaml 18 | - !include slides/waqi.yaml 19 | - !include slides/allergy-index.yaml 20 | - !include slides/wind.yaml 21 | 22 | 23 | # Home Devices 24 | - !include slides/power-usage.yaml 25 | - !include slides/vacuum.yaml 26 | 27 | 28 | # Fun Stuff 29 | - !include slides/last-fm-artist.yaml 30 | - !include slides/plex-new-shows.yaml 31 | 32 | 33 | # Neighborhood 34 | - !include slides/tgtg.yaml 35 | 36 | 37 | # Commute 38 | - !include slides/subway-status.yaml 39 | - !include slides/gasbuddy.yaml 40 | - !include slides/nyc311-alt-side-parking.yaml 41 | - !include slides/waze-driving-time.yaml 42 | - !include slides/traffic-map.yaml 43 | 44 | - type: 'custom:button-card' 45 | template: 46 | - slide_basic 47 | - slide_with_live_camera 48 | entity: camera.511ny_i278_at_morgan_ave 49 | name: Brooklyn-Queens Expressway at Morgan Ave 50 | 51 | - type: 'custom:button-card' 52 | template: 53 | - slide_basic 54 | - slide_with_live_camera 55 | entity: camera.511ny_i495_at_84th_street 56 | name: Long Island Expressway at 84th St 57 | 58 | - type: 'custom:button-card' 59 | template: 60 | - slide_basic 61 | - slide_with_live_camera 62 | entity: camera.511ny_i278_at_state_street_upper_lvl 63 | name: Brooklyn-Queens Expressway at State St 64 | 65 | - type: 'custom:button-card' 66 | template: 67 | - slide_basic 68 | - slide_with_live_camera 69 | entity: camera.511ny_i495_at_queens_midtown_tunnel 70 | name: Long Island Expressway at Queens Midtown Tunnel 71 | 72 | 73 | # Notify NYC 74 | 75 | - &slide-notify-nyc 76 | type: 'custom:button-card' 77 | template: slide_basic 78 | entity: sensor.notify_nyc 79 | variables: 80 | slide: 0 81 | show_state: true 82 | show_label: true 83 | name: | 84 | [[[ 85 | return "Notify NYC - " + moment(entity.attributes.entries[variables.slide].published, "DD/MMM/YYYY HH:mm:ss").fromNow() 86 | ]]] 87 | state_display: >- 88 | [[[ return 89 | entity.attributes.entries[variables.slide].title.replaceAll("Notify NYC 90 | - ", "") ]]] 91 | label: >- 92 | [[[ return 93 | entity.attributes.entries[variables.slide].summary.replaceAll(/Notification 94 | issued .*/g, "").replaceAll(/For more information, .*/g, 95 | "").replaceAll(/To view this message in.*/g, "") ]]] 96 | 97 | - <<: *slide-notify-nyc 98 | variables: 99 | aspect_ratio: 2/1 100 | slide: 1 101 | 102 | - <<: *slide-notify-nyc 103 | variables: 104 | aspect_ratio: 2/1 105 | slide: 2 106 | 107 | 108 | - !include slides/blank.yaml 109 | -------------------------------------------------------------------------------- /config/groups/env-sensors.yaml: -------------------------------------------------------------------------------- 1 | 2 | # ENVIRONMENTAL SENSORS 3 | 4 | indoor_temperature_sensors: 5 | name: Indoor Temperature Sensors 6 | entities: 7 | - sensor.netatmo_strawberry_land_indoor_temperature 8 | - sensor.bedroom_hue_sensor_temperature 9 | - sensor.workspace_room_hue_sensor_temperature 10 | - sensor.workspace_env_sensor_temperature 11 | - sensor.bathroom_env_sensor_temperature 12 | - sensor.living_room_air_purifier_temperature 13 | - sensor.living_room_env_sensor_temperature 14 | - sensor.living_room_hue_sensor_temperature 15 | - sensor.kitchen_counter_motion_sensor_temperature 16 | 17 | indoor_humidity_sensors: 18 | name: Indoor Humidity Sensors 19 | entities: 20 | - sensor.pure_hot_cool_link_humidity 21 | - sensor.bathroom_env_sensor_humidity 22 | - sensor.workspace_env_sensor_humidity 23 | - sensor.living_room_air_purifier_humidity 24 | - sensor.living_room_env_sensor_humidity 25 | - sensor.netatmo_strawberry_land_indoor_humidity 26 | 27 | env_sensors_bedroom: 28 | name: Bedroom Environmental Sensors 29 | entities: 30 | - sensor.bedroom_hue_sensor_temperature 31 | - sensor.netatmo_strawberry_land_indoor_temperature 32 | - sensor.netatmo_strawberry_land_indoor_humidity 33 | - sensor.netatmo_strawberry_land_indoor_co2 34 | - sensor.netatmo_strawberry_land_indoor_noise 35 | - sensor.thermal_comfort_netatmo_bedroom_absolutehumidity 36 | - sensor.thermal_comfort_netatmo_bedroom_heatindex 37 | - sensor.thermal_comfort_netatmo_bedroom_perception 38 | - sensor.thermal_comfort_netatmo_bedroom_simmerindex 39 | - sensor.thermal_comfort_netatmo_bedroom_simmerzone 40 | 41 | env_sensors_workspace: 42 | name: Workspace Environmental Sensors 43 | entities: 44 | - sensor.workspace_room_hue_sensor_temperature 45 | - sensor.astralplane_hue_sensor_temperature 46 | - sensor.workspace_env_sensor_temperature 47 | - sensor.workspace_env_sensor_humidity 48 | - sensor.workspace_env_sensor_pressure 49 | - sensor.thermal_comfort_workspace_absolutehumidity 50 | - sensor.thermal_comfort_workspace_perception 51 | - sensor.thermal_comfort_workspace_simmerindex 52 | - sensor.thermal_comfort_workspace_simmerzone 53 | 54 | env_sensors_living_room: 55 | name: Living Room Environmental Sensors 56 | entities: 57 | - sensor.living_room_hue_sensor_temperature 58 | - sensor.living_room_air_purifier_temperature 59 | - sensor.living_room_air_purifier_humidity 60 | - sensor.living_room_env_sensor_temperature 61 | - sensor.living_room_env_sensor_humidity 62 | - sensor.living_room_env_sensor_pressure 63 | - sensor.thermal_comfort_living_room_absolutehumidity 64 | - sensor.thermal_comfort_living_room_heatindex 65 | - sensor.thermal_comfort_living_room_perception 66 | - sensor.thermal_comfort_living_room_simmerindex 67 | - sensor.thermal_comfort_living_room_simmerzone 68 | 69 | env_sensors_kitchen: 70 | name: Kitchen Environmental Sensors 71 | entities: 72 | - sensor.kitchen_counter_motion_sensor_temperature 73 | 74 | env_sensors_bathroom: 75 | name: Bathroom Environmental Sensors 76 | entities: 77 | - sensor.bathroom_env_sensor_temperature 78 | - sensor.bathroom_env_sensor_humidity 79 | -------------------------------------------------------------------------------- /config/switch.yaml: -------------------------------------------------------------------------------- 1 | 2 | - platform: template 3 | switches: 4 | bedroom_humidifier: 5 | friendly_name: "Bedroom Humidifier" 6 | icon_template: '{{ iif (states("sensor.bedroom_humidifier_power") == on, "mdi:air-humidifier", "mdi:air-humidifier-off") }}' 7 | value_template: "{{ is_state('sensor.bedroom_humidifier_power', 'on') }}" 8 | turn_on: 9 | service: rest_command.switchbot_device_command 10 | data: 11 | deviceId: !secret switchbot_humidifier_deviceID 12 | command: turnOn 13 | turn_off: 14 | service: rest_command.switchbot_device_command 15 | data: 16 | deviceId: !secret switchbot_humidifier_deviceID 17 | command: turnOff 18 | 19 | bedroom_air_conditioner: 20 | friendly_name: "Bedroom Air Conditioner" 21 | icon_template: '{{ iif (states("binary_sensor.bedroom_air_conditioner_power") == on, "mdi:fan", "mdi:fan-off") }}' 22 | value_template: "{{ is_state('binary_sensor.bedroom_air_conditioner_power', 'on') }}" 23 | turn_on: 24 | service: media_player.play_media 25 | data: 26 | media_content_id: Turn on Bedroom Air Conditioner 27 | media_content_type: custom 28 | target: 29 | entity_id: media_player.bedroom_echo_show 30 | turn_off: 31 | service: media_player.play_media 32 | data: 33 | media_content_id: Turn off Bedroom Air Conditioner 34 | media_content_type: custom 35 | target: 36 | entity_id: media_player.bedroom_echo_show 37 | 38 | # - platform: rest 39 | # name: "Bedroom Humidifier" 40 | # resource: !secret switchbot_humidifier_post 41 | # method: POST 42 | # headers: 43 | # Authorization: !secret switchbot_api_token 44 | # Content-Type: "application/json" 45 | # body_on: '"command": "turnOn"' 46 | # body_off: '"command": "turnOff"' 47 | # - platform: rest 48 | # name: "Bedroom Humidifier Auto Mode" 49 | # resource: !secret switchbot_humidifier_post 50 | # method: POST 51 | # headers: 52 | # Authorization: !secret switchbot_api_token 53 | # Content-Type: "application/json" 54 | # body_on: '"command": "setMode", "parameter": "auto"' 55 | # body_off: '"command": "turnOff"' 56 | # - platform: rest 57 | # name: "Bedroom Humidifier Low Mode" 58 | # resource: !secret switchbot_humidifier_post 59 | # method: POST 60 | # headers: 61 | # Authorization: !secret switchbot_api_token 62 | # Content-Type: "application/json" 63 | # body_on: '"command": "setMode", "parameter": "101"' 64 | # body_off: '"command": "turnOff"' 65 | # - platform: rest 66 | # name: "Bedroom Humidifier Medium Mode" 67 | # resource: !secret switchbot_humidifier_post 68 | # method: POST 69 | # headers: 70 | # Authorization: !secret switchbot_api_token 71 | # Content-Type: "application/json" 72 | # body_on: '"command": "setMode", "parameter": "102"' 73 | # body_off: '"command": "turnOff"' 74 | # - platform: rest 75 | # name: "Bedroom Humidifier High Mode" 76 | # resource: !secret switchbot_humidifier_post 77 | # method: POST 78 | # headers: 79 | # Authorization: !secret switchbot_api_token 80 | # Content-Type: "application/json" 81 | # body_on: '"command": "setMode", "parameter": "103"' 82 | # body_off: '"command": "turnOff"' 83 | -------------------------------------------------------------------------------- /config/templates/chores.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Calculate the number of chores done, to do, or overdue. 3 | 4 | - trigger: 5 | - platform: homeassistant 6 | event: start 7 | - platform: event 8 | event_type: event_template_reloaded 9 | - platform: time_pattern 10 | minutes: "/5" 11 | - platform: state 12 | entity_id: 13 | - group.chores 14 | sensor: 15 | 16 | - name: Chores Done 17 | unit_of_measurement: "Tasks" 18 | state: "OK" 19 | attributes: 20 | entities: > 21 | {%- set chore_done = namespace(entities=[]) -%} 22 | {%- for chore in expand('group.chores') -%} 23 | {%- if (chore.state != 'unknown') -%} 24 | {%- set input = chore.entity_id|regex_replace(find='input_button', replace='input_text') -%} 25 | {%- set diff = ( as_timestamp(now()) - as_timestamp(chore.state) ) / 60 / 60 / 24 %} 26 | {%- set due = states(input)|float(-1) -%} 27 | {%- if (diff < 1) and (as_datetime(chore.state).day == now().day) -%} 28 | {%- set chore_done.entities = chore_done.entities + [chore.entity_id] -%} 29 | {%- endif -%} 30 | {%- endif %} 31 | {%- endfor -%} 32 | {{ chore_done.entities }} 33 | 34 | - name: Chores To Do 35 | state: "OK" 36 | attributes: 37 | entities: > 38 | {%- set chore_todo = namespace(entities=[]) -%} 39 | {%- for chore in expand('group.chores') -%} 40 | {%- if (chore.state != 'unknown') -%} 41 | {%- set input = chore.entity_id|regex_replace(find='input_button', replace='input_text') -%} 42 | {%- set diff = ( as_timestamp(now()) - as_timestamp(chore.state) ) / 60 / 60 / 24 %} 43 | {%- set due = states(input)|float(-1) -%} 44 | {%- if due > 0 -%} 45 | {%- if (due < diff) -%} 46 | {%- else -%} 47 | {%- if ((due / 4) > 7) -%} 48 | {%- if (due < diff + 7) -%}{%- set chore_todo.entities = chore_todo.entities + [chore.entity_id] -%}{%- endif -%} 49 | {%- else -%} 50 | {%- if (due < diff + (due / 4)) -%}{%- set chore_todo.entities = chore_todo.entities + [chore.entity_id] -%}{%- endif -%} 51 | {%- endif -%} 52 | {%- endif -%} 53 | {%- endif -%} 54 | {%- endif %} 55 | {%- endfor -%} 56 | {{ chore_todo.entities }} 57 | 58 | - name: Chores Overdue 59 | state: "OK" 60 | attributes: 61 | entities: > 62 | {%- set chore_overdue = namespace(entities=[]) -%} 63 | {%- for chore in expand('group.chores') -%} 64 | {%- if (chore.state != 'unknown') -%} 65 | {%- set input = chore.entity_id|regex_replace(find='input_button', replace='input_text') -%} 66 | {%- set diff = ( as_timestamp(now()) - as_timestamp(chore.state) ) / 60 / 60 / 24 %} 67 | {%- set due = states(input)|float(-1) -%} 68 | {%- if due > 0 -%} 69 | {%- if (due < diff) -%} 70 | {%- set chore_overdue.entities = chore_overdue.entities + [chore.entity_id] -%} 71 | {%- endif -%} 72 | {%- endif -%} 73 | {%- endif %} 74 | {%- endfor -%} 75 | {{ chore_overdue.entities }} 76 | -------------------------------------------------------------------------------- /config/chores.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Plants 3 | chore_water_plants: 4 | name: Water Plants 5 | icon: mdi:watering-can 6 | chore_fertilize_plants: 7 | name: Fertilize Plants 8 | icon: mdi:flower 9 | chore_refill_reservoir: 10 | name: Refill Reservoir 11 | icon: mdi:water-boiler 12 | chore_apply_insecticide: 13 | name: Apply Insecticide 14 | icon: mdi:bug 15 | 16 | # Kitchen 17 | chore_clean_kitchen_sink: 18 | name: Clean Kitchen Sink 19 | icon: mdi:water-pump 20 | chore_clean_kitchen_counter: 21 | name: Clean Kitchen Counter 22 | icon: mdi:countertop 23 | chore_clean_kitchen_stove: 24 | name: Clean Kitchen Stove 25 | icon: mdi:stove 26 | chore_dust_lights: 27 | name: Dust Lights 28 | icon: mdi:ceiling-light 29 | chore_replace_uv_lamp: 30 | name: Replace UV Lamp 31 | icon: mdi:sun-wireless 32 | chore_wipe_handles: 33 | name: Wipe Handles 34 | icon: mdi:door 35 | chore_clean_kitchen_exhaust_fan: 36 | name: Clean Kitchen Exhaust Fan 37 | icon: mdi:stove 38 | chore_change_sponge: 39 | name: Change Sponge 40 | icon: mdi:hand-wash 41 | chore_clean_kitchen_floor: 42 | name: Clean Kitchen Floor 43 | icon: mdi:broom 44 | chore_change_kitchen_hand_towels: 45 | name: Change Kitchen Hand Towels 46 | icon: mdi:hand-water 47 | chore_change_empty_trash: 48 | name: Empty Trash 49 | icon: mdi:delete-empty 50 | chore_change_water_filter: 51 | name: Change Water Filter 52 | icon: mdi:air-filter 53 | chore_pest_exterminator: 54 | name: Pest Exterminator Visit 55 | icon: mdi:bug 56 | chore_vacuum_mop_pad: 57 | name: Change Vacuum Mop Pad 58 | icon: mdi:robot-vacuum 59 | 60 | # Bathroom 61 | chore_clean_bathroom_floor: 62 | name: Clean Bathroom Floor 63 | icon: mdi:broom 64 | chore_clean_bathtub: 65 | name: Clean Bathtub 66 | icon: mdi:bathtub 67 | chore_clean_toilet: 68 | name: Clean Toilet 69 | icon: mdi:toilet 70 | chore_change_hand_towels: 71 | name: Change Bathroom Hand Towels 72 | icon: mdi:hand-water 73 | chore_change_bath_mat: 74 | name: Change Bath Mat 75 | icon: mdi:rug 76 | chore_change_shower_curtain: 77 | name: Change Shower Curtain 78 | icon: mdi:curtains-closed 79 | chore_change_face_towel: 80 | name: Change Face Towel 81 | icon: mdi:shower 82 | chore_change_body_sponge: 83 | name: Change Body Sponge 84 | icon: mdi:shower 85 | 86 | # Living Room 87 | chore_wipe_floors: 88 | name: Wipe Floors 89 | icon: mdi:broom 90 | chore_dust_bookshelves: 91 | name: Dust Bookshelves 92 | icon: mdi:bookshelf 93 | chore_dust_stereos: 94 | name: Dust Stereos 95 | icon: mdi:speaker-multiple 96 | chore_clean_windows: 97 | name: Clean Windows 98 | icon: mdi:window-shutter-open 99 | chore_clean_tables: 100 | name: Clean Tables 101 | icon: mdi:table-furniture 102 | chore_dust_window_blinds: 103 | name: Dust Window Blinds 104 | icon: mdi:window-shutter 105 | 106 | # Personal 107 | chore_clothes_laundry: 108 | name: Clothes Laundry 109 | icon: mdi:washing-machine 110 | chore_heavy_laundry: 111 | name: Heavy Laundry 112 | icon: mdi:washing-machine 113 | chore_change_bed_sheets: 114 | name: Change Bed Sheets 115 | icon: mdi:bed 116 | chore_clean_bedroom_floor: 117 | name: Clean Bedroom Floor 118 | icon: mdi:broom 119 | chore_wash_hair: 120 | name: Wash My Hair 121 | icon: mdi:hair-dryer 122 | chore_body_deep_clean: 123 | name: Body Deep Clean 124 | icon: mdi:shower 125 | chore_pluck_eyebrows: 126 | name: Pluck Eyebrows 127 | icon: mdi:eye 128 | chore_mouthwash: 129 | name: Full Mouthwash 130 | icon: mdi:tooth 131 | chore_facial: 132 | name: Facial 133 | icon: mdi:face-woman-shimmer 134 | 135 | # Car 136 | chore_car_oil_change: 137 | name: Oil Change 138 | icon: mdi:engine 139 | chore_car_car_wash: 140 | name: Car Wash 141 | icon: mdi:car-wash 142 | 143 | -------------------------------------------------------------------------------- /ui/views/rooms/kitchen.yaml: -------------------------------------------------------------------------------- 1 | # MAXIMALIST DASHBOARD 2 | # Kitchen View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Kitchen 6 | path: kitchen 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.yaml 15 | view_layout: 16 | grid-area: cc 17 | cards: 18 | 19 | # [Header] Summary 20 | 21 | - type: 'custom:layout-card' 22 | layout_type: 'custom:grid-layout' 23 | layout: !include ../../shared/snippets/layout-page-title.yaml 24 | view_layout: 25 | grid-column: 1/-1 26 | cards: 27 | 28 | - type: markdown 29 | style: !include ../../shared/snippets/style-markdown-page-title.yaml 30 | content: > 31 | # Kitchen 32 | 33 | 34 | # [Column] Main Lights 35 | 36 | - type: 'custom:layout-card' 37 | layout_type: 'custom:grid-layout' 38 | layout: 39 | margin: -1 40 | cards: 41 | 42 | - type: 'custom:button-card' 43 | template: header_card_no_link 44 | variables: 45 | name: LIGHTS 46 | 47 | - type: 'custom:layout-card' 48 | layout_type: 'custom:grid-layout' 49 | layout: !include ../../shared/snippets/layout-live-tile.yaml 50 | cards: !include ../../shared/columns/lights-kitchen.yaml 51 | 52 | 53 | # [Column] Energy 54 | 55 | - type: 'custom:layout-card' 56 | layout_type: 'custom:grid-layout' 57 | layout: 58 | margin: -1 59 | cards: 60 | 61 | - type: 'custom:button-card' 62 | template: header_card_no_link 63 | variables: 64 | name: ENERGY 65 | 66 | - !include ../../shared/cards/energy-kitchen.yaml 67 | 68 | 69 | # [Column] Security 70 | 71 | - type: 'custom:layout-card' 72 | layout_type: 'custom:grid-layout' 73 | layout: 74 | margin: -1 75 | cards: 76 | 77 | - type: 'custom:button-card' 78 | template: header_card_no_link 79 | variables: 80 | name: SECURITY 81 | 82 | - type: 'custom:layout-card' 83 | layout_type: 'custom:grid-layout' 84 | layout: 85 | margin: -1 86 | cards: !include ../../shared/secret/security-kitchen.yaml 87 | 88 | 89 | # [Column] Chores 90 | 91 | - type: 'custom:layout-card' 92 | layout_type: 'custom:grid-layout' 93 | layout: 94 | margin: -1 95 | cards: 96 | 97 | - type: 'custom:button-card' 98 | template: header_card_no_link 99 | variables: 100 | name: CHORES 101 | 102 | - !include ../../shared/cards/chores-kitchen.yaml 103 | 104 | 105 | # [Column] Environment 106 | 107 | - type: 'custom:layout-card' 108 | layout_type: 'custom:grid-layout' 109 | layout: !include ../../shared/snippets/layout-live-tile.yaml 110 | cards: 111 | 112 | - type: 'custom:button-card' 113 | template: header_card_no_link 114 | variables: 115 | name: ENVIRONMENT 116 | view_layout: 117 | grid-column: 1/-1 118 | 119 | - type: 'custom:button-card' 120 | template: 121 | - live_tile_with_graph 122 | - live_tile_with_state_unit 123 | entity: sensor.kitchen_counter_motion_sensor_temperature 124 | name: Temperature 125 | variables: 126 | aspect_ratio: 2 127 | line_width: 2 128 | graph_height: 96 129 | view_layout: 130 | grid-column: span 2 131 | -------------------------------------------------------------------------------- /ui/ui-smartdisplays.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 8 | 9 | animated_background: 10 | default_url: 'https://cdn.flixel.com/flixel/ypy8bw9fgw1zv2b4htp2.hd.mp4' 11 | entity: sun.sun 12 | state_url: 13 | above_horizon: 14 | - 'https://cdn.flixel.com/flixel/lcgczt9lyh7qr0p7wnyj.hd.mp4' 15 | - 'https://cdn.flixel.com/flixel/knkmvjypn212ywzh4s7q.hd.mp4' 16 | - 'https://cdn.flixel.com/flixel/nl2m3img5siuxsp2cz7e.hd.mp4' 17 | - 'https://cdn.flixel.com/flixel/vn1d788icpyow95oxphk.hd.mp4' 18 | below_horizon: 19 | - 'https://cdn.flixel.com/flixel/qebkh12wmojz8d35mdw5.hd.mp4' 20 | - 'https://cdn.flixel.com/flixel/edszxo70ja5nlgziwswc.hd.mp4' 21 | - 'https://cdn.flixel.com/flixel/l9ntkcybth4ihlggs98f.hd.mp4' 22 | - 'https://cdn.flixel.com/flixel/3lnfjmvxhcv2mrxh8f0v.hd.mp4' 23 | views: 24 | - path: lights 25 | config: 26 | enabled: false 27 | - path: chores 28 | config: 29 | enabled: false 30 | - path: vacuum 31 | config: 32 | enabled: false 33 | - path: music 34 | config: 35 | enabled: false 36 | - path: tv 37 | config: 38 | enabled: false 39 | - path: energy 40 | config: 41 | enabled: false 42 | - path: weather 43 | config: 44 | background: linear-gradient(to right, rgba(0,0,0,.33), rgba(0,0,0,1)) 45 | default_url: "https://cdn.flixel.com/flixel/ypy8bw9fgw1zv2b4htp2.hd.mp4" 46 | entity: weather.valhalla_2 47 | state_url: 48 | 'sunny': 49 | - "https://cdn.flixel.com/flixel/hlhff0h8md4ev0kju5be.hd.mp4" 50 | 'partlycloudy': 51 | - "https://cdn.flixel.com/flixel/13e0s6coh6ayapvdyqnv.hd.mp4" 52 | - "https://cdn.flixel.com/flixel/aorl3skmssy7udwopk22.hd.mp4" 53 | - "https://cdn.flixel.com/flixel/qed6wvf2igukiioykg3r.hd.mp4" 54 | - "https://cdn.flixel.com/flixel/3rd72eezaj6d23ahlo7y.hd.mp4" 55 | - "https://cdn.flixel.com/flixel/9m11gd43m6qn3y93ntzp.hd.mp4" 56 | - "https://cdn.flixel.com/flixel/hrkw2m8eofib9sk7t1v2.hd.mp4" 57 | 58 | 'cloudy': 59 | - "https://cdn.flixel.com/flixel/13e0s6coh6ayapvdyqnv.hd.mp4" 60 | - "https://cdn.flixel.com/flixel/aorl3skmssy7udwopk22.hd.mp4" 61 | - "https://cdn.flixel.com/flixel/qed6wvf2igukiioykg3r.hd.mp4" 62 | - "https://cdn.flixel.com/flixel/3rd72eezaj6d23ahlo7y.hd.mp4" 63 | - "https://cdn.flixel.com/flixel/9m11gd43m6qn3y93ntzp.hd.mp4" 64 | - "https://cdn.flixel.com/flixel/hrkw2m8eofib9sk7t1v2.hd.mp4" 65 | 66 | 'mostlycloudy': 67 | - "https://cdn.flixel.com/flixel/e95h5cqyvhnrk4ytqt4q.hd.mp4" 68 | - "https://cdn.flixel.com/flixel/l2bjw34wnusyf5q2qq3p.hd.mp4" 69 | - "https://cdn.flixel.com/flixel/rrgta099ulami3zb9fd2.hd.mp4" 70 | 71 | 'clear-night': 72 | - "https://cdn.flixel.com/flixel/x9dr8caygivq5secll7i.hd.mp4" 73 | 'fog': 74 | - "https://cdn.flixel.com/flixel/vwqzlk4turo2449be9uf.hd.mp4" 75 | 'rainy': "https://cdn.flixel.com/flixel/f0w23bd0enxur5ff0bxz.hd.mp4" 76 | - path: climate 77 | config: 78 | enabled: false 79 | 80 | decluttering_templates: !include templates/decluttering-card.yaml 81 | button_card_templates: !include_dir_merge_named templates/button-card/ 82 | 83 | views: 84 | - !include smartdisplays/views/home.yaml 85 | - !include smartdisplays/views/start.yaml 86 | - !include smartdisplays/views/chores.yaml 87 | - !include smartdisplays/views/lights.yaml 88 | - !include smartdisplays/views/climate.yaml 89 | - !include smartdisplays/views/vacuum.yaml 90 | - !include smartdisplays/views/music.yaml 91 | - !include smartdisplays/views/tv.yaml 92 | - !include smartdisplays/views/energy.yaml 93 | - !include smartdisplays/views/weather.yaml 94 | 95 | 96 | -------------------------------------------------------------------------------- /lovelace-resources.yaml: -------------------------------------------------------------------------------- 1 | # LOVELACE RESOURCES 2 | 3 | - url: https://unpkg.com/moment@2.29.3/min/moment.min.js 4 | type: js 5 | - url: /hacsfiles/lovelace-mushroom/mushroom.js?hacstag=44435037518022 6 | type: module 7 | - url: /local/metro.css?version=20220902 8 | type: css 9 | - url: /hacsfiles/lovelace-card-tools/card-tools.js 10 | type: module 11 | - url: /hacsfiles/mini-graph-card/mini-graph-card-bundle.js?hacstag=1512800620110 12 | type: module 13 | - url: /hacsfiles/lovelace-layout-card/layout-card.js 14 | type: module 15 | - url: /hacsfiles/lovelace-multiple-entity-row/multiple-entity-row.js 16 | type: module 17 | - url: /hacsfiles/uptime-card/uptime-card.js 18 | type: module 19 | # - url: /hacsfiles/bar-card/bar-card.js 20 | # type: module 21 | - url: /hacsfiles/vacuum-card/vacuum-card.js?hacstag=261291295263 22 | type: module 23 | # - url: /hacsfiles/lovelace-swipe-navigation/swipe-navigation.js 24 | # type: module 25 | - url: /hacsfiles/decluttering-card/decluttering-card.js 26 | type: module 27 | - url: /hacsfiles/lovelace-auto-entities/auto-entities.js 28 | type: module 29 | - url: /hacsfiles/lovelace-card-mod/card-mod.js?hacstag=190927524314 30 | type: module 31 | - url: /hacsfiles/button-card/button-card.js?hacstag=146194325342 32 | type: module 33 | - url: /hacsfiles/harmony-card/harmony-card.js?hacstag=2375327500141 34 | type: module 35 | - url: /hacsfiles/slider-button-card/slider-button-card.js 36 | type: module 37 | - url: /hacsfiles/logbook-card/logbook-card.js?hacstag=216008446141 38 | type: module 39 | - url: /hacsfiles/ha-floorplan/floorplan.js?hacstag=1883234941030 40 | type: module 41 | - url: /hacsfiles/apexcharts-card/apexcharts-card.js?hacstag=331701152201 42 | type: module 43 | # - url: /hacsfiles/lovelace-more-info-card/more-info-card.js?hacstag=1805289500994 44 | # type: module 45 | # - url: /hacsfiles/kiosk-mode/kiosk-mode.js?hacstag=303101606172 46 | # type: module 47 | - url: /hacsfiles/mini-media-player/mini-media-player-bundle.js?hacstag=1485208381162 48 | type: module 49 | - url: /hacsfiles/lovelace-state-switch/state-switch.js?hacstag=158756598193 50 | type: module 51 | - url: /hacsfiles/lovelace-canary/canary.js?hacstag=245159052034 52 | type: module 53 | - url: /local/swipe-card.js?version=202209042 54 | type: module 55 | # - url: /hacsfiles/circle-sensor-card/circle-sensor-card.js?hacstag=141952963122 56 | # type: module 57 | - url: /hacsfiles/lovelace-template-entity-row/template-entity-row.js?hacstag=231674882130 58 | type: module 59 | - url: /hacsfiles/list-card/list-card.js?hacstag=145479324011 60 | type: module 61 | # - url: /hacsfiles/config-template-card/config-template-card.js?hacstag=172177543136 62 | # type: module 63 | - url: /hacsfiles/home-assistant-sun-card/home-assistant-sun-card.js?hacstag=123456 64 | type: module 65 | - url: /hacsfiles/weather-chart-card/weather-chart-card.js?hacstag=163941792120 66 | type: module 67 | # - url: /hacsfiles/lovelace-media-art-background/media-art-background.js?hacstag=20287427051370 68 | # type: module 69 | - url: /hacsfiles/lovelace-animated-background/animated-background.js?hacstag=202743061063 70 | type: module 71 | # - url: /local/aos.css 72 | # type: css 73 | # - url: /local/aos.js 74 | # type: module 75 | - url: /hacsfiles/ha-sankey-chart/ha-sankey-chart.js?hacstag=455846088040 76 | type: module 77 | - url: /hacsfiles/lovelace-home-feed-card/lovelace-home-feed-card.js 78 | type: module 79 | - url: /hacsfiles/lovelace-fold-entity-row/fold-entity-row.js 80 | type: module 81 | - url: /hacsfiles/lovelace-card-templater/lovelace-card-templater.js 82 | type: module 83 | # - url: /hacsfiles/history-explorer-card/history-explorer-card.js 84 | # type: module 85 | - url: /hacsfiles/hourly-weather/hourly-weather.js 86 | type: module 87 | - url: /hacsfiles/PlexMeetsHomeAssistant/plex-meets-homeassistant.js 88 | type: module 89 | - url: /hacsfiles/lovelace-xiaomi-vacuum-map-card/xiaomi-vacuum-map-card.js 90 | type: module 91 | - url: /hacsfiles/lovelace-windrose-card/windrose-card.js 92 | type: module 93 | - url: /hacsfiles/lovelace-lightning-detector-card/lightning-detector-card.js 94 | type: module 95 | - url: /hacsfiles/lovelace-thermostat-card/main.js 96 | type: module 97 | -------------------------------------------------------------------------------- /ui/shared/cards/traffic-bridges-and-tunnels.yaml: -------------------------------------------------------------------------------- 1 | type: entities 2 | title: Bridges + Tunnels 3 | entities: 4 | - entity: sensor.mta_bt_alerts_queens_midtown_tunnel 5 | - entity: sensor.mta_bt_alerts_triboro_bridge 6 | name: Triboro Bridge 7 | - entity: sensor.mta_bt_alerts_bronx_whitestone_bridge 8 | name: Whitestone Bridge 9 | - entity: sensor.mta_bt_alerts_battery_tunnel 10 | name: Battery Tunnel 11 | - entity: sensor.mta_bt_alerts_verrazzano_narrows_bridge 12 | name: Verrazzano Bridge 13 | - type: custom:fold-entity-row 14 | head: 15 | type: section 16 | label: More Bridges + Tunnels 17 | padding: 0 18 | entities: 19 | - type: custom:multiple-entity-row 20 | entity: sensor.panynj_bt_crossing_holland_tunnel_eastbound 21 | name: Holland Tunnel 22 | show_state: false 23 | entities: 24 | - entity: sensor.panynj_bt_crossing_holland_tunnel_eastbound 25 | name: To NY 26 | styles: 27 | text-align: left 28 | - entity: sensor.panynj_bt_crossing_holland_tunnel_westbound 29 | name: To NJ 30 | styles: 31 | text-align: left 32 | - type: custom:multiple-entity-row 33 | entity: sensor.panynj_bt_crossing_george_washington_bridge_lower_eastbound 34 | name: George Washinton Bridge (Lower) 35 | show_state: false 36 | entities: 37 | - entity: sensor.panynj_bt_crossing_george_washington_bridge_lower_eastbound 38 | name: To NY 39 | styles: 40 | text-align: left 41 | - entity: sensor.panynj_bt_crossing_george_washington_bridge_lower_westbound 42 | name: To NJ 43 | styles: 44 | text-align: left 45 | - type: custom:multiple-entity-row 46 | entity: sensor.panynj_bt_crossing_george_washington_bridge_upper_eastbound 47 | name: George Washinton Bridge (Upper) 48 | show_state: false 49 | entities: 50 | - entity: sensor.panynj_bt_crossing_george_washington_bridge_upper_eastbound 51 | name: To NY 52 | styles: 53 | text-align: left 54 | - entity: sensor.panynj_bt_crossing_george_washington_bridge_upper_westbound 55 | name: To NJ 56 | styles: 57 | text-align: left 58 | - entity: sensor.mta_bt_alerts_throgs_neck_bridge 59 | - entity: sensor.mta_bt_alerts_henry_hudson_bridge 60 | - entity: sensor.mta_bt_alerts_marine_parkway_bridge 61 | - entity: sensor.mta_bt_alerts_cross_bay_bridge 62 | - type: custom:multiple-entity-row 63 | entity: sensor.panynj_bt_crossing_lincoln_tunnel_eastbound 64 | name: Lincoln Tunnel 65 | show_state: false 66 | entities: 67 | - entity: sensor.panynj_bt_crossing_lincoln_tunnel_eastbound 68 | name: To NY 69 | styles: 70 | text-align: left 71 | - entity: sensor.panynj_bt_crossing_lincoln_tunnel_westbound 72 | name: To NJ 73 | styles: 74 | text-align: left 75 | - type: custom:multiple-entity-row 76 | entity: sensor.panynj_bt_crossing_goethals_bridge_eastbound 77 | name: Goethals Bridge 78 | show_state: false 79 | entities: 80 | - entity: sensor.panynj_bt_crossing_goethals_bridge_eastbound 81 | name: To NY 82 | styles: 83 | text-align: left 84 | - entity: sensor.panynj_bt_crossing_goethals_bridge_westbound 85 | name: To NJ 86 | styles: 87 | text-align: left 88 | - type: custom:multiple-entity-row 89 | entity: sensor.panynj_bt_crossing_outerbridge_crossing_eastbound 90 | name: Outerbridge Crossing 91 | show_state: false 92 | entities: 93 | - entity: sensor.panynj_bt_crossing_outerbridge_crossing_eastbound 94 | name: To NY 95 | styles: 96 | text-align: left 97 | - entity: sensor.panynj_bt_crossing_outerbridge_crossing_westbound 98 | name: To NJ 99 | styles: 100 | text-align: left 101 | -------------------------------------------------------------------------------- /ui/templates/button-card/header-cards.yaml: -------------------------------------------------------------------------------- 1 | # METROLOGY FOR HOME ASSISTANT 2 | # Button Card Templates 3 | # Made by Madelena Mak 2022 4 | 5 | 6 | ## HEADERS AND TITLE CARDS 7 | 8 | # Title Card (with icon) 9 | 10 | title_card_with_icon: 11 | layout: icon_name_state2nd 12 | tap_action: 13 | action: none 14 | styles: 15 | grid: 16 | - grid-template-rows: auto 17 | - grid-template-columns: max-content auto 18 | name: 19 | - font-size: var(--title-font-size) 20 | - font-weight: var(--title-font-weight) 21 | - place-self: center start 22 | card: 23 | - background: none 24 | - padding: 8px 0 0 25 | img_cell: 26 | - width: 48px 27 | - padding: 4px 24px 4px 16px 28 | - place-self: center 29 | icon: 30 | - opacity: 0.8 31 | - color: var(--primary-text-color) 32 | - width: 100% 33 | state: 34 | - font-size: 10pt 35 | - place-self: start 36 | - padding-bottom: 8px 37 | 38 | 39 | # Header Card 40 | 41 | header_card: 42 | variables: 43 | name: '' 44 | label: '' 45 | arrow: 'mdi:arrow-right' 46 | action: navigate 47 | link: '' 48 | service: '' 49 | service_data: '' 50 | subheader: false 51 | 52 | show_name: false 53 | show_state: false 54 | show_label: false 55 | 56 | styles: 57 | grid: 58 | - grid-template-columns: auto min-content 16px 59 | - grid-template-rows: '[[[ return variables.subheader ? "10px auto 8px" : "26px auto 8px" ]]]' 60 | - grid-template-areas: "'header .' 'header link' 'header .'" 61 | card: 62 | - background: none 63 | - padding: 0 64 | 65 | custom_fields: 66 | header: 67 | card: 68 | type: 'custom:button-card' 69 | template: 70 | - header_card_no_link 71 | name: '[[[ return variables.name ]]]' 72 | variables: 73 | subheader: '[[[ return variables.subheader ]]]' 74 | 75 | link: 76 | card: 77 | type: 'custom:button-card' 78 | name: '[[[ return variables.label ]]]' 79 | icon: '[[[ return variables.arrow ]]]' 80 | show_state: false 81 | 82 | tap_action: 83 | action: '[[[ return variables.action ]]]' 84 | navigation_path: '[[[ return variables.link ]]]' 85 | url_path: '[[[ return variables.link ]]]' 86 | entity: '[[[ return variables.link ]]]' 87 | service: '[[[ return variables.service ]]]' 88 | service_data: '[[[ return variables.service_data ]]]' 89 | 90 | styles: 91 | grid: 92 | - grid-template-columns: min-content min-content 93 | - grid-template-areas: '"n i"' 94 | card: 95 | - background: none 96 | - padding: 0 97 | img_cell: 98 | - width: 16px 99 | - background: var(--ha-card-background) 100 | - border-radius: 0 4px 4px 0 101 | - padding-right: 8px 102 | icon: 103 | - width: 100% 104 | - padding-bottom: 2px 105 | name: 106 | - background: var(--ha-card-background) 107 | - border-radius: 4px 0 0 4px 108 | - padding: 4px 8px 6px 109 | - font-size: var(--subtitle-font-size) 110 | 111 | 112 | # Header Card (with no links) 113 | # Header text is 'name'. 114 | 115 | header_card_no_link: 116 | variables: 117 | name: '' 118 | subheader: false 119 | 120 | name: '[[[ return variables.name ]]]' 121 | show_state: false 122 | show_label: false 123 | 124 | tap_action: 125 | action: none 126 | 127 | styles: 128 | grid: 129 | - grid-template-columns: auto 130 | - grid-template-areas: '"n"' 131 | card: 132 | - padding: '[[[ return variables.subheader ? "16px 16px 16px 16px" : "32px 16px 16px 16px" ]]]' 133 | - background: none 134 | - cursor: default 135 | name: 136 | - text-align: left 137 | - align-self: center 138 | - justify-self: start 139 | - font-size: '[[[ return variables.subheader ? "var(--h6-font-size)" : "var(--subtitle-font-size)" ]]]' 140 | - font-weight: var(--subtitle-font-weight) 141 | - line-height: var(--subtitle-line-height) 142 | - color: var(--secondary-text-color) 143 | 144 | -------------------------------------------------------------------------------- /ui/views/machines/illinoise-plex-library.yaml: -------------------------------------------------------------------------------- 1 | 2 | type: 'custom:layout-card' 3 | layout_type: 'custom:grid-layout' 4 | layout: 5 | grid-template-columns: 'repeat(auto-fit, [col-start] minmax(360px, 1fr) [col-end])' 6 | grid-template-rows: auto 7 | xgrid-column-gap: 16px 8 | margin: -1px 9 | cards: 10 | 11 | - type: vertical-stack 12 | in_card: true 13 | cards: 14 | - type: entity 15 | entity: sensor.dorothy_library_flacs 16 | unit: Songs 17 | name: FLAC Library 18 | - type: entities 19 | entities: 20 | - entity: sensor.dorothy_library_flacs 21 | type: custom:multiple-entity-row 22 | name: Artists 23 | icon: mdi:account-music 24 | show_state: false 25 | entities: 26 | - attribute: artists 27 | - entity: sensor.dorothy_library_flacs 28 | type: custom:multiple-entity-row 29 | name: Albums 30 | icon: mdi:album 31 | show_state: false 32 | entities: 33 | - attribute: albums 34 | - entity: sensor.dorothy_library_movies 35 | type: custom:template-entity-row 36 | name: Last Added Item 37 | secondary: >- 38 | {{ state_attr('sensor.dorothy_library_flacs', 39 | 'last_added_timestamp') | relative_time }} ago 40 | state: >- 41 | {{ state_attr('sensor.dorothy_library_flacs', 42 | 'last_added_item') }} 43 | 44 | - type: vertical-stack 45 | in_card: true 46 | cards: 47 | - type: entity 48 | entity: sensor.dorothy_library_movies 49 | unit: Movies 50 | name: Movie Library 51 | - type: entities 52 | entities: 53 | - entity: sensor.dorothy_library_movies 54 | type: custom:template-entity-row 55 | name: Last Added Item 56 | secondary: >- 57 | {{ state_attr('sensor.dorothy_library_movies', 58 | 'last_added_timestamp') | relative_time }} ago 59 | state: >- 60 | {{ state_attr('sensor.dorothy_library_movies', 61 | 'last_added_item') }} 62 | 63 | - type: vertical-stack 64 | in_card: true 65 | cards: 66 | - type: entity 67 | entity: sensor.dorothy_library_photos 68 | unit: Photos 69 | name: Photo Library 70 | - type: entities 71 | entities: 72 | - entity: sensor.dorothy_library_photos 73 | type: custom:multiple-entity-row 74 | name: Photo Albums 75 | icon: mdi:image-multiple-outline 76 | show_state: false 77 | entities: 78 | - attribute: photoalbums 79 | - entity: sensor.dorothy_library_photos 80 | type: custom:template-entity-row 81 | name: Last Added Item 82 | secondary: >- 83 | {{ state_attr('sensor.dorothy_library_photos', 84 | 'last_added_timestamp') | relative_time }} ago 85 | state: >- 86 | {{ state_attr('sensor.dorothy_library_photos', 87 | 'last_added_item') }} 88 | 89 | - type: vertical-stack 90 | in_card: true 91 | cards: 92 | - type: entity 93 | entity: sensor.dorothy_library_tv_shows 94 | unit: Episodes 95 | name: TV Show Library 96 | - type: entities 97 | entities: 98 | - entity: sensor.dorothy_library_tv_shows 99 | type: custom:multiple-entity-row 100 | name: Shows 101 | icon: mdi:television-shimmer 102 | show_state: false 103 | entities: 104 | - attribute: shows 105 | - entity: sensor.dorothy_library_tv_shows 106 | type: custom:multiple-entity-row 107 | name: Seasons 108 | icon: mdi:filmstrip-box-multiple 109 | show_state: false 110 | entities: 111 | - attribute: seasons 112 | - entity: sensor.dorothy_library_tv_shows 113 | type: custom:template-entity-row 114 | name: Last Added Item 115 | secondary: >- 116 | {{ state_attr('sensor.dorothy_library_tv_shows', 117 | 'last_added_timestamp') | relative_time }} ago 118 | state: >- 119 | {{ state_attr('sensor.dorothy_library_tv_shows', 120 | 'last_added_item') }} 121 | -------------------------------------------------------------------------------- /ui/templates/button-card/sensors/sun.yaml: -------------------------------------------------------------------------------- 1 | 2 | sun_card: 3 | template: 4 | - live_tile_card 5 | - sun_variables 6 | entity: sun.sun 7 | show_icon: false 8 | color_type: icon 9 | state_display: | 10 | [[[ 11 | return variables.time_to_next_sun + " " + variables.time_to_next_sun_unit + "" 12 | ]]] 13 | name: '[[[ return "To " + variables.next_state ]]]' 14 | label: '[[[ return variables.next_sun_time ]]]' 15 | custom_fields: 16 | sun_card: 17 | card: 18 | type: 'custom:sun-card' 19 | style: > 20 | ha-card { aspect-ratio: 3/1; background: transparent; } 21 | .sun-card {padding: 0 !important; } 22 | .sun-card-header, .sun-card-footer {display: none 23 | !important; } 24 | .sun-card-body { 25 | padding-top: 0 !important; 26 | filter: sepia(1) saturate(5) hue-rotate(calc(var(--hue-primary-color) - 39deg)); 27 | } 28 | .sun-card-light { 29 | --sun-card-lines: var(--primary-text-color) !important; 30 | } 31 | styles: 32 | grid: 33 | - grid-template-areas: '"s s" "sun_card sun_card" "n l"' 34 | card: 35 | - background-image: | 36 | [[[ 37 | var opacity = 1 - (variables.time_to_next_sun / 90) 38 | if (variables.time_to_next_sun_unit != "min") { return '' } 39 | return 'linear-gradient( to top, rgba(var(--rgb-primary-color),' + opacity + ') 0%, rgba(var(--rgb-primary-color),' + opacity + ') 100%)' 40 | ]]] 41 | - color: | 42 | [[[ 43 | if (variables.time_to_next_sun_unit != "min") { return 'var(--primary-text-color)' } else { return 'var(--accent-text-color)'} 44 | ]]] 45 | label: 46 | - position: absolute 47 | - right: 12px 48 | - top: calc( 100% - 28px ) 49 | - text-align: right 50 | - color: var(--primary-text-color) 51 | - opacity: 0.5 52 | - padding: 0 0 10px 0 53 | - justify-self: end 54 | - align-self: end 55 | custom_fields: 56 | sun_card: 57 | - position: absolute 58 | - top: 33% 59 | - left: 0 60 | - height: 33% 61 | - width: 100% 62 | - mix-blend-mode: lighten 63 | 64 | sun_variables: 65 | entity: sun.sun 66 | variables: 67 | time_to_next_sun: |- 68 | [[[ 69 | if (entity.attributes.elevation >= 0) { 70 | var diff = -(new Date() - new Date(entity.attributes.next_setting)) / 1000 / 60 / 60 71 | if (diff > 1.5) { 72 | return Math.round(diff) 73 | } else { 74 | return Math.round(diff * 60) 75 | } 76 | } else { 77 | var diff = -(new Date() - new Date(entity.attributes.next_rising)) / 1000 / 60 / 60 78 | if (diff > 1.5) { 79 | return Math.round(diff) 80 | } else { 81 | return Math.round(diff * 60) 82 | } 83 | } 84 | ]]] 85 | 86 | time_to_next_sun_unit: |- 87 | [[[ 88 | if (entity.attributes.elevation >= 0) { 89 | var diff = -(new Date() - new Date(entity.attributes.next_setting)) / 1000 / 60 / 60 90 | if (diff > 1.5) { 91 | return "hr" 92 | } else { 93 | return "min" 94 | } 95 | } else { 96 | var diff = -(new Date() - new Date(entity.attributes.next_rising)) / 1000 / 60 / 60 97 | if (diff > 1.5) { 98 | return "hr" 99 | } else { 100 | return "min" 101 | } 102 | } 103 | ]]] 104 | 105 | next_state: |- 106 | [[[ 107 | if (entity.attributes.elevation >= 0) { 108 | return "Sunset" 109 | } else { 110 | return "Sunrise" 111 | } 112 | ]]] 113 | 114 | next_state_icon: |- 115 | [[[ 116 | if (entity.attributes.elevation >= 0) { 117 | return "mdi:weather-sunset-down" 118 | } else { 119 | return "mdi:weather-sunset-up" 120 | } 121 | ]]] 122 | 123 | next_sun_time: |- 124 | [[[ 125 | if (entity.attributes.elevation >= 0) { 126 | var time = new Date(entity.attributes.next_setting) 127 | return moment(time).format("H:mm") 128 | } else { 129 | var time = new Date(entity.attributes.next_rising) 130 | return moment(time).format("H:mm") 131 | } 132 | ]]] -------------------------------------------------------------------------------- /ui/smartdisplays/views/lights.yaml: -------------------------------------------------------------------------------- 1 | # AMBIENT DASHBOARD 2 | # Lights App 3 | # Made by Madelena Mak 2022 4 | 5 | title: Lights 6 | path: lights 7 | type: panel 8 | cards: 9 | 10 | - type: 'custom:mod-card' 11 | card_mod: !include ../snippets/slideshow-mod-card-bg.yaml 12 | 13 | card: 14 | 15 | type: 'custom:layout-card' 16 | layout_type: 'custom:grid-layout' 17 | layout: 18 | margin: '-1px' 19 | grid-template-areas: '"topbar" "tiles"' 20 | grid-template-rows: 100% 0 21 | grid-template-columns: 100% 22 | cards: 23 | 24 | 25 | # Title Bar 26 | 27 | - type: 'custom:layout-card' 28 | layout_type: 'custom:grid-layout' 29 | view_layout: 30 | grid-area: topbar 31 | card_margin: 0 32 | layout: 33 | grid-template-rows: auto 34 | grid-template-columns: '12.5vw auto 25vw' 35 | margin: 0 36 | padding: 0 37 | cards: 38 | 39 | - !include ../snippets/topbar-back-button.yaml 40 | 41 | - type: 'custom:button-card' 42 | template: slide_page_title 43 | name: LIGHTS 44 | 45 | 46 | # Tiles 47 | 48 | - type: 'custom:layout-card' 49 | layout_type: 'custom:grid-layout' 50 | layout: 51 | grid-template-columns: 100vw 52 | margin: -5.33vh 0 0 0 53 | view_layout: 54 | grid-area: tiles 55 | cards: 56 | 57 | - type: 'custom:swipe-card' 58 | card_mod: 59 | style: | 60 | .swiper-slide { width: fit-content !important; } 61 | .swiper-wrapper { padding-left: 7.5vw !important; } 62 | 63 | parameters: 64 | autoHeight: true 65 | slidesPerView: auto 66 | xspaceBetween: '5vw' 67 | keyboard: 68 | enabled: true 69 | cards: 70 | 71 | - type: 'custom:layout-card' 72 | layout_type: 'custom:grid-layout' 73 | layout: 74 | margin: 0 75 | padding: 0 0 0 5vw 76 | cards: 77 | 78 | - type: 'custom:button-card' 79 | template: slide_header_card_no_link 80 | variables: 81 | name: KITCHEN 82 | label: Scenes 83 | action: more-info 84 | link: popup.kitchen_scenes 85 | 86 | - type: 'custom:layout-card' 87 | layout_type: 'custom:grid-layout' 88 | layout: !include ../snippets/slideshow-tiles-layout-options.yaml 89 | cards: !include ../../shared/columns/lights-kitchen.yaml 90 | 91 | - type: 'custom:layout-card' 92 | layout_type: 'custom:grid-layout' 93 | layout: 94 | margin: 0 95 | padding: 0 0 0 5vw 96 | cards: 97 | 98 | - type: 'custom:button-card' 99 | template: slide_header_card_no_link 100 | variables: 101 | name: LIVING ROOM 102 | label: Scenes 103 | action: more-info 104 | link: popup.kitchen_scenes 105 | 106 | - type: 'custom:layout-card' 107 | layout_type: 'custom:grid-layout' 108 | layout: !include ../snippets/slideshow-tiles-layout-options.yaml 109 | cards: !include ../../shared/columns/lights-living-room.yaml 110 | 111 | - type: 'custom:layout-card' 112 | layout_type: 'custom:grid-layout' 113 | layout: 114 | margin: 0 115 | padding: 0 12.5vw 0 5vw 116 | cards: 117 | 118 | - type: 'custom:button-card' 119 | template: slide_header_card_no_link 120 | variables: 121 | name: LIVING ROOM ACCENTS 122 | label: Scenes 123 | action: more-info 124 | link: popup.kitchen_scenes 125 | 126 | - type: 'custom:layout-card' 127 | layout_type: 'custom:grid-layout' 128 | layout: !include ../snippets/slideshow-tiles-layout-options.yaml 129 | cards: !include ../../shared/columns/lights-living-room-accents.yaml 130 | -------------------------------------------------------------------------------- /config/multiscrape/weather.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Open UV Forecast 3 | # It looks like the number of results will change according to the number of hours with daylight, so this is going to be tricky to extract. 4 | 5 | - name: OpenUV Forecast 6 | resource: !secret openuv_url 7 | scan_interval: 14400 8 | headers: 9 | x-access-token: !secret openuv_key 10 | Content-Type: application/json 11 | sensor: 12 | 13 | - unique_id: openuv_forecast 14 | name: OpenUV - Hourly Forecast 15 | value_template: OK 16 | icon: mdi:weather-sunny-alert 17 | attributes: 18 | - name: result 19 | value_template: '{{ value_json.result }}' 20 | 21 | 22 | # OpenMeteo Air Quality Hourly Forecast 23 | # Another bizarre API that returns a giant array for each weather variable. 24 | 25 | - name: OpenMeteo Forecast 26 | resource: !secret openmeteo_api 27 | scan_interval: 14400 28 | sensor: 29 | 30 | - unique_id: openmeteo_aq_forecast 31 | name: OpenMeteo - Hourly Forecast 32 | value_template: OK 33 | icon: mdi:weather-windy 34 | attributes: 35 | - name: time 36 | value_template: '{{ value_json.hourly.time }}' 37 | - name: us_aqi_pm2_5 38 | value_template: '{{ value_json.hourly.us_aqi_pm2_5 }}' 39 | - name: us_aqi_pm10 40 | value_template: '{{ value_json.hourly.us_aqi_pm10 }}' 41 | - name: us_aqi_o3 42 | value_template: '{{ value_json.hourly.us_aqi_o3 }}' 43 | 44 | 45 | - name: WAQI Forecast 46 | resource: !secret waqi_api 47 | scan_interval: 14400 48 | sensor: 49 | 50 | - unique_id: waqi_forecast_ozone 51 | name: WAQI - Daily Forecast - Ozone 52 | value_template: '{{ value_json.data.iaqi.o3.v }}' 53 | icon: mdi:weather-windy 54 | attributes: 55 | - name: 2d_ago 56 | value_template: '{{ value_json.data.forecast.daily.o3[0].avg }}' 57 | - name: 1d_ago 58 | value_template: '{{ value_json.data.forecast.daily.o3[1].avg }}' 59 | - name: 0d 60 | value_template: '{{ value_json.data.forecast.daily.o3[2].avg }}' 61 | - name: 1d 62 | value_template: '{{ value_json.data.forecast.daily.o3[3].avg }}' 63 | - name: 2d 64 | value_template: '{{ value_json.data.forecast.daily.o3[4].avg }}' 65 | - name: 3d 66 | value_template: '{{ value_json.data.forecast.daily.o3[5].avg }}' 67 | - name: 4d 68 | value_template: '{{ value_json.data.forecast.daily.o3[6].avg }}' 69 | - name: 5d 70 | value_template: '{{ value_json.data.forecast.daily.o3[7].avg }}' 71 | 72 | - unique_id: waqi_forecast_pm10 73 | name: WAQI - Daily Forecast - PM10 74 | value_template: '{{ value_json.data.iaqi.pm10.v }}' 75 | icon: mdi:weather-windy 76 | attributes: 77 | - name: 2d_ago 78 | value_template: '{{ value_json.data.forecast.daily.pm10[0].avg }}' 79 | - name: 1d_ago 80 | value_template: '{{ value_json.data.forecast.daily.pm10[1].avg }}' 81 | - name: 0d 82 | value_template: '{{ value_json.data.forecast.daily.pm10[2].avg }}' 83 | - name: 1d 84 | value_template: '{{ value_json.data.forecast.daily.pm10[3].avg }}' 85 | - name: 2d 86 | value_template: '{{ value_json.data.forecast.daily.pm10[4].avg }}' 87 | - name: 3d 88 | value_template: '{{ value_json.data.forecast.daily.pm10[5].avg }}' 89 | - name: 4d 90 | value_template: '{{ value_json.data.forecast.daily.pm10[6].avg }}' 91 | - name: 5d 92 | value_template: '{{ value_json.data.forecast.daily.pm10[7].avg }}' 93 | 94 | - unique_id: waqi_forecast_pm25 95 | name: WAQI - Daily Forecast - PM2.5 96 | value_template: '{{ value_json.data.iaqi.pm25.v }}' 97 | icon: mdi:weather-windy 98 | attributes: 99 | - name: 2d_ago 100 | value_template: '{{ value_json.data.forecast.daily.pm25[0].avg }}' 101 | - name: 1d_ago 102 | value_template: '{{ value_json.data.forecast.daily.pm25[1].avg }}' 103 | - name: 0d 104 | value_template: '{{ value_json.data.forecast.daily.pm25[2].avg }}' 105 | - name: 1d 106 | value_template: '{{ value_json.data.forecast.daily.pm25[3].avg }}' 107 | - name: 2d 108 | value_template: '{{ value_json.data.forecast.daily.pm25[4].avg }}' 109 | - name: 3d 110 | value_template: '{{ value_json.data.forecast.daily.pm25[5].avg }}' 111 | - name: 4d 112 | value_template: '{{ value_json.data.forecast.daily.pm25[6].avg }}' 113 | - name: 5d 114 | value_template: '{{ value_json.data.forecast.daily.pm25[7].avg }}' 115 | -------------------------------------------------------------------------------- /ui/views/machines/printers.yaml: -------------------------------------------------------------------------------- 1 | title: Printers 2 | path: printers 3 | 4 | type: 'custom:grid-layout' 5 | layout: 6 | grid-template-columns: 'repeat(auto-fill, [col-start] minmax(360px, 1fr) [col-end])' 7 | grid-column-gap: 32px 8 | margin: 0 16px 32px 9 | 10 | cards: 11 | 12 | - view_layout: 13 | grid-column: 1/-1 14 | type: 'custom:button-card' 15 | template: title_card_with_icon 16 | name: Printers 17 | icon: mdi:printer 18 | entity: binary_sensor.dorothy_illinoise 19 | 20 | - type: vertical-stack 21 | cards: 22 | - type: 'custom:button-card' 23 | template: header_card_no_link 24 | variables: 25 | name: BROTHER MFC-L2700DW 26 | - type: glance 27 | entities: 28 | - entity: sensor.brother_mfc_l2700dw_series 29 | - entity: sensor.mfc_l2700dw_status 30 | 31 | - type: entities 32 | style: | 33 | #states > div > * {overflow: visible !important;} 34 | entities: 35 | - entity: sensor.mfc_l2700dw_black_toner_remaining 36 | type: custom:button-card 37 | template: bar_row 38 | name: Black Toner 39 | variables: 40 | bar_color: 128,128,128 41 | - entity: sensor.mfc_l2700dw_drum_remaining_life 42 | type: custom:button-card 43 | template: bar_row 44 | name: Drum 45 | 46 | - type: entities 47 | entities: 48 | - entity: sensor.brother_mfc_l2700dw_series_uptime 49 | - entity: sensor.mfc_l2700dw_page_counter 50 | 51 | - type: vertical-stack 52 | cards: 53 | - type: 'custom:button-card' 54 | template: header_card_no_link 55 | variables: 56 | name: 'BROTHER HL-L3230CDW' 57 | - type: glance 58 | entities: 59 | - entity: sensor.brother_hl_l3230cdw_series 60 | - entity: sensor.hl_l3230cdw_status 61 | 62 | - type: entities 63 | style: | 64 | #states > div > * {overflow: visible !important;} 65 | entities: 66 | - entity: sensor.brother_hl_l3230cdw_series_c 67 | type: custom:button-card 68 | template: bar_row 69 | name: Cyan Toner 70 | variables: 71 | bar_color: 0,255,255 72 | - entity: sensor.brother_hl_l3230cdw_series_m 73 | type: custom:button-card 74 | template: bar_row 75 | name: Magenta Toner 76 | variables: 77 | bar_color: 255,0,255 78 | - entity: sensor.brother_hl_l3230cdw_series_y 79 | type: custom:button-card 80 | template: bar_row 81 | name: Yellow Toner 82 | variables: 83 | bar_color: 255,255,0 84 | - entity: sensor.brother_hl_l3230cdw_series_bk 85 | type: custom:button-card 86 | template: bar_row 87 | name: Black Toner 88 | variables: 89 | bar_color: 128,128,128 90 | - entity: sensor.hl_l3230cdw_cyan_drum_remaining_life 91 | type: custom:button-card 92 | template: bar_row 93 | name: Cyan Drum 94 | variables: 95 | bar_color: 0,255,255 96 | - entity: sensor.hl_l3230cdw_magenta_drum_remaining_life 97 | type: custom:button-card 98 | template: bar_row 99 | name: Magenta Drum 100 | variables: 101 | bar_color: 255,0,255 102 | - entity: sensor.hl_l3230cdw_yellow_drum_remaining_life 103 | type: custom:button-card 104 | template: bar_row 105 | name: Yellow Drum 106 | variables: 107 | bar_color: 255,255,0 108 | - entity: sensor.hl_l3230cdw_black_drum_remaining_life 109 | type: custom:button-card 110 | template: bar_row 111 | name: Black Drum 112 | variables: 113 | bar_color: 128,128,128 114 | - entity: sensor.hl_l3230cdw_fuser_remaining_life 115 | type: custom:button-card 116 | template: bar_row 117 | name: Fuser 118 | - entity: sensor.hl_l3230cdw_pf_kit_1_remaining_life 119 | type: custom:button-card 120 | template: bar_row 121 | name: PF Kit 1 122 | - entity: sensor.hl_l3230cdw_belt_unit_remaining_life 123 | type: custom:button-card 124 | template: bar_row 125 | name: Belt Unit 126 | 127 | - type: entities 128 | entities: 129 | - entity: sensor.hl_l3230cdw_page_counter 130 | - entity: sensor.hl_l3230cdw_b_w_counter 131 | - entity: sensor.hl_l3230cdw_color_counter 132 | - entity: sensor.hl_l3230cdw_uptime 133 | -------------------------------------------------------------------------------- /ui/views/rooms/living-room.yaml: -------------------------------------------------------------------------------- 1 | # MAXIMALIST DASHBOARD 2 | # Living Room View 3 | # Made by Madelena Mak 2022 4 | 5 | title: Living Room 6 | path: living-room 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.yaml 15 | view_layout: 16 | grid-area: cc 17 | cards: 18 | 19 | # [Header] Summary 20 | 21 | - type: 'custom:layout-card' 22 | layout_type: 'custom:grid-layout' 23 | layout: !include ../../shared/snippets/layout-page-title.yaml 24 | view_layout: 25 | grid-column: 1/-1 26 | cards: 27 | 28 | - type: markdown 29 | style: !include ../../shared/snippets/style-markdown-page-title.yaml 30 | content: > 31 | # Living Room 32 | 33 | 34 | # [Column] Main Lights 35 | 36 | - type: 'custom:layout-card' 37 | layout_type: 'custom:grid-layout' 38 | layout: 39 | margin: -1 40 | cards: 41 | 42 | - type: 'custom:button-card' 43 | template: header_card 44 | variables: 45 | name: MAIN LIGHTS 46 | label: Scenes 47 | action: more-info 48 | link: popup.living_room_scenes 49 | 50 | - type: 'custom:layout-card' 51 | layout_type: 'custom:grid-layout' 52 | layout: !include ../../shared/snippets/layout-live-tile.yaml 53 | cards: !include ../../shared/columns/lights-living-room.yaml 54 | 55 | 56 | # [Column] Living Room Accents 57 | 58 | - type: 'custom:layout-card' 59 | layout_type: 'custom:grid-layout' 60 | layout: 61 | margin: -1 62 | cards: 63 | 64 | - type: 'custom:button-card' 65 | template: header_card 66 | variables: 67 | name: ACCENT LIGHTS 68 | label: Scenes 69 | action: more-info 70 | link: popup.living_room_accents_scenes 71 | 72 | - type: 'custom:layout-card' 73 | layout_type: 'custom:grid-layout' 74 | layout: !include ../../shared/snippets/layout-live-tile.yaml 75 | cards: !include ../../shared/columns/lights-living-room-accents.yaml 76 | 77 | 78 | # [Column] Energy 79 | 80 | - type: 'custom:layout-card' 81 | layout_type: 'custom:grid-layout' 82 | layout: 83 | margin: -1 84 | cards: 85 | 86 | - type: 'custom:button-card' 87 | template: header_card_no_link 88 | variables: 89 | name: ENERGY 90 | 91 | - !include ../../shared/cards/energy-living-room.yaml 92 | 93 | 94 | # [Column] Security 95 | 96 | - type: 'custom:layout-card' 97 | layout_type: 'custom:grid-layout' 98 | layout: 99 | margin: -1 100 | cards: 101 | 102 | - type: 'custom:button-card' 103 | template: header_card_no_link 104 | variables: 105 | name: SECURITY 106 | 107 | - type: 'custom:layout-card' 108 | layout_type: 'custom:grid-layout' 109 | layout: 110 | margin: -1 111 | cards: !include ../../shared/secret/security-living-room.yaml 112 | 113 | 114 | # [Column] Chores 115 | 116 | - type: 'custom:layout-card' 117 | layout_type: 'custom:grid-layout' 118 | layout: 119 | margin: -1 120 | cards: 121 | 122 | - type: 'custom:button-card' 123 | template: header_card_no_link 124 | variables: 125 | name: CHORES 126 | 127 | - !include ../../shared/cards/chores-living-room.yaml 128 | 129 | 130 | # [Column] Environment 131 | 132 | - type: 'custom:layout-card' 133 | layout_type: 'custom:grid-layout' 134 | layout: !include ../../shared/snippets/layout-live-tile.yaml 135 | cards: 136 | 137 | - type: 'custom:button-card' 138 | template: header_card_no_link 139 | variables: 140 | name: ENVIRONMENT 141 | view_layout: 142 | grid-column: 1/-1 143 | 144 | - type: 'custom:button-card' 145 | template: 146 | - live_tile_with_graph 147 | - live_tile_with_state_unit 148 | entity: sensor.living_room_hue_sensor_temperature 149 | name: Temperature 150 | variables: 151 | aspect_ratio: 2 152 | line_width: 2 153 | graph_height: 96 154 | view_layout: 155 | grid-column: span 2 156 | -------------------------------------------------------------------------------- /ui/smartdisplays/views/start.yaml: -------------------------------------------------------------------------------- 1 | # AMBIENT DASHBOARD 2 | # Start Menu 3 | # Made by Madelena Mak 2022 4 | 5 | type: 'custom:grid-layout' 6 | title: Menu 7 | path: start 8 | layout: 9 | grid-template-rows: 100vh 10 | grid-template-columns: 100vw 11 | margin: 0 12 | cards: 13 | 14 | - type: 'custom:mod-card' 15 | card: 16 | type: 'custom:layout-card' 17 | layout_type: 'custom:grid-layout' 18 | layout: 19 | grid-template-rows: 100vh 20 | grid-template-columns: 100vw 21 | margin: 0 22 | padding: 0 23 | cards: 24 | 25 | - type: custom:button-card 26 | show_name: false 27 | show_state: false 28 | show_icon: false 29 | styles: 30 | grid: 31 | - grid-template-areas: '"back swipe_card"' 32 | - grid-template-columns: 15vw auto 33 | - align-items: start 34 | card: 35 | - padding: 0 36 | - background: none 37 | custom_fields: 38 | 39 | back: 40 | card: !include ../snippets/topbar-back-button.yaml 41 | 42 | swipe_card: 43 | card: 44 | type: 'custom:swipe-card' 45 | start_card: 2 46 | parameters: 47 | slidesPerView: 4 48 | direction: vertical 49 | height: '[[[ return window.innerHeight ]]]' 50 | effect: coverflow 51 | centeredSlides: true 52 | coverflowEffect: 53 | rotate: -10 54 | depth: 20 55 | initialSlide: 2 56 | card_mod: 57 | style: | 58 | .swiper-slide { transition: opacity .5s, transform !important; opacity: 0.33; } 59 | .swiper-slide-prev, .swiper-slide-next { opacity: 0.66; } 60 | .swiper-slide-active { opacity: 1; } 61 | 62 | cards: 63 | 64 | - type: 'custom:button-card' 65 | template: menu_item 66 | name: chores 67 | tap_action: 68 | action: navigate 69 | navigation_path: chores 70 | 71 | - type: 'custom:button-card' 72 | template: menu_item 73 | name: lights 74 | tap_action: 75 | action: navigate 76 | navigation_path: lights 77 | 78 | - type: 'custom:button-card' 79 | template: menu_item 80 | name: vacuum 81 | tap_action: 82 | action: navigate 83 | navigation_path: vacuum 84 | 85 | - type: 'custom:button-card' 86 | template: menu_item 87 | name: music+radio 88 | tap_action: 89 | action: navigate 90 | navigation_path: music 91 | 92 | - type: 'custom:button-card' 93 | template: menu_item 94 | name: tv+movies 95 | tap_action: 96 | action: navigate 97 | navigation_path: tv 98 | 99 | - type: 'custom:button-card' 100 | template: menu_item 101 | name: climate 102 | tap_action: 103 | action: navigate 104 | navigation_path: climate 105 | 106 | - type: 'custom:button-card' 107 | template: menu_item 108 | name: power usage 109 | tap_action: 110 | action: navigate 111 | navigation_path: energy 112 | 113 | - type: 'custom:button-card' 114 | template: menu_item 115 | name: weather 116 | tap_action: 117 | action: navigate 118 | navigation_path: weather 119 | 120 | card_mod: 121 | style: > 122 | ha-card { background: linear-gradient(to right, transparent, transparent, var(--primary-background-color), var(--primary-background-color)); background-position: 100% 0; background-size: 300% 100%; background-repeat: no-repeat; position: relative; 123 | height: 100vh; width: 100vw; margin: -1px; overflow: hidden; 124 | animation-name: fade-in; animation-timing-function: ease-out; 125 | animation-duration: 2s; } 126 | @keyframes fade-in { 127 | 0% {opacity: 0; transform: rotateY(80deg) translateX(200%); background-position: -300% 0;} 128 | 50% {opacity: 1; transform: rotateY(0deg) translateX(0%); background-position: 0% 0;} 129 | 100% {opacity: 1; transform: rotateY(0deg) translateX(0%); background-position: 100% 0;} 130 | } 131 | -------------------------------------------------------------------------------- /ui/shared/popups/scenes.yaml: -------------------------------------------------------------------------------- 1 | 2 | - type: custom:popup-card 3 | entity: popup.workspace_accents_scenes 4 | title: Workspace Accents Scenes 5 | card: 6 | type: 'custom:auto-entities' 7 | filter: 8 | template: | 9 | {% for state in states.scene -%} 10 | {%- if state.entity_id | regex_match('scene.workspace_accents_',ignorecase=False) -%} 11 | {%- set NAME = state_attr(state.entity_id,"friendly_name") | regex_replace(find='Workspace Accents ', replace='') -%} 12 | {{ 13 | { 'entity': state.entity_id, 14 | 'type': 'custom:button-card', 15 | 'template': 'hue_scene_card', 16 | 'variables': { 17 | 'name': NAME 18 | }, 19 | } 20 | }}, 21 | {%- endif -%} 22 | {%- endfor %} 23 | sort: 24 | method: friendly_name 25 | card: 26 | type: 'custom:layout-card' 27 | layout_type: 'custom:grid-layout' 28 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml 29 | view_layout: 30 | grid-column: 1/-1 31 | 32 | - type: custom:popup-card 33 | entity: popup.bedroom_scenes 34 | title: Bedroom Scenes 35 | card: 36 | type: 'custom:auto-entities' 37 | filter: 38 | template: | 39 | {% for state in states.scene -%} 40 | {%- if state.entity_id | regex_match('scene.bedroom_',ignorecase=False) -%} 41 | {%- set NAME = state_attr(state.entity_id,"friendly_name") | regex_replace(find='Bedroom ', replace='') -%} 42 | {{ 43 | { 'entity': state.entity_id, 44 | 'type': 'custom:button-card', 45 | 'template': 'hue_scene_card', 46 | 'variables': { 47 | 'name': NAME 48 | }, 49 | } 50 | }}, 51 | {%- endif -%} 52 | {%- endfor %} 53 | sort: 54 | method: friendly_name 55 | card: 56 | type: 'custom:layout-card' 57 | layout_type: 'custom:grid-layout' 58 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml 59 | view_layout: 60 | grid-column: 1/-1 61 | 62 | - type: custom:popup-card 63 | entity: popup.living_room_scenes 64 | title: Living Room Scenes 65 | card: 66 | type: 'custom:auto-entities' 67 | filter: 68 | template: | 69 | {% for state in states.scene -%} 70 | {%- if state.entity_id | regex_match('scene.living_room_main_',ignorecase=False) -%} 71 | {%- set NAME = state_attr(state.entity_id,"friendly_name") | regex_replace(find='Living Room Main ', replace='') -%} 72 | {{ 73 | { 'entity': state.entity_id, 74 | 'type': 'custom:button-card', 75 | 'template': 'hue_scene_card', 76 | 'variables': { 77 | 'name': NAME 78 | }, 79 | } 80 | }}, 81 | {%- endif -%} 82 | {%- endfor %} 83 | sort: 84 | method: friendly_name 85 | card: 86 | type: 'custom:layout-card' 87 | layout_type: 'custom:grid-layout' 88 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml 89 | view_layout: 90 | grid-column: 1/-1 91 | 92 | - type: custom:popup-card 93 | entity: popup.living_room_accents_scenes 94 | title: Living Room Accents Scenes 95 | card: 96 | type: 'custom:auto-entities' 97 | filter: 98 | template: | 99 | {% for state in states.scene -%} 100 | {%- if state.entity_id | regex_match('scene.living_room_accents_',ignorecase=False) -%} 101 | {%- set NAME = state_attr(state.entity_id,"friendly_name") | regex_replace(find='Living Room Accents ', replace='') -%} 102 | {{ 103 | { 'entity': state.entity_id, 104 | 'type': 'custom:button-card', 105 | 'template': 'hue_scene_card', 106 | 'variables': { 107 | 'name': NAME 108 | }, 109 | } 110 | }}, 111 | {%- endif -%} 112 | {%- endfor %} 113 | sort: 114 | method: friendly_name 115 | card: 116 | type: 'custom:layout-card' 117 | layout_type: 'custom:grid-layout' 118 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml 119 | view_layout: 120 | grid-column: 1/-1 121 | 122 | - type: custom:popup-card 123 | entity: popup.kitchen_scenes 124 | title: Kitchen Scenes 125 | card: 126 | type: 'custom:auto-entities' 127 | filter: 128 | template: | 129 | {% for state in states.scene -%} 130 | {%- if state.entity_id | regex_match('scene.kitchen_',ignorecase=False) -%} 131 | {%- set NAME = state_attr(state.entity_id,"friendly_name") | regex_replace(find='Kitchen ', replace='') -%} 132 | {{ 133 | { 'entity': state.entity_id, 134 | 'type': 'custom:button-card', 135 | 'template': 'hue_scene_card', 136 | 'variables': { 137 | 'name': NAME 138 | }, 139 | } 140 | }}, 141 | {%- endif -%} 142 | {%- endfor %} 143 | sort: 144 | method: friendly_name 145 | card: 146 | type: 'custom:layout-card' 147 | layout_type: 'custom:grid-layout' 148 | layout_options: !include ../../shared/snippets/layout-live-tile.yaml 149 | view_layout: 150 | grid-column: 1/-1 151 | -------------------------------------------------------------------------------- /config/groups/energy.yaml: -------------------------------------------------------------------------------- 1 | 2 | # ENERGY BY ROOMS 3 | 4 | energy_workspace: 5 | name: Workspace Energy 6 | entities: 7 | - sensor.astralplane_plug_smartenergy_metering 8 | - sensor.makery_plug_smartenergy_metering 9 | - sensor.quattro_plug_smartenergy_metering 10 | - sensor.workspace_lights_energy_use 11 | 12 | energy_bedroom: 13 | name: Bedroom Energy 14 | entities: 15 | - sensor.dorothy_plug_smartenergy_metering 16 | - sensor.dorothy_devices_plug_smartenergy_metering 17 | - sensor.bedroom_devices_plug_smartenergy_metering 18 | - sensor.bedroom_air_conditioner_plug_smartenergy_metering 19 | - sensor.bedroom_lights_energy_use 20 | 21 | energy_kitchen: 22 | name: Kitchen Energy 23 | entities: 24 | - sensor.kitchen_fridge_plug_smartenergy_metering 25 | - sensor.kitchen_microwave_plug_smartenergy_metering 26 | - sensor.kitchen_aerogardens_plug_smartenergy_metering 27 | - sensor.kitchen_lights_energy_use 28 | 29 | energy_kitchen_power_strip: 30 | name: Kitchen Power Strip 31 | entities: 32 | - sensor.kitchen_counter_echo_plug_current_consumption 33 | - sensor.kitchen_counter_hand_blender_current_consumption 34 | - sensor.kitchen_counter_kettle_current_consumption 35 | - sensor.kitchen_counter_plug_3_current_consumption 36 | - sensor.kitchen_counter_rice_cooker_current_consumption 37 | - sensor.kitchen_counter_toaster_current_consumption 38 | 39 | energy_living_room: 40 | name: Living Room Energy 41 | entities: 42 | - sensor.terpsichora_plug_smartenergy_metering 43 | - sensor.living_room_projector_plug_smartenergy_metering 44 | - sensor.living_room_air_conditioner_plug_smartenergy_metering 45 | - sensor.living_room_lights_energy_use 46 | 47 | 48 | # ENERGY BY CIRCUITS 49 | 50 | circuit_north: 51 | name: North Circuit 52 | entities: 53 | - sensor.valhalla_plug_smartenergy_metering 54 | 55 | circuit_south: 56 | name: South Circuit 57 | entities: 58 | - sensor.astralplane_plug_smartenergy_metering 59 | - sensor.bedroom_devices_plug_smartenergy_metering 60 | - sensor.kitchen_aerogardens_plug_smartenergy_metering 61 | - sensor.living_room_air_conditioner_plug_smartenergy_metering 62 | - sensor.makery_plug_smartenergy_metering 63 | - sensor.quattro_plug_smartenergy_metering 64 | - sensor.terpsichora_plug_smartenergy_metering 65 | - sensor.kitchen_sink_lights_power 66 | - sensor.kitchen_counter_accent_lights_power 67 | - sensor.living_room_hue_bowl_power 68 | - sensor.living_room_table_lights_power 69 | - sensor.bedroom_cloud_light_power 70 | 71 | circuit_center: 72 | name: Center Circuit 73 | entities: 74 | - sensor.dorothy_devices_plug_smartenergy_metering 75 | - sensor.dorothy_plug_smartenergy_metering 76 | - sensor.living_room_strala_light_power 77 | 78 | circuit_north_ceiling_lights: 79 | name: North Ceiling Lights Circuit 80 | entities: 81 | - sensor.hallway_light_power 82 | # Storage Light, Room B/C Lights 83 | 84 | circuit_living_room_lights: 85 | name: Living Room Lights Circuit 86 | entities: 87 | - sensor.living_room_chandelier_main_power 88 | - sensor.kitchen_spot_lights_power 89 | - sensor.kitchen_counter_lights_power 90 | - sensor.living_room_ramsele_light_power 91 | - sensor.living_room_random_light_power 92 | 93 | circuit_bedroom_ac: 94 | name: Bedroom A/C Circuit 95 | entities: 96 | - sensor.bedroom_air_conditioner_plug_smartenergy_metering 97 | # Dyson Fan also 98 | 99 | circuit_fridge_counter: 100 | name: Fridge + Kitchen Counter Circuit 101 | entities: 102 | - sensor.kitchen_fridge_plug_smartenergy_metering 103 | - sensor.kitchen_microwave_plug_smartenergy_metering 104 | - sensor.kitchen_counter_echo_plug_current_consumption 105 | - sensor.kitchen_counter_hand_blender_current_consumption 106 | - sensor.kitchen_counter_kettle_current_consumption 107 | - sensor.kitchen_counter_plug_3_current_consumption 108 | - sensor.kitchen_counter_rice_cooker_current_consumption 109 | - sensor.kitchen_counter_toaster_current_consumption 110 | 111 | circuit_living_room_projector: 112 | name: Living Room Projector Circuit 113 | entities: 114 | - sensor.living_room_projector_plug_smartenergy_metering 115 | - sensor.living_room_decor_lights_power 116 | 117 | 118 | # ENERGY CATEGORIES 119 | 120 | all_computers_energy_use: 121 | name: All Computers Energy Use 122 | entities: 123 | - sensor.valhalla_plug_smartenergy_metering 124 | - sensor.astralplane_plug_smartenergy_metering 125 | - sensor.makery_plug_smartenergy_metering 126 | - sensor.quattro_plug_smartenergy_metering 127 | - sensor.dorothy_plug_smartenergy_metering 128 | 129 | all_entertainement_energy_use: 130 | name: All Entertainment Energy Use 131 | entities: 132 | - sensor.dorothy_devices_plug_smartenergy_metering 133 | - sensor.terpsichora_plug_smartenergy_metering 134 | - sensor.living_room_projector_plug_smartenergy_metering 135 | 136 | all_kitchen_energy_use: 137 | name: All Kitchen Energy Use 138 | entities: 139 | - sensor.kitchen_aerogardens_plug_smartenergy_metering 140 | - sensor.kitchen_fridge_plug_smartenergy_metering 141 | - sensor.kitchen_microwave_plug_smartenergy_metering 142 | - sensor.kitchen_counter_echo_plug_current_consumption 143 | - sensor.kitchen_counter_hand_blender_current_consumption 144 | - sensor.kitchen_counter_kettle_current_consumption 145 | - sensor.kitchen_counter_plug_3_current_consumption 146 | - sensor.kitchen_counter_rice_cooker_current_consumption 147 | - sensor.kitchen_counter_toaster_current_consumption 148 | 149 | all_climate_energy_use: 150 | name: All Climate Energy Use 151 | entities: 152 | - sensor.living_room_air_conditioner_plug_smartenergy_metering 153 | - sensor.bedroom_air_conditioner_plug_smartenergy_metering 154 | --------------------------------------------------------------------------------