Retrieving temp/humidity data.
This commit is contained in:
commit
aaa9838cc4
|
@ -0,0 +1,8 @@
|
|||
CC=rustc
|
||||
|
||||
build:
|
||||
$(CC) -O main.rs -o temp-prometheus
|
||||
|
||||
install: build
|
||||
install -d $(PREFIX)/bin/
|
||||
install -m 755 ./temp-prometheus $(PREFIX)/bin/
|
|
@ -0,0 +1,12 @@
|
|||
# Prometheus Temperature Exporter
|
||||
|
||||
This small software reads some temperature/humidity data from a serial
|
||||
USB device before exposing the data using the Prometheus file format.
|
||||
|
||||
Note: you'll have to use Nginx or another webserver to expose the prometheus file to the web.
|
||||
|
||||
## Usage
|
||||
|
||||
```sh
|
||||
./temp-prometheus USB-DEV PROMETHEUS-FILE
|
||||
```
|
|
@ -0,0 +1,9 @@
|
|||
{ pkgs ? import <nixpkgs> {}}:
|
||||
|
||||
pkgs.stdenv.mkDerivation {
|
||||
pname = "temp-prometheus";
|
||||
version = "1.0";
|
||||
src = ./.;
|
||||
nativeBuildInputs = [ pkgs.rustc ];
|
||||
makeFlags = [ "PREFIX=$(out)" ];
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
use std::fs::File;
|
||||
use std::io::{BufReader, BufRead, Write};
|
||||
use std::sync::{Arc,Mutex};
|
||||
use std::thread;
|
||||
|
||||
struct Metrics {
|
||||
humidity: String,
|
||||
temperature: String
|
||||
}
|
||||
|
||||
/*
|
||||
We'll have two threads:
|
||||
|
||||
- One in charge of parsing the CLI args, then in charge of parsing the
|
||||
data coming from the serial interface.
|
||||
- Another one in charge of writing the results in the prometheus
|
||||
format on the disk every 30 seconds.
|
||||
*/
|
||||
fn main() -> std::io::Result<()> {
|
||||
let dev = std::env::args().nth(1).expect("Missing USB-DEV");
|
||||
let prometheus_file_path = std::env::args().nth(2).expect("Missing LISTEN-ADDR");
|
||||
|
||||
let file = File::open(dev)?;
|
||||
let mut buf_reader = BufReader::new(file);
|
||||
let mut buffer = String::with_capacity(12);
|
||||
let metrics = Metrics{
|
||||
humidity: String::from("0"),
|
||||
temperature: String::from("0")
|
||||
};
|
||||
let metrics = Mutex::new(metrics);
|
||||
let metrics = Arc::new(metrics);
|
||||
|
||||
let thread_metrics = metrics.clone();
|
||||
thread::spawn(move || {
|
||||
loop {
|
||||
{
|
||||
match File::create(prometheus_file_path.to_owned()) {
|
||||
Ok(mut file) => {
|
||||
if let Ok(m) = thread_metrics.lock() {
|
||||
let prom_str = format!("officetemp_humidity {}\nofficetemp_temperature {}\n", m.humidity, m.temperature);
|
||||
match file.write_all(prom_str.as_bytes()) {
|
||||
Ok(()) => (),
|
||||
Err(err) => {
|
||||
eprintln!("Cannot write to {}: {}", prometheus_file_path, err);
|
||||
}
|
||||
};
|
||||
}
|
||||
},
|
||||
Err(err) => {
|
||||
eprintln!("Cannot write to {}: {}", prometheus_file_path, err);
|
||||
}
|
||||
};
|
||||
}
|
||||
thread::sleep(std::time::Duration::from_secs(30));
|
||||
}
|
||||
});
|
||||
|
||||
let thread_metrics = metrics.clone();
|
||||
loop {
|
||||
match buf_reader.read_line(&mut buffer) {
|
||||
Ok(result) => {
|
||||
if result == 12 {
|
||||
if let Ok(mut m) = thread_metrics.lock() {
|
||||
let vec: Vec<&str> = buffer.split(";").collect();
|
||||
m.humidity = vec[0].to_string();
|
||||
m.temperature = vec[1].to_string();
|
||||
buffer.clear();
|
||||
}
|
||||
}
|
||||
},
|
||||
Err(_) => ()
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue