Files
gree-controller/src/models/control_plan.rs
T
2026-09-01 22:20:10 +02:00

113 lines
3.9 KiB
Rust

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConfigurationExport {
pub format_version: u32,
pub exported_at: DateTime<Utc>,
pub settings: RuntimeSettings,
pub devices: Vec<Device>,
pub zones: Vec<Zone>,
#[serde(default)]
pub groups: Vec<ClimateGroup>,
pub schedules: Vec<Schedule>,
pub automations: Vec<Automation>,
#[serde(default)]
pub flows: Vec<Flow>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ControlPlanEvent {
pub at: DateTime<Utc>,
pub kind: String,
pub label: String,
pub preset: Option<String>,
pub target_temperature: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ZoneControlPlan {
pub zone_id: String,
pub zone_name: String,
pub device_id: String,
pub device_name: String,
/// Configured per-zone enable switch. Group/master gates are reported separately.
pub enabled: bool,
/// True when the configured zone is eligible for thermostat control. Disabled group control does not block the zone.
pub effective_enabled: bool,
/// Effective mode currently used by the controller.
pub mode: String,
/// Configured zone mode before house-mode inheritance is resolved.
pub configured_mode: String,
pub inherit_house_mode: bool,
/// Profile resolved from a manual override or the active schedule.
pub preset: String,
/// Explicit per-zone profile override; None means Auto schedule.
pub preset_override: Option<String>,
pub current_temperature: Option<f64>,
pub target_temperature: Option<f64>,
pub device_setpoint: Option<f64>,
pub desired_power: bool,
pub desired_mode: String,
pub actual_power: Option<bool>,
pub actual_mode: Option<String>,
pub actual_setpoint: Option<f64>,
pub demand: bool,
pub control_source: String,
pub manual_override_until: Option<DateTime<Utc>>,
pub local_thermostat_power: Option<bool>,
pub local_thermostat_resume_at: Option<DateTime<Utc>>,
pub device_manual_override: bool,
pub device_manual_override_until: Option<DateTime<Utc>>,
pub control_owner: String,
pub control_command_source: String,
pub control_since: Option<DateTime<Utc>>,
pub resume_at: Option<DateTime<Utc>>,
pub control_reason: String,
pub blocked_reason: Option<String>,
pub lockout_until: Option<DateTime<Utc>>,
pub current_schedule_id: Option<String>,
pub current_schedule_name: Option<String>,
pub next_events: Vec<ControlPlanEvent>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutomationPlanRule {
pub id: String,
pub name: String,
pub enabled: bool,
pub trigger_kind: String,
pub trigger_device_id: Option<String>,
pub trigger_device_name: Option<String>,
pub threshold: Option<f64>,
pub at_time: Option<String>,
pub action_device_id: String,
pub action_device_name: String,
#[serde(default)]
pub action_group_id: Option<String>,
#[serde(default)]
pub action_group_name: Option<String>,
#[serde(default)]
pub action_preset: Option<String>,
pub action: DeviceCommand,
pub last_fired_at: Option<DateTime<Utc>>,
pub next_ready_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ControlPlan {
pub generated_at: DateTime<Utc>,
pub house_mode: String,
/// Uniform whole-house preset when every zone uses the same override; None for a mixed state.
pub house_preset: Option<String>,
/// Compatibility field. Global ON/OFF does not use a persistent master gate; this remains true in v0.9.4+.
pub house_power: bool,
pub outdoor_temperature: Option<f64>,
pub control_strategy: String,
pub night_mode_active: bool,
pub night_mode_start: String,
pub night_mode_end: String,
pub night_mode_max_fan_speed: u8,
pub next_events: Vec<ControlPlanEvent>,
pub zones: Vec<ZoneControlPlan>,
pub rules: Vec<AutomationPlanRule>,
}