diff --git a/src/config.rs b/src/config.rs index 0b3e50d..8fa069a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -140,7 +140,7 @@ impl PresenceDeviceConfig { // @TODO This is not perfect, if the topic is some/+/thing/# this will fail let offset = config.presence.topic.find('+').or(config.presence.topic.find('#')).unwrap(); - let topic = config.presence.topic[..offset].to_owned() + class + "/" + identifier; + let topic = format!("{}/{class}/{identifier}", &config.presence.topic[..offset-1]); trace!("Setting presence mqtt topic: {topic}"); self.mqtt = Some(MqttDeviceConfig { topic }); } @@ -245,9 +245,9 @@ impl Device { Device::AudioSetup { mqtt, mixer, speakers } => { trace!(id = identifier, "AudioSetup [{}]", identifier); // Create the child devices - let mixer_id = identifier.to_owned() + ".mixer"; + let mixer_id = format!("{}.mixer", identifier); let mixer = (*mixer).create(&mixer_id, config, client.clone()).await?; - let speakers_id = identifier.to_owned() + ".speakers"; + let speakers_id = format!("{}.speakers", identifier); let speakers = (*speakers).create(&speakers_id, config, client.clone()).await?; AudioSetup::build(&identifier, mqtt, mixer, speakers, client).await diff --git a/src/debug_bridge.rs b/src/debug_bridge.rs index 1cb210d..653783d 100644 --- a/src/debug_bridge.rs +++ b/src/debug_bridge.rs @@ -48,7 +48,7 @@ pub fn start(mut presence_rx: presence::Receiver, mut light_sensor_rx: light_sen impl OnPresence for DebugBridge { async fn on_presence(&mut self, presence: bool) { let message = PresenceMessage::new(presence); - let topic = self.topic.clone() + "/presence"; + let topic = format!("{}/presence", self.topic); self.client.publish(topic, rumqttc::QoS::AtLeastOnce, true, serde_json::to_string(&message).unwrap()) .await .map_err(|err| warn!("Failed to update presence on {}/presence: {err}", self.topic)) @@ -60,7 +60,7 @@ impl OnPresence for DebugBridge { impl OnDarkness for DebugBridge { async fn on_darkness(&mut self, dark: bool) { let message = DarknessMessage::new(dark); - let topic = self.topic.clone() + "/darkness"; + let topic = format!("{}/darkness", self.topic); self.client.publish(topic, rumqttc::QoS::AtLeastOnce, true, serde_json::to_string(&message).unwrap()) .await .map_err(|err| warn!("Failed to update presence on {}/presence: {err}", self.topic)) diff --git a/src/devices/audio_setup.rs b/src/devices/audio_setup.rs index 0242e6e..9f4e25a 100644 --- a/src/devices/audio_setup.rs +++ b/src/devices/audio_setup.rs @@ -23,11 +23,13 @@ pub struct AudioSetup { impl AudioSetup { pub async fn build(identifier: &str, mqtt: MqttDeviceConfig, mixer: DeviceBox, speakers: DeviceBox, client: AsyncClient) -> Result { // We expect the children devices to implement the OnOff trait + let mixer_id = mixer.get_id().to_owned(); let mixer = AsOnOff::consume(mixer) - .ok_or_else(|| DeviceError::OnOffExpected(identifier.to_owned() + ".mixer"))?; + .ok_or_else(|| DeviceError::OnOffExpected(mixer_id))?; + let speakers_id = speakers.get_id().to_owned(); let speakers = AsOnOff::consume(speakers) - .ok_or_else(|| DeviceError::OnOffExpected(identifier.to_owned() + ".speakers"))?; + .ok_or_else(|| DeviceError::OnOffExpected(speakers_id))?; client.subscribe(mqtt.topic.clone(), rumqttc::QoS::AtLeastOnce).await?; diff --git a/src/devices/ikea_outlet.rs b/src/devices/ikea_outlet.rs index 32f2b24..fef07a7 100644 --- a/src/devices/ikea_outlet.rs +++ b/src/devices/ikea_outlet.rs @@ -37,10 +37,11 @@ impl IkeaOutlet { async fn set_on(client: AsyncClient, topic: &str, on: bool) { let message = OnOffMessage::new(on); + let topic = format!("{}/set", topic); // @TODO Handle potential errors here - client.publish(topic.to_owned() + "/set", rumqttc::QoS::AtLeastOnce, false, serde_json::to_string(&message).unwrap()) + client.publish(topic.clone(), rumqttc::QoS::AtLeastOnce, false, serde_json::to_string(&message).unwrap()) .await - .map_err(|err| warn!("Failed to update state on {topic}/set: {err}")) + .map_err(|err| warn!("Failed to update state on {topic}: {err}")) .ok(); }