mirror of
https://codeberg.org/icewind/mitemp-prometheus.git
synced 2026-06-03 09:04:13 +02:00
mitemp 0.3
This commit is contained in:
parent
2e1102b1df
commit
4a940b0b4a
4 changed files with 293 additions and 712 deletions
974
Cargo.lock
generated
974
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -11,5 +11,6 @@ dotenv = "0.15.0"
|
|||
main_error = "0.1.0"
|
||||
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
|
||||
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"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ Expose Xiaomi MI Temperature and Humidity Sensor to prometheus
|
|||
Run the binary with the following environment variables
|
||||
|
||||
```dotenv
|
||||
ADAPTER=00:1A:7D:DA:71:01
|
||||
PORT=3030
|
||||
NAMES="58:2d:34:39:1a:01=Sensor 1,58:2d:34:39:1a:02=Sensor 2"
|
||||
```
|
||||
|
|
|
|||
29
src/main.rs
29
src/main.rs
|
|
@ -1,10 +1,13 @@
|
|||
use btleplug::api::Manager as _;
|
||||
use btleplug::platform::Manager;
|
||||
use main_error::MainError;
|
||||
use mitemp::{adapter_by_mac, listen, BDAddr, Sensor};
|
||||
use mitemp::{listen, BDAddr, Sensor};
|
||||
use std::collections::HashMap;
|
||||
use std::fmt::Write;
|
||||
use std::str::FromStr;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::thread::spawn;
|
||||
use tokio::{pin, spawn};
|
||||
use tokio_stream::StreamExt;
|
||||
use warp::Filter;
|
||||
|
||||
type Cache = Arc<Mutex<HashMap<BDAddr, Sensor>>>;
|
||||
|
|
@ -14,8 +17,6 @@ async fn main() -> Result<(), MainError> {
|
|||
let cache: Cache = Arc::default();
|
||||
|
||||
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
|
||||
.get("PORT")
|
||||
.and_then(|s| u16::from_str(s).ok())
|
||||
|
|
@ -34,16 +35,24 @@ async fn main() -> Result<(), MainError> {
|
|||
})
|
||||
.collect::<Result<HashMap<BDAddr, String>, MainError>>()?;
|
||||
|
||||
let adapter = adapter_by_mac(adapter).map_err(|_| "Adapter not found")?;
|
||||
|
||||
let iter = listen(adapter).map_err(|e| format!("Failed to start btle listen: {}", e))?;
|
||||
|
||||
let manager = Manager::new().await?;
|
||||
for adapter in manager.adapters().await? {
|
||||
let rx_cache = cache.clone();
|
||||
spawn(move || {
|
||||
for sensor in iter {
|
||||
spawn(async move {
|
||||
let stream = match listen(&adapter).await {
|
||||
Ok(stream) => stream,
|
||||
Err(e) => {
|
||||
eprintln!("Failed to listen to adapter: {:#}", e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
pin!(stream);
|
||||
|
||||
while let Some(sensor) = stream.next().await {
|
||||
rx_cache.lock().unwrap().insert(sensor.mac, sensor);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let metrics = warp::path!("metrics").map(move || {
|
||||
let mut result = String::new();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue