Files
Evergreen-Health-Mobile/src/components/devices/StandardLightControls.vue
T
2026-10-09 18:06:21 +08:00

43 lines
3.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script setup lang="ts">
import { Slider as VanSlider } from 'vant'
import type { HomeAssistantDiscoveredDevice } from '../../services/health'
import { useDeviceControlContext } from '../../devices/controlContext'
import { useLightControls } from '../../devices/lighting/useLightControls'
const props = defineProps<{ device: HomeAssistantDiscoveredDevice; reportedBrightness?: number }>()
const { operationBusy, applyParam } = useDeviceControlContext()
const { capability, brightnessReading, brightnessTarget, temperatureTarget, effectTarget, defaultEffect, setBrightness, setTemperature, setEffect } =
useLightControls(() => props.device, () => operationBusy.value, applyParam, () => props.reportedBrightness)
</script>
<template>
<div v-if="capability.canDim" class="param-row">
<div class="param-header"><span class="p-title">灯光亮度</span><strong class="p-val">{{ brightnessReading === undefined ? '--' : `${brightnessReading}%` }}</strong></div>
<VanSlider v-model="brightnessTarget" :min="0" :max="100" :step="1" :disabled="operationBusy || !capability.available"
active-color="#d6a657" aria-label="待设置的灯光亮度" @change="setBrightness" />
<div class="slider-scale"><span>0% 关闭</span><span>100% 满亮</span></div>
<p v-if="capability.available" class="scale-note">目标亮度 {{ brightnessTarget }}%;滑动后设置,非当前回读值。</p>
</div>
<div v-if="capability.temperatureRange" class="param-row">
<div class="param-header"><span class="p-title">灯光色温调节</span><strong class="p-val">{{ capability.colorTemperature === undefined ? '--' : `${capability.colorTemperature}K` }}</strong></div>
<VanSlider v-model="temperatureTarget" :min="capability.temperatureRange.min" :max="capability.temperatureRange.max" :step="1"
:disabled="operationBusy || !capability.available" active-color="#c87f2b" aria-label="待设置的灯光色温" @change="setTemperature" />
<div class="slider-scale"><span>{{ capability.temperatureRange.min }}K 暖光</span><span>{{ capability.temperatureRange.max }}K 冷光</span></div>
<p v-if="capability.available" class="scale-note">目标色温 {{ temperatureTarget }}K;滑动后设置,关灯时调节会点亮灯。</p>
</div>
<div v-if="capability.effects.length" class="param-row">
<div class="param-header"><span class="p-title">灯光模式</span><strong class="p-val">{{ capability.effect || '--' }}</strong></div>
<select v-model="effectTarget" class="standard-light-select" aria-label="选择灯光模式" :disabled="operationBusy || !capability.available" @change="setEffect">
<option value="" disabled>选择要设置的模式</option>
<option v-for="effect in capability.effects" :key="effect" :value="effect">{{ effect }}</option>
</select>
<p class="scale-note">使用这盏灯实际提供的模式;选择后可能点亮灯。</p>
<p v-if="defaultEffect" class="scale-note">舒睡默认 {{ defaultEffect }};实际模式以顶部回读为准。</p>
</div>
<p v-if="!capability.canDim && !capability.temperatureRange && !capability.effects.length" class="scale-note">这盏灯未上报可用的调光能力,目前仅提供开关。</p>
</template>
<style scoped>
.standard-light-select { width: 100%; min-height: 40px; padding: 8px 12px; border: 1px solid #d9e6de; border-radius: 10px; background: #fff; color: #174d40; font: inherit; font-size: 13px; }
.standard-light-select:disabled { opacity: .5; }
</style>