v0.5.4
This commit is contained in:
+48
-3
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user