
后端前端物联网边缘计算【免费下载链接】openemsOpenEMS - Open Source Energy Management System项目地址https://gitcode.com/gh_mirrors/op/openems点击查看免费下载OpenEMSOpen Source Energy Management System是一个围绕储能、光伏、电动汽车充电、热泵、分时电价等场景构建的模块化能源管理EMS开源平台。本文以仓库根目录的 README.md 为主线结合doc/官方文档与io.openems.*源码带你理解其「Edge 现场控制 Backend 云端聚合 UI 实时监控」的 IoT 技术栈、OSGi/Bundle 模块化设计并手把手完成一次完整的本地仿真部署模拟光伏 电池系统与 Backend 集成。一、OpenEMS 是什么定位与应用场景官方定义见 README.md 与 doc/modules/ROOT/pages/introduction.adocOpenEMS 是一个面向能源管理应用的模块化平台围绕监控、控制与集成能源存储ESS并将其与可再生能源及互补设备/服务电动汽车充电站、热泵、电解槽、分时电价等结合而开发。其典型应用分为两个层次README 中分别配图为「Local Energy Management」与「Areal Energy Management」Local Energy Management本地能源管理在单个户用或工商业站点内对电池储能、光伏、电表、充电桩等进行本地闭环控制例如削峰填谷、自发自用优化、需量管理等。Areal Energy Management区域能源管理跨多个站点/建筑通过 Backend 将分布式 Edge 系统连接起来实现跨站点的聚合、监控与集中控制。从工程背景看README「Open Source philosophy」章节OpenEMS 由德国储能系统制造商FENECON GmbH发起是FEMSFENECON Energy Management System背后的软件栈已在户用、工商业及工业场景中广泛使用项目当前由OpenEMS Association e.V.高校、硬件厂商、软件公司、电网运营者与个人业主组成的网络推动并得到多个联邦及欧盟资助项目支持若将 OpenEMS 用于科学研究README 建议引用其 Zenodo DOI10.5281/zenodo.4440883。二、OpenEMS IoT 技术栈三大组件README「OpenEMS IoT stack」章节将平台拆分为三个核心组件仓库目录结构与之一一对应组件职责仓库对应OpenEMS Edge部署在现场on site负责与设备/服务通信、采集数据并执行控制算法约 200 个io.openems.edge.*Bundle 目录 io.openems.edge.applicationOpenEMS UI面向浏览器与智能手机的实时用户界面ui/TypeScript Angular/IonicOpenEMS Backend运行在云服务器上连接去中心化的 Edge 系统提供跨互联网的聚合、监控与控制io.openems.backend.*系列 Bundle io.openems.backend.applicationREADME 给出的四条架构设计目标「Features」与源码的对应关系是Fast, PLC-like control of devices类 PLC 的快速控制——由 Edge 核心的 Cycle/IPO 模型实现见第五节Easily extendable易扩展的模块化架构——每个io.openems.*顶层目录都是一个独立 OSGi Bundle可热插拔见第四节Reusable, device independent control algorithms设备无关的可复用控制算法——由 Nature 抽象实现控制器只需声明「我需要ManagedSymmetricEss」无需知道具体通信协议或厂商Wide range of supported devices and protocols广泛的设备与协议支持——从 EdgeApp.bndrun 的依赖清单可数出通信桥接层有io.openems.edge.bridge.modbus、bridge.mqtt、bridge.onewire、bridge.mbus、bridge.http设备层覆盖电池FENECON、BYD、BMW、PylonTech、Tesla Powerwall 2 等、电表ABB、Janitza、Siemens、Hager 等十余家、逆变器SMA、Fronius、Sungrow、GoodWe、SolarEdge、Huawei 等、充电桩Keba、Mennekes、ABL、Webasto 等、IO 模块Shelly、WAGO、REVPI 等以及预测器predictor.lstm等与分时电价服务timeofusetariff.*。三、系统架构与关键端口README「System architecture」章节指出OpenEMS 通常与外部硬件/软件组合使用唯一的例外是官方提供的模拟开发环境即本节与第六节的仿真流程。其生产部署形态为Edge 位于现场网关如工控机、Raspberry Pi上直连设备UI 通过 WebSocket 获取实时数据Backend 汇聚多个 Edge 并对外提供监控与控制。从构建配置文件可以确认各组件默认 HTTP/WebSocket 端口与 doc/modules/ROOT/pages/gettingstarted.adoc 一致端口服务配置来源8080Edge 的 Apache Felix Web Console组件配置界面EdgeApp.bndrun 中org.osgi.service.http.port80808085Edge 的Controller Api Websocket本地 UI 默认连接端口gettingstarted.adocStarting [Websocket Api] websocket server [port8085]8079Backend 的 Apache Felix Web ConsoleBackendApp.bndrun 中org.osgi.service.http.port80798081Backend 的Edge.WebsocketEdge 上行连接端口gettingstarted.adoc 配置示例8082Backend 的Ui.WebsocketUI 连接端口gettingstarted.adoc 配置示例4200OpenEMS UI 前端服务端口ui/README.md两个.bndrun文件还揭示了运行时基础两者均使用 Apache Felix 框架org.apache.felix.framework;version[7.0.5,7.0.5]执行环境为JavaSE-21并统一约定felix.cm.dirFelix 配置目录与openems.data.dir数据目录等运行属性。四、OSGi 模块化Bundle、Component、Channel 与 Nature这一节回答 README 中「为什么 OpenEMS 易于扩展」的技术依据。核心概念文档见 doc/modules/ROOT/pages/coreconcepts.adoc。4.1 OSGi Bundle目录即模块OpenEMS Edge 基于OSGi平台提供完全模块化、动态化的服务化系统源码根目录下每个以io.openems.*开头的目录就是一个 Bundle构建系统使用 bnd 工具链见 settings.gradle.kts 中的biz.aQute.bnd.workspace插件与 gradle.properties 中的bnd_version7.4.0、java_source21。Bundle 命名遵循明确的层次约定*.common多组件共享代码如 io.openems.commonEdge/Backend 之间共享的工具、JSON-RPC 定义、抽象 Worker、io.openems.edge.commonEdge 内部共享、io.openems.backend.commonBackend 内部共享*.apiNature 与 API 接口层如 io.openems.edge.controller.api、io.openems.edge.ess.api、io.openems.edge.energy.api*.core中心单例服务如 io.openems.edge.core提供ComponentManager、Cycle、Host、Meta、Sum等核心服务、io.openems.edge.ess.core提供EssPower功率分配服务。4.2 OpenEMS Component动态组装的构件OpenEMS Component 是系统的基本构建块在 OSGi 框架中它表示一个带需求与能力声明的服务。一个组件可以声明自己具备「对称储能系统ESS」能力从而成为真实设备的数字孪生而控制算法作为另一个组件只需声明对 ESS 的需求。OSGi 会在运行时把这些构件自动装配wiring起来——组件可随时启用、修改或禁用而无需重启重装配由框架在后台透明完成。每个组件有唯一的Component-ID如ess0、meter0、ctrlBalancing0。声明一个组件即让 Java 类实现 OpenemsComponent 接口。4.3 Channel带容错语义的数据点每个组件拥有一组数据点——Channel通道每个通道表示一条独立信息由元数据定义描述文本、访问模式read-only/read-write/write-only、数据类型string、integer、float等与计量单位Watt、Volt、Degree Celsius等。组件用Component-ID/Channel-ID组合出全系统唯一的Channel Address例如第一套储能的荷电状态为ess0/Soc。由于外部设备通信是异步的任何 Channel 值在某个周期内不会变化但随时可能是undefined/null如设备尚未通信成功。因此 Channel 接口 要求读取方显式声明缺省策略提供两类取值方法public T getOrError() throws InvalidValueException; // 缺值即报错 public T orElse(T alternativeValue); // 缺值取替代值4.4 Nature设备无关抽象的关键Nature是「带 Channel 集合的 Java 接口」用于把同一类设备/服务归组ElectricityMeter电表、SymmetricEss对称储能、Evcs充电桩等。组件实现某 Nature 就必须提供该 Nature 定义的全部 Channel——例如 ESS 仿真器实现 SymmetricEss 接口 后必须提供SocChannel。这正是 README「reusable, device independent control algorithms」的落地机制控制器面向 Nature 而非具体设备编写声明「我需要ManagedSymmetricEss」后由框架在运行时装配任意满足能力的服务控制算法完全不感知底层 Modbus/MQTT 协议与厂商差异。五、类 PLC 控制Cycle、IPO 模型与调度优先级README 首条 Feature 是「Fast, PLC-like control of devices」其实现细节在 doc/modules/ROOT/pages/edge/architecture.adocIPOInput-Process-Output模型Input 阶段采集全部输入形成过程映像Process Image保证本周期内不变Process 阶段运行各控制算法Output 阶段把结果下发到硬件。双缓冲通道Channel 实现维护两个数据变量——value当前生效值供消费者使用与nextValue最新收到的原始数据每个计算周期只在输入阶段刷新一次value从而解耦数据生产与消费屏蔽多线程竞争。Scheduler调度器Process 阶段多个控制器可能争用同一资源如两个 Controller 都想写同一数字输出Scheduler 提供排序后的 Controller 执行顺序后执行的控制器不允许覆盖先前写入的结果。Controller承载具体业务逻辑/控制算法实现 Controller 接口每个周期默认 1 秒执行一次。控制器遵循 KISS 原则只承担单一封装任务北向连接Backend API、REST API同样实现为 Controller使外部设定点请求被自然纳入本地优先级体系。循环引擎是 CycleImpl它以 OSGi 单例服务Cycle.SINGLETON_SERVICE_PID形式注册通过Reference动态收集系统中所有enabledtrue的Scheduler并维护在一个按 ID 排序的TreeSet中Reference(// policy ReferencePolicy.DYNAMIC, // policyOption ReferencePolicyOption.GREEDY, // cardinality ReferenceCardinality.MULTIPLE, // target (enabledtrue)) protected void addScheduler(Scheduler newScheduler) { synchronized (this.schedulers) { this.schedulers.add(newScheduler); } }这段代码也解释了启动时若未配置任何 Scheduler日志会打印WARN ... There are no Schedulers configured!——因为循环引擎找不到可执行的控制器列表。文档还给出了控制精度的边界如实说明适用前提测量设备通常每秒才更新一次执行循环不必快于该频率而对虚拟惯量等需要软实时/最小延迟的控制、以及消防等安全关键措施EMS 周期控制并不适用这类任务应交由设备内部或专用安全逻辑处理。六、快速上手运行一个模拟光伏 电池系统以下流程完整继承自 doc/modules/ROOT/pages/gettingstarted.adocREADME「Getting Started」章节指向的官方入门指南可让你在本地零硬件地跑通「Edge UI Backend」全链路。注意该指南定位为测试用途生产部署请改用文档中的 systemd 或 Docker 部署章节doc/modules/ROOT/pages/edge/deploy/systemd.adoc、doc/modules/ROOT/pages/backend/deploy/docker.adoc。6.1 安装 JavaOpenEMS 需要Java 21与 gradle.properties 中java_source21一致推荐 Eclipse Temurin。校验java -version # openjdk version 21.0.8 2025-07-15 LTS # OpenJDK Runtime Environment Temurin-21.0.89 (build 21.0.89-LTS)6.2 启动预构建的 OpenEMS Edge从 OpenEMS 发行版下载最新的openems-edge.jar终端进入下载目录执行java -jar openems-edge.jar启动成功后日志中出现如下告警属正常现象尚无调度器稍后配置WARN [ms.edge.core.cycle.CycleWorker] [_cycle] There are no Schedulers configured!6.3 基础配置Felix Web Console打开http://localhost:8080/system/console/configMgrApache Felix Web Console以admin / admin登录配置 Scheduler点击Scheduler All Alphabetically接受默认值并保存——你创建了第一个组件实例scheduler0日志输出INFO [onent.AbstractOpenemsComponent] [scheduler0] Activate Scheduler.AllAlphabeticallyScheduler 负责按序执行控制算法并定义 Edge 应用循环 3.配置调试输出Controller Debug Log默认值即可日志出现INFO [onent.AbstractOpenemsComponent] [ctrlDebugLog0] Activate Controller.Debug.Log INFO [ntroller.debuglog.DebugLogImpl] [ctrlDebugLog0] _sum[State:Ok]每秒打印一行因为 Cycle 时间默认 1000 ms可在Core Cycle (Core.Cycle)组件中调整 4.配置Controller Api Websocket默认值即可这是本地 UI 连接 Edge 所必需的组件日志出现INFO [onent.AbstractOpenemsComponent] [ctrlApiWebsocket0] Activate Controller.Api.Websocket INFO [socket.AbstractWebsocketServer] Starting [Websocket Api] websocket server [port8085]配置完成后后续也可通过 OpenEMS UI 设置中的 Install components 功能更方便地安装组件。6.4 启动仿真Simulator数据源配置Simulator DataSource: CSV PredefinedSource选择H0_HOUSEHOLD_SUMMER_WEEKDAY_STANDARD_LOAD_PROFILE标准负荷曲线组件 ID 为datasource0模拟电网电表配置Simulator GridMeter ActingDatasource-ID填datasource0。日志显示电表开始「测量」模拟此时尚无光伏/储能Consumption 直接等于 Grid 功率INFO [nent.AbstractOpenemsComponent] [meter0] Activate Simulator.GridMeter.Acting INFO [ntroller.debuglog.DebugLogImpl] [ctrlDebugLog0] _sum[State:Ok Grid:1336 W Consumption:1336 W] meter0[1336 W]命名约定值得注意「Acting」表示该模拟设备主动产生数据与之相对的是「Reacting」设备对其它组件做出反应 3.模拟对称储能配置Simulator EssSymmetric Reacting默认值即可组件 IDess0日志显示 SoC 保持 50%、充放电功率为 0INFO [onent.AbstractOpenemsComponent] [ess0] Activate Simulator.EssSymmetric.Reacting INFO [ntroller.debuglog.DebugLogImpl] [ctrlDebugLog0] _sum[State:Ok Ess SoC:50 %|L:0 W Grid:1502 W Consumption:1502 W] ess0[SoC:50 %|L:0 W] meter0[1502 W]自发自用优化算法配置Controller Ess BalancingEss-ID填ess0、Grid-Meter-ID填meter0。此时控制器开始驱动电池放电以将 Grid 功率压向 0INFO [onent.AbstractOpenemsComponent] [ctrlBalancing0] Activate Controller.Symmetric.Balancing INFO [ntroller.debuglog.DebugLogImpl] [ctrlDebugLog0] _sum[State:Ok Ess SoC:49 %|L:593 W Grid:15 W Consumption:608 W] ess0[SoC:49 %|L:593 W|DebugSetActivePower:593 W] meter0[15 W]各环境数值会略有差异但能清楚看到控制器下发「放电 593 W」把并网功率从 1560 W 拉到约 15 W。6.5 运行 OpenEMS UI从发行版下载openems-ui.tar.xz并解压到本地目录用任意 Web 服务器文档以 nginx 为例在4200端口提供服务确保 Edge 正在本地运行且 WebSocket 端口与 UI 预期一致预构建 UI 默认为8085浏览器打开http://localhost:4200以用户guest留空密码登录或输入admin获得扩展权限Energymonitor 视图应显示与 DebugLog 一致的数据。6.6 集成 OpenEMS Backend让 UI 与 Edge 的通信改为经 Backend 代理生产架构形态下载并启动openems-backend.jarjava -jar openems-backend.jar打开http://localhost:8079/system/console/configMgr端口 8079 即 BackendApp.bndrun 中org.osgi.service.http.port所设配置Edge.Websocket示例端口8081Debug Mode可设DETAILED——该服务负责 Backend 与 Edge 的通信配置Ui.Websocket示例端口8082——负责 Backend 与 UI 的通信配置 Timedata测试用Timedata.Dummy生产环境应使用Timedata.InfluxDB等真实实现Timedata 服务保存每个已连接 Edge 的当前与历史数据配置 Metadata测试用Metadata.Dummy接受任意用户/密码生产环境应使用Metadata.File——静态 JSON 文件或Metadata.Odoo——结合 Odoo 业务系统的认证与 IoT 设备管理对应 io.openems.backend.metadata.file 与 io.openems.backend.metadata.odoo 两个 Bundle看到如下日志即代表 Backend 就绪INFO [d.timedata.dummy.TimedataDummy] [Timedata.Dummy] Activate INFO [d.metadata.dummy.MetadataDummy] [Metadata.Dummy] Activate INFO [socket.AbstractWebsocketServer] [Ui.Websocket] Starting websocket server [port8082] INFO [socket.AbstractWebsocketServer] [Edge.Websocket] Starting websocket server [port8081]回 Edge 侧配置Controller Api BackendApikey用于在 Backend Metadata 服务中认证该 Edge每个 Edge 必须唯一Uri设为ws://localhost:8081与上一步 Edge.Websocket 端口一致生产环境应使用wss://TLS 加密。保存后 Edge 日志INFO [socket.AbstractWebsocketClient] [ctrlBackend0] Opening connection to websocket server [ws://localhost:8081] INFO [socket.ClientReconnectorWorker] [ctrlBackend0] Connected WebSocket successfully [0s] INFO [.controller.api.backend.OnOpen] [ctrlBackend0] Connected to OpenEMS BackendBackend 侧同时记录 Edge 注册与连接数Edge-Connections: 1 9.以 Backend 模式重启 UIng serve -c openems-backend-devUI 支持本地 Edge 直连与云端 Backend 两种模式切换依赖ui/src/themes/openems/environments中的 environment 配置可用的-c参数在 ui/angular.json 中定义。登录任意账号后即可看到有权限的所有 Edge 列表点击进入与本地直连相同的 Live 视图。七、OpenEMS UIAngular/Ionic 前端UI 位于 ui/基于TypeScript AngularIonic 框架构建README 建议为其使用 Visual Studio Code 开发。ui/README.md 给出主题化构建约定# Edge 直连模式期望本地 Controller.Api.Websocket默认 8085 端口服务到 4200 端口 ng serve -o -c openems-edge-dev ng build -c openems,openems-edge-dev # 开发构建 ng build -c openems,openems-edge-prod,prod # 生产构建 # Backend 模式期望 Backend Ui.Websocket默认 8082 端口 ng serve -o -c openems-backend-dev ng build -c openems,openems-backend-prod,prod主题机制/src/themes下每个主题目录的root内容被复制到 UI 根目录scss/variables.scss提供样式变量environments/*.ts定义 Backend/Edge 与开发/生产的环境参数ui/还内置了基于 Capacitor 的 Android/iOS 打包配置capacitor.config.ts、android/、ios/目录与 README 所说「UI 面向浏览器与智能手机」一致。八、构建体系与版本管理构建工具Gradle bnd workspace。settings.gradle.kts 声明rootProject.name openems通过pluginManagement引入biz.aQute.bnd.workspace/biz.aQute.bnd插件版本来自 gradle.properties 的bnd_version7.4.0并显式 include 应用模块io.openems.backend.application、io.openems.backend.edge.application与doc质量基线gradle.properties 配置 JaCoCo覆盖率、Checkstylecheckstyle.toolVersion11.1.0规则见 cnf/checkstyle.xml、SonarQubeJava 侧验证可使用gradlew checkstyleAll或在 Bundle 级别执行:bundle.name:test、:bundle.name:checkstyleMain见 AGENTS.md版本策略introduction.adoc「Development guidelines」版本号为year.month.0模式如2022.1.0表示 2022 年 1 月发布patch 位恒为 0保留给私有分发按 Gitflow 工作流main分支始终指向稳定版活跃开发在develop分支进行。九、开源许可与引用README「License」章节给出双许可结构仓库根目录保留完整协议文本组件许可证说明OpenEMS Edge / OpenEMS BackendEclipse Public License v2.0LICENSE-EPL-2.0Copyright (C) 2016-2026 OpenEMS Association e.V.含 FENECON GmbH 开发的软件OpenEMS UIGNU Affero General Public License v3LICENSE-AGPL-3.0同上若 OpenEMS 用于科学研究请以仓库 README 中给出的 Zenodo DOI10.5281/zenodo.4440883作为文献引用依据。十、延伸阅读仓库内文档索引围绕本文主线以下仓库内文档可继续深入doc/modules/ROOT/pages/introduction.adoc项目介绍本文主要来源之一doc/modules/ROOT/pages/gettingstarted.adoc完整入门指南第六节来源含 Docker/systemd 部署指引doc/modules/ROOT/pages/coreconcepts.adoc核心概念与术语Bundle/Component/Channel/Nature/Scheduler/Controllerdoc/modules/ROOT/pages/edge/architecture.adocEdge 架构IPO、Process Image、调度优先级doc/modules/ROOT/pages/backend/architecture.adoc、timedata.adoc、metadata.adocBackend 架构、Timedata 与 Metadata 服务详解doc/modules/ROOT/pages/development/overview.adoc面向二次开发者的开发环境指南含 Eclipse/IntelliJ 配置。赞分享后端前端物联网边缘计算【免费下载链接】openemsOpenEMS - Open Source Energy Management System项目地址https://gitcode.com/gh_mirrors/op/openems点击查看免费下载相关推荐OpenEMS AGENTS.md 深度解读OpenEMS 模块化能源管理系统的架构与工程规范指南OpenEMS AGENTS.md 深度解读OpenEMS 模块化能源管理系统的架构与工程规范指南 本文基于仓库根目录下的 AGENTS.md https:/后端前端物联网边缘计算OpenEMS开源能源管理系统从零开始构建智能能源平台OpenEMS是一款专为现代能源场景设计的开源能源管理系统通过模块化架构实现对分布式能源资源的智能化监控与管理。无论是家庭光伏储能系统还是工业级微电网Op后端前端物联网边缘计算OpenEMS开源能源管理系统终极指南从零部署到智能优化OpenEMS开源能源管理系统终极指南从零部署到智能优化 OpenEMS作为一款强大的开源能源管理系统为分布式能源资源提供了完整的监测、控制和优化解决方案。后端前端物联网边缘计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考