Automazioni dei dispositivi in più parti su Android

Un'automazione può fare riferimento a dispositivi multipart in modo simile a un'automazione che non utilizza dispositivi multipart.

Innanzitutto, ottieni le parti componenti come faresti normalmente. Per scoprire come utilizzare i dispositivi multipart, consulta la pagina Dispositivi multipart.

Poi, per ogni parte che vuoi utilizzare nell'automazione, crea un AutomationPartPath, che ti consente di fare riferimento alla parte negli avviatori, nelle condizioni e nelle azioni.

// Obtain a reference to the device:
val multipartDevices = structure.devices(enableMultipartDevices = true).first().toList()

val lights = multipartDevices.filter { it.has(OnOffLightDevice) && it.has(OnOff) }

val light = lights.first()

// get the AutomationPartPath for the device
val lightPartPath = light.automationPart(light.part(OnOffLightDevice).first())

Un'altra cosa da notare è che le azioni di automazione in genere accettano un dispositivo e un tipo di dispositivo come parametri. Tuttavia, un'azione di automazione che fa riferimento a un dispositivo parte componente, utilizzando di nuovo un AutomationPartPath, richiede solo l' AutomationPartPath, perché quest'ultimo contiene già un riferimento al tipo di dispositivo oltre al riferimento al dispositivo componente.AutomationPartPath

Ad esempio, nell'API Automation, un tipo di dispositivo Refrigerator può essere trattato come un dispositivo multipart. È costituito da un RefrigeratorDevice root che può contenere più armadietti secondari, come congelatori o armadietti standard di tipo TemperatureControlledCabinetDevice.

Per creare automazioni per il frigorifero, interagisci principalmente con due tratti Matter standard:

  • RefrigeratorAlarm: espone gli allarmi di stato della porta tramite l'attributo doorOpen del campo state.
  • RefrigeratorAndTemperatureControlledCabinetMode: consente di leggere e comandare le modalità. Ad esempio, l'esecuzione di comandi come changeToMode per passare a modalità come LowEnergy, RapidCool o LowNoise.

Questa automazione di esempio viene attivata quando viene aperta la porta del frigorifero. Se la porta rimane aperta per più di due minuti, l'automazione trasmette una notifica vocale sugli smart speaker, accende le luci della cucina e invia una notifica push. Tieni presente che questa automazione influisce solo sul vano frigorifero del dispositivo, ignorando il vano congelatore (se presente):

import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.equals
import com.google.home.automation.starter
import com.google.home.google.AssistantBroadcast
import com.google.home.google.Notification
import com.google.home.matter.standard.OnOff
import com.google.home.matter.standard.OnOffLightDevice
import com.google.home.matter.standard.RefrigeratorAlarm
import com.google.home.matter.standard.RefrigeratorAlarm.Companion.state
import com.google.home.matter.standard.RefrigeratorDevice
import com.google.home.matter.standard.SpeakerDevice
import java.time.Duration

val structure: Structure = home.structures().first()

// Fetch devices using the multipart device model.
var multipartDevices = homeManager.devices(enableMultipartDevices = true)

// Obtain a reference to the refrigerator device.
val refrigeratorDevice = multipartDevices.first {
  it.has(TemperatureControlledCabinetDevice) &&
  it.has(RefrigeratorAndTemperatureControlledCabinetMode) &&
  it.has(RefrigeratorAlarm)
}

// Get all temperature-controlled cabinet parts of the refrigerator
val cabinets = refrigeratorDevice.parts(TemperatureControlledCabinetDevice)

// Find the cabinet part with the 'refrigerator' semantic tag
val refrigeratorCabinet = cabinets.firstOrNull {
  it.metadata.tags.contains(SemanticTag.Refrigerator.refrigerator)
}

val cabinetPartPath = refrigeratorCabinet.automationPath(TemperatureControlledCabinetDevice)

val speaker = home.devices().list().first { device -> device.has(SpeakerDevice) }

val refrigeratorDoorAlert = automation {
  name = "Refrigerator Door Open Alert"
  description = "Warn when the refrigerator door has been open for over 2 min"
  isActive = true

  sequential {
    // 1. Starter: Monitor the refrigerator door alarm trait
    val alarmStarter = starter<_>(cabinetPartPath, RefrigeratorAlarm)

    // 2. Condition: Ensure the 'doorOpen' alarm remains active for 2 continuous min
    condition {
      expression = alarmStarter.state.doorOpen equals true
      forDuration(Duration.ofMinutes(2))
    }

    // 3. Actions: Execute parallel reactions
    parallel {
      // Broadcast warning to household speakers
      action(speaker, SpeakerDevice) {
        command(AssistantBroadcast.broadcast("The refrigerator door has been left open!"))
      }

      // Push a notification alerts to home members' mobile devices
      action(structure) {
        command(Notification.sendNotifications(
          "Fridge Alert",
          { body = "The refrigerator door has been open for over 2 min" }
        ))
      }
    }
  }
}

L'esempio seguente passa il frigorifero alla modalità a basso consumo energetico quando rileva che non c'è nessuno in casa.

import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.equals
import com.google.home.automation.starter
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.RefrigeratorAndTemperatureControlledCabinetMode
import com.google.home.matter.standard.RefrigeratorAndTemperatureControlledCabinetMode.Companion.changeToMode
import com.google.home.matter.standard.RefrigeratorDevice
import com.google.home.matter.standard.TemperatureControlledCabinetDevice

val structure: Structure = home.structures().first()

// Fetch devices using the multipart device model.
var multipartDevices = homeManager.devices(enableMultipartDevices = true)

// Obtain a reference to the refrigerator device.
val refrigeratorDevice = multipartDevices.first {
  it.has(TemperatureControlledCabinetDevice) &&
  it.has(RefrigeratorAndTemperatureControlledCabinetMode) &&
  it.has(RefrigeratorAlarm)
}

val refrigeratorPartPath = refrigeratorDevice.automationPart(refrigeratorDevice.part(RefrigeratorDevice).first())

// Get all temperature-controlled cabinet parts of the refrigerator
val cabinets = refrigeratorDevice.parts(TemperatureControlledCabinetDevice )

// Find the cabinet part with the 'refrigerator' semantic tag
val refrigeratorCabinet = cabinets.firstOrNull {
  it.metadata.tags.contains(SemanticTag.Refrigerator.refrigerator)
}

val refrigeratorEcoMode = automation {
  name = "Refrigerator Eco Mode"
  description = "Automatically changes refrigerator to low energy mode when house is vacant."
  isActive = true

  sequential {
    // 1. Starter: Monitor household presence changes
    val presenceStarter = starter<_>(structure, AreaPresenceState)

    // 2. Condition: Verify presence state transitions to vacant
    condition {
      expression = presenceStarter.presenceState equals PresenceState.PresenceStateVacant
    }

    // 3. Action: Set refrigerator cabinet Mode to 'Low Energy' (e.g. Mode 1u)
    action(refrigeratorPartPath {
      command(RefrigeratorAndTemperatureControlledCabinetMode.changeToMode(1u))
    }
  }
}