Der Gerätetyp „Thermostat“ kann mit mehreren Home API-Traits implementiert werden, der primäre Trait ist jedoch Thermostat
. Im Folgenden finden Sie die erforderlichen und optionalen Traits für Thermostatgeräte.
Gerätetyp für Home-APIs | Attribute | Kotlin-Beispiel-App | Anwendungsfall |
---|---|---|---|
Thermostat
Ein Gerät, das entweder über integrierte oder separate Sensoren für Temperatur, Luftfeuchtigkeit oder Anwesenheit verfügt und mit dem die gewünschte Temperatur eingestellt werden kann. Ein Thermostat kann Benachrichtigungen über den Heiz- und/oder Kühlbedarf an eine Heiz- oder Kühleinheit (z. B. eine Innenraumeinheit) senden oder einen Mechanismus zur direkten Steuerung einer Heiz- oder Kühleinheit enthalten. |
Erforderliche Merkmale matter Identify matter Thermostat |
Thermostat |
Unterstützung der Automatisierungen-API
Die folgenden Thermostat-Traits und -Elemente werden in der Automation API unterstützt.
Umgebungstemperatur abrufen
Umgebungstemperatur mit Thermostat abrufen
Wenn Sie die Umgebungstemperatur des Thermostats mit dem Trait Thermostat
abrufen möchten, lesen Sie das Attribut localTemperature
.
Geräte-API
// Get the ambient temperature val thermostat = home.devices().list().first { device -> device.has(Thermostat) } val thermostatTraitFlow: Flow<Thermostat?> = thermostat .type(ThermostatDevice) .mapNotNull { it.standardTraits.thermostat } .distinctUntilChanged() val localTempFlow = thermostatTraitFlow.mapNotNull { it?.localTemperature }
Automation API
val automation = automation { sequential { val starterNode = starter<_>(thermostat, ThermostatDevice, Thermostat) // If the temperature is higher than 35C... // `localTemperature` is in one hundredth of a degree Celsius. condition { expression = starterNode.localTemperature greaterThan 3500 } // ...and the automation hasn't been run for at least an hour... suppressFor(Duration.ofHours(1)) // ...broadcast a message action(speaker, SpeakerDevice) { command(AssistantBroadcast.broadcast("It's very hot outside.")) } } }
Umgebungstemperatur mit TemperatureMeasurement abrufen
Wenn Sie die Umgebungstemperatur des Thermostats mit dem Trait TemperatureMeasurement
abrufen möchten, lesen Sie das Attribut measuredValue
.
Geräte-API
val temperatureTraitFlow: Flow<TemperatureMeasurement?> = thermostat .type(TemperatureSensorDevice) .map { it.standardTraits.temperatureMeasurement } .distinctUntilChanged() val localTemp: Short? = temperatureTraitFlow.first()?.measuredValue
Automation API
val automation = automation { sequential { val temperature = starter<_>(thermostat, ThermostatDevice, TemperatureMeasurement) val stateReaderNode = stateReader<_>(light, DimmableLightDevice, OnOff) condition() { val expr1 = temperature.measuredValue greaterThanOrEquals 3500 val expr2 = stateReaderNode.onOff equals true expression = expr1 and expr2 } action(light, DimmableLightDevice) { command(OnOff.on()) } } }
Durchschnittstemperatur mit ExtendedThermostat abrufen
Wenn Sie die Durchschnittstemperatur mehrerer Sensoren abrufen möchten, lesen Sie das Attribut averageLocalTemperature
des Traits ExtendedThermostat
.
Geräte-API
// Get the average temperature val thermostat = home.devices().list().first { device -> device.has(TemperatureSensorDevice) } val temperatureTraitFlow: Flow<TemperatureMeasurement?> = thermostat .type(TemperatureSensorDevice) .map { it.standardTraits.temperatureMeasurement } .distinctUntilChanged() val localTemp: Short? = temperatureTraitFlow.first()?.measuredValue
Automation API
val automation = automation { sequential { val temperature = starter<_>(thermostat, ThermostatDevice, ExtendedThermostat) val stateReaderNode = stateReader<_>(light, DimmableLightDevice, OnOff) // if the average temperature is >= 35C condition() { val expr1 = temperature.averageLocalTemperature greaterThanOrEquals 3500 val expr2 = stateReaderNode.onOff equals true expression = expr1 and expr2 } // Turn on the light action(light, DimmableLightDevice) { command(OnOff.on()) } } }
Luftfeuchtigkeit abrufen
Wenn Sie die Luftfeuchtigkeit des Thermostats über das RelativeHumidityMeasurement
-Trait abrufen möchten, lesen Sie das Attribut measuredValue
.
Geräte-API
// Get the ambient humidity val humidityTraitFlow: Flow<RelativeHumidityMeasurement?> = humiditySensingThermostat .type(HumiditySensorDevice) .map { it.standardTraits.relativeHumidityMeasurement } .distinctUntilChanged() val localHumidity: UShort? = humidityTraitFlow.first()?.measuredValue
Automation API
val automation = automation { sequential { val humidity = starter<_>(thermostat, HumiditySensorDevice, RelativeHumidityMeasurement) val stateReaderNode = stateReader<_>(light, DimmableLightDevice, OnOff) // if the ambient humidity is >= 80% condition() { val expr1 = (humidity.measuredValue greaterThanOrEquals 80u) val expr2 = (stateReaderNode.onOff equals true) expression = expr1 and expr2 } // Turn on the light action(light, DimmableLightDevice) { command(OnOff.on()) } } }
Angezeigte Temperaturskala auswählen
Wenn Sie die Temperatureinheit ändern möchten, die auf dem Display des Thermostats verwendet wird, legen Sie das Attribut temperatureDisplayMode
des ThermostatUserInterfaceConfigurationTrait
auf TemperatureDisplayModeEnum.Celsius
oder TemperatureDisplayModeEnum.Fahrenheit
fest.
Geräte-API
// Set the displayed temperature scale to Fahrenheit val uiConfig = home .devices() .list() .filter { device -> device.has(ThermostatUserInterfaceConfiguration) } .first() val uiConfigTraitFlow: Flow<ThermostatUserInterfaceConfiguration?> = uiConfig .type(ThermostatDevice) .map { it.standardTraits.thermostatUserInterfaceConfiguration } .distinctUntilChanged() val uiConfigTrait: ThermostatUserInterfaceConfiguration = uiConfigTraitFlow.first()!! if ( uiConfigTrait.supports(ThermostatUserInterfaceConfiguration.Attribute.temperatureDisplayMode) ) { val unused = uiConfigTrait.update { setTemperatureDisplayMode(TemperatureDisplayModeEnum.Fahrenheit) } }
Automation API
val automation = automation { isActive = true sequential { val stateReaderNode = stateReader<_>(thermostat, ThermostatDevice, ThermostatUserInterfaceConfiguration) // When someone says "Show the temperature in Fahrenheit", val unused = starter<_>(structure, VoiceStarter.OkGoogleEvent) { parameter(VoiceStarter.OkGoogleEvent.query("Show the temperature in Fahrenheit")) } // if the temperature isn't being shown in Fahrenheit condition() { expression = stateReaderNode.temperatureDisplayMode notEquals TemperatureDisplayModeEnum.Fahrenheit } // display the current temperature using Fahrenheit action(thermostat, ThermostatDevice) { update(ThermostatUserInterfaceConfiguration) { setTemperatureDisplayMode(TemperatureDisplayModeEnum.Fahrenheit) } } } }
Betriebsmodus ändern
Das Thermostat kann auf bestimmte Betriebsmodi beschränkt werden, die durch ThermostatTrait.SystemModeEnum
definiert werden. Dazu wird das Attribut ThermostatTrait.Attributes.systemMode
festgelegt, dessen Werte durch ThermostatTrait.Attributes.SystemModeEnum
definiert werden.
Geräte-API
val thermostatDevice = structure.devices().list().first { device -> device.has(Thermostat) } val thermostatTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val thermostatTrait: Thermostat = thermostatTraitFlow.first()!! // Set the system mode to Auto if (thermostatTrait.supports(Thermostat.Attribute.systemMode)) { val unused = thermostatTrait.update { setSystemMode(SystemModeEnum.Auto) } }
Automation API
val automation = automation { isActive = true // When the door lock state changes sequential { val doorLockEvent = starter<_>(doorLock, DoorLockDevice, LockOperationEvent) val stateReaderNode = stateReader<_>(thermostat, ThermostatDevice, SimplifiedThermostat) // if the door is unlocked and the thermostat is in Eco mode condition() { val expr1 = (doorLockEvent.lockOperationType equals LockOperationTypeEnum.Unlock) val expr2 = (stateReaderNode.systemMode equals SimplifiedThermostatSystemModeEnum.Eco) expression = expr1 and expr2 } // Set the thermostat to Auto mode action(thermostat, ThermostatDevice) { command(SimplifiedThermostat.setSystemMode(SimplifiedThermostatSystemModeEnum.Auto)) } } }
Wenn der Thermostat auf SystemModeEnum.Auto
eingestellt ist, können zusätzliche Informationen zum Betriebsmodus des Thermostats aus ThermostatTrait.Attributes.thermostatRunningMode
gelesen werden, das mit Werten aus ThermostatRunningModeEnum
gefüllt wird.
Geräte-API
// Get the current thermostat running mode val runningModeTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val runningMode: ThermostatTrait.ThermostatRunningModeEnum? = runningModeTraitFlow.first()?.thermostatRunningMode
Automation API
val automation = automation { isActive = true sequential { val stateReaderNode = stateReader<_>(thermostat, ThermostatDevice, Thermostat) // at 10:00am val unused = starter<_>(structure, Time.ScheduledTimeEvent) { parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(10, 0, 0, 0))) } // if the thermostat is in Auto mode and is currently cooling condition() { val expr1 = (stateReaderNode.systemMode equals ThermostatTrait.SystemModeEnum.Auto) val expr2 = (stateReaderNode.thermostatRunningMode equals ThermostatTrait.ThermostatRunningModeEnum.Cool) expression = expr1 and expr2 } // announce that it's in Cool mode action(structure) { command(AssistantBroadcast.broadcast("The thermostat is currently running in Cool mode.")) } } }
Die SimplifiedThermostatTrait
soll die Einrichtung des Betriebsmodus in Automatisierungen vereinfachen. Wenn Sie den Betriebsmodus des Thermostats mit SimplifiedThermostatTrait
ändern möchten, verwenden Sie SetSystemModeCommand
. Die Werte dafür werden durch SimplifiedThermostatTrait.SystemModeEnum
definiert.
Dieses Merkmal ist nur für die Verwendung mit der Automation API verfügbar.
Automation API
val automation = automation { isActive = true sequential { // When the presence state changes... val starterNode = starter<_>(structure, AreaPresenceState) // ...and if the area is unoccupied... condition() { expression = starterNode.presenceState equals PresenceState.PresenceStateVacant } // Set the thermostat to Eco mode action(thermostat, ThermostatDevice) { command(SimplifiedThermostat.setSystemMode(SimplifiedThermostatSystemModeEnum.Eco)) } } }
Um die Systemmodi zu ermitteln, in denen ein Thermostat betrieben werden kann, lesen Sie ThermostatTrait.Attributes.controlSequenceOfOperation
. Die Werte werden durch ThermostatTrait.ControlSequenceOfOperationEnum
bestimmt.
Geräte-API
// Get the controlSequenceOfOperation val standardTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val controlSequenceOfOperation: ThermostatTrait.ControlSequenceOfOperationEnum? = standardTraitFlow.first()?.controlSequenceOfOperation
Automation API
val automation = automation { isActive = true sequential { val stateReaderNode = stateReader<_>(thermostat, ThermostatDevice, Thermostat) // When someone says "Switch to cool mode", val unused = starter<_>(structure, VoiceStarter.OkGoogleEvent) { parameter(VoiceStarter.OkGoogleEvent.query("Switch to cool mode")) } // if the thermostat is capable of operating in Cool mode, condition() { val expr1 = stateReaderNode.controlSequenceOfOperation notEquals ControlSequenceOfOperationEnum.HeatingOnly val expr2 = stateReaderNode.controlSequenceOfOperation notEquals ControlSequenceOfOperationEnum.HeatingWithReheat expression = expr1 and expr2 } action(thermostat, ThermostatDevice) { // switch to Cool mode update(SimplifiedThermostat) { command(SimplifiedThermostat.setSystemMode(SimplifiedThermostatSystemModeEnum.Cool)) } } } }
Programmierbetriebsmodus ändern
Der Programmiermodus des Thermostats kann über das thermostatProgrammingOperationMode
des Thermostat
geändert werden. Die Werte werden durch das ProgrammingOperationModeBitmap
definiert.
Geräte-API
val thermostatTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val thermostatTrait: Thermostat = thermostatTraitFlow.first()!! if (thermostatTrait.supports(Thermostat.Attribute.thermostatProgrammingOperationMode)) { val programmingOperationMode = thermostatTrait.thermostatProgrammingOperationMode!! // Enable autoRecovery on the thermostatProgrammingOperationMode val unused = thermostatTrait.update { setThermostatProgrammingOperationMode( ThermostatTrait.ProgrammingOperationModeBitmap( programmingOperationMode.scheduleActive, true, programmingOperationMode.economy, ) ) } }
Automation API
// When someone says "Reset programming operation mode" val automation = automation { isActive = true sequential { val unused = starter<_>(structure, VoiceStarter.OkGoogleEvent) { parameter(VoiceStarter.OkGoogleEvent.query("Reset programming operation mode")) } // Set all the flags on the programming operation mode action(thermostat, ThermostatDevice) { update(Thermostat) { setThermostatProgrammingOperationMode(ProgrammingOperationModeBitmap(true, true, true)) } } } }
Sollwert für Temperatur ändern
Wenn Sie den Temperatursollwert mit Thermostat
ändern möchten, rufen Sie ThermostatTrait.SetpointRaiseLowerCommand
auf.
Geräte-API
val thermostatTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val thermostatTrait: Thermostat = thermostatTraitFlow.first()!! // lower the temperature setpoint by 1 degree C. // `amount` is in one tenth of a degree Celsius. thermostatTrait.setpointRaiseLower(amount = -10, mode = SetpointRaiseLowerModeEnum.Cool)
Automation API
val automation = automation { isActive = true sequential { val stateReaderNode = stateReader<_>(thermostat, ThermostatDevice, Thermostat) // At 10:00pm val unused = starter<_>(structure, Time.ScheduledTimeEvent) { parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(22, 0, 0, 0))) } // if the setpoint is warmer than 19C // `occupiedCoolingSetpoint` is in one hundredth of a degree C. condition() { expression = stateReaderNode.occupiedCoolingSetpoint greaterThan 1900 } // lower the temperature setpoint by 5 degrees C // Setpoint amount here is in one tenth of a degree Celsius. action(thermostat, ThermostatDevice) { command(Thermostat.setpointRaiseLower(SetpointRaiseLowerModeEnum.Cool, -50)) } } }
Sollwert für Temperatur priorisieren
Sie können festlegen, dass ein Temperatur-Sollwert Vorrang vor einem vorprogrammierten Zeitplan hat, indem Sie das Attribut temperatureSetpointHold
des ThermostatTrait
auf TemperatureSetpointHoldEnum.SetpointHoldOn
setzen. Wenn der Zeitplan Vorrang haben soll, setzen Sie es auf TemperatureSetpointHoldEnum.SetpointHoldOff
.
Geräte-API
val thermostatTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val thermostatTrait: Thermostat = thermostatTraitFlow.first()!! if (thermostatTrait.supports(Thermostat.Attribute.temperatureSetpointHold)) { // Set temperatureSetpointHold to SetpointHoldOn // allowing temperature setpoints to override any preprogrammed schedules. val unused = thermostatTrait.update { setTemperatureSetpointHold(TemperatureSetpointHoldEnum.SetpointHoldOn) }
Automation API
val automation = automation { isActive = true sequential { // When someone says "Prioritize thermostat setpoint" val unused = starter<_>(structure, VoiceStarter.OkGoogleEvent) { parameter(VoiceStarter.OkGoogleEvent.query("Prioritize thermostat setpoint")) } // make temperature setpoints override any preprogrammed schedules. action(thermostat, ThermostatDevice) { val unused2 = update(Thermostat) { setTemperatureSetpointHold(TemperatureSetpointHoldEnum.SetpointHoldOn) } } }
Mit ThermostatTrait.Attributes.temperatureSetpointHoldDuration
kannst du festlegen, wie viele Minuten ein Sollwert gehalten wird.
Geräte-API
val thermostatTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val thermostatTrait: Thermostat = thermostatTraitFlow.first()!! if (thermostatTrait.supports(Thermostat.Attribute.temperatureSetpointHoldDuration)) { // Set the setpoint hold duration to 60 minutes val unused = thermostatTrait.update { setTemperatureSetpointHoldDuration(60u) } }
Automation API
val automation = automation { isActive = true sequential { val stateReaderNode = stateReader<_>(thermostat, ThermostatDevice, Thermostat) val unused = starter<_>(thermostat, ThermostatDevice, Thermostat) // if the temperature setpoint hold duration is less than 60 minutes... condition() { expression = stateReaderNode.temperatureSetpointHoldDuration.lessThan(60u) } // ...and the automation hasn't been run for at least 24 hours... suppressFor(Duration.ofHours(24)) // ...set the temperature setpoint hold duration to 60 minutes action(thermostat, ThermostatDevice) { val unused2 = update(Thermostat) { setTemperatureSetpointHoldDuration(60u) } } } }