<br />

To show a range of different tasks that can be automated using the Automation
API and perhaps inspire more ideas, here are some example automations. See
[Android DSL Guide](https://developers.home.google.com/apis/android/automation/dsl/basic) for further information.
| **Experimental:** These examples are provided for use as a starting point. Some alterations may be required in order for them to work.
| **Important:** All household members can see when these automations run. Automations are for convenience only, not safety- or security-critical use cases. Do not create automations that could result in injury or harm if they fail to start or stop. Automations can depend on working internet, Wi-Fi, and service availability from both Google and the third parties who manufacture the devices included in automations. Automations may not always work, and Google is not responsible for any harm or losses incurred as a result of any failed automations.

## Turn on a device when another device is turned on or off

    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff
    import com.google.home.matter.standard.OnOffLightDevice

    ...

    automation {
      sequential {
        val starterNode = starter<_>(device1, OnOffLightDevice, OnOff)
        val device2State = stateReader<_>(device2, OnOffLightDevice, OnOff)
        condition {
          // Only send the command if device2 is off
          expression = device2State.onOff equals false
        }
       // turn on device 2
       action(device2, OnOffLightDevice) { command(OnOff.on()) }
       }
    }

## Close the blind if it's too bright

    import com.google.home.Home
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.automation.and
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.greaterThan
    import com.google.home.matter.standard.IlluminanceMeasurement
    import com.google.home.matter.standard.IlluminanceMeasurement.Companion.measuredValue
    import com.google.home.matter.standard.LightSensorDevice
    import com.google.home.matter.standard.WindowCovering
    import com.google.home.matter.standard.WindowCovering.Companion.currentPositionLift
    import com.google.home.matter.standard.WindowCoveringDevice

    ...

    automation {
      sequential {
        val starterNode = starter<_>(device1, LightSensorDevice, IlluminanceMeasurement)
        val blindsPosition = stateReader<_>(blinds, WindowCoveringDevice, WindowCovering)

        condition {
          // only send the command if
          // the blinds are open
          (blindsPosition.currentPositionLift greaterThan 0u) and
            // it's brighter than a certain threshold value
            (starterNode.measuredValue greaterThan 10u)
        }
        // close the blind
        action(blinds, WindowCoveringDevice) { command(WindowCovering.downOrClose()) }
      }
    }

## Turn on the fan when the temperature surpasses a threshold

    import com.google.home.Home
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.Action
    import com.google.home.automation.And
    import com.google.home.automation.Automation
    import com.google.home.automation.Condition
    import com.google.home.automation.Equals
    import com.google.home.automation.Node
    import com.google.home.automation.SequentialFlow
    import com.google.home.automation.Starter
    import com.google.home.automation.StateReader
    import com.google.home.matter.standard.FanDevice
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOffTrait.Attributes.onOff
    import com.google.home.matter.standard.TemperatureMeasurement
    import com.google.home.matter.standard.TemperatureMeasurement.measuredValue
    import com.google.home.matter.standard.TemperatureSensorDevice

    ...

    automation {
      sequential {
        val starterNode = starter<_>(thermometer, TemperatureSensorDevice, TemperatureMeasurement)

        val fanStateReaderNode = stateReader<_>(fan, FanDevice, OnOff)
        condition {
          // only send the command if the temperature is above 78F
          val expr1 = starterNode.measuredValue greaterThan 78
          // the fan is off
          val expr2 = fanStateReaderNode.onOff equals false
          expression = expr1 and expr2
        }
        // turn on the fan
        action(fan, FanDevice) { command(OnOff.on()) }
      }
    }

## Alert when motion is detected during summer vacation

See
[Delays](https://developers.home.google.com/apis/android/automation/dsl/complex#delays) and
[Trigger suppression](https://developers.home.google.com/apis/android/automation/dsl/complex#trigger_suppression)
for more information.  

    import com.google.home.Home
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.automation.and
    import com.google.home.automation.automation
    import com.google.home.automation.condition
    import com.google.home.automation.equals
    import com.google.home.automation.greaterThan
    import com.google.home.automation.starter
    import com.google.home.automation.stateReader
    import com.google.home.google.AssistantBroadcast
    import com.google.home.google.MotionDetection
    import com.google.home.google.MotionDetection.Companion.motionDetectionEventInProgress
    import com.google.home.matter.standard.OccupancySensorDevice
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff
    import com.google.home.matter.standard.OnOffLightDevice
    import com.google.home.matter.standard.SpeakerDevice
    import java.time.Duration

    ...

    automation {
      sequential {
        val starterNode = starter<_>(sensor, OccupancySensorDevice, MotionDetection)
        // only proceed if...
        condition {
          // ...there is currently motion taking place and...
          val expr1 = starterNode.motionDetectionEventInProgress
          // ...it is during our summer vacation
          val expr2 = time.currentDate.monthDay.between(
            MonthDay.of(Month.JULY, 15),
            MonthDay.of(Month.AUGUST, 1),
          )
          expression = expr1 and expr2
        }
        // ignore the starter for one minute after it was last triggered
        suppressFor(Duration.ofMinutes(1))
        // make three announcements three seconds apart
        action(speaker, SpeakerDevice) {
          command(AssistantBroadcast.broadcast("Intruder detected!"))
        }
        delayFor(Duration.ofSeconds(3))
        action(speaker, SpeakerDevice) {
          command(AssistantBroadcast.broadcast("Intruder detected!"))
        }
        delayFor(Duration.ofSeconds(3))
        action(speaker, SpeakerDevice) {
          command(AssistantBroadcast.broadcast("Intruder detected!"))
        }
        // flash lights every two seconds
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
        delayFor(Duration.ofSeconds(2))
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
        delayFor(Duration.ofSeconds(2))
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
        delayFor(Duration.ofSeconds(2))
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
        delayFor(Duration.ofSeconds(2))
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
        delayFor(Duration.ofSeconds(2))
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
      }
    }

## Open the blinds 15 minutes before sunrise

    import com.google.home.Home
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.Action
    import com.google.home.automation.and
    import com.google.home.automation.automation
    import com.google.home.automation.condition
    import com.google.home.automation.equals
    import com.google.home.automation.greaterThan
    import com.google.home.automation.parallel
    import com.google.home.automation.starter
    import com.google.home.automation.stateReader
    import com.google.home.google.Time
    import com.google.home.google.Time.Companion.sunriseTime
    import com.google.home.google.TimeTrait.SolarTimeStruct
    import com.google.home.google.TimeTrait.SolarTimeType
    import com.google.home.matter.standard.WindowCovering
    import com.google.home.matter.standard.WindowCovering.Companion.upOrOpen
    import com.google.home.matter.standard.WindowCoveringDevice
    import java.time.Duration

    ...

    automation {
      sequential {
        // 15 minutes before sunrise
        val unused =
          starter<_>(structure, Time.ScheduledTimeEvent) {
            parameter(Time.ScheduledTimeEvent.solarTime(
              SolarTimeStruct(SolarTimeType.Sunrise,
                              java.time.Duration.ofMinutes(-15))))
          }
        }
        sequential {
          manualStarter()
        }
        // simultaneously open the five blinds
        parallel {
            action(blind1, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
            action(blind2, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
            action(blind3, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
            action(blind4, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
            action(blind5, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
        }
    }

## Open the blinds at 7:00am, except if it's too bright and/or too hot

See
[Trigger suppression](https://developers.home.google.com/apis/android/automation/dsl/complex#trigger_suppression)
for more information.

Note that this example uses a starter
which requires that the structure has been assigned an address using the
[Google Home app (GHA)](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app). [Change Google home
address](https://support.google.com/googlenest/answer/7551002)
explains how a user can enter the structure address.  

    import com.google.home.Home
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.greaterThan
    import com.google.home.automation.lessThanOrEquals
    import com.google.home.automation.notEquals
    import com.google.home.automation.or
    import com.google.home.automation.parallel
    import com.google.home.automation.select
    import com.google.home.automation.sequential
    import com.google.home.automation.size
    import com.google.home.automation.starter
    import com.google.home.automation.stateReader
    import com.google.home.google.Time
    import com.google.home.matter.standard.IlluminanceMeasurement
    import com.google.home.matter.standard.IlluminanceMeasurement.Companion.measuredValue
    import com.google.home.matter.standard.LightSensorDevice
    import com.google.home.matter.standard.TemperatureMeasurement
    import com.google.home.matter.standard.TemperatureMeasurement.Companion.measuredValue
    import com.google.home.matter.standard.TemperatureSensorDevice
    import com.google.home.matter.standard.WindowCovering
    import com.google.home.matter.standard.WindowCovering.Companion.upOrOpen
    import com.google.home.matter.standard.WindowCoveringDevice
    import java.time.Duration
    import java.time.LocalTime

    ...

    automation {
      sequential {
        select {
          sequential {
            // run the automation daily at 7am
            val earlyMorning =
              starter<_>(structure, Time.ScheduledTimeEvent) {
                parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(7, 0, 0, 0)))
              }
            val temperature = starter<_>(device, TemperatureSensorDevice, TemperatureMeasurement)
            val brightness = starter<_>(device1, LightSensorDevice, IlluminanceMeasurement)
            // don't run more often than every 15 minutes
            suppressFor(Duration.ofMinutes(15))
            condition {
              // temperature is below 32C/90F
              val expr1 = (temperature.measuredValue lessThanOrEquals 32)

              // too bright
              val expr2 = (brightness.measuredValue greaterThan 60u)

              expression = expr1 or expr2
            }
          }
          sequential { manualStarter() }
        }
        // simultaneously open the five blinds
        parallel {
          action(blind1, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
          action(blind2, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
          action(blind3, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
          action(blind4, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
          action(blind5, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
        }
      }
    }

## Close the blinds if it is likely to rain

    import com.google.home.HomeDevice
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.greaterThan
    import com.google.home.automation.starter
    import com.google.home.google.Weather
    import com.google.home.google.Weather.Companion.currentConditions
    import com.google.home.google.WeatherTrait
    import com.google.home.google.WeatherTrait.CurrentConditions
    import com.google.home.google.WeatherTrait.CurrentConditions.Adapter.chanceOfPrecipitationType
    import com.google.home.google.WeatherTrait.CurrentConditions.Adapter.precipitationChancePercent
    import com.google.home.google.WeatherTrait.PrecipitationType
    import com.google.home.google.WeatherTrait.PrecipitationType.PrecipitationTypeEnum
    import com.google.home.matter.standard.WindowCovering
    import com.google.home.matter.standard.WindowCoveringDevice

    automation {
      sequential {
        val weatherState = starter<_>(structure, trait = Weather)
        condition {
          val currentPrecipitationTypeIsRain = (weatherState.currentConditions.precipitationType equals
              WeatherTrait.PrecipitationType.PrecipitationTypeRain)
          val futurePrecipitationTypeIsRain = (weatherState.dailyForecastConditionsList[0].precipitationType equals WeatherTrait.PrecipitationType.PrecipitationTypeRain)

          val expression = currentPrecipitationTypeIsRain and futurePrecipitationTypeIsRain
        }

        parallel {
          for (windowBlind in windowBlinds) {
            action(windowBlind, WindowCoveringDevice) { command(WindowCovering.downOrClose()) }
          }
        }
      }
    }

## If the light is on, turn off the fan and change the speed setting

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.matter.standard.DimmableLightDevice
    import com.google.home.matter.standard.FanControl
    import com.google.home.matter.standard.FanControl.Companion.setFanMode
    import com.google.home.matter.standard.FanControl.Companion.setPercentSetting
    import com.google.home.matter.standard.FanControlTrait
    import com.google.home.matter.standard.FanControlTrait.FanModeEnum
    import com.google.home.matter.standard.FanDevice
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff

    ...

    automation {
      name = "Turn off the fan when the light is turned on."
      description = "If light is on, turn off the fan and change the speed setting."
      isActive = true
      sequential {
        // When the light's OnOff state changes...
        val starterNode = starter<_>(device, DimmableLightDevice, OnOff)
        // ...and if the light is turned on...
        condition() { expression = starterNode.onOff equals true }
        // ...turn off the fan and change the speed.
        action(device, FanDevice) {
          update(FanControl) {
            setFanMode(FanModeEnum.Off)
            setPercentSetting(20u)
          }
        }
      }
    }

## Turn on the light if the area is occupied

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.google.AreaPresenceState
    import com.google.home.google.AreaPresenceState.Companion.presenceState
    import com.google.home.google.AreaPresenceStateTrait.PresenceState
    import com.google.home.matter.standard.DimmableLightDevice
    import com.google.home.matter.standard.OnOff

    ...

    automation {
      description = "If the area is occupied, turn the light on."
      isActive = true
      sequential {
        // If the presence state changes...
        val starterNode = starter<_>(structure, AreaPresenceState)
        // ...and if the area is occupied...
        condition() {
          expression = starterNode.presenceState equals PresenceState.PresenceStateOccupied
        }
        // ...turn the light on.
        action(device, DimmableLightDevice) { command(OnOff.on()) }
      }
    }

## Turn off the light if no one is home

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.and
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.stateReader
    import com.google.home.google.AreaAttendanceState
    import com.google.home.google.AreaAttendanceState.Companion.attendanceState
    import com.google.home.google.AreaAttendanceStateTrait.AttendanceState
    import com.google.home.matter.standard.DimmableLightDevice
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff

    ...

    automation {
      sequential {
        val starterNode = starter<_>(device, DimmableLightDevice, OnOff)
        val stateReaderNode = stateReader<_>(structure, AreaAttendanceState)

        condition() {
          val expr1 = starterNode.onOff equals true
          val expr2 =
            stateReaderNode.attendanceState equals AttendanceState.AttendanceStateNoHouseholdMembers
          // If the light is turned on and no one from the household is present
          expression = expr1 and expr2
        }
        // turn the light off
        action(device, DimmableLightDevice) { command(OnOff.off()) }
      }
    }

## Send a notification at a specified time

Note that this example uses a starter
which requires that the structure has been assigned an address using the
[Google Home app (GHA)](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app). [Change Google home
address](https://support.google.com/googlenest/answer/7551002)
explains how a user can enter the structure address.  

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.starter
    import com.google.home.google.AreaAttendanceState
    import com.google.home.google.Notification
    import com.google.home.google.Time
    import java.time.LocalTime

    ...

    automation {
      sequential {
        // If the time is 1:01:01:001
        val unused =
          starter<_>(structure, Time.ScheduledTimeEvent) {
            parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(1, 1, 1, 1)))
          }
        action(structure) {
          // send a notification to the user via the Google Home App
          command(Notification.sendNotifications("title", { body = "body" }))
        }
      }
    }

## Broadcast a message at a specified time if the light is on

Note that this example uses a starter
which requires that the structure has been assigned an address using the
[Google Home app (GHA)](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app). [Change Google home
address](https://support.google.com/googlenest/answer/7551002)
explains how a user can enter the structure address.  

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.starter
    import com.google.home.google.AssistantBroadcast
    import com.google.home.google.Time
    import com.google.home.matter.standard.DimmableLightDevice
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff
    import java.time.LocalTime

    ...

    automation {
      sequential {
        // If the time is 12:00...
        val unused =
          starter<_>(structure, Time.ScheduledTimeEvent) {
            parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(12, 0, 0, 0)))
          }

        val stateReaderNode = stateReader<_>(device, DimmableLightDevice, OnOff)
        // ...and the light is on...
        condition() { expression = stateReaderNode.onOff equals true }
        // ...broadcast a message over any devices that support Google Assistant.
        action(structure) { command(AssistantBroadcast.broadcast("It's midday.")) }
      }
    }

## Play music at a specified time when the light is on

Note that this example uses a starter
which requires that the structure has been assigned an address using the
[Google Home app (GHA)](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app). [Change Google home
address](https://support.google.com/googlenest/answer/7551002)
explains how a user can enter the structure address.  

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.starter
    import com.google.home.google.AssistantFulfillment
    import com.google.home.google.Time
    import com.google.home.matter.standard.DimmableLightDevice
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff
    import com.google.home.matter.standard.SpeakerDevice
    import java.time.LocalTime
    ...

    automation {
      sequential {
        // When the time is 3:15pm...
        val unused =
          starter<_>(structure, Time.ScheduledTimeEvent) {
            parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(15, 15, 0, 0)))
          }
        val stateReaderNode = stateReader<_>(device, DimmableLightDevice, OnOff)
        // ...and the light's OnOff state is on...
        condition() { expression = stateReaderNode.onOff equals true }
        // ...tell Google Assistant to play music
        action(device, SpeakerDevice) { command(AssistantFulfillment.okGoogle("Play some music")) }
      }
    }

## Blink the lights and announce when the oven reaches the chosen temperature

This automation requires an Oven device that implements the
[`RunCycle`](https://developers.home.google.com/cloud-to-cloud/traits/runcycle) Cloud-to-cloud trait or the
Oven Cavity Operational State Matter cluster. See
[Interoperability on Android](https://developers.home.google.com/apis/android/interoperability#oven) and
[Delays](https://developers.home.google.com/apis/android/automation/dsl/complex#delays) for more information.  

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.parallel
    import com.google.home.automation.starter
    import com.google.home.google.AssistantBroadcast
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.toggle
    import com.google.home.matter.standard.OnOffLightDevice
    import com.google.home.matter.standard.OvenCavityOperationalState
    import com.google.home.matter.standard.OvenCavityOperationalState.Companion.currentPhase
    import com.google.home.matter.standard.OvenCavityOperationalState.Companion.phaseList
    import com.google.home.matter.standard.OvenCavityOperationalStateTrait.OperationalStateStruct
    import com.google.home.matter.standard.OvenDevice
    import com.google.home.matter.standard.SpeakerDevice
    import java.time.Duration

    ...

    automation {
      name = "Oven is up-to-temperature"
      description =
        "When an oven has finished pre-heating, living room lights blink and smart speaker makes an announcement"
      isActive = true

      sequential {
        val starterNode =
          starter<_>(oven, OvenDevice, OvenCavityOperationalState /* Or OperationalState */)
        condition {
          expression = starterNode.phaseList[operationalState.currentPhase.toUInt()] equals "pre-heated"
        }
        action(speaker, SpeakerDevice) {
          command(AssistantBroadcast.broadcast("The oven has now reached the chosen temperature."))
        }
        // "blink" the light by toggling them twice with a five-second pause,
        // then return to the original state.
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
        delayFor(Duration.ofSeconds(5))
        action(light, OnOffLightDevice) { command(OnOff.toggle()) }
      }
    }

## Use Google Assistant to create conditions for sleep

This example is triggered by Google Assistant, and uses
Assistant in an action to play ocean wave sounds.

The
[`okGoogle`](https://developers.home.google.com/reference/kotlin/com/google/home/google/AssistantFulfillmentTrait.OkGoogleCommand)
command is a structure-level command and can be used to automate any device in
the structure. However, a Home APIs app may not have access to every device. See
[OkGoogle permissions](https://developers.home.google.com/apis/permissions#okgoogle_permissions) to see how
permissions are enforced in various cases.  

    import com.google.home.Home
    import com.google.home.HomeClient
    import com.google.home.HomeDevice
    import com.google.home.HomeManager
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.parallel
    import com.google.home.automation.starter
    import com.google.home.google.AssistantFulfillment
    import com.google.home.google.VoiceStarter
    import com.google.home.matter.standard.FanControl
    import com.google.home.matter.standard.FanControl.Companion.setFanMode
    import com.google.home.matter.standard.FanControlTrait.FanModeEnum
    import com.google.home.matter.standard.FanDevice
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.toggle
    import com.google.home.matter.standard.OnOffPluginUnitDevice
    import com.google.home.matter.standard.SpeakerDevice
    import com.google.home.matter.standard.WindowCovering
    import com.google.home.matter.standard.WindowCoveringDevice

    automation {
      name = "Lull to sleep"
      description =
        "If user says \"Hey Google, I can't sleep\", play ocean wave sounds, turn on the fan, turn on the plug, and roll down the blinds"
      isActive = true
      sequential {
        val unused =
          starter<_>(structure, VoiceStarter.OkGoogleEvent) {
            parameter(VoiceStarter.OkGoogleEvent.query("I can't sleep"))
          }

        parallel {
          // tell the speaker to play ocean wave sounds
          action(speaker, SpeakerDevice) {
            command(AssistantFulfillment.okGoogle("Play ocean wave sounds"))
          }
          // turn on the fan
          action(fan, FanDevice) { update(FanControl) { setFanMode(FanModeEnum.On) } }
          // turn on the outlet
          action(plug, OnOffPluginUnitDevice) { command(OnOff.on()) }
          // close the blinds
          action(blinds, WindowCoveringDevice) { command(WindowCovering.downOrClose()) }
        }
      }
    }

## Turn Chromecast on or off when light turns on

    import com.google.home.HomeDevice
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.starter
    import com.google.home.google.ExtendedApplicationLauncher
    import com.google.home.google.ExtendedChannel
    import com.google.home.google.ExtendedLevelControl
    import com.google.home.google.ExtendedMediaInput
    import com.google.home.google.ExtendedMediaPlayback
    import com.google.home.google.GoogleTVDevice
    import com.google.home.google.MediaActivityState
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.on
    import com.google.home.matter.standard.OnOff.Companion.onOff
    import com.google.home.matter.standard.OnOffLightDevice

    automation {
      name = "Light Activated Chromecast"
      description = "When light turns on, turn on/off the Chromecast."
      isActive = true
      sequential {
        select {
          // Create a starter node for each light device selected
          sequential {
            val starterNode = starter<_>(lightDevice, OnOffLightDevice, OnOff)
            // ...and if the light is turned on...
            condition { expression = starterNode.onOff equals true }
          }
          manualStarter()
        }
        parallel {
          // ...turn the Chromecast on or off.
          action(chromecastDevice, GoogleTVDevice) { command(OnOff.on()) }
        }
      }
    }

## Stop Chromecast and broadcast a message when light turns on

    import com.google.home.HomeDevice
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.starter
    import com.google.home.google.AssistantBroadcast
    import com.google.home.google.ExtendedApplicationLauncher
    import com.google.home.google.ExtendedChannel
    import com.google.home.google.ExtendedLevelControl
    import com.google.home.google.ExtendedMediaInput
    import com.google.home.google.ExtendedMediaPlayback
    import com.google.home.google.GoogleTVDevice
    import com.google.home.matter.standard.MediaPlayback
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff
    import com.google.home.matter.standard.OnOffLightDevice

    automation {
      name = "Light Activated Chromecast Media Control"
      description = "When the light turns on, stop the media on Chromecast."
      isActive = true
      sequential {
        select {
          // Create a starter node for each light device selected
          sequential {
            val starterNode = starter<_>(lightDevice, OnOffLightDevice, OnOff)
            condition {
              // ...and the light is on...
              expression = starterNode.onOff equals true
            }
          }
          manualStarter()
        }
        val message = "Light turned on, stopping the media."
        parallel {
          // ...stop the media on the Chromecast...
          action(chromecastDevice, GoogleTVDevice) { command(MediaPlayback.stop()) }
          // ...broadcast message over any devices that support Google Assistant.
          action(speakerDevice, SpeakerDevice) { command(AssistantBroadcast.broadcast(message)) }
        }
      }
    }

## Turn on lights when Chromecast turns on

    import com.google.home.HomeDevice
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.starter
    import com.google.home.google.GoogleTVDevice
    import com.google.home.matter.standard.MediaPlayback
    import com.google.home.matter.standard.OnOff
    import com.google.home.matter.standard.OnOff.Companion.onOff
    import com.google.home.matter.standard.OnOffLightDevice

    automation {
      name = "Chromecast Activated Lights"
      description = "When chromecast turns on, turn on a set of lights."
      isActive = true
      sequential {
        select {
          // Create a starter node for each Chromecast device selected...
          sequential {
            val starterNode = starter<_>(chromecastDevice, GoogleTVDevice, OnOff)
            condition {
              // ...and when the Chromecast is turned on...
              expression = starterNode.onOff equals true
            }
          }
          manualStarter()
        }
        parallel {
          // ...turn the lights on.
          action(lightDevice, OnOffLightDevice) { command(OnOff.on()) }
        }
      }
    }

## Set temperature at 8:00am and 10:00pm in July and August

Note that this example uses a starter
which requires that the structure has been assigned an address using the
[Google Home app (GHA)](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app). [Change Google home
address](https://support.google.com/googlenest/answer/7551002)
explains how a user can enter the structure address.  

    import com.google.home.HomeDevice
    import com.google.home.Id
    import com.google.home.Structure
    import com.google.home.automation.action
    import com.google.home.automation.automation
    import com.google.home.automation.equals
    import com.google.home.automation.starter
    import com.google.home.matter.standard.TemperatureControl
    import com.google.home.matter.standard.TemperatureControlledCabinetDevice
    import com.google.home.google.Time

    automation {
      sequential {
        val starter =
          starter<_>(structure, event = Time.RecurringClockTimeScheduledEvent) {
            parameter(Time.RecurringClockTimeScheduledEvent.cronExpression("0 0 08,22 ? 7,8 * *"))
          }
        // Set the temperature to 5C
        action(tempControlDevice, TemperatureControlledCabinetDevice) {
          command(TemperatureControl.setTemperature(5))
        }
        assertThat(starter).isNotNull()
      }
    }

## Apply different conditions to different starters within a single automation

This automation is triggered whenever one of two specified lights is
turned on. Each of the two starters has its own condition, and the conditions
are evaluated independently. If the condition is met on either starter,
the rule executes an action to turn on a Chromecast device.  

```kotlin
automation {
  sequential {
    val unused1 = select {
      sequential {
        val starterNode = starter<_>(lightDevice, OnOffLightDevice, OnOff)
        // ...and if the light is turned on...
        condition { expression = starterNode.onOff equals true }
      }
      sequential {
        val starterNode = starter<_>(lightDevice2, OnOffLightDevice, OnOff)
        // ...and if the light is turned on...
        condition { expression = starterNode.onOff equals true }
      }
    }
    val unused2 = parallel {
      // ...turn the Chromecast on or off.
      action(chromecastDevice, GoogleTVDevice) { command(OnOff.on()) }
    }
  }
}
```