Need help developing blueprint script for creating monthly roster on calendar

Hello, I am new to home assistant & I am having trouble with writing a blueprint script that can take multiple dates (about 16) then automatically create the same calendar event for each of the different dates that were inputted.

I want the events to be created in my HA work calendar as I already built an automation that relies on the event being found in the calendar for that day.

I have started with the blueprint script however I am unsure how to continue with the actions.

The current blueprint does not work, & I wasn’t sure if I should continue calling service calendar.create_event 16 times (1 for each input date)

Please let me know if there is a better way to do this or how I could continue/resolve my current blueprint.

Thank you!

blueprint:
  name: Create Roster
  domain: script
  description: Creates monthly work roster based on multiple date inputs for the upcoming month
input:
#creating 16 date inputs for various shifts throughtout the month
    datetime_1:
      name: Date 1
      description: Date of Shift
      selector:
        date:
    datetime_2:
      name: Date 2
      description: Date of Shift
      selector:
        date:
    datetime_3:
      name: Date 3
      description: Date of Shift
      selector:
        date:
    datetime_4:
      name: Date 4
      description: Date of Shift
      selector:
        date:
    datetime_5:
      name: Date 5
      description: Date of Shift
      selector:
        date:
    datetime_6:
      name: Date 6
      description: Date of Shift
      selector:
        date:
    datetime_7:
      name: Date 7
      description: Date of Shift
      selector:
        date:
    datetime_8:
      name: Date 8
      description: Date of Shift
      selector:
        date:
    datetime_9:
      name: Date 9
      description: Date of Shift
      selector:
        date:
    datetime_10:
      name: Date 10
      description: Date of Shift
      selector:
        date:
    datetime_11:
      name: Date 11
      description: Date of Shift
      selector:
        date:
    datetime_12:
      name: Date 12
      description: Date of Shift
      selector:
        date:
    datetime_13:
      name: Date 13
      description: Date of Shift
      selector:
        date:
    datetime_14:
      name: Date 14
      description: Date of Shift
      selector:
        date:
    datetime_15:
      name: Date 15
      description: Date of Shift
      selector:
        date:
    datetime_16:
      name: Date 16
      description: Date of Shift
      selector:
        date: 
action:
   - service: calendar.create_event
     data:
       summary: Work
       start_time: "07:00:00"
       end_time: "19:00:00"
       start_date: !input datetime_1
       end_date: !input datetime_1
target:
          entity_id: calendar.work

I can’t help but think there is an easier way to do this in the front end somehow…

The suggested way to write blueprints is to create your in this case script code first as a script, then add the other stuff that makes it a blueprint. Then you first fight the script syntax, once you have that right you fight the changes for the blueprint syntax.
Creating an automation blueprint - Home Assistant.

Try that.

Now I see you have script syntax problems to start with, such as action: doesn’t go there and to complete what you are trying to do you need a loop or a bunch of choose statements or something. I don’t see any of that.

The basic structure of the script as @Sir_Goodenough mentioned would be something like:

alias: Create Roster
description: ""
variables:
  wd1: !input datetime_1
  wd2: !input datetime_2
    ....
  workdates: >-
    {{[wd1, wd2] | select('defined')|reject('in', [none, '']) | list}}
sequence:
  - repeat:
      sequence:
        - service: calendar.create_event
          target:
            entity_id: calendar.work
          data:
            summary: Work
            start_date_time: "{{ repeat.item }} 07:00:00"
            end_date_time: "{{ repeat.item }} 19:00:00"
      for_each: "{{ workdates }}"
mode: single
1 Like

Thank you both for your assistance & quick replies!

I have updated the blueprint based on your inputs, however now I am getting an input not defined error, any ideas or references on what steps I need to do in order to define them.

Error Message: Invalid blueprint: Missing input definition for datetime_15, datetime_2, datetime_8, datetime_3, datetime_14, datetime_13, datetime_10, datetime_5, datetime_7, datetime_16, datetime_12, datetime_11, datetime_4, datetime_1, datetime_9, datetime_6

blueprint:
  name: Create Roster
  domain: script
  description: Creates monthly work roster based on multiple date inputs for the upcoming month
