From cad01edab8e52d19739db67f76c1ed86d28956e3 Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Wed, 25 Mar 2026 11:21:04 +0100 Subject: [PATCH] parse topic 2 --- src/readings_broadcaster.gleam | 2 ++ src/sensors.gleam | 23 +++++++++++++++++++++-- test/sensors_test.gleam | 16 +++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/readings_broadcaster.gleam b/src/readings_broadcaster.gleam index 1c115eb..b5cd694 100644 --- a/src/readings_broadcaster.gleam +++ b/src/readings_broadcaster.gleam @@ -40,6 +40,8 @@ fn parse_mqtt_update( case topic { "homeassistant/sensor/bws/node1/state1" -> Ok(sensors.parse_topic_1(payload_str)) + "homeassistant/sensor/bws/node1/state2" -> + Ok(sensors.parse_topic_2(payload_str)) _ -> Error(Nil) } } diff --git a/src/sensors.gleam b/src/sensors.gleam index ba494df..7bbcb3a 100644 --- a/src/sensors.gleam +++ b/src/sensors.gleam @@ -27,8 +27,6 @@ pub fn sensor_name(sensor: Sensor) -> String { } } -pub const topic_1: String = "homeassistant/sensor/bws/node1/state1" - type Topic1Value { Topic1Value(temp: Float, humidity: Float, pressure: Float) } @@ -50,6 +48,27 @@ pub fn parse_topic_1(json_string: String) -> List(SensorReading) { ] } +type Topic2Value { + Topic2Value(pm1: Float, pm2: Float, pm10: Float) +} + +/// Parses a JSON string into a list of `SensorReading` values from topic 2. +/// example input string: {"pm1":16.83,"pm2_5":10.68,"pm10":16.619719} +pub fn parse_topic_2(json_string: String) -> List(SensorReading) { + let decoder = { + use pm1 <- decode.field("pm1", decode.float) + use pm2 <- decode.field("pm2_5", decode.float) + use pm10 <- decode.field("pm10", decode.float) + decode.success(Topic2Value(pm1:, pm2:, pm10:)) + } + let assert Ok(decoded_val) = json.parse(from: json_string, using: decoder) + [ + SensorReading(sensor: ParticalMatterOne, value: decoded_val.pm1), + SensorReading(sensor: ParticalMatterTwoPointFive, value: decoded_val.pm2), + SensorReading(sensor: ParticalMatterTen, value: decoded_val.pm10), + ] +} + pub fn print_sensor_reading(reading: SensorReading) -> Nil { let sensor_name = sensor_name(reading.sensor) io.println(sensor_name <> ": " <> float.to_string(reading.value)) diff --git a/test/sensors_test.gleam b/test/sensors_test.gleam index 6d02b0c..58d111a 100644 --- a/test/sensors_test.gleam +++ b/test/sensors_test.gleam @@ -6,7 +6,7 @@ pub fn main() -> Nil { gleeunit.main() } -pub fn file_read_test() { +pub fn sensor_name_and_unit_test() { let reading = sensors.sensor_name(sensors.Temperature) <> " " @@ -28,3 +28,17 @@ pub fn parse_topic_1_test() { sensors.SensorReading(sensor: sensors.Pressure, value: 944.67), ]) } + +pub fn parse_topic_2_test() { + let json_string = "{\"pm1\":16.83,\"pm2_5\":10.68,\"pm10\":16.619719}" + let readings = sensors.parse_topic_2(json_string) + readings + |> should.equal([ + sensors.SensorReading(sensor: sensors.ParticalMatterOne, value: 16.83), + sensors.SensorReading( + sensor: sensors.ParticalMatterTwoPointFive, + value: 10.68, + ), + sensors.SensorReading(sensor: sensors.ParticalMatterTen, value: 16.619719), + ]) +}