From 4b766f54aeedccdc97f676f65d12e3603f91f5dd Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Tue, 24 Mar 2026 11:35:21 +0100 Subject: [PATCH 1/2] add sensor module that defines some basic sensor metadata --- src/mqtt_dummy.gleam | 8 ++++++-- src/sensors.gleam | 38 ++++++++++++++++++++++++++++++++++++++ src/weather_portal.gleam | 6 +++--- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 src/sensors.gleam diff --git a/src/mqtt_dummy.gleam b/src/mqtt_dummy.gleam index 5a3fdd7..0713e4c 100644 --- a/src/mqtt_dummy.gleam +++ b/src/mqtt_dummy.gleam @@ -1,9 +1,10 @@ import gleam/erlang/process import gleam/list import gleam/otp/actor +import sensors pub type Subscriber = - process.Subject(String) + process.Subject(sensors.SensorReading) pub type Message { Subscribe(subscriber: Subscriber) @@ -24,7 +25,10 @@ fn handle_message( } Proc -> { list.each(subscribers, fn(subscriber) { - process.send(subscriber, "Hello from dummy mqtt action") + process.send( + subscriber, + sensors.SensorReading(sensors.Temperature, 26.6), + ) }) actor.continue(subscribers) } diff --git a/src/sensors.gleam b/src/sensors.gleam new file mode 100644 index 0000000..caf2db9 --- /dev/null +++ b/src/sensors.gleam @@ -0,0 +1,38 @@ +import gleam/float +import gleam/io + +pub type Sensor { + Temperature + Humidity + Pressure + ParticalMatterOne + ParticalMatterTwoPointFive + ParticalMatterTen +} + +pub type SensorReading { + SensorReading(sensor: Sensor, value: Float) +} + +pub fn print_sensor_reading(reading: SensorReading) -> Nil { + let sensor_name = case reading.sensor { + Temperature -> "Temperature" + Humidity -> "Humidity" + Pressure -> "Pressure" + ParticalMatterOne -> "Partical matter 1 micron or less" + ParticalMatterTwoPointFive -> "Partical matter 2.5 micros or less" + ParticalMatterTen -> "Partical matter 10 microns or less" + } + io.println(sensor_name <> ": " <> float.to_string(reading.value)) +} + +pub fn sensor_unit(sensor: Sensor) -> String { + case sensor { + Temperature -> "°C" + Humidity -> "%" + Pressure -> "hPa" + ParticalMatterOne -> "µg/m³" + ParticalMatterTwoPointFive -> "µg/m³" + ParticalMatterTen -> "µg/m³" + } +} diff --git a/src/weather_portal.gleam b/src/weather_portal.gleam index 1627003..2888f43 100644 --- a/src/weather_portal.gleam +++ b/src/weather_portal.gleam @@ -2,6 +2,7 @@ import config import gleam/erlang/process import gleam/io import mqtt_dummy +import sensors pub fn main() -> Nil { case config.load_config() { @@ -37,13 +38,12 @@ pub fn main() -> Nil { } fn receive_and_reschedule( - mailbox: process.Subject(String), + mailbox: process.Subject(sensors.SensorReading), subject: process.Subject(mqtt_dummy.Message), ) -> Nil { case process.receive(mailbox, 2000) { Ok(msg) -> { - io.println("Got message: " <> msg) - // Reschedule the next Proc message + sensors.print_sensor_reading(msg) process.send_after(subject, 1000, mqtt_dummy.Proc) receive_and_reschedule(mailbox, subject) } From 113384b6ce84e63028076f917e1dde4870fa5497 Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Tue, 24 Mar 2026 11:48:46 +0100 Subject: [PATCH 2/2] add test for sensor_name and sensor_unit --- src/sensors.gleam | 8 ++++++-- test/sensors_test.gleam | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 test/sensors_test.gleam diff --git a/src/sensors.gleam b/src/sensors.gleam index caf2db9..0cc1df2 100644 --- a/src/sensors.gleam +++ b/src/sensors.gleam @@ -14,8 +14,8 @@ pub type SensorReading { SensorReading(sensor: Sensor, value: Float) } -pub fn print_sensor_reading(reading: SensorReading) -> Nil { - let sensor_name = case reading.sensor { +pub fn sensor_name(sensor: Sensor) -> String { + case sensor { Temperature -> "Temperature" Humidity -> "Humidity" Pressure -> "Pressure" @@ -23,6 +23,10 @@ pub fn print_sensor_reading(reading: SensorReading) -> Nil { ParticalMatterTwoPointFive -> "Partical matter 2.5 micros or less" ParticalMatterTen -> "Partical matter 10 microns or less" } +} + +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 new file mode 100644 index 0000000..fd4ce0e --- /dev/null +++ b/test/sensors_test.gleam @@ -0,0 +1,19 @@ +import gleeunit +import gleeunit/should +import sensors + +pub fn main() -> Nil { + gleeunit.main() +} + +// gleeunit test functions end in `_test` +pub fn file_read_test() { + let reading = + sensors.sensor_name(sensors.Temperature) + <> " " + <> "20.5" + <> " " + <> sensors.sensor_unit(sensors.Temperature) + reading + |> should.equal("Temperature 20.5 °C") +}