DIY Family Calendar (Skylight)

I was able to copy and past your YAML, which went a long way. Thank you! I think we i am struggling is adding other people such as my wife. And also making it look like the Skylight UI.

why am i getting this config error?


almost there just missing a few things and I cant seem to figure them out.

  1. I cant get the weather to show on the calendar in each individual square.

  2. When I click on birthdays and a person I get the error ā€œAction script.birthdays_calendar_visible_filter not foundā€

  3. Not sure why I keep getting the config error on the left of birthdays

  4. The bubble that say Jesus I cant change that to another color only stays grey.

Can someone explain what im doing wrong. I am attaching the YAML code

views:
  - type: sections
    title: Family Planner
    path: family-planner
    sections:
      - type: custom:better-moment-card
        parentStyle: |
          line-height:normal;
        moment:
          - parentStyle: |
              font-size:1em; text-align:center; margin-top:5px;
            templateRaw: |
              {{moment format=cccc}}
          - parentStyle: |
              font-size:1.5em; text-align:center; margin-top:5px;
            templateRaw: |
              {{moment format=LLLL dd, yyyy}}              
          - parentStyle: |
              font-size:4em;  text-align:center; font-weight:400;
            templateRaw: |
              {{moment format=HH:mm}} 
        card_mod:
          style: |
            ha-card {
              background: transparent !important;
              box-shadow: none !important;
              border: none !important;
            }
      - type: custom:weather-card
        entity: weather.forecast_home_2
        current: true
        details: true
        forecast: false
        card_mod:
          style: |
            ha-card {
              background: transparent !important;
              box-shadow: none !important;
              border: none !important;
            }
      - type: grid
        cards:
          - show_current: false
            show_forecast: true
            type: weather-forecast
            entity: weather.forecast_home_2
            forecast_type: daily
            forecast_slots: 10
            card_mod:
              style: |
                ha-card {
                  background: transparent !important;
                  box-shadow: none !important;
                  border: none !important;
                }
            grid_options:
              columns: 24
              rows: 3
        column_span: 2
      - type: grid
        cards:
          - type: vertical-stack
            cards:
              - type: markdown
                content: <font color="" size="12">Family Planner</font>
            grid_options:
              columns: 48
              rows: auto
        column_span: 4
      - cards:
          - type: horizontal-stack
            cards:
              - type: custom:bubble-card
                card_type: button
                button_type: state
                entity: person.jesus
                scrolling_effect: false
                show_icon: true
                show_name: true
                show_state: false
                tap_action:
                  action: perform-action
                  perform_action: script.jesus_calendar_visible_filter
                  target: {}
                button_action:
                  tap_action:
                    action: perform-action
                    perform_action: script.jesus_calendar_visible_filter
                    target: {}
                styles: |
                  .bubble-button-background {
                    opacity: 1 !important;
                    background-color: ${hass.states['input_text.jesus_calendar_filter'].state === '.*' ? 'light-grey' : 'blue'} !important;}
                  }
                modules:
                  - default
              - type: custom:bubble-card
                card_type: button
                button_type: state
                entity: person.person2
                scrolling_effect: false
                show_icon: true
                show_name: true
                show_state: false
                tap_action:
                  action: perform-action
                  perform_action: script.person2_calendar_visible_filter
                  target: {}
                button_action:
                  tap_action:
                    action: perform-action
                    perform_action: script.person2_calendar_visible_filter
                    target: {}
                styles: |
                  .bubble-button-background {
                    opacity: 1 !important;
                    background-color: ${hass.states['input_text.person2_calendar_filter'].state === '.*' ? 'light-grey' : '#e5f50c'} !important;}
                  }
                modules:
                  - default
              - type: custom:bubble-card
                card_type: button
                button_type: state
                entity: person.person3
                scrolling_effect: false
                show_icon: true
                show_name: true
                show_state: false
                tap_action:
                  action: perform-action
                  perform_action: script.person3_calendar_visible_filter
                  target: {}
                button_action:
                  tap_action:
                    action: perform-action
                    perform_action: script.person3_calendar_visible_filter
                    target: {}
                styles: |
                  .bubble-button-background {
                    opacity: 1 !important;
                    background-color: ${hass.states['input_text.person3_calendar_filter'].state === '.*' ? 'light-grey' : '#900cf5'} !important;}
                  }
                modules:
                  - default
              - type: custom:bubble-card
                card_type: button
                button_type: state
                entity: person.person4
                scrolling_effect: false
                show_icon: true
                show_name: true
                show_state: false
                tap_action:
                  action: perform-action
                  perform_action: script.person4_calendar_visible_filter
                  target: {}
                button_action:
                  tap_action:
                    action: perform-action
                    perform_action: script.person4_calendar_visible_filter
                    target: {}
                styles: |
                  .bubble-button-background {
                    opacity: 1 !important;
                    background-color: ${hass.states['input_text.person4_calendar_filter'].state === '.*' ? 'light-grey' : '#0cf537'} !important;}
                  }
                modules:
                  - default
              - type: custom:bubble-card
                card_type: button
                button_type: state
                entity: person.person5
                scrolling_effect: false
                show_icon: true
                show_name: true
                show_state: false
                tap_action:
                  action: perform-action
                  perform_action: script.person5_calendar_visible_filter
                  target: {}
                button_action:
                  tap_action:
                    action: perform-action
                    perform_action: script.person5_calendar_visible_filter
                    target: {}
                styles: |
                  .bubble-button-background {
                    opacity: 1 !important;
                    background-color: ${hass.states['input_text.person5_calendar_filter'].state === '.*' ? 'light-grey' : '#eb8af2'} !important;}
                  }
                modules:
                  - default
              - type: custom:bubble-card
                card_type: button
                button_type: state
                entity: person.birthdays
                name: Birthdays
                scrolling_effect: false
                show_icon: true
                show_name: true
                show_state: false
                tap_action:
                  action: perform-action
                  perform_action: script.birthdays_calendar_visible_filter
                  target: {}
                button_action:
                  tap_action:
                    action: perform-action
                    perform_action: script.birthdays_calendar_visible_filter
                    target: {}
                styles: |
                  .bubble-button-background {
                    opacity: 1 !important;
                    background-color: ${hass.states['input_text.birthdays_calendar_filter'].state === '.*' ? 'light-grey' : 'red'} !important;}
                  }
                modules:
                  - default
            grid_options:
              columns: 28
              rows: auto
        column_span: 3
      - type: custom:bubble-card
        card_type: button
        button_type: name
        card_layout: large
        name: Add Event
        icon: mdi:calendar-plus
        tap_action:
          action: navigate
          navigation_path: '#addcalendarevent'
        button_action:
          tap_action:
            action: navigate
            navigation_path: '#addcalendarevent'
        styles: |
          * { 
            font-size: 1.05em !important;    
          }
          ha-card {
            --bubble-main-background-color: #393745 !important;
            width: 300px;
          }    
          .bubble-icon {
            --mdc-icon-size: 30px !important;  
            color: snow !important;
            opacity: 1;
          }
          .bubble-icon-container {
            background: #393745 !important;
            display: flex;

          }
          .bubble-name {
            color: snow !important;
            opacity: 1;
            display: flex;
            line-height: 18px;
            flex-direction: row;
            justify-content: center;
            flex-grow: 1;
            margin: 0 40px 0 0;
            pointer-events: none;
            position: relative;
            overflow: hidden;
          }
      - type: custom:bubble-card
        card_type: select
        entity: input_select.calendar_view
        show_name: true
        show_state: true
        name: Select View
        show_last_changed: false
        show_attribute: false
        column_span: 1
      - type: custom:config-template-card
        entities:
          - input_text.person1_calendar_filter
          - input_text.person2_calendar_filter
          - input_text.person3_calendar_filter
          - input_text.person4_calendar_filter
          - input_text.person5_calendar_filter
          - input_text.birthdays_calendar_filter
          - input_select.calendar_view
        variables:
          PERSONCAL: states['input_text.person1_calendar_filter']?.state
          PERSON2CAL: states['input_text.person2_calendar_filter']?.state
          PERSON3CAL: states['input_text.person3_calendar_filter']?.state
          PERSON4CAL: states['input_text.person4_calendar_filter']?.state
          PERSON5CAL: states['input_text.person5_calendar_filter']?.state
          BIRCAL: states['input_text.birthdays_calendar_filter']?.state
          VIEW: states['input_select.calendar_view']?.state
          DAYS: |
            (() => {
              const calendarView = states['input_select.calendar_view']?.state;

              if (calendarView === 'Today') return 1;
              if (calendarView === 'Tomorrow') return 2;
              if (calendarView === 'Overmorrow') return 3;

              // Check for Month, Biweek, or Week based on screen width
              if (calendarView === 'Week') return 7;
              if (calendarView === 'Biweek') return 14;
              if (calendarView === 'Month') return 28;
              if (calendarView === 'Bimonth') return 56;

              // Default fallback to 7 if no condition matches
              return 28;
            })()
        card:
          type: custom:week-planner-card
          calendars:
            - entity: calendar.jesuschavana26_gmail_com
              name: person1
              color: '#80b690'
              filter: ${ PERSONCAL }
            - entity: calendar.person2
              name: person2
              color: '#e5f50c'
              filter: ${ PERSON2CAL }
            - entity: calendar.person3
              name: person3
              color: '#900cf5'
              filter: ${ PERSON3CAL }
            - entity: calendar.person4
              name: person4
              color: '#0cf537'
              filter: ${ PERSON4CAL }
            - entity: calendar.person5
              name: person5
              color: '#eb8af2'
              filter: ${ PERSON5CAL }
            - entity: calendar.birthdays
              name: Birthdays
              color: red
              filter: ${ BIRCAL }
          days: ${ DAYS }
          startingDayOffset: 0
          hideWeekend: false
          noCardBackground: false
          compact: false
          locale: en
          weather: null
          showCondition: true
          showTemperature: true
          showLowTemperature: true
          useTwiceDaily: false
          entity: weather.forecast_home_2
          showLocation: true
          hidePastEvents: false
          hideDaysWithoutEvents: false
          hideTodayWithoutEvents: false
          combineSimilarEvents: true
          showLegend: false
          legendToggle: false
          showNavigation: true
          texts:
            monday: Mon
            tuesday: Tue
            wednesday: Wed
            thursday: Thu
            friday: Fri
            saturday: Sat
            sunday: Sun
            yesterday: ''
            today: ⭐TODAY⭐
            tomorrow: ''
            overmorrow: ''
          card_mod:
            style: |
              ha-card {
                .container .navigation .data-year {
                    position: static;
                    right: 60px;
                }
                .event.past {
                  opacity: .2;
                  background-color: gray !important;
                }
                .time {
                  color: #333333 !important;
                  font-size: 0.8em !important;
                }
                .event {
                  color: #333333 !important;
                  line-height: 16px !important;
                  background-color: var(--border-color) !important;
                  border-radius: 10px !important;
                  max-height: 80px !important;
                  overflow: hidden !important;
                  font-size: 1.1em !important;
                }
                .none {
                  background-color: transparent !important;
                }
                .today .number {
                  border-radius: 5px;
                  background-color: orange !important;
                  padding-left: 4px;
                  padding-right: 4px;        
                }
                .day .date .text {
                  font-size: 1em !important;
                  font-weight: bold !important;
                }
                .day .date .number {
                  font-weight: bold !important;
                  font-size: 3em !important;
                }
                .day {
                  --background-color: red;
                  border: solid 1px whitesmoke;
                  padding: 0.2%;
                  width: 13% !important;
                }
                }
        column_span: 4
      - type: grid
        cards:
          - type: vertical-stack
            cards:
              - type: custom:bubble-card
                card_type: pop-up
                hash: '#addcalendarevent'
                button_type: name
                name: Add Calendar Event
                icon: mdi:calendar-plus
                scrolling_effect: false
                show_icon: true
                show_name: true
                styles: |
                  .bubble-button-card-container {
                    background: 
                    ${hass.states['input_select.calendar_select'].state == 
                    'person1' ? '#2d7bcf 
                    : hass.states['input_select.calendar_select'].state == 
                    'person2' ? '#e5f50c' 
                    : hass.states['input_select.calendar_select'].state == 
                    'person3' ? '#900cf5' 
                    : hass.states['input_select.calendar_select'].state == 
                    'person4' ? '#0cf537'
                    : hass.states['input_select.calendar_select'].state == 
                    'person5' ? '#eb8af2'
                    : hass.states['input_select.calendar_select'].state == 
                    'Birthdays' ? '#B2BEB5' 
                    : 'red'} !important;
                  }
              - type: vertical-stack
                cards:
                  - type: entities
                    entities:
                      - entity: input_select.calendar_select
                      - entity: input_text.calendar_event_title
                        name: Event Title
                      - entity: input_text.calendar_event_description
                        name: Event Description
                      - entity: input_boolean.calendar_all_day_event
                        name: All Day Event
                    title: Add Calendar Event
                    state_color: false
                  - type: conditional
                    conditions:
                      - entity: input_boolean.calendar_all_day_event
                        state: 'off'
                    card:
                      type: entities
                      entities:
                        - entity: input_datetime.calendar_event_start
                          name: Start Time
                        - entity: input_datetime.calendar_event_end
                          name: End Time
                  - type: conditional
                    conditions:
                      - entity: input_boolean.calendar_all_day_event
                        state: 'on'
                    card:
                      type: entities
                      entities:
                        - entity: input_datetime.calendar_day_event_start
                          name: Event Start Date
                        - entity: input_datetime.calendar_day_event_end
                          name: Event End Date
                  - type: custom:button-card
                    name: Add Event to Calendar
                    tap_action:
                      action: call-service
                      service: script.add_google_calendar_event
                    styles:
                      card:
                        - background-color: |
                            [[[
                              if (states['input_select.calendar_select'].state == 'person1')
                                return "#2d7bcf";
                              if (states['input_select.calendar_select'].state == 'person2')
                                return "#e5f50c";
                              if (states['input_select.calendar_select'].state == 'person3')
                                return "#900cf5";
                              if (states['input_select.calendar_select'].state == 'person4')
                                return "#0cf537";
                              if (states['input_select.calendar_select'].state == 'person5')
                                return "#eb8af2";
                              if (states['input_select.calendar_select'].state == 'Birthdays')
                                return "#33a02c";
                              return "gray";
                            ]]]
                column_span: 4
          - type: custom:week-planner-card
            calendars:
              - entity: calendar.jesuschavana26_gmail_com
                name: person1
                color: '#2d7bcf'
                filter: ${ PERSONCAL }
              - entity: calendar.person2
                name: person2
                color: '#e5f50c'
                filter: ${ PERSONCAL2 }
              - entity: calendar.person3
                name: person3
                color: '#900cf5'
                filter: ${ PERSONCAL3 }
              - entity: calendar.person4
                name: person4
                color: '#0cf537'
                filter: ${ PERSONCAL4 }
              - entity: calendar.person5
                name: person5
                color: '#eb8af2'
                filter: ${ PERSONCAL5 }
              - entity: calendar.birthdays
                name: Birthdays
                color: '#B2BEB5'
                filter: ${ BIRCAL }
            days: ${ DAYS }
            startingDay: today
            startingDayOffset: 0
            hideWeekend: false
            noCardBackground: false
            compact: false
            weather:
              showCondition: true
              showTemperature: false
              showLowTemperature: true
              useTwiceDaily: false
              entity: weather.forecast_home
            locale: en
            showLocation: true
            hidePastEvents: false
            hideDaysWithoutEvents: false
            hideTodayWithoutEvents: false
            combineSimilarEvents: true
            showLegend: false
            legendToggle: false
            showNavigation: true
            texts:
              monday: Mon
              tuesday: Tue
              wednesday: Wed
              thursday: Thu
              friday: Fri
              saturday: Sat
              sunday: Sun
              yesterday: ''
              today: ''
              tomorrow: ''
              overmorrow: ''
            column_span: 4
    cards: []

