একটি অটোমেশন তৈরি করুন

হোম API-এর মাধ্যমে অটোমেশন এপিআইগুলি অ্যাক্সেস করা যেতে পারে, কিন্তু যেহেতু তাদের এন্ট্রি পয়েন্টটি একটি কাঠামোর মাধ্যমে, তাই সেগুলি ব্যবহার করার আগে প্রথমে কাঠামোতে অনুমতি দিতে হবে।

একবার একটি কাঠামোর জন্য অনুমতি দেওয়া হলে, এই প্যাকেজগুলি আপনার অ্যাপে আমদানি করুন:


import com.google.home.Home
import com.google.home.HomeDevice
import com.google.home.Id
import com.google.home.Structure

একটি কাঠামোতে নিম্নলিখিত অটোমেশন-নির্দিষ্ট পদ্ধতিগুলির সাথে একটি HasAutomations ইন্টারফেস রয়েছে:

API বর্ণনা
automations() কাঠামোর অন্তর্গত সমস্ত অটোমেশনের তালিকা করুন। হোম API-এর মাধ্যমে আপনার তৈরি করা অটোমেশনগুলিই ফেরত দেওয়া হয়।
createAutomation(automation) একটি কাঠামোর জন্য একটি অটোমেশন উদাহরণ তৈরি করুন।
deleteAutomation(automationId) এটির আইডি দ্বারা একটি অটোমেশন উদাহরণ মুছুন।

একটি অটোমেশন তৈরি করুন

হোমের একটি উদাহরণ তৈরি করার পরে এবং ব্যবহারকারীর কাছ থেকে অনুমতি পাওয়ার পরে, কাঠামো এবং ডিভাইস(গুলি) পান:

val structure = homeManager.structures().list().single()
val device = homeManager.devices().get(Id("myDevice"))!!

তারপর অটোমেশন ডিএসএল ব্যবহার করে আপনার অটোমেশনের যুক্তি সংজ্ঞায়িত করুন। হোম API-এ, একটি অটোমেশন Automation ইন্টারফেস দ্বারা প্রতিনিধিত্ব করা হয়। এই ইন্টারফেসে বৈশিষ্ট্যগুলির একটি সেট রয়েছে:

  • মেটাডেটা, যেমন নাম এবং বিবরণ।
  • পতাকা যা নির্দেশ করে, উদাহরণস্বরূপ, অটোমেশন কার্যকর করা যেতে পারে কিনা।
  • নোডের একটি তালিকা যা অটোমেশনের যুক্তি ধারণ করে, যাকে অটোমেশন গ্রাফ বলা হয়, automationGraph বৈশিষ্ট্য দ্বারা প্রতিনিধিত্ব করা হয়।

automationGraph , ডিফল্টভাবে, SequentialFlow টাইপের হয়, এটি এমন একটি শ্রেণী যাতে নোডের একটি তালিকা থাকে যা অনুক্রমিক ক্রমে কার্যকর হয়। প্রতিটি নোড অটোমেশনের একটি উপাদানকে প্রতিনিধিত্ব করে, যেমন একটি স্টার্টার, শর্ত বা ক্রিয়া।

অটোমেশনকে একটি name এবং description বরাদ্দ করুন।

একটি অটোমেশন তৈরি করা হলে isActive পতাকাটিকে true ডিফল্ট করে, তাই এই পতাকাটি স্পষ্টভাবে সেট করার প্রয়োজন নেই যদি না আপনি প্রাথমিকভাবে অটোমেশনটি নিষ্ক্রিয় করতে চান। সেই দৃশ্যে, সৃষ্টির সময় পতাকাটিকে false সেট করুন।

DraftAutomation ইন্টারফেসটি অটোমেশন তৈরি এবং তৈরি করতে ব্যবহৃত হয় এবং Automation ইন্টারফেস পুনরুদ্ধারের জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, এখানে একটি অটোমেশনের জন্য অটোমেশন ডিএসএল রয়েছে যা অন্য ডিভাইস চালু হলে একটি ডিভাইস চালু করে:

import com.google.home.automation.Action
import com.google.home.automation.Automation
import com.google.home.automation.Condition
import com.google.home.automation.DraftAutomation
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.Home
import com.google.home.HomeDevice
import com.google.home.HomeManager
import com.google.home.Id
import com.google.home.matter.standard.OnOff
import com.google.home.Structure

...

val automation: DraftAutomation = automation {
  name = "MyFirstAutomation"
  description = "Turn on a device when another device is turned on."
  sequential {
    val starterNode = starter<_>(device1, OnOffLightDevice, trait=OnOff)
    condition() { expression = stateReaderNode.onOff equals true }
    action(device2, OnOffLightDevice) { command(OnOff.on()) }
  }
}

অটোমেশন ডিএসএল সংজ্ঞায়িত হয়ে গেলে, DraftAutomation উদাহরণ তৈরি করতে createAutomation() পদ্ধতিতে পাস করুন:

val createdAutomation = structure.createAutomation(automation)

এখান থেকে, আপনি অটোমেশনের অন্যান্য সমস্ত অটোমেশন পদ্ধতি ব্যবহার করতে পারেন, যেমন execute() , stop() , এবং update()

বৈধতা ত্রুটি

যদি অটোমেশন তৈরি বৈধতা পাস না করে, একটি সতর্কতা বা ত্রুটি বার্তা সমস্যা সম্পর্কে তথ্য প্রদান করে। আরও তথ্যের জন্য, ValidationIssueType রেফারেন্স পড়ুন।

কোড উদাহরণ

এখানে আমরা কিছু উদাহরণ কোড উপস্থাপন করছি যা ডিজাইন একটি অটোমেশন পৃষ্ঠায় বর্ণিত অনুমানমূলক অটোমেশনের অংশগুলি বাস্তবায়ন করতে ব্যবহার করা যেতে পারে।

সহজ অটোমেশন

একটি অটোমেশন যা সকাল 8:00 টায় ব্লাইন্ডগুলিকে উত্থাপন করে তা এইভাবে প্রয়োগ করা যেতে পারে:

// get all the automation node candidates in the structure
val allCandidates = structure.allCandidates().first()
// determine whether a scheduled automation can be constructed
val isSchedulingSupported =
  allCandidates.any {
    it is EventCandidate &&
      it.eventFactory == Time.ScheduledTimeEvent &&
      it.unsupportedReasons.isEmpty()
  }
// get the blinds present in the structure
val blinds =
  allCandidates
    .filter {
      it is CommandCandidate &&
        it.commandDescriptor == WindowCoveringTrait.UpOrOpenCommand &&
        it.unsupportedReasons.isEmpty()
    }
    .map { it.entity }
    .filterIsInstance<HomeDevice>()
    .filter { it.has(WindowCoveringDevice) }
 if (isSchedulingSupported && blinds.isNotEmpty()) {
  // Proceed to create automation
  val automation: DraftAutomation = automation {
    name = "Day time open blinds"
    description = "Open all blinds at 8AM everyday"
    isActive = true
    sequential {
      // At 8:00am local time....
      val unused =
        starter(structure, Time.ScheduledTimeEvent) {
          parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(8, 0, 0, 0)))
        }
        // ...open all the blinds
       parallel {
        for (blind in blinds) {
          action(blind, WindowCoveringDevice) { command(WindowCovering.upOrOpen()) }
        }
      }
    }
  }
   val createdAutomation = structure.createAutomation(automation)
} else if (!isSchedulingSupported) {
  // Cannot create automation. Set up your address on the structure, then try again.
} else {
  // You don't have any WindowCoveringDevices. Try again after adding some blinds to your structure.
}

জটিল অটোমেশন

একটি অটোমেশন যা ব্লিঙ্কিং লাইট ট্রিগার করে যখন গতি সনাক্ত করা হয় তা এইভাবে প্রয়োগ করা যেতে পারে:

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 java.time.Duration

// get all the automation node candidates in the structure
val allCandidates = structure.allCandidates().first()

