راهنمای دستگاه ترموستات

نوع دستگاه ترموستات ممکن است با استفاده از چندین ویژگی Home API اجرا شود، اما ویژگی اصلی Thermostat است. در زیر ویژگی های مورد نیاز و اختیاری برای دستگاه های ترموستات آورده شده است.

APIهای خانگی نوع دستگاه صفات نمونه برنامه استفاده از مورد

ترموستات

Thermostat Device

دستگاهی که می تواند حسگرهای داخلی یا مجزا برای دما، رطوبت یا اشغال داشته باشد و امکان تنظیم دمای مورد نظر را فراهم کند. ترموستات قادر است اعلان‌های مورد نیاز گرمایش و/یا سرمایش را به یک واحد گرمایش/سرمایش (به عنوان مثال، یک کنترل‌کننده هوای داخلی) ارسال کند یا می‌تواند مکانیزمی برای کنترل مستقیم یک واحد گرمایش یا سرمایش را شامل شود.

صفات مورد نیاز
ماده شناسایی
ترموستات ماده

ترموستات

پشتیبانی از API اتوماسیون

ویژگی‌ها و عناصر ترموستات زیر در Automation API پشتیبانی می‌شوند.

صفت نوع صفت نوع عنصر عنصر
ترموستات موضوع فرمان SetpointRaiseLower
ترموستات موضوع صفت activePresetHandle
ترموستات موضوع صفت دمای محلی
ترموستات موضوع صفت اشغال
ترموستات موضوع صفت occupiedCoolingSetpoint
ترموستات موضوع صفت occupiedHeatingSetpoint
ترموستات موضوع صفت دمای بیرون
ترموستات موضوع صفت setpointChangeSource
ترموستات موضوع صفت systemMode
ترموستات موضوع صفت temperatureSetpointHold
ترموستات موضوع صفت temperatureSetpointHoldDuration
ترموستات موضوع صفت ترموستات Running Mode
ترموستات موضوع صفت ترموستات Running State
ترموستات موضوع صفت CoolingSetpoint unoccupied
ترموستات موضوع صفت نقطه تنظیم گرمایش خالی
ترموستات تمدید شده گوگل صفت activePresetHandle
ترموستات تمدید شده گوگل صفت فعال RemoteTemperatureSensorIds
ترموستات تمدید شده گوگل صفت میانگین دمای محلی
ترموستات تمدید شده گوگل صفت ExtendedRunningMode
ترموستات تمدید شده گوگل صفت ExtendedSystemMode
ترموستات ساده شده گوگل فرمان SetSystemMode
ترموستات ساده شده گوگل صفت systemMode

دمای محیط را بدست آورید

دمای محیط را با استفاده از ترموستات بدست آورید

برای دریافت دمای محیط ترموستات با استفاده از ویژگی Thermostat ، ویژگی localTemperature را بخوانید.

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 }

API اتوماسیون

val automation = automation {
  sequential {
    val starterNode = starter<_>(thermostat, ThermostatDevice, Thermostat)

    // If the temperature is higher than 35C...
    condition { expression = starterNode.localTemperature greaterThan 35 }

    // ...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."))
    }
  }
}

دمای محیط را با استفاده از TemperatureMeasurement بدست آورید

برای به دست آوردن دمای محیط ترموستات با استفاده از ویژگی TemperatureMeasurement ، ویژگی measuredValue را بخوانید.

API دستگاه

val temperatureTraitFlow: Flow<TemperatureMeasurement?> =
  thermostat
    .type(TemperatureSensorDevice)
    .map { it.standardTraits.temperatureMeasurement }
    .distinctUntilChanged()

val localTemp: Short? = temperatureTraitFlow.first()?.measuredValue

API اتوماسیون

val automation = automation {
  sequential {
    val temperature = starter<_>(thermostat, ThermostatDevice, TemperatureMeasurement)
    val stateReaderNode = stateReader<_>(light, DimmableLightDevice, OnOff)
    condition() {
      val expr1 = temperature.measuredValue greaterThanOrEquals 35
      val expr2 = stateReaderNode.onOff equals true
      expression = expr1 and expr2
    }
    action(light, DimmableLightDevice) { command(OnOff.on()) }
  }
}

دمای متوسط ​​را با استفاده از Extended Thermostat دریافت کنید

برای دریافت میانگین دما در چندین سنسور، ویژگی averageLocalTemperature ویژگی ExtendedThermostat را بخوانید.

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

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 35
      val expr2 = stateReaderNode.onOff equals true
      expression = expr1 and expr2
    }
    // Turn on the light
    action(light, DimmableLightDevice) { command(OnOff.on()) }
  }
}

رطوبت محیط را دریافت کنید

برای به دست آوردن رطوبت محیط ترموستات با استفاده از ویژگی RelativeHumidityMeasurement ، ویژگی measuredValue را بخوانید.

API دستگاه

// Get the ambient humidity

val humidityTraitFlow: Flow<RelativeHumidityMeasurement?> =
  humiditySensingThermostat
    .type(HumiditySensorDevice)
    .map { it.standardTraits.relativeHumidityMeasurement }
    .distinctUntilChanged()

val localHumidity: UShort? = humidityTraitFlow.first()?.measuredValue

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()) }
  }
}

مقیاس دمای نمایش داده شده را انتخاب کنید

برای تغییر واحد اندازه‌گیری دمایی که برای نمایشگر ترموستات استفاده می‌شود، ویژگی temperatureDisplayMode در ThermostatUserInterfaceConfigurationTrait را روی TemperatureDisplayModeEnum.Celsius یا TemperatureDisplayModeEnum.Fahrenheit تنظیم کنید.

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) }
}

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)
      }
    }
  }
}

