From 73a796545073480e3335e0d2690112e4a7d571aa Mon Sep 17 00:00:00 2001 From: Cosmin Constantin Lazar Date: Sun, 21 Apr 2024 22:11:34 +0200 Subject: [PATCH] Use json! insted of n00b string interpolation --- src/homeassistant/mod.rs | 74 +++++++++---------- .../full_flow_insta__smoke_test_insta.snap | 36 ++++----- 2 files changed, 53 insertions(+), 57 deletions(-) diff --git a/src/homeassistant/mod.rs b/src/homeassistant/mod.rs index bf530db..94e87a0 100644 --- a/src/homeassistant/mod.rs +++ b/src/homeassistant/mod.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use crate::mitaffald::Container; use crate::settings::MQTTConfig; use rumqttc::{AsyncClient, LastWill, MqttOptions}; +use serde_json::json; const HA_AVAILABILITY_TOPIC: &str = "garbage_bin/availability"; @@ -123,33 +124,27 @@ impl HASensor { return Ok(()); } - let payload = format!( - r#"{{ - "object_id": "ha_affaldvarme_{id}", - "unique_id": "ha_affaldvarme_{id}", - "name": "{sensor_name}", - "state_topic": "{state_topic}", - "json_attributes_topic": "{state_topic}", - "value_template": "{{{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}}}", - "availability_topic": "{availability_topic}", - "payload_available": "online", - "payload_not_available": "offline", - "unit_of_measurement": "days", - "device": {{ - "identifiers": [ - "ha_affaldvarme" - ], - "name": "Affaldvarme integration", - "sw_version": "1.0", - "model": "Standard", - "manufacturer": "Your Garbage Bin Manufacturer" - }}, - "icon": "mdi:recycle" - }}"#, - sensor_name = container.name, - state_topic = self.state_topic, - availability_topic = HA_AVAILABILITY_TOPIC, - id = self.container_id, + let payload = json!( + { + "object_id": format!("ha_affaldvarme_{}", self.container_id), + "unique_id": format!("ha_affaldvarme_{}", self.container_id), + "name": container.name, + "state_topic": self.state_topic, + "json_attributes_topic": self.state_topic, + "value_template": "{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}", + "availability_topic": HA_AVAILABILITY_TOPIC, + "payload_available": "online", + "payload_not_available": "offline", + "unit_of_measurement": "days", + "device": { + "identifiers": ["ha_affaldvarme"], + "name": "Affaldvarme integration", + "sw_version": "1.0", + "model": "Standard", + "manufacturer": "Your Garbage Bin Manufacturer" + }, + "icon": "mdi:recycle" + } ); let publish_result = client @@ -157,7 +152,7 @@ impl HASensor { &self.configure_topic, rumqttc::QoS::AtLeastOnce, false, - payload, + serde_json::to_string(&payload).expect("Failed to serialize"), ) .await; @@ -173,20 +168,21 @@ impl HASensor { container: &Container, client: &mut AsyncClient, ) -> Result<(), rumqttc::ClientError> { - let payload = format!( - r#" - {{ - "name": "{sensor_name}", - "next_empty": "{next_empty}", - "last_update": "{last_update}" - }}"#, - sensor_name = container.name, - next_empty = container.date.format("%Y-%m-%d"), - last_update = chrono::Local::now().to_rfc3339(), + let payload = json!( + { + "name": container.name, + "next_empty": container.date.format("%Y-%m-%d").to_string(), + "last_update": chrono::Local::now().to_rfc3339() + } ); client - .publish(&self.state_topic, rumqttc::QoS::AtLeastOnce, false, payload) + .publish( + &self.state_topic, + rumqttc::QoS::AtLeastOnce, + false, + serde_json::to_string(&payload).expect("Failed to serialize"), + ) .await } } diff --git a/tests/snapshots/full_flow_insta__smoke_test_insta.snap b/tests/snapshots/full_flow_insta__smoke_test_insta.snap index e427fb5..676d39d 100644 --- a/tests/snapshots/full_flow_insta__smoke_test_insta.snap +++ b/tests/snapshots/full_flow_insta__smoke_test_insta.snap @@ -3,40 +3,40 @@ source: tests/full_flow_insta.rs expression: actual --- - topic: garbage_bin/Glas/status - payload: "\n { \n \"name\": \"Glas\",\n \"next_empty\": \"2024-04-18\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Glas\",\"next_empty\":\"2024-04-18\"}" - topic: garbage_bin/Mad__og_drikkekartoner/status - payload: "\n { \n \"name\": \"Mad- og drikkekartoner\",\n \"next_empty\": \"2024-04-18\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Mad- og drikkekartoner\",\"next_empty\":\"2024-04-18\"}" - topic: garbage_bin/Madaffald/status - payload: "\n { \n \"name\": \"Madaffald\",\n \"next_empty\": \"2024-04-26\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Madaffald\",\"next_empty\":\"2024-04-26\"}" - topic: garbage_bin/Metal/status - payload: "\n { \n \"name\": \"Metal\",\n \"next_empty\": \"2024-04-18\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Metal\",\"next_empty\":\"2024-04-18\"}" - topic: garbage_bin/Pap/status - payload: "\n { \n \"name\": \"Pap\",\n \"next_empty\": \"2024-05-09\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Pap\",\"next_empty\":\"2024-05-09\"}" - topic: garbage_bin/Papir/status - payload: "\n { \n \"name\": \"Papir\",\n \"next_empty\": \"2024-05-09\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Papir\",\"next_empty\":\"2024-05-09\"}" - topic: garbage_bin/Plast/status - payload: "\n { \n \"name\": \"Plast\",\n \"next_empty\": \"2024-04-18\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Plast\",\"next_empty\":\"2024-04-18\"}" - topic: garbage_bin/Restaffald/status - payload: "\n { \n \"name\": \"Restaffald\",\n \"next_empty\": \"2024-04-26\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Restaffald\",\"next_empty\":\"2024-04-26\"}" - topic: garbage_bin/Tekstiler/status - payload: "\n { \n \"name\": \"Tekstiler\",\n \"next_empty\": \"2024-05-09\",\n \"last_update\": \"[REDACTED]\"\n }" + payload: "{\"last_update\": \"[REDACTED]\",\"name\":\"Tekstiler\",\"next_empty\":\"2024-05-09\"}" - topic: garbage_bin/availability payload: online - topic: homeassistant/sensor/ha_affaldvarme_Glas/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Glas\",\n \"unique_id\": \"ha_affaldvarme_Glas\",\n \"name\": \"Glas\",\n \"state_topic\": \"garbage_bin/Glas/status\",\n \"json_attributes_topic\": \"garbage_bin/Glas/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Glas/status\",\"name\":\"Glas\",\"object_id\":\"ha_affaldvarme_Glas\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Glas/status\",\"unique_id\":\"ha_affaldvarme_Glas\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Mad__og_drikkekartoner/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Mad__og_drikkekartoner\",\n \"unique_id\": \"ha_affaldvarme_Mad__og_drikkekartoner\",\n \"name\": \"Mad- og drikkekartoner\",\n \"state_topic\": \"garbage_bin/Mad__og_drikkekartoner/status\",\n \"json_attributes_topic\": \"garbage_bin/Mad__og_drikkekartoner/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Mad__og_drikkekartoner/status\",\"name\":\"Mad- og drikkekartoner\",\"object_id\":\"ha_affaldvarme_Mad__og_drikkekartoner\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Mad__og_drikkekartoner/status\",\"unique_id\":\"ha_affaldvarme_Mad__og_drikkekartoner\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Madaffald/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Madaffald\",\n \"unique_id\": \"ha_affaldvarme_Madaffald\",\n \"name\": \"Madaffald\",\n \"state_topic\": \"garbage_bin/Madaffald/status\",\n \"json_attributes_topic\": \"garbage_bin/Madaffald/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Madaffald/status\",\"name\":\"Madaffald\",\"object_id\":\"ha_affaldvarme_Madaffald\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Madaffald/status\",\"unique_id\":\"ha_affaldvarme_Madaffald\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Metal/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Metal\",\n \"unique_id\": \"ha_affaldvarme_Metal\",\n \"name\": \"Metal\",\n \"state_topic\": \"garbage_bin/Metal/status\",\n \"json_attributes_topic\": \"garbage_bin/Metal/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Metal/status\",\"name\":\"Metal\",\"object_id\":\"ha_affaldvarme_Metal\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Metal/status\",\"unique_id\":\"ha_affaldvarme_Metal\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Pap/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Pap\",\n \"unique_id\": \"ha_affaldvarme_Pap\",\n \"name\": \"Pap\",\n \"state_topic\": \"garbage_bin/Pap/status\",\n \"json_attributes_topic\": \"garbage_bin/Pap/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Pap/status\",\"name\":\"Pap\",\"object_id\":\"ha_affaldvarme_Pap\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Pap/status\",\"unique_id\":\"ha_affaldvarme_Pap\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Papir/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Papir\",\n \"unique_id\": \"ha_affaldvarme_Papir\",\n \"name\": \"Papir\",\n \"state_topic\": \"garbage_bin/Papir/status\",\n \"json_attributes_topic\": \"garbage_bin/Papir/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Papir/status\",\"name\":\"Papir\",\"object_id\":\"ha_affaldvarme_Papir\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Papir/status\",\"unique_id\":\"ha_affaldvarme_Papir\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Plast/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Plast\",\n \"unique_id\": \"ha_affaldvarme_Plast\",\n \"name\": \"Plast\",\n \"state_topic\": \"garbage_bin/Plast/status\",\n \"json_attributes_topic\": \"garbage_bin/Plast/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Plast/status\",\"name\":\"Plast\",\"object_id\":\"ha_affaldvarme_Plast\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Plast/status\",\"unique_id\":\"ha_affaldvarme_Plast\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Restaffald/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Restaffald\",\n \"unique_id\": \"ha_affaldvarme_Restaffald\",\n \"name\": \"Restaffald\",\n \"state_topic\": \"garbage_bin/Restaffald/status\",\n \"json_attributes_topic\": \"garbage_bin/Restaffald/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Restaffald/status\",\"name\":\"Restaffald\",\"object_id\":\"ha_affaldvarme_Restaffald\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Restaffald/status\",\"unique_id\":\"ha_affaldvarme_Restaffald\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}" - topic: homeassistant/sensor/ha_affaldvarme_Tekstiler/config - payload: "{\n \"object_id\": \"ha_affaldvarme_Tekstiler\",\n \"unique_id\": \"ha_affaldvarme_Tekstiler\",\n \"name\": \"Tekstiler\",\n \"state_topic\": \"garbage_bin/Tekstiler/status\",\n \"json_attributes_topic\": \"garbage_bin/Tekstiler/status\",\n \"value_template\": \"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\",\n \"availability_topic\": \"garbage_bin/availability\",\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"unit_of_measurement\": \"days\",\n \"device\": {\n \"identifiers\": [\n \"ha_affaldvarme\"\n ],\n \"name\": \"Affaldvarme integration\",\n \"sw_version\": \"1.0\",\n \"model\": \"Standard\",\n \"manufacturer\": \"Your Garbage Bin Manufacturer\"\n },\n \"icon\": \"mdi:recycle\"\n }" + payload: "{\"availability_topic\":\"garbage_bin/availability\",\"device\":{\"identifiers\":[\"ha_affaldvarme\"],\"manufacturer\":\"Your Garbage Bin Manufacturer\",\"model\":\"Standard\",\"name\":\"Affaldvarme integration\",\"sw_version\":\"1.0\"},\"icon\":\"mdi:recycle\",\"json_attributes_topic\":\"garbage_bin/Tekstiler/status\",\"name\":\"Tekstiler\",\"object_id\":\"ha_affaldvarme_Tekstiler\",\"payload_available\":\"online\",\"payload_not_available\":\"offline\",\"state_topic\":\"garbage_bin/Tekstiler/status\",\"unique_id\":\"ha_affaldvarme_Tekstiler\",\"unit_of_measurement\":\"days\",\"value_template\":\"{{ (strptime(value_json.next_empty, '%Y-%m-%d').date() - now().date()).days }}\"}"