ruuvi_sensor_protocol/
lib.rs

1/*!
2
3ruuvi-sensor-protocol implements parser for [Ruuvi Sensor Protocols][1] used by the
4[RuuviTag sensor beacon][2].
5
6[1]: https://docs.ruuvi.com/communication/bluetooth-advertisements
7[2]: https://ruuvi.com
8
9# Parsing a set of values from manufacturer specific data
10
11Parsing may return an error due to unknown manufacturer id, unsupported data format version or
12invalid data in value field.
13
14```rust
15use ruuvi_sensor_protocol::{ParseError, SensorValues};
16
17let id = 0x0499;
18let value = [
19    0x07, 0x17, 0x01, 0x45, 0x35, 0x58, 0x03, 0xE8, 0x04, 0xE7, 0x05, 0xE6, 0x08, 0x86,
20];
21let result = SensorValues::from_manufacturer_specific_data(id, value);
22assert_eq!(result, Err(ParseError::UnsupportedFormatVersion(7)));
23```
24
25A successful parse returns a [`SensorValues`] structure with a set of values.
26```rust
27use ruuvi_sensor_protocol::{
28    Acceleration, AccelerationVector, BatteryPotential, Humidity, Pressure, SensorValues,
29    Temperature,
30};
31# use ruuvi_sensor_protocol::ParseError;
32
33let id = 0x0499;
34let value = [
35    0x03, 0x17, 0x01, 0x45, 0x35, 0x58, 0x03, 0xE8, 0x04, 0xE7, 0x05, 0xE6, 0x08, 0x86,
36];
37let values = SensorValues::from_manufacturer_specific_data(id, value)?;
38
39assert_eq!(values.humidity_as_ppm(), Some(115_000));
40assert_eq!(values.temperature_as_millicelsius(), Some(1690));
41assert_eq!(values.pressure_as_pascals(), Some(63656));
42assert_eq!(values.acceleration_vector_as_milli_g(), Some(AccelerationVector(1000, 1255, 1510)));
43assert_eq!(values.battery_potential_as_millivolts(), Some(2182));
44# Ok::<(), ParseError>(())
45```
46
47See [`SensorValues`] documentation for a description of each value.
48
49[`SensorValues`]: crate::SensorValues
50
51# Parsing Ruuvi Gateway data formats
52
53This crate also supports parsing MQTT message payloads published by a Ruuvi Gateway.
54Deserialization is implemented with [Serde][3], and requires `gateway` feature to be enabled. See
55[`gateway`] module for documentation, structures, and functions.
56
57[3]: https://serde.rs
58[`gateway`]: crate::gateway
59*/
60
61#![warn(rust_2018_idioms)]
62#![cfg_attr(not(feature = "std"), no_std)]
63
64#[cfg(feature = "gateway")]
65extern crate alloc;
66
67pub use crate::{
68    errors::ParseError,
69    formats::{
70        Acceleration, AccelerationVector, BatteryPotential, Humidity, MacAddress,
71        MeasurementSequenceNumber, MovementCounter, Pressure, SensorValues, Temperature,
72        TransmitterPower,
73    },
74};
75
76mod errors;
77mod formats;
78#[cfg(feature = "gateway")]
79pub mod gateway;
80
81#[cfg(test)]
82mod testing;