mitemp 0.3

This commit is contained in:
Robin Appelman 2021-10-31 18:42:59 +01:00
commit 4a940b0b4a
4 changed files with 293 additions and 712 deletions

974
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -11,5 +11,6 @@ dotenv = "0.15.0"
main_error = "0.1.0" main_error = "0.1.0"
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
warp = "0.3" warp = "0.3"
mitemp = { version = "0.2.0", git = "https://github.com/icewind1991/mitemp-rs" } mitemp = "0.3"
tokio-stream = "0.1"
btleplug = "0.9"

View file

@ -7,7 +7,6 @@ Expose Xiaomi MI Temperature and Humidity Sensor to prometheus
Run the binary with the following environment variables Run the binary with the following environment variables
```dotenv ```dotenv
ADAPTER=00:1A:7D:DA:71:01
PORT=3030 PORT=3030
NAMES="58:2d:34:39:1a:01=Sensor 1,58:2d:34:39:1a:02=Sensor 2" NAMES="58:2d:34:39:1a:01=Sensor 1,58:2d:34:39:1a:02=Sensor 2"
``` ```

View file

@ -1,10 +1,13 @@
use btleplug::api::Manager as _;
use btleplug::platform::Manager;
use main_error::MainError; use main_error::MainError;
use mitemp::{adapter_by_mac, listen, BDAddr, Sensor}; use mitemp::{listen, BDAddr, Sensor};
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::Write; use std::fmt::Write;
use std::str::FromStr; use std::str::FromStr;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::thread::spawn; use tokio::{pin, spawn};
use tokio_stream::StreamExt;
use warp::Filter; use warp::Filter;
type Cache = Arc<Mutex<HashMap<BDAddr, Sensor>>>; type Cache = Arc<Mutex<HashMap<BDAddr, Sensor>>>;
@ -14,8 +17,6 @@ async fn main() -> Result<(), MainError> {
let cache: Cache = Arc::default(); let cache: Cache = Arc::default();
let mut env: HashMap<String, String> = dotenv::vars().collect(); let mut env: HashMap<String, String> = dotenv::vars().collect();
let adapter = BDAddr::from_str(&env.remove("ADAPTER").ok_or("No ADDR set")?)
.map_err(|_| "Invalid adapter address")?;
let port = env let port = env
.get("PORT") .get("PORT")
.and_then(|s| u16::from_str(s).ok()) .and_then(|s| u16::from_str(s).ok())
@ -34,16 +35,24 @@ async fn main() -> Result<(), MainError> {
}) })
.collect::<Result<HashMap<BDAddr, String>, MainError>>()?; .collect::<Result<HashMap<BDAddr, String>, MainError>>()?;
let adapter = adapter_by_mac(adapter).map_err(|_| "Adapter not found")?; let manager = Manager::new().await?;
for adapter in manager.adapters().await? {
let rx_cache = cache.clone();
spawn(async move {
let stream = match listen(&adapter).await {
Ok(stream) => stream,
Err(e) => {
eprintln!("Failed to listen to adapter: {:#}", e);
return;
}
};
pin!(stream);
let iter = listen(adapter).map_err(|e| format!("Failed to start btle listen: {}", e))?; while let Some(sensor) = stream.next().await {
rx_cache.lock().unwrap().insert(sensor.mac, sensor);
let rx_cache = cache.clone(); }
spawn(move || { });
for sensor in iter { }
rx_cache.lock().unwrap().insert(sensor.mac, sensor);
}
});
let metrics = warp::path!("metrics").map(move || { let metrics = warp::path!("metrics").map(move || {
let mut result = String::new(); let mut result = String::new();