So you ā€˜person.jesus’ as well as ā€˜script.jesus_calendar_visible_filter’ as the perform_action.

Then you have others namely ā€˜person.person2’ with a ā€˜script.person2_…’
and so on.

However lower down you have a number of input_text. entries. The first one being:
" - input_text.person1_calendar_filter"
with a corresponding variable below:
"PERSONCAL: states[ā€˜input_text.person1_calendar_filter’]?.state

All the bits that say person1 should be replaced with ā€œjesusā€.

Can you try this and let me know how it goes.

If you want the weather icons/temp to show on each day in the calendar you need to add that section in. I didnt want it, for me it was too much and I felt it cluttered the view. But its personal choice.

Within the calendar section where it says ā€œweather: nullā€ you need to add additional elements:

      weather:
        showCondition: true
        showTemperature: true
        showLowTemperature: true
        useTwiceDaily: false

as an example

idk what i did but got it to work

@husbspamuel is it possible to get blanks on the calendar. For example I just want to see 1-31 or whatever that month has. While also keeping the weekday on the same side? so like 29 and 30 for the previous month from the image would show as blank like a regular calendar

I’ll have a look. I suspect some sort of conditional formatting that identifies days from previous month and sets them to a semi transparant grey colour or something perhaps.

You can also set it so it just has the current month on screen. So it doesnt do a rolling 30/31 days, but a fixed 31 days.

