| Crates.io | sunspec |
| lib.rs | sunspec |
| version | 0.8.0 |
| created_at | 2023-11-04 13:06:45.878554+00 |
| updated_at | 2024-12-10 22:16:52.22281+00 |
| description | SunSpec 1.1 compliant library with tokio support |
| homepage | |
| repository | https://github.com/bikeshedder/sunspec |
| max_upload_size | |
| id | 1025135 |
| size | 3,380,860 |
This Rust crate contains code for accessing SunSpec compliant devices in a safe and convenient way.
| ⚠️ Nested and repeating groups are not supported, yet. |
|---|
| Feature | Description | Extra dependencies | Default |
|---|---|---|---|
tokio |
Enable tokio_modbus support |
tokio-modbus, tokio/time |
yes |
serde |
Enable serde support |
serde, bitflags/serde |
yes |
The examples directory in the code repository contains the unabridged code.
use std::{error::Error, net::SocketAddr, time::Duration};
use clap::Parser;
use itertools::Itertools;
use sunspec::{
client::{AsyncClient, Config},
models::{model1::Model1, model103::Model103},
};
use tokio::time::sleep;
use tokio_modbus::client::tcp::connect;
#[derive(Parser)]
struct Args {
addr: SocketAddr,
device_id: u8,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let args = Args::parse();
let client = AsyncClient::new(connect(args.addr).await?, Config::default());
let device = client.device(args.device_id).await?;
let m1: Model1 = device.read_model().await?;
println!("Manufacturer: {}", m1.mn);
println!("Model: {}", m1.md);
println!("Version: {}", m1.vr.as_deref().unwrap_or("(unspecified)"));
println!("Serial Number: {}", m1.sn);
println!(
"Supported models: {}",
device
.models
.supported_model_ids()
.iter()
.map(|id| id.to_string())
.join(", ")
);
loop {
let m103: Model103 = device.read_model().await?;
let w = m103.w as f32 * 10f32.powf(m103.w_sf.into());
let wh = m103.wh as f32 * 10f32.powf(m103.wh_sf.into());
println!("{:12.3} kWh {:9.3} kW", wh / 1000.0, w / 1000.0,);
sleep(Duration::from_secs(1)).await;
}
}
How does this crate differ from crates like tokio-sunspec, sunspec-models, sunspec_rs?
This crate generates all code using Rust code via the official SunSpec models repository with a code generator that was written in Rust, too.
All generated models are plain Rust structs. A single Modbus call can return the complete data for a model rather than having to fetch points individually.
All public types are documented. Even the generated models.
Licensed under either of
at your option.