অ্যান্ড্রয়েডের জন্য হোম এপিআই-এর মাধ্যমে অটোমেশন এপিআই অ্যাক্সেস করা যেতে পারে, কিন্তু যেহেতু তাদের প্রবেশ বিন্দু একটি কাঠামোর মাধ্যমে, তাই ব্যবহারের আগে কাঠামোর উপর অনুমতি নিতে হবে।
একবার কোনও কাঠামোর জন্য অনুমতি দেওয়া হয়ে গেলে, এই প্যাকেজগুলি আপনার অ্যাপে আমদানি করুন:
import com.google.home.Home
import com.google.home.HomeDevice
import com.google.home.Id
import com.google.home.Structure
 একটি কাঠামোতে নিম্নলিখিত অটোমেশন-নির্দিষ্ট পদ্ধতি সহ একটি HasAutomations ইন্টারফেস থাকে:
| এপিআই | বিবরণ | 
|---|---|
| automations() | কাঠামোর সাথে সম্পর্কিত সমস্ত অটোমেশন তালিকাভুক্ত করুন। শুধুমাত্র হোম API গুলির মাধ্যমে তৈরি করা অটোমেশনগুলি ফেরত দেওয়া হবে। | 
| createAutomation(automation) | একটি কাঠামোর জন্য একটি অটোমেশন উদাহরণ তৈরি করুন। | 
| deleteAutomation(automationId) | একটি অটোমেশন উদাহরণ তার আইডি দ্বারা মুছুন। | 
একটি অটোমেশন তৈরি করুন
হোমের একটি ইনস্ট্যান্স তৈরি করার পরে এবং ব্যবহারকারীর কাছ থেকে অনুমতি পাওয়ার পরে, কাঠামো এবং ডিভাইস(গুলি) পান:
val structure = homeManager.structures().list().single()
val device = homeManager.devices().get(Id("myDevice"))!!
 তারপর অটোমেশন DSL ব্যবহার করে আপনার অটোমেশনের লজিক সংজ্ঞায়িত করুন। হোম API গুলিতে, একটি অটোমেশনকে Automation ইন্টারফেস দ্বারা প্রতিনিধিত্ব করা হয়। এই ইন্টারফেসে বৈশিষ্ট্যের একটি সেট রয়েছে:
- মেটাডেটা, যেমন নাম এবং বিবরণ।
- উদাহরণস্বরূপ, অটোমেশন কার্যকর করা যাবে কিনা তা নির্দেশ করে এমন পতাকা।
-  অটোমেশনের লজিক ধারণকারী নোডের একটি তালিকা, যাকে অটোমেশন গ্রাফ বলা হয়, যা automationGraphবৈশিষ্ট্য দ্বারা প্রতিনিধিত্ব করা হয়।
 automationGraph , ডিফল্টরূপে, SequentialFlow ধরণের, যা এমন একটি ক্লাস যেখানে ক্রমানুসারে কার্যকর করা নোডগুলির একটি তালিকা থাকে। প্রতিটি নোড অটোমেশনের একটি উপাদানকে প্রতিনিধিত্ব করে, যেমন একটি স্টার্টার, শর্ত বা ক্রিয়া।
 অটোমেশনের একটি name এবং description দিন।
 একটি অটোমেশন তৈরি করলে isActive ফ্ল্যাগটি ডিফল্টভাবে true তে সেট হয়ে যায়, তাই যদি না আপনি প্রাথমিকভাবে অটোমেশনটি অক্ষম করতে চান তবে এই ফ্ল্যাগটি স্পষ্টভাবে সেট করার প্রয়োজন নেই। এই পরিস্থিতিতে, তৈরির সময় ফ্ল্যাগটি false তে সেট করুন।
 DraftAutomation ইন্টারফেসটি অটোমেশন তৈরি এবং তৈরি করার জন্য ব্যবহৃত হয়, এবং Automation ইন্টারফেসটি পুনরুদ্ধারের জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, এখানে অটোমেশন DSL হল একটি অটোমেশনের জন্য যা অন্য ডিভাইস চালু করার সময় একটি ডিভাইস চালু করে:
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()) }
  }
}
 অটোমেশন DSL সংজ্ঞায়িত হয়ে গেলে, DraftAutomation ইনস্ট্যান্স তৈরি করতে এটি createAutomation() পদ্ধতিতে পাস করুন:
val createdAutomation = structure.createAutomation(automation)
 এখান থেকে, আপনি অটোমেশনের অন্যান্য সমস্ত অটোমেশন পদ্ধতি ব্যবহার করতে পারেন, যেমন execute() , stop() , এবং update() ।
যাচাইকরণ ত্রুটি
 যদি অটোমেশন তৈরির মাধ্যমে যাচাইকরণ পাস না হয়, তাহলে একটি সতর্কতা বা ত্রুটি বার্তা সমস্যা সম্পর্কে তথ্য প্রদান করে। আরও তথ্যের জন্য, ValidationIssueType রেফারেন্স দেখুন।
কোড উদাহরণ
এখানে আমরা কিছু উদাহরণ কোড উপস্থাপন করছি যা "Android-এ অটোমেশন ডিজাইন করুন" পৃষ্ঠায় বর্ণিত কাল্পনিক অটোমেশনের অংশগুলি বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে।
সহজ অটোমেশন
সকাল ৮:০০ টায় ব্লাইন্ডগুলি উপরে তোলার জন্য একটি অটোমেশন এভাবে বাস্তবায়িত হতে পারে:
// 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())}
         }
      }
   }
}
সত্তা ফিল্টার সহ ডিভাইসগুলি গতিশীলভাবে নির্বাচন করুন
অটোমেশন লেখার সময়, আপনি কেবল নির্দিষ্ট ডিভাইস নির্দিষ্ট করার মধ্যেই সীমাবদ্ধ থাকেন না। এন্টিটি ফিল্টার নামক একটি বৈশিষ্ট্য আপনার অটোমেশনকে বিভিন্ন মানদণ্ডের উপর ভিত্তি করে রানটাইমে ডিভাইস নির্বাচন করতে দেয়।
উদাহরণস্বরূপ, সত্তা ফিল্টার ব্যবহার করে, আপনার অটোমেশন লক্ষ্য করতে পারে:
- একটি নির্দিষ্ট ডিভাইস ধরণের সমস্ত ডিভাইস
- একটি নির্দিষ্ট ঘরের সমস্ত ডিভাইস
- একটি নির্দিষ্ট ঘরে একটি নির্দিষ্ট ডিভাইস ধরণের সমস্ত ডিভাইস
- চালু থাকা সকল ডিভাইস
- একটি নির্দিষ্ট ঘরে চালু থাকা সমস্ত ডিভাইস
সত্তা ফিল্টার ব্যবহার করতে:
-  StructureঅথবাRoomযেকোনো একটিতে,atExecutionTime()কল করুন। এটি একটিTypedExpression<TypedEntity<StructureType>>প্রদান করে।
-  এই অবজেক্টে, getDevicesOfType()কল করুন, এটিকে একটিDeviceTypeদিন।
এন্টিটি ফিল্টারগুলি স্টার্টার, স্টেট রিডার এবং অ্যাকশনে ব্যবহার করা যেতে পারে।
উদাহরণস্বরূপ, যেকোনো অন/অফ লাইট স্টার্টার থেকে অটোমেশন ট্রিগার করতে:
// If any light is turned on or off val starter = starter( entityExpression = structure.atExecutionTime().getDevicesOfType(OnOffLightDevice), trait = OnOff, )
 একটি স্টেট রিডারে একটি কাঠামোর (বিশেষ করে, অন/অফ লাইট) সমস্ত লাইটের OnOff অবস্থা ক্যাপচার করতে:
// Build a Map<Entity, OnOff> val onOffStateOfAllLights = stateReader( entityExpression = structure.atExecutionTime().getDevicesOfType(OnOffLightDevice), trait = OnOff, )
একটি নির্দিষ্ট ঘরে আলো পেতে এবং সেগুলিকে একটি নির্দিষ্ট অবস্থায় ব্যবহার করতে:
val livingRoomLights = stateReader( entityExpression = livingRoom.atExecutionTime().getDevicesOfType(OnOffLightDevice), trait = OnOff, ) // Are any of the lights in the living room on? condition { expression = livingRoomLights.values.any { it.onOff equals true } }
রানটাইমে:
| দৃশ্যকল্প | ফলাফল | 
|---|---|
| স্টার্টারে কোনও ডিভাইসই মানদণ্ড পূরণ করে না। | অটোমেশন চালু হচ্ছে না। | 
| কোনও স্টেট রিডারে কোনও ডিভাইসই মানদণ্ড পূরণ করে না। | অটোমেশন শুরু হয় কিন্তু কিছুই করে না। | 
| কোনও ডিভাইস কোনও কাজের মানদণ্ড পূরণ করে না। | অটোমেশন শুরু হয় কিন্তু অ্যাকশন কিছুই করে না। | 
নিম্নলিখিত উদাহরণটি এমন একটি অটোমেশন যা হলের আলো ছাড়া সমস্ত আলো নিভিয়ে দেয় যখনই একটি পৃথক আলো নিভিয়ে দেওয়া হয়:
val unused = automation { sequential { // If any light is turned on or off val starter = starter( entityExpression = structure.atExecutionTime().getDevicesOfType(OnOffLightDevice), trait = OnOff, ) condition { // Check to see if the triggering light was turned off expression = starter.onOff equals false } // Turn off all lights except the hall light action( entityExpression = structure.atExecutionTime().getDevicesOfType(OnOffLightDevice).filter { it notEquals entity(hallwayLight, OnOffLightDevice) } ) { command(OnOff.on()) } } }
একটি অটোমেশন কার্যকর করুন
 execute() পদ্ধতি ব্যবহার করে একটি তৈরি অটোমেশন চালান: 
createdAutomation.execute()
যদি অটোমেশনে একটি ম্যানুয়াল স্টার্টার থাকে, execute() সেই বিন্দু থেকে অটোমেশন শুরু করে, ম্যানুয়াল স্টার্টারের পূর্ববর্তী সমস্ত নোড উপেক্ষা করে। যদি অটোমেশনে একটি ম্যানুয়াল স্টার্টার না থাকে, তাহলে প্রথম স্টার্টার নোডের পরে নোড থেকে এক্সিকিউশন শুরু হয়।
 যদি execute() অপারেশন ব্যর্থ হয়, তাহলে একটি HomeException থ্রো করা হতে পারে। Error handling দেখুন।
অটোমেশন বন্ধ করুন
 stop() পদ্ধতি ব্যবহার করে একটি চলমান অটোমেশন বন্ধ করুন: 
createdAutomation.stop()
যদি stop() অপারেশন ব্যর্থ হয়, তাহলে একটি HomeException থ্রো করা হতে পারে। Error handling দেখুন। 
একটি কাঠামোর জন্য অটোমেশনের একটি তালিকা পান
 অটোমেশনগুলি কাঠামোর স্তরে সংজ্ঞায়িত করা হয়। অটোমেশনের 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")
    ]))
নাম অনুসারে একটি অটোমেশন পান
 Kotlin-এ 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() পদ্ধতিটি একটি অটোমেশন গ্রাফ সম্পূর্ণরূপে প্রতিস্থাপন সমর্থন করে, কিন্তু গ্রাফের প্রতি-নোড সম্পাদনাকে সমর্থন করে না। নোডের আন্তঃনির্ভরতার কারণে প্রতি-নোড সম্পাদনা ত্রুটি-প্রবণ। আপনি যদি একটি অটোমেশনের যুক্তি পরিবর্তন করতে চান, তাহলে একটি নতুন গ্রাফ তৈরি করুন এবং বিদ্যমানটি সম্পূর্ণরূপে প্রতিস্থাপন করুন। 
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: Automation = structure.automations().mapNotNull {
  it.firstOrNull
    { automation -> automation.id == Id("automation-id") }
  }.firstOrNull()
automation.update {
  this.automationGraph = sequential {
    val laundryWasherCompletionEvent =
      starter<_>(laundryWasher, LaundryWasherDevice, OperationCompletionEvent)
    condition {
      expression =
        laundryWasherCompletionEvent.completionErrorCode equals
          // UByte 0x00u means NoError
          0x00u
    }
    action(speaker, SpeakerDevice) { command(AssistantBroadcast.broadcast("laundry is done")) }
    }
  }
}
একটি অটোমেশন মুছে ফেলুন
 একটি অটোমেশন মুছে ফেলার জন্য, কাঠামোর 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 এর উপর নির্ভর করে, তাহলে সেই স্টার্টারটি আর অটোমেশন সক্রিয় করতে পারবে না।