On shorter months that does tend to mean there are 1 or 2 days from the next month on view as well though.

Does anyone have their yaml for the chore part they would want to share?

I have got a morning routine check list that works well. Not really a chore list, but it could be used for the same purpose.

Chore Tracker 1.0 - Chore Tracking with Point System in Home Assistant

Chore Tracker 2.0 - Home Assistant Chore Tracker 2.0: Part 1 Chore Tracker Setup - Smart Home Sysadmin

That said you could do something like ā€œTodoistā€. Create an account, build it out in that, add a new dashboard and set it as that webpage perhaps

Thank you for this! Super happy with the idea of not having to create a ton of scripts and helpers (as I was having problems with the helpers for the main calendar in this thread)

I’ve added some other fun things. I’m using wallpanel (HACS) to pop up a screensaver of favorite photos, I’m using Browser_mod (HACS) to turn off the screensaver when one of my zigbee motion sensors detects motion in front of the calendar, and I’m using simple-swipe-card (HACS) to swipe back and forth between the calendar and the whole home graphical display (a picture-elements card)

for the top row of my calendar, I’m using clock-weather-card (HACS) twice (like you) and lunar-phase-card (HACS) for moon phases. I’ve also modified the CSS a bunch so that the day numbers are in an upper corner, days that have passed have a diagonal line through them and faded numbers, and past events are mostly transparent and have the details hidden.