حالت عملکرد را تغییر دهید

با تنظیم ویژگی ThermostatTrait.SystemModeEnum ، که مقادیر آن توسط ThermostatTrait.Attributes.systemMode تعیین می شود، ترموستات را می توان به حالت های عملیاتی خاصی محدود کرد، که توسط ThermostatTrait.Attributes.SystemModeEnum تعریف شده است.

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) }
}

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))
    }
  }
}

وقتی ترموستات روی SystemModeEnum.Auto تنظیم می شود، اطلاعات اضافی درباره حالت کارکرد ترموستات را می توان از ThermostatTrait.Attributes.thermostatRunningMode که با مقادیر ThermostatRunningModeEnum پر شده است، خواند.

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

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."))
    }
  }
}

SimplifiedThermostatTrait ThermostatTrait برای ساده کردن فرآیند تنظیم حالت عملکرد در اتوماسیون طراحی شده است. برای تغییر حالت عملکرد ترموستات با استفاده از SimplifiedThermostatTrait ، از SetSystemModeCommand استفاده کنید، که مقادیر آن توسط SimplifiedThermostatTrait.SystemModeEnum تعریف شده است.

این ویژگی فقط برای استفاده با Automation API در دسترس است.

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))
    }
  }
}

برای تعیین حالت‌های سیستمی که ترموستات می‌تواند در آن کار کند، ThermostatTrait.Attributes.controlSequenceOfOperation بخوانید که مقادیر آن توسط ThermostatTrait.ControlSequenceOfOperationEnum تعیین می‌شود.

API دستگاه

// Get the controlSequenceOfOperation
val standardTraitFlow: Flow<Thermostat?> =
  thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged()

val controlSequenceOfOperation: ThermostatTrait.ControlSequenceOfOperationEnum? =
  standardTraitFlow.first()?.controlSequenceOfOperation

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))
      }
    }
  }
}

حالت عملیات برنامه نویسی را تغییر دهید

حالت عملیات برنامه نویسی ترموستات را می توان با استفاده از Thermostat thermostatProgrammingOperationMode تغییر داد که مقادیر آن توسط ProgrammingOperationModeBitmap تعریف شده است.

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,
        )
      )
    }
}

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))
      }
    }
  }
}

نقطه تنظیم دما را تغییر دهید

برای تغییر نقطه تنظیم دما با استفاده از Thermostat ، با ThermostatTrait.SetpointRaiseLowerCommand تماس بگیرید.

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
thermostatTrait.setpointRaiseLower(amount = 1, mode = SetpointRaiseLowerModeEnum.Cool)

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
    condition() { expression = stateReaderNode.occupiedCoolingSetpoint greaterThan 19 }

    // lower the temperature setpoint by 5 degrees
    action(thermostat, ThermostatDevice) {
      command(Thermostat.setpointRaiseLower(SetpointRaiseLowerModeEnum.Cool, 5))
    }
  }
}

یک نقطه تنظیم دما را اولویت بندی کنید

شما می توانید با تنظیم ویژگی temperatureSetpointHold در ThermostatTrait بر روی TemperatureSetpointHoldEnum.SetpointHoldOn ، یک نقطه تنظیم دما را بر یک برنامه از پیش برنامه ریزی شده ارجحیت دهید، یا با تنظیم آن بر روی TemperatureSetpointHoldEnum.SetpointHoldOff ، زمان بندی را اولویت قرار دهید.

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)
    }

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)
        }
    }
  }

ThermostatTrait.Attributes.temperatureSetpointHoldDuration را برای کنترل چند دقیقه فعال بودن یک نقطه تنظیم تنظیم کنید.

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) }
}

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) }
    }
  }
}

برای تغییر خط‌مشی نگه‌داشتن نقطه تنظیم دما، که تعیین می‌کند چگونه و چه زمانی یک حالت نگه‌داشتن ترموستات به پایان می‌رسد، ThermostatTrait.SetTemperatureSetpointHoldPolicyCommand را فراخوانی کنید.

مقادیر معتبر توسط TemperatureSetpointHoldPolicyBitmap تعیین می شوند.

API دستگاه

val thermostatTraitFlow: Flow<Thermostat?> =
  thermostat.type(ThermostatDevice).map { it.standardTraits.thermostat }.distinctUntilChanged()

val thermostatTrait: Thermostat = thermostatTraitFlow.first()!!
if (thermostatTrait.supports(Thermostat.Attribute.temperatureSetpointHoldPolicy)) {

  // Set the temperature setpoint hold policy to holdDurationElapsedOrPresetChanged
  val unused =
    thermostatTrait.setTemperatureSetpointHoldPolicy(
      ThermostatTrait.TemperatureSetpointHoldPolicyBitmap(
        holdDurationElapsed = false,
        holdDurationElapsedOrPresetChanged = true,
      )
    )
}

val automation = automation {
  isActive = true
  sequential {

    // When someone says "Set my preferred hold duration",
    val unused =
      starter<_>(structure, VoiceStarter.OkGoogleEvent) {
        parameter(VoiceStarter.OkGoogleEvent.query("Set my preferred hold duration"))
      }

    // set the temperature setpoint hold policy to holdDurationElapsedOrPresetChanged
    action(thermostat, ThermostatDevice) {
      command(
        Thermostat.setTemperatureSetpointHoldPolicy(
          TemperatureSetpointHoldPolicyBitmap(
            holdDurationElapsed = false,
            holdDurationElapsedOrPresetChanged = true,
          )
        )
      )
    }
  }
}