// get the lights present in the structure
val availableLights = allCandidates.filter {
   it is CommandCandidate &&
   it.commandDescriptor == OnOffTrait.OnCommand
}.map { it.entity }
.filterIsInstance<HomeDevice>()
.filter {it.has(OnOffLightDevice) ||
         it.has(ColorTemperatureLightDevice) ||
         it.has(DimmableLightDevice) ||
         it.has(ExtendedColorLightDevice)}

val selectedLights = ... // user selects one or more lights from availableLights

automation {
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
   }
   // "blink" the light(s)
   parallel {
            for(light in selectedLights) {
            action(light, OnOffLightDevice) { command(OnOff.toggle()) }
            delayFor(Duration.ofSeconds(1))
            action(light, OnOffLightDevice) { command(OnOff.toggle()) }
            delayFor(Duration.ofSeconds(1))
            action(light, OnOffLightDevice) { command(OnOff.toggle()) }
            delayFor(Duration.ofSeconds(1))
            action(light, OnOffLightDevice) { command(OnOff.toggle())}
         }
      }
   }
}

জেনেরিক অটোমেশন

নিম্নলিখিত কোডটি দেখায় যে কীভাবে কেউ স্ট্রাকচার এপিআই , ডিভাইস এপিআই , এবং ডিসকভারি এপিআই ব্যবহার করে ব্যবহারকারীর বাড়ির সম্পর্কে ডেটা সংগ্রহ করতে পারে এমন একটি অ্যাপ বাস্তবায়নের জন্য যা ব্যবহারকারীকে তাদের নিজস্ব জেনেরিক অটোমেশন তৈরি করার মাধ্যমে গাইড করে (যেমনটি ডিজাইন একটি অটোমেশনে বর্ণনা করা হয়েছে: জেনেরিক অটোমেশন )

val structureFlow: Flow<Structure> = home.structures().itemFlow(myStructureId)

// Get a snapshot of the structure.
val structure: Structure = structureFlow.first()

   // map of devices where key is device id
val devicesById = mutableMapOf<Id,HomeDevice>()

home.devices().list().map { devicesById.put(it.id, it) }

// map of rooms where key is room id
val roomsByName: MutableMap<String,Room?> = mutableMapOf<String,Room?>()

structure.rooms().list().map { roomsByName.put(it.name, it) }

// map of commands where key is trait id
val commandsByTrait: MutableMap<String,MutableList<CommandCandidate>?> = mutableMapOf<String,MutableList<CommandCandidate>?>()

// map of commands where key is DeviceType.Metadata.hashcode()
val commandsByDeviceType: MutableMap<Id,MutableList<CommandCandidate>?> = mutableMapOf<Id,MutableList<CommandCandidate>?>()

// map of commands where key is entity id
val commandsByEntity: MutableMap<Id,MutableList<CommandCandidate>?> = mutableMapOf<Id,MutableList<CommandCandidate>?>()


// map of stateReaders where key is trait id
val stateReadersByTrait: MutableMap<Int,MutableList<StateReaderCandidate>?> = mutableMapOf<Int,MutableList<StateReaderCandidate>?>()

// map of stateReaders where key is DeviceType.Metadata.hashcode()
val stateReadersByDeviceType: MutableMap<Int,MutableList<StateReaderCandidate>?> = mutableMapOf<Int,MutableList<StateReaderCandidate>?>()

// map of stateReaders where key is  entity id
val stateReadersByEntity: MutableMap<Int,MutableList<StateReaderCandidate>?> = mutableMapOf<Int,MutableList<StateReaderCandidate>?>()

// map of starters where key is trait id
val startersByTrait: MutableMap<Int,MutableList<StarterCandidate>?> = mutableMapOf<Int,MutableList<StarterCandidate>?>()

// map of starters where key is DeviceType.Metadata.hashcode()
val startersByDeviceType: MutableMap<Int,MutableList<CommandCandidate>?> = mutableMapOf<Int,MutableList<CommandCandidate>?>()

// map of starters where key is entity id
val startersByEntity: MutableMap<Int,MutableList<StarterCandidate>?> = mutableMapOf<Int,MutableList<StarterCandidate>?>()

// populate candidate maps
structure.allCandidates().first().map {
  when (it) {
   is CommandCandidate -> {

      // update commandsByTrait
      // TODO refactor into generic function to eliminate duplicate code
      var commandsByTraitList: MutableList<CommandCandidate>? = commandsByTrait.get(it.trait.factory.traitId: String)
      if(commandsByTraitList == null) { commandsByTraitList = arrayListOf<CommandCandidate>() }

      commandsByTraitList.add(it)
      commandsByTrait.put(it.trait.factory.traitId, commandsByTraitList)

      // update commandsByDeviceType
      // TODO refactor into generic function to eliminate duplicate code
      for (t in it.types) {

      //TODO filter out device types not present in the home

      //TODO how to get a reference to device type id? 

      var commandsByDeviceTypeList: MutableList<CommandCandidate>? = commandsByDeviceType.get(t.factory.typeId: Id)

      if (commandsByDeviceTypeList == null)  { commandsByDeviceTypeList = arrayListOf<CommandCandidate>() }

      commandsByDeviceTypeList.add(it)

      commandsByDeviceType.put(t.factory.typeId, commandsByDeviceTypeList)
      }

      // update commandsByEntity
      // TODO refactor into generic function to eliminate duplicate code
     var commandsByEntityList: MutableList<CommandCandidate>? = commandsByEntity.get(it.entity.id: Id)
      if ( commandsByEntityList == null ) {commandsByEntityList = arrayListOf<CommandCandidate>()}
      commandsByEntityList.add(it)
      commandsByEntity.put(it.entity.id, commandsByEntityList)
   }

/*
   is StateReaderCandidate -> {

      // update stateReadersByTrait

      var stateReadersList: MutableList<StateReaderCandidate>? = stateReadersByTrait.get(it.trait.factory.traitId)
      if(stateReadersList == null) { stateReadersList = arrayListOf<StateReaderCandidate>() }

      stateReadersList.add(it)
      stateReadersByTrait.put(it.trait.factory.traitId, stateReadersList)

   // update stateReadersByDeviceType

      for (t in it.types) {
      //TODO filter out device types not present in the home
      var stateReadersList: MutableList<StateReaderCandidate>? = stateReadersByDeviceType.get(t.metadata.hashcode())

      if (stateReadersList == null)  { stateReadersList = arrayListOf<StateReaderCandidate>() }

      stateReadersList.put(it)

      stateReadersByDeviceType.put(t.metadata.hashCode(),deviceTypeStateReaderList)
      }

      // update stateReadersByEntity

      MutableList<StateReaderCandidate> entityStateReaderList? = stateReadersByEntity.get(it.entity.id)
      if  entityStateReaderList  is null  {entityStateReaderList = arrayListOf<StateReaderCandidate>()}
      entityStateReaderList.add(it)
      stateReadersByEntity.put(it.entity.id, entityStateReaderList)
   }

   */

   /*
   is StarterCandidate  -> {

      // update startersByTrait

      var startersList: MutableList<StateReaderCandidate>? = startersByTrait.get(it.trait.factory.traitId)
      if(startersList == null) { startersList = arrayListOf<StateReaderCandidate>() }

      startersList.add(it)
      startersByTrait.put(it.trait.factory.traitId, startersList)

   // update startersByDeviceType

      for (t in it.types) {
      //TODO filter out device types not present in the home
      var startersList: MutableList<StateReaderCandidate>? = startersByDeviceType.get(t.metadata.hashcode())

      if (startersList == null)  { startersList = arrayListOf<StateReaderCandidate>() }

      startersList.put(it)

      startersByDeviceType.put(t.metadata.hashCode(),deviceTypeStateReaderList)
      }

      // update startersByEntity

      MutableList<StateReaderCandidate> entityStateReaderList? = startersByEntity.get(it.entity.id)
      if  entityStateReaderList  is null  {entityStateReaderList = arrayListOf<StateReaderCandidate>()}
      entityStateReaderList.add(it)
      stateReadersByEntity.put(it.entity.id, entityStateReaderList)

      }
*/
 else -> println("unknown type encountered: " + it)

  }
}