my css (I’m not super good at css, so it may be poor, but it works for my needs):

                          ha-card {
                            background: transparent !important;
                            box-shadow: none !important;
                            border: none !important;
                          }  .card-content {
                            padding-top: 0px !important;                    
                          }  .container .legend {
                            padding: 0px 0px 5px 20px !important;
                          }  .container .day .date span .month {
                            display: none;
                            font-size: var(--day-date-number-font-size);
                            line-height: var(--day-date-number-line-height);
                          }

                          .container .day .date span[data-date="1"] .number {
                            display: none;
                          }

                          .container .day .date span[data-date="1"] .month {
                            display: inline;
                            background-color: #fcf3cf !important;
                            border-radius: 20%;
                            order: 2;
                            height: 20px;
                            width: 120px;
                            padding: 5px;
                            padding-top: 10px;
                            margin-top: 5px;
                            display: table-cell;
                            vertical-align: middle;
                            text-align: center;
                            font-weight: 100;
                            font-family: "ChunkFive", sans-serif;
                          }

                          .container .day .events .event .time {
                            font-weight: 700;
                            font-size: 15px !important;
                            margin: 0px !important;
                          } .time {
                            color: black !important;
                          } .container { 
                            row-gap: 0px !important;
                            column-gap: 2px !important;
                          }

                          .container .navigation {
                            position: absolute;
                            right: 50px;
                          }

                          ha-card {
                            border-radius: 0px;
                            margin-top: 0px;
                            font-size: 20px !important;
                            overflow: hidden;
                            --days-spacing: 11px;
                            --event-padding: 2px !important;
                            --events-margin-top: 1px !important;
                            --event-border-width: 2px;
                            --navigation-month-font-size: 20px !important;
                          }

                          .event.past {
                            opacity: 0.2;
                          }

                          .event.past .title{
                            display: none;
                          } .none {
                            background-color: transparent !important;
                          }

                          .container .day {
                            width: calc((100% - 6 * var(--days-spacing)) / 7) !important;
                            margin: 0px !important;
                            border: 1px solid gray;
                          }

                          .container .day .date {
                            display: inline-block;
                            width: 98%;
                            align-items: center;
                            justify-content: center;
                          }

                          .container .day .date .number {
                            order: 2;
                            height: 20px;
                            width: 98%;
                            padding: 5px;
                            padding-top: 5px;
                            padding-bottom: 5px
                            margin-top: 2px;
                            display: inline-block;
                            vertical-align: center;
                            text-align: left;
                            font-weight: 50;
                            font-family: "ChunkFive", sans-serif;
                            font-size: 98% !important;
                          }

                          .container .day .date .text {
                            order: 1;
                            font-weight: 300;
                            font-family: "ChunkFive", sans-serif;
                            font-size: 20px !important;
                            margin-bottom: 8px;
                            transform: scale(1, 1.2);
                          }

                          .today .date .number {
                            background-color: #CCCCCC !important;
                            text-decoration: underline;
                            width: 98% !important;
                            height: 20px !important;
                            padding: 2px !important;
                            padding-top: 2px !important;
                            margin-top: 2px !important;
                            text-align: center !important;
                            border: double;
                            border-radius: 10%;
                          }

                          .past .date .number {
                            opacity: 0.3;
                            font-size: 95% !important;
                            border-radius: 10%;
                          }

                          .container .day:nth-child(n+9) .date .text {
                            display: none;
                          }

                          .event {
                            color: #333333 !important;
                            background-color: var(--border-color) !important;
                            border-radius: 10px !important;
                            max-height: 200px !important;
                            overflow: hidden !important;
                            font-size: .75em !important;
                          }

                          .day.past {
                            background-image: repeating-linear-gradient(150deg, transparent 0%, transparent 49%, #44a 50%, transparent 51%, transparent 100%);
                          }

1 Like