This commit is contained in:
Mateusz Gruszczyński
2026-08-24 16:12:31 +02:00
parent 83f744e2cb
commit 66a5d6e5e9
22 changed files with 686 additions and 103 deletions
+48 -3
View File
@@ -17,6 +17,25 @@ fn request_client(default_client: &reqwest::Client, settings: &HomeAssistantSett
.context("cannot build Home Assistant HTTPS client")
}
pub fn resolve_entity_id(settings: &HomeAssistantSettings, entity_override: Option<&str>) -> Option<String> {
let requested = entity_override.filter(|value| !value.trim().is_empty())
.map(str::trim)
.unwrap_or_else(|| settings.default_entity_id.trim());
if requested.is_empty() { return None; }
// Aliases are presentation-only. Accepting an alias here is a defensive
// compatibility path for settings saved by older UI revisions or manual edits;
// the actual Home Assistant request always uses the original entity_id key.
if settings.sensor_aliases.contains_key(requested) {
return Some(requested.to_string());
}
if let Some((entity_id, _)) = settings.sensor_aliases.iter()
.find(|(_, alias)| alias.trim().eq_ignore_ascii_case(requested)) {
return Some(entity_id.clone());
}
Some(requested.to_string())
}
pub async fn read_temperature(
default_client: &reqwest::Client,
settings: &HomeAssistantSettings,
@@ -24,9 +43,8 @@ pub async fn read_temperature(
) -> Result<f64> {
if settings.url.trim().is_empty() { bail!("Home Assistant URL is not configured") }
if settings.token.trim().is_empty() { bail!("Home Assistant token is not configured") }
let entity = entity_override.filter(|v| !v.trim().is_empty())
.unwrap_or(settings.default_entity_id.trim());
if entity.is_empty() { bail!("Home Assistant entity_id is not configured") }
let entity = resolve_entity_id(settings, entity_override)
.ok_or_else(|| anyhow!("Home Assistant entity_id is not configured"))?;
let mut base = Url::parse(settings.url.trim()).context("invalid Home Assistant URL")?;
if !matches!(base.scheme(), "http" | "https") { bail!("Home Assistant URL must use http or https") }
@@ -53,3 +71,30 @@ pub async fn read_temperature(
}
Ok((temperature * 10.0).round() / 10.0)
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::BTreeMap;
fn settings() -> HomeAssistantSettings {
let mut sensor_aliases = BTreeMap::new();
sensor_aliases.insert("sensor.gabinet_temperature".into(), "Gabinet".into());
HomeAssistantSettings {
url: "http://homeassistant.local:8123".into(),
token: "token".into(),
default_entity_id: "sensor.salon_temperature".into(),
outdoor_entity_id: "sensor.zewnatrz_temperature".into(),
allow_invalid_tls: false,
sensor_aliases,
}
}
#[test]
fn aliases_never_replace_real_home_assistant_entity_ids() {
let settings = settings();
assert_eq!(resolve_entity_id(&settings, Some("sensor.gabinet_temperature")).as_deref(), Some("sensor.gabinet_temperature"));
assert_eq!(resolve_entity_id(&settings, Some("Gabinet")).as_deref(), Some("sensor.gabinet_temperature"));
assert_eq!(resolve_entity_id(&settings, None).as_deref(), Some("sensor.salon_temperature"));
}
}