Le type d'appareil Thermostat peut être implémenté à l'aide de plusieurs traits de l'API Home, mais le trait principal est Thermostat
. Vous trouverez ci-dessous les traits obligatoires et facultatifs pour les thermostats.
Type d'appareil des API Home | Traits | Exemple d'application Kotlin | Cas d'utilisation |
---|---|---|---|
Thermostat
Appareil doté de capteurs intégrés ou séparés pour la température, l'humidité ou l'occupation, et permettant de régler la température souhaitée. Un thermostat peut envoyer des notifications de besoin de chauffage et/ou de climatisation à une unité de chauffage/climatisation (par exemple, un système de traitement de l'air intérieur) ou inclure un mécanisme permettant de contrôler directement une unité de chauffage ou de climatisation. |
Traits requis matter Identifier matter Thermostat |
Thermostat |
Compatibilité avec l'API Automation
Les traits et éléments de thermostat suivants sont compatibles avec l'API Automation.
Obtenir la température ambiante
Obtenir la température ambiante avec le thermostat
Pour obtenir la température ambiante du thermostat à l'aide du trait Thermostat
, lisez l'attribut localTemperature
.
API Device
// 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 }
API Automation
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.")) } } }
Obtenir la température ambiante à l'aide de TemperatureMeasurement
Pour obtenir la température ambiante du thermostat à l'aide du trait TemperatureMeasurement
, lisez l'attribut measuredValue
.
API Device
val temperatureTraitFlow: Flow<TemperatureMeasurement?> = thermostat .type(TemperatureSensorDevice) .map { it.standardTraits.temperatureMeasurement } .distinctUntilChanged() val localTemp: Short? = temperatureTraitFlow.first()?.measuredValue
API Automation
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()) } } }
Obtenir la température moyenne à l'aide d'ExtendedThermostat
Pour obtenir la température moyenne de plusieurs capteurs, consultez l'attribut averageLocalTemperature
du trait ExtendedThermostat
.
API Device
// 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
API Automation
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()) } } }
Obtenir l'humidité ambiante
Pour obtenir l'humidité ambiante du thermostat à l'aide du trait RelativeHumidityMeasurement
, lisez l'attribut measuredValue
.
API Device
// Get the ambient humidity val humidityTraitFlow: Flow<RelativeHumidityMeasurement?> = humiditySensingThermostat .type(HumiditySensorDevice) .map { it.standardTraits.relativeHumidityMeasurement } .distinctUntilChanged() val localHumidity: UShort? = humidityTraitFlow.first()?.measuredValue
API Automation
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()) } } }
Sélectionnez l'échelle de température affichée.
Pour modifier l'unité de mesure de la température utilisée pour l'affichage du thermostat, définissez l'attribut temperatureDisplayMode
de ThermostatUserInterfaceConfigurationTrait
sur TemperatureDisplayModeEnum.Celsius
ou TemperatureDisplayModeEnum.Fahrenheit
.
API Device
// 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) } }
API Automation
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) } } } }
Modifier le mode de fonctionnement
Le thermostat peut être limité à certains modes de fonctionnement, définis par ThermostatTrait.SystemModeEnum
, en définissant l'attribut ThermostatTrait.Attributes.systemMode
, dont les valeurs sont définies par ThermostatTrait.Attributes.SystemModeEnum
.
API Device
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) } }
API Automation
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)) } } }
Lorsque le thermostat est défini sur SystemModeEnum.Auto
, des informations supplémentaires sur le mode de fonctionnement du thermostat peuvent être lues à partir de ThermostatTrait.Attributes.thermostatRunningMode
, qui est renseigné avec les valeurs de ThermostatRunningModeEnum
.
API Device
// 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
API Automation
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.")) } } }
SimplifiedThermostatTrait
est conçu pour simplifier le processus de définition du mode de fonctionnement dans les automatisations. Pour modifier le mode de fonctionnement du thermostat à l'aide de SimplifiedThermostatTrait
, utilisez SetSystemModeCommand
, dont les valeurs sont définies par SimplifiedThermostatTrait.SystemModeEnum
.
Ce trait n'est disponible que pour l'API Automation.
API Automation
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)) } } }
Pour déterminer les modes système dans lesquels un thermostat peut fonctionner, lisez ThermostatTrait.Attributes.controlSequenceOfOperation
, dont les valeurs sont déterminées par ThermostatTrait.ControlSequenceOfOperationEnum
.
API Device
// Get the controlSequenceOfOperation val standardTraitFlow: Flow<Thermostat?> = thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged() val controlSequenceOfOperation: ThermostatTrait.ControlSequenceOfOperationEnum? = standardTraitFlow.first()?.controlSequenceOfOperation
API Automation
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)) } } } }
Modifier le mode de programmation
Le mode de programmation du thermostat peut être modifié à l'aide de Thermostat
's
thermostatProgrammingOperationMode
, dont les valeurs sont définies par ProgrammingOperationModeBitmap
.
API Device
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, ) ) } }
API Automation
// 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)) } } } }
Modifier la température de consigne
Pour modifier la température de consigne à l'aide de Thermostat
, appelez ThermostatTrait.SetpointRaiseLowerCommand
.
API Device
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)
API Automation
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)) } } }
Prioriser une température mémorisée
Vous pouvez faire en sorte qu'une température de consigne prévale sur une programmation préprogrammée en définissant l'attribut temperatureSetpointHold
de ThermostatTrait
sur TemperatureSetpointHoldEnum.SetpointHoldOn
, ou faire en sorte que la programmation prévale en le définissant sur TemperatureSetpointHoldEnum.SetpointHoldOff
.
API Device
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) }
API Automation
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) } } }
Définissez ThermostatTrait.Attributes.temperatureSetpointHoldDuration
pour contrôler le nombre de minutes pendant lesquelles une température de consigne est active.
API Device
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) } }
API Automation
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) } } } }