Files
gree-controller/src/models/integrations.rs
T
2026-08-30 13:39:29 +02:00

196 lines
6.9 KiB
Rust

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HomeAssistantSettings {
#[serde(default)]
pub url: String,
#[serde(default)]
pub token: String,
#[serde(default)]
pub default_entity_id: String,
/// Optional outdoor temperature sensor used only as an assist signal.
#[serde(default)]
pub outdoor_entity_id: String,
/// Maximum accepted age of Home Assistant sensor samples.
#[serde(default = "default_sensor_stale_after")]
pub sensor_stale_after_seconds: u64,
/// Accept self-signed/expired certificates for local Home Assistant HTTPS.
#[serde(default)]
pub allow_invalid_tls: bool,
/// Friendly labels used only by the controller UI/charts; entity_id remains the storage key.
#[serde(default)]
pub sensor_aliases: BTreeMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InfluxDbSettings {
#[serde(default)]
pub enabled: bool,
/// InfluxDB API generation: `1` or `2`.
#[serde(default = "default_influx_version")]
pub version: String,
#[serde(default)]
pub url: String,
/// InfluxDB 1.x database name.
#[serde(default = "default_influx_database")]
pub database: String,
#[serde(default)]
pub username: String,
#[serde(default)]
pub password: String,
/// InfluxDB 2.x organization.
#[serde(default)]
pub org: String,
/// InfluxDB 2.x bucket.
#[serde(default = "default_influx_database")]
pub bucket: String,
#[serde(default)]
pub token: String,
/// Queries older than this age are read from InfluxDB when it is enabled.
#[serde(default = "default_influx_threshold_days")]
pub history_threshold_days: u32,
}
impl Default for InfluxDbSettings {
fn default() -> Self {
Self {
enabled: false,
version: default_influx_version(),
url: String::new(),
database: default_influx_database(),
username: String::new(),
password: String::new(),
org: String::new(),
bucket: default_influx_database(),
token: String::new(),
history_threshold_days: default_influx_threshold_days(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationAlertTypes {
/// Home Assistant sensor exceeded the configured freshness window.
#[serde(default = "default_true")]
pub stale_sensor: bool,
/// Other Home Assistant sensor errors (missing/unavailable/invalid value).
#[serde(default = "default_true")]
pub sensor_errors: bool,
/// Device connectivity, polling and communication problems.
#[serde(default = "default_true")]
pub communication: bool,
/// Zone failed to reach its target within the configured timeout.
#[serde(default = "default_true")]
pub target_timeout: bool,
/// Automation execution errors and conflicts.
#[serde(default = "default_true")]
pub automation: bool,
/// Thermostat/group/device control failures and sensor discrepancies.
#[serde(default = "default_true")]
pub control_errors: bool,
/// Informational state changes sent when notification mode is "important".
#[serde(default = "default_true")]
pub important_events: bool,
/// Any warning/error not matched by one of the categories above.
#[serde(default = "default_true")]
pub other: bool,
}
impl Default for NotificationAlertTypes {
fn default() -> Self {
Self {
stale_sensor: true, sensor_errors: true, communication: true, target_timeout: true,
automation: true, control_errors: true, important_events: true, other: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationSettings {
#[serde(default)]
pub enabled: bool,
/// problems = warnings/errors/anomalies, important = problems plus important state changes.
#[serde(default = "default_notification_mode")]
pub mode: String,
/// pushover, slack, discord
#[serde(default = "default_notification_provider")]
pub provider: String,
#[serde(default)]
pub pushover_app_token: String,
#[serde(default)]
pub pushover_user_key: String,
#[serde(default)]
pub slack_webhook_url: String,
#[serde(default)]
pub discord_webhook_url: String,
#[serde(default = "default_notification_cooldown")]
pub cooldown_seconds: u64,
#[serde(default = "default_notification_failure_threshold")]
pub communication_failure_threshold: u32,
#[serde(default = "default_notification_target_timeout")]
pub target_timeout_minutes: u32,
/// Fine-grained selection of which alert categories may be delivered.
#[serde(default)]
pub alert_types: NotificationAlertTypes,
}
fn default_notification_mode() -> String { "problems".into() }
fn default_notification_provider() -> String { "pushover".into() }
fn default_notification_cooldown() -> u64 { 300 }
fn default_notification_failure_threshold() -> u32 { 3 }
fn default_notification_target_timeout() -> u32 { 60 }
impl Default for NotificationSettings {
fn default() -> Self {
Self {
enabled: false, mode: default_notification_mode(), provider: default_notification_provider(),
pushover_app_token: String::new(), pushover_user_key: String::new(),
slack_webhook_url: String::new(), discord_webhook_url: String::new(),
cooldown_seconds: default_notification_cooldown(),
communication_failure_threshold: default_notification_failure_threshold(),
target_timeout_minutes: default_notification_target_timeout(),
alert_types: NotificationAlertTypes::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DebugSettings {
#[serde(default)]
pub overlay_enabled: bool,
#[serde(default)]
pub gree_frames: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NightModeSettings {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_night_start")]
pub start_time: String,
#[serde(default = "default_night_end")]
pub end_time: String,
/// Maximum fan speed used by thermostat control during night hours (1=Low..5=High).
#[serde(default = "default_night_max_fan_speed")]
pub max_fan_speed: u8,
/// Ask compatible GREE units to keep Quiet enabled during the whole night window.
#[serde(default = "default_true")]
pub force_quiet: bool,
/// Use the unit's native Sleep function during the night window when it is supported.
#[serde(default = "default_true")]
pub use_native_sleep: bool,
}
impl Default for NightModeSettings {
fn default() -> Self {
Self {
enabled: false,
start_time: default_night_start(),
end_time: default_night_end(),
max_fan_speed: default_night_max_fan_speed(),
force_quiet: true,
use_native_sleep: true,
}
}
}