একটি অটোমেশন চালান

execute() পদ্ধতি ব্যবহার করে একটি তৈরি অটোমেশন চালান:

createdAutomation.execute()

যদি অটোমেশনের একটি ম্যানুয়াল স্টার্টার থাকে, execute() সেই স্থান থেকে অটোমেশন শুরু করে, ম্যানুয়াল স্টার্টারের আগে থাকা সমস্ত নোডকে উপেক্ষা করে। যদি অটোমেশনে ম্যানুয়াল স্টার্টার না থাকে, তাহলে প্রথম স্টার্টার নোড অনুসরণ করে নোড থেকে এক্সিকিউশন শুরু হয়।

execute() অপারেশন ব্যর্থ হলে, একটি HomeException নিক্ষেপ করা হতে পারে। ত্রুটি পরিচালনা দেখুন।

একটি অটোমেশন বন্ধ করুন

stop() পদ্ধতি ব্যবহার করে চলমান অটোমেশন বন্ধ করুন:


createdAutomation.stop()

stop() অপারেশন ব্যর্থ হলে, একটি HomeException নিক্ষেপ করা হতে পারে। ত্রুটি পরিচালনা দেখুন।

একটি কাঠামোর জন্য অটোমেশনের একটি তালিকা পান

অটোমেশনগুলি কাঠামো স্তরে সংজ্ঞায়িত করা হয়। অটোমেশনের একটি Flow অ্যাক্সেস করতে কাঠামোর automations() সংগ্রহ করুন:


import com.google.home.automation.Automation
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

...

val structure = homeManager.structures().list().single()
structure.automations().collect {
  println("Available automations:")
  for (automation in it) {
    println(String.format("%S %S", "$automation.id", "$automation.name"))
  }
}

বিকল্পভাবে, এটি একটি স্থানীয় Collection বরাদ্দ করুন:

import com.google.home.automation.Automation
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

...

var myAutomations: Collection<Automation> = emptyList()
myAutomations = structure.automations()

আইডি দ্বারা একটি অটোমেশন পান

অটোমেশন আইডি দ্বারা একটি অটোমেশন পেতে, কাঠামোর automations() পদ্ধতিতে কল করুন এবং আইডিতে মিল করুন:

import com.google.home.automation.Automation
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

...

val structure = homeManager.structures().list().single()
val automation: DraftAutomation = structure.automations().mapNotNull {
  it.firstOrNull
    { automation -> automation.id == Id("automation-id") }
  }.firstOrNull()

প্রতিক্রিয়া:

// Here's how the automation looks like in the get response. Here, it's represented
// as if calling a println(automation.toString())

Automation(
  name = "automation-name",
  description = "automation-description",
  isActive = true,
  id = Id("automation@automation-id"),
  automationGraph = SequentialFlow(
    nodes = [
      Starter(
        entity="device@test-device",
        type="home.matter.0000.types.0101",
        trait="OnOff@6789..."),
      Action(
        entity="device@test-device",
        type="home.matter.0000.types.0101",
        trait="OnOff@8765...",
        command="on")
    ]))

নাম অনুসারে একটি অটোমেশন পান

কোটলিনের filter() পদ্ধতিটি API কলগুলিকে আরও পরিমার্জিত করতে ব্যবহার করা যেতে পারে। নামের দ্বারা একটি অটোমেশন পেতে, অটোমেশন নামের কাঠামোর অটোমেশন এবং ফিল্টার পান:

import com.google.home.automation.Automation
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

...

val structure = homeManager.structures().list().single()
val automation: DraftAutomation = structure.automations().filter {
  it.name.equals('Sunset Blinds') }

একটি ডিভাইসের জন্য সমস্ত অটোমেশন পান

একটি প্রদত্ত ডিভাইসের উল্লেখ করে এমন সমস্ত অটোমেশন পেতে, প্রতিটি অটোমেশনের automationGraph স্ক্যান করতে নেস্টেড ফিল্টারিং ব্যবহার করুন:

import android.util.Log
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.Automation.automationGraph
import com.google.home.automation.Node
import com.google.home.automation.ParallelFlow
import com.google.home.automation.SelectFlow
import com.google.home.automation.SequentialFlow
import com.google.home.automation.Starter
import com.google.home.automation.StateReader

...

fun collectDescendants(node: Node): List<Node> {
  val d: MutableList<Node> = mutableListOf(node)

  val children: List<Node> =
    when (node) {
      is SequentialFlow -> node.nodes
      is ParallelFlow -> node.nodes
      is SelectFlow -> node.nodes
      else -> emptyList()
    }
  for (c in children) {
    d += collectDescendants(c)
  }
  return d
}

val myDeviceId = "device@452f78ce8-0143-84a-7e32-1d99ab54c83a"
val structure = homeManager.structures().list().single()
val automations =
  structure.automations().first().filter {
    automation: Automation ->
    collectDescendants(automation.automationGraph!!).any { node: Node ->
      when (node) {
        is Starter -> node.entity.id.id == myDeviceId
        is StateReader -> node.entity.id.id == myDeviceId
        is Action -> node.entity.id.id == myDeviceId
        else -> false
      }
    }
  }

একটি অটোমেশন আপডেট করুন

একটি অটোমেশনের মেটাডেটা আপডেট করতে, এটির update() পদ্ধতিতে কল করুন, এটি একটি ল্যাম্বডা এক্সপ্রেশন পাস করে যা মেটাডেটা সেট করে:

import com.google.home.automation.Automation
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

...

val structure = homeManager.structures().list().single()
val automation: DraftAutomation = structure.automations().mapNotNull {
  it.firstOrNull
    { automation -> automation.id == Id("automation-id") }
  }.firstOrNull()
automation.update { this.name = "Flashing lights 2" }

update() পদ্ধতি সম্পূর্ণরূপে একটি অটোমেশন গ্রাফ প্রতিস্থাপন সমর্থন করে, কিন্তু গ্রাফের প্রতি-নোড সম্পাদনা নয়। নোড আন্তঃনির্ভরতার কারণে প্রতি-নোড সম্পাদনা ত্রুটি-প্রবণ। আপনি যদি একটি অটোমেশনের যুক্তি পরিবর্তন করতে চান, একটি নতুন গ্রাফ তৈরি করুন এবং বিদ্যমানটিকে সম্পূর্ণরূপে প্রতিস্থাপন করুন৷

একটি অটোমেশন মুছুন

একটি অটোমেশন মুছে ফেলার জন্য, কাঠামোর deleteAutomation() পদ্ধতি ব্যবহার করুন। একটি অটোমেশন অবশ্যই তার আইডি ব্যবহার করে মুছে ফেলতে হবে।

import com.google.home.automation.Automation
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

...

val structure = homeManager.structures().list().single()
val automation: DraftAutomation = structure.automations().first()
structure.deleteAutomation(automation.id)

মোছা ব্যর্থ হলে, একটি HomeException নিক্ষেপ করা হতে পারে। ত্রুটি পরিচালনা দেখুন।

অটোমেশনে ডিভাইস মুছে ফেলার প্রভাব

যদি একজন ব্যবহারকারী একটি অটোমেশনে ব্যবহৃত একটি ডিভাইস মুছে ফেলে, মুছে ফেলা ডিভাইসটি কোনো স্টার্টার ট্রিগার করতে পারে না, এবং অটোমেশন এটি থেকে বৈশিষ্ট্যগুলি পড়তে বা এটিতে কমান্ড ইস্যু করতে সক্ষম হবে না। উদাহরণস্বরূপ, যদি একজন ব্যবহারকারী তাদের বাড়ি থেকে একটি OccupancySensorDevice মুছে ফেলে এবং একটি অটোমেশনের একটি স্টার্টার থাকে যা OccupancySensorDevice উপর নির্ভর করে, তাহলে সেই স্টার্টারটি আর অটোমেশন সক্রিয় করতে পারবে না।