input:
#creating 16 date inputs for various shifts throughtout the month
    datetime_1:
      name: Date 1
      description: Date of Shift
      selector:
        date:
    datetime_2:
      name: Date 2
      description: Date of Shift
      selector:
        date:
    datetime_3:
      name: Date 3
      description: Date of Shift
      selector:
        date:
    datetime_4:
      name: Date 4
      description: Date of Shift
      selector:
        date:
    datetime_5:
      name: Date 5
      description: Date of Shift
      selector:
        date:
    datetime_6:
      name: Date 6
      description: Date of Shift
      selector:
        date:
    datetime_7:
      name: Date 7
      description: Date of Shift
      selector:
        date:
    datetime_8:
      name: Date 8
      description: Date of Shift
      selector:
        date:
    datetime_9:
      name: Date 9
      description: Date of Shift
      selector:
        date:
    datetime_10:
      name: Date 10
      description: Date of Shift
      selector:
        date:
    datetime_11:
      name: Date 11
      description: Date of Shift
      selector:
        date:
    datetime_12:
      name: Date 12
      description: Date of Shift
      selector:
        date:
    datetime_13:
      name: Date 13
      description: Date of Shift
      selector:
        date:
    datetime_14:
      name: Date 14
      description: Date of Shift
      selector:
        date:
    datetime_15:
      name: Date 15
      description: Date of Shift
      selector:
        date:
    datetime_16:
      name: Date 16
      description: Date of Shift
      selector:
        date: 
variables:
  work_dates:
    wd1: !input datetime_1
    wd2: !input datetime_2
    wd3: !input datetime_3
    wd4: !input datetime_4
    wd5: !input datetime_5
    wd6: !input datetime_6
    wd7: !input datetime_7
    wd8: !input datetime_8
    wd9: !input datetime_9
    wd10: !input datetime_10
    wd11: !input datetime_11
    wd12: !input datetime_12
    wd13: !input datetime_13
    wd14: !input datetime_14
    wd15: !input datetime_15
    wd16: !input datetime_16
    
  workdates: >-
    {{[wd1, wd2, wd3, wd4, wd5, wd6, wd7, wd8, wd9, wd10, wd11, wd12, wd13, wd14, wd15, wd16] | select('defined')|reject('in', '[none, '']) | list}}
sequence:
  - repeat:
      sequence:
        - service: calendar.create_event
          target:
            entity_id: calendar.work
          data:
            summary: Work
            start_date_time: "{{ repeat.item }} 07:00:00"
            end_date_time: "{{ repeat.item }} 19:00:00"
      for_each: "{{ workdates }}"
    mode: single

Make sure to indent input: to the same depth as the other blueprint keys and add a default for each “datetime” inputs so you can leave some blank if necessary (either "" or null should work as the default value).

Get rid of the work_dates: in the variables block… or modify the template to look within the dictionary.

FWIW, since you’re setting this up as a Blueprint it would make more sense to also add inputs for summary, calendar, start time and end time as well instead of static values… otherwise, you should just use a regular script.

Blueprint with additional inputs and simplified variables block
blueprint:
  name: Create Roster
  domain: script
  description: Creates up to 16 identical events on multiple dates.
  input:
    summary:
      name: Event Title
      description: The title for the events being created
      selector:
        text:
    calendar:
      name: Calendar
      description: The calendar entity to add events to.
      selector:
        entity:
          filter:
            - domain: calendar
    start_time:
      name: Start Time
      description: Start of Shift
      selector:
        time:
    end_time:
      name: End Time
      description: End of Shift
      selector:
        time:
    datetime_1:
      name: Date 1
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_2:
      name: Date 2
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_3:
      name: Date 3
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_4:
      name: Date 4
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_5:
      name: Date 5
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_6:
      name: Date 6
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_7:
      name: Date 7
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_8:
      name: Date 8
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_9:
      name: Date 9
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_10:
      name: Date 10
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_11:
      name: Date 11
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_12:
      name: Date 12
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_13:
      name: Date 13
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_14:
      name: Date 14
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_15:
      name: Date 15
      description: Date of Shift
      default: null
      selector:
        date:
    datetime_16:
      name: Date 16
      description: Date of Shift
      default: null
      selector:
        date: 

variables:
  start: !input start_time
  end: !input end_time
  wd:
    - !input datetime_1
    - !input datetime_2
    - !input datetime_3
    - !input datetime_4
    - !input datetime_5
    - !input datetime_6
    - !input datetime_7
    - !input datetime_8
    - !input datetime_9
    - !input datetime_10
    - !input datetime_11
    - !input datetime_12
    - !input datetime_13
    - !input datetime_14
    - !input datetime_15
    - !input datetime_16
  workdates: "{{ wd | select('defined')|reject('in', [none, '']) | list }}"
sequence:
  - repeat:
      sequence:
        - service: calendar.create_event
          target:
            entity_id: !input calendar
          data:
            summary: !input summary
            start_date_time: "{{ repeat.item }} {{start}}"
            end_date_time: "{{ repeat.item }} {{end}}"
      for_each: "{{ workdates }}"
mode: single

EDIT: There was an errant ' in the workdates template that has been corrected both here and above.

1 Like

Thank you so much for your time & effort. It’s working now exactly as needed!

Really appreciate your help!