EnerOS v0.17.0
发布日期:2025年03月30日 版本代号:Insight Git Tag:v0.17.0 支持状态:稳定(Stable) Crate 总数:46(新增 4 个) 测试用例数:6380+(新增 560)
版本概述
EnerOS v0.17.0「Insight」是 EnerOS 在「可视化与人机交互」方向上的核心版本,本版本的核心目标是引入可视化仪表盘(Visualization Dashboard)与Web UI 框架,为调度员、运维人员与管理者提供直观、实时、可定制的电网运行视图,将 EnerOS 内核强大的计算与洞察能力以可视化形式呈现给最终用户。
电力调度传统依赖 SCADA 系统的「数字表格 + 简易图形」界面,信息密度低、交互笨重、定制困难。现代电网规模不断扩大,一个省级调度中心可能监控数万节点、数十万遥测点,传统界面已无法支撑高效决策。v0.17.0 引入基于现代 Web 技术的可视化框架,集成 ECharts 图表库、D3.js 拓扑渲染、WebGL 加速,支持实时数据流式更新与拖拽式组件编排,使调度员能够在一块大屏上全局掌控电网态势。
本版本引入了 eneros-dashboard(仪表盘核心)、eneros-dashboard-ui(Web UI 框架)、eneros-dashboard-chart(实时图表)、eneros-dashboard-topo(拓扑可视化)四个新 crate。设计哲学是「所见即所控」——仪表盘不仅是展示工具,更是操作入口,调度员可在可视化界面上直接下达操作指令,且所有操作经过 Guardian 守卫校验,确保安全。
关键数据
| 指标 | v0.16.0 | v0.17.0 | 提升 |
|---|---|---|---|
| 数据刷新延迟 | 5s | 200ms | 25x |
| 拓扑渲染节点数 | 1000 | 50000 | 50x |
| 图表渲染帧率 | 5fps | 60fps | 12x |
| 自定义组件数 | 0 | 32 | 全新 |
| 大屏分辨率 | 1080p | 4K+ | 4x |
新特性
1. 可视化仪表盘
引入 eneros-dashboard crate,提供完整的仪表盘运行时,支持多仪表盘、多布局、多租户。仪表盘以声明式 JSON 描述,支持运行时动态加载与编辑。
仪表盘定义
use eneros_dashboard::{Dashboard, Layout, Widget};
let dashboard = Dashboard::new("province-overview")
.title("省级电网总览")
.layout(Layout::grid(4, 3)) // 4行3列网格
.widget(Widget::chart("voltage-trend")
.position(0, 0, 2, 1) // 占 2列 1行
.metric("bus.*.voltage")
.chart_type(ChartType::Line)
.refresh(Duration::milliseconds(500)))
.widget(Widget::topology("grid-topo")
.position(0, 2, 1, 3)
.source(&network)
.highlight(HighlightRule::overload()))
.widget(Widget::gauge("total-load")
.position(2, 0, 1, 1)
.metric("system.total-load")
.range(0, 5000)
.unit("MW"))
.widget(Widget::table("alarms")
.position(2, 1, 1, 2)
.source("alarm.*")
.columns(&["time", "severity", "device", "message"]))
.build()?;
dashboard.serve("0.0.0.0:8080").await?;
内置仪表盘模板
| 模板 | 用途 | 组件数 | 适用角色 |
|---|---|---|---|
| 省级总览 | 全局监控 | 12 | 调度员 |
| 故障处置 | 故障定位 | 8 | 应急人员 |
| 负荷预测 | 预测分析 | 6 | 计划员 |
| 设备健康 | 状态监测 | 10 | 运维 |
| 合规审计 | 安全审计 | 8 | 安全员 |
2. Web UI 框架
引入 eneros-dashboard-ui crate,提供基于 React + TypeScript 的前端框架,内置 32 个电力行业专用组件,支持拖拽式编排与主题定制。前端通过 WebSocket / SSE 与后端实时通信,数据刷新延迟低于 200ms。
组件体系
use eneros_dashboard_ui::{Component, ComponentRegistry};
// 注册自定义组件
let registry = ComponentRegistry::new()
.register(Component::single_line("voltage-display")
.props(&["bus_id", "precision"])
.data_source("telemetry.bus.{bus_id}.voltage"))
.register(Component::status_indicator("breaker-status")
.props(&["breaker_id"])
.states(&["open", "closed", "fault"]))
.register(Component::trend_chart("load-curve")
.props(&["time_range", "interval"])
.chart_type(ChartType::Area));
组件分类
| 类别 | 组件数 | 典型组件 | 用途 |
|---|---|---|---|
| 指标类 | 8 | 仪表盘、数值卡 | 单值展示 |
| 图表类 | 10 | 折线、柱状、饼图 | 趋势分析 |
| 拓扑类 | 6 | 电网图、设备图 | 结构展示 |
| 表格类 | 4 | 数据表、事件流 | 列表展示 |
| 控制类 | 4 | 按钮、滑块 | 操作交互 |
实时数据绑定
use eneros_dashboard_ui::datasource;
// 绑定管道主题,实时更新
let binding = datasource::bind("telemetry.bus.*")
.transform(|e| {
json!({
"bus": e.topic.suffix(),
"voltage": e.payload["voltage"],
"timestamp": e.timestamp,
})
})
.debounce(Duration::milliseconds(100));
// 推送到前端
dashboard.push("voltage-trend", binding).await?;
3. 实时图表(ECharts)
引入 eneros-dashboard-chart crate,集成 Apache ECharts 图表库,支持 30+ 图表类型,并通过 WebGL 加速实现 60fps 流畅渲染。图表数据通过流式管道实时更新,支持百万级数据点的高性能可视化。
图表配置
use eneros_dashboard_chart::{Chart, ChartConfig, Series};
let chart = Chart::new("voltage-trend")
.config(ChartConfig {
chart_type: ChartType::Line,
theme: Theme::dark(),
animation: true,
animation_duration: Duration::milliseconds(300),
data_zoom: true,
legend: true,
tooltip: TooltipConfig::axis(),
})
.series(Series::new("bus-1")
.metric("telemetry.bus.1.voltage")
.color("#5470c6")
.smooth(true))
.series(Series::new("bus-2")
.metric("telemetry.bus.2.voltage")
.color("#91cc75"))
.x_axis(Axis::time())
.y_axis(Axis::value()
.name("电压 (pu)")
.range(0.9, 1.1)
.mark_line(MarkLine::at(1.0, "额定")));
图表类型支持
| 图表类型 | 数据点上限 | 渲染帧率 | 适用场景 |
|---|---|---|---|
| 折线图 | 100万 | 60fps | 趋势监控 |
| 柱状图 | 10万 | 60fps | 对比分析 |
| 饼图 | 1000 | 60fps | 占比分布 |
| 散点图 | 50万 | 30fps | 关联分析 |
| 热力图 | 10万 | 30fps | 密度分布 |
| 桑基图 | 5000 | 30fps | 潮流分布 |
大数据量优化
// 百万级数据点使用降采样
let chart = Chart::new("large-dataset")
.config(ChartConfig {
chart_type: ChartType::Line,
sampling: SamplingStrategy::lttb(1000), // LTTB 降采样至 1000 点
progressive_render: true,
progressive_threshold: 10000,
..Default::default()
});
4. 拓扑可视化
引入 eneros-dashboard-topo crate,提供电网拓扑的可视化渲染,支持单线图、地理图、层次图三种视图。基于 WebGL 加速,可流畅渲染 5 万节点级电网拓扑,支持缩放、平移、框选等交互。
拓扑渲染
use eneros_dashboard_topo::{TopologyView, ViewConfig, Layout};
let view = TopologyView::new("grid-topo")
.source(&network)
.config(ViewConfig {
layout: Layout::geo(&geo_coordinates), // 地理布局
node_size: NodeSize::by_voltage_level(),
edge_width: EdgeWidth::by_power_flow(),
color_scheme: ColorScheme::voltage(),
labels: LabelConfig::show_on_zoom(0.7),
})
.highlight(HighlightRule::overload()
.color(Color::from_rgb(255, 0, 0)))
.highlight(HighlightRule::outage()
.color(Color::from_rgb(128, 128, 128)));
view.render().await?;
视图模式
| 视图模式 | 布局算法 | 节点上限 | 适用场景 |
|---|---|---|---|
| 单线图 | 力导向 | 5000 | 电气分析 |
| 地理图 | GPS 坐标 | 50000 | 地理监控 |
| 层次图 | 树状 | 10000 | 调度层级 |
| 混合图 | 自适应 | 50000 | 综合展示 |
实时潮流动画
// 在拓扑上显示实时潮流流动动画
view.animate_power_flow(AnimationConfig {
speed: AnimationSpeed::by_magnitude(),
direction: AnimationDirection::actual(),
particle_density: 0.8,
color: Color::by_load_level(),
});
5. 自定义组件
支持用户使用 React/TypeScript 开发自定义组件,通过标准协议与 EnerOS 后端交互。组件可发布到组件市场,供其他租户复用。
组件开发
// my-voltage-gauge.tsx
import { useEnerosData } from '@eneros/dashboard-sdk';
export function VoltageGauge({ busId }: { busId: string }) {
const { data, loading } = useEnerosData(`telemetry.bus.${busId}.voltage`);
return (
<Gauge
value={data?.voltage ?? 0}
min={0.9}
max={1.1}
marks={[{ value: 1.0, label: '额定' }]}
color={data?.voltage > 1.05 ? 'red' : 'green'}
/>
);
}
组件注册
use eneros_dashboard_ui::custom;
// 注册自定义组件
custom::register("my-voltage-gauge")
.entrypoint("/widgets/voltage-gauge.js")
.props(&["bus_id"])
.preview("/widgets/voltage-gauge-preview.png")
.category("custom")
.permissions(&["telemetry:read"])?;
组件市场
| 组件类别 | 组件数 | 来源 | 审核状态 |
|---|---|---|---|
| 官方组件 | 32 | EnerOS 团队 | 已验证 |
| 认证组件 | 18 | 合作伙伴 | 已审核 |
| 社区组件 | 56 | 开源社区 | 待审核 |
改进
- API 网关:新增 WebSocket 与 SSE 端点,支持实时数据推送
- 管道:数据管道支持按仪表盘订阅过滤,减少不必要的网络传输
- 孪生体:孪生体状态变更自动推送至仪表盘,无需轮询
- 守卫系统:操作类组件自动接入守卫校验,确保可视化操作安全
Bug 修复
- 修复
eneros-dashboard在组件数量超过 50 时渲染卡顿的问题(#1709) - 修复
eneros-dashboard-chart在数据点超过 10 万时内存溢出的问题(#1715) - 修复
eneros-dashboard-topo拓扑缩放时节点位置错乱的问题(#1721) - 修复
eneros-dashboard-uiWebSocket 断线重连后数据丢失的问题(#1727)
破坏性变更
Dashboard::serve:默认端口从 3000 改为 8080Component::register:新增permissions参数,需声明组件所需权限Chart::config:theme字段从String改为强类型Theme
性能提升
- 数据刷新延迟从 5s 降至 200ms(提升 25 倍)
- 拓扑渲染节点数从 1000 提升至 50000(提升 50 倍)
- 图表渲染帧率从 5fps 提升至 60fps(提升 12 倍)
- 大数据量降采样使百万点渲染可行
贡献者
本版本由 28 位贡献者共同完成,提交 512 次。特别感谢:
- @dashboard-core:仪表盘运行时与布局引擎
- @ui-framework:React 组件框架与 SDK
- @chart-master:ECharts 集成与 WebGL 加速
- @topo-renderer:拓扑可视化与力导向布局
升级指南
从 v0.16.0 升级
1. 更新依赖
# Cargo.toml
[dependencies]
eneros-dashboard = { version = "0.17" }
eneros-dashboard-ui = { version = "0.17" }
eneros-dashboard-chart = { version = "0.17", features = ["webgl"] }
eneros-dashboard-topo = { version = "0.17" }
2. 启用仪表盘服务
# eneros.toml
[dashboard]
enabled = true
bind = "0.0.0.0:8080"
theme = "dark"
realtime_push = true
websocket = true
3. 加载内置仪表盘
use eneros_dashboard::templates;
// 加载省级总览模板
let dashboard = templates::province_overview()
.tenant(TenantId::from("default"))
.load()
.await?;
4. 开发自定义组件(可选)
如需开发自定义组件,参考前端开发指南,使用 @eneros/dashboard-sdk 包,组件开发完成后通过 custom::register 注册到仪表盘。
5. 大屏部署建议
生产环境推荐使用 4K 大屏部署,硬件配置建议:CPU 8 核以上、内存 16GB 以上、GPU 支持 WebGL 2.0。多屏拼接时使用 multi_screen 配置模式,确保跨屏拓扑连贯。