跳到主内容

v0.17.0 版本说明

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.0v0.17.0提升
数据刷新延迟5s200ms25x
拓扑渲染节点数10005000050x
图表渲染帧率5fps60fps12x
自定义组件数032全新
大屏分辨率1080p4K+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对比分析
饼图100060fps占比分布
散点图50万30fps关联分析
热力图10万30fps密度分布
桑基图500030fps潮流分布

大数据量优化

// 百万级数据点使用降采样
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"])?;

组件市场

组件类别组件数来源审核状态
官方组件32EnerOS 团队已验证
认证组件18合作伙伴已审核
社区组件56开源社区待审核

改进

  • API 网关:新增 WebSocket 与 SSE 端点,支持实时数据推送
  • 管道:数据管道支持按仪表盘订阅过滤,减少不必要的网络传输
  • 孪生体:孪生体状态变更自动推送至仪表盘,无需轮询
  • 守卫系统:操作类组件自动接入守卫校验,确保可视化操作安全

Bug 修复

  • 修复 eneros-dashboard 在组件数量超过 50 时渲染卡顿的问题(#1709)
  • 修复 eneros-dashboard-chart 在数据点超过 10 万时内存溢出的问题(#1715)
  • 修复 eneros-dashboard-topo 拓扑缩放时节点位置错乱的问题(#1721)
  • 修复 eneros-dashboard-ui WebSocket 断线重连后数据丢失的问题(#1727)

破坏性变更

  • Dashboard::serve:默认端口从 3000 改为 8080
  • Component::register:新增 permissions 参数,需声明组件所需权限
  • Chart::configtheme 字段从 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 配置模式,确保跨屏拓扑连贯。