Skip to content
Merged
38 changes: 30 additions & 8 deletions crates/hue/src/api/light.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::collections::BTreeSet;
use std::ops::{AddAssign, Sub};

use serde::{Deserialize, Serialize};
use serde_json::{Value, json};
use serde_json::Value;

use crate::api::device::DeviceIdentifyUpdate;
use crate::api::{DeviceArchetype, Identify, Metadata, MetadataUpdate, ResourceLink, Stub};
Expand Down Expand Up @@ -113,9 +113,9 @@ impl Light {
gradient: None,
identify: Identify {},
timed_effects: Some(LightTimedEffects {
status_values: json!(["no_effect", "sunrise", "sunset"]),
status: json!("no_effect"),
effect_values: json!(["no_effect", "sunrise", "sunset"]),
status_values: Vec::from(LightTimedEffect::ALL),
status: LightTimedEffect::NoEffect,
effect_values: Vec::from(LightTimedEffect::ALL),
}),
mode: LightMode::Normal,
on: On { on: true },
Expand Down Expand Up @@ -501,7 +501,6 @@ pub enum LightEffect {
Cosmos,
Sunbeam,
Enchant,
Sunrise,
}

impl LightEffect {
Expand Down Expand Up @@ -607,11 +606,32 @@ pub struct LightEffectStatus {
pub parameters: Option<Value>,
}

#[derive(Debug, Default, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum LightTimedEffect {
#[default]
NoEffect,
Sunrise,
Sunset,
}

impl LightTimedEffect {
pub const ALL: [Self; 3] = [Self::NoEffect, Self::Sunrise, Self::Sunset];
}

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct LightTimedEffects {
pub status_values: Value,
pub status: Value,
pub effect_values: Value,
pub status_values: Vec<LightTimedEffect>,
pub status: LightTimedEffect,
pub effect_values: Vec<LightTimedEffect>,
}

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct LightTimedEffectsUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub effect: Option<LightTimedEffect>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<u32>,
}

#[derive(Debug, Serialize, Deserialize, Clone, Default)]
Expand Down Expand Up @@ -642,6 +662,8 @@ pub struct LightUpdate {
pub dynamics: Option<LightDynamicsUpdate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub identify: Option<DeviceIdentifyUpdate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timed_effects: Option<LightTimedEffectsUpdate>,
}

impl LightUpdate {
Expand Down
4 changes: 2 additions & 2 deletions crates/hue/src/api/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ pub use light::{
LightEffectValues, LightEffects, LightEffectsV2, LightEffectsV2Update, LightFunction,
LightGradient, LightGradientMode, LightGradientPoint, LightGradientUpdate, LightMetadata,
LightMode, LightPowerup, LightPowerupColor, LightPowerupDimming, LightPowerupOn,
LightPowerupPreset, LightProductData, LightSignal, LightSignaling, LightTimedEffects,
LightUpdate, MirekSchema, On,
LightPowerupPreset, LightProductData, LightSignal, LightSignaling, LightTimedEffect,
LightTimedEffects, LightTimedEffectsUpdate, LightUpdate, MirekSchema, On,
};
pub use resource::{RType, ResourceLink, ResourceRecord};
pub use room::{Room, RoomArchetype, RoomMetadata, RoomMetadataUpdate, RoomUpdate};
Expand Down
Loading