1 个不稳定版本

0.1.0-alpha2024年2月1日

#706硬件支持

MIT 许可证

80KB
1.5K SLoC

equilibrium 是一个用于创建分布式控制系统的框架。

它提供多种控制系统范式,并独立于底层硬件。目的是提供一个可用于各种应用的框架,例如水培/土培、水族馆、家庭酿酒、生物反应器等。

示例

此示例创建2个控制器

  • 一个生长灯在早上5点打开输出并在8小时后关闭,
  • 一个加热器在温度低于70度时打开输出。

然后创建一个运行时,每秒轮询控制器。控制器的输出是消息,这些消息被发送到在本地主机上运行的消息代理。

use chrono::{Duration, NaiveTime, Utc};
use equilibrium::controllers::{Controller, TimedOutput, Threshold};
use equilibrium::{Output, Input, ControllerGroup};

#[tokio::main]
fn main() {
    // this represents a grow-light
    let time = NaiveTime::from_hms_opt(5, 0, 0).unwrap();
    let duration = Duration::hours(8);
    let mut grow_light = TimedOutput::new(
        Output::new(|_| {
            // low-level code would go here
        }),
        time,
        duration,
    );

    // this represents a heater controller
    let min_temp = 70.0;        // activate heater when temp is below 70 degrees
    let interval = Duration::minutes(5);    // check temp every 5 minutes

    let heater = Output::new(|_| {
        // low-level code would go here
    });
    let temp_sensor = Input::new(|| {
        // low-level code would go here
        String::from("79.0")
    });
    let mut heater_controller = Threshold::new(
        min_temp,
        temp_sensor,
        heater,
        interval
    );

    // a group can be used to manage multiple controllers
    let mut group = ControllerGroup::new()
        .add_controller(grow_light)
        .add_controller(heater_controller);

    // create a runtime which polls every second and build an emitter
    let runtime = Runtime::new(
        group,
        chrono::Duration::seconds(1)
    ).build_emitter("https://127.0.0.1:8000");
}

特性

控制器类型

  • TimedOutput:在指定时间打开输出并在一段时间后关闭
  • Threshold:达到阈值时打开输出
  • BidirectionalThreshold:达到阈值时增加或减少输出

将来将添加更多控制器类型(例如:PID)。

输出

目前,仅支持二进制输出设备。

路线图

  • 添加对更常见的消息代理(如MQTT)的支持
  • 添加对更多类型控制器的支持(例如:PID等)
  • 为GPIO创建示例(例如:Atmel、RPi、ARM、RISC-V等)
  • 添加对更多类型输入的支持(例如:模拟、数字等)
  • 添加对更多类型输出的支持(例如:PWM、数字等)
  • 通过引入宏简化API

依赖项

~7–19MB
~285K SLoC