GrumpyTanker/fluke-3540-analyzer

GitHub: GrumpyTanker/fluke-3540-analyzer

Fluke 3540 FC 三相电能记录仪会话文件的开源解析、事件检测与可视化工具,提供浏览器端 Web 应用和 Python CLI,作为 Fluke Energy Analyze Plus 的跨平台替代方案。

Stars: 0 | Forks: 0

# fluke-3540-analyzer **针对 Fluke 3540 FC 三相电能质量记录仪会话的开源解析器、事件检测器和图表生成器。** 支持 Windows、Linux 和 macOS。在浏览器中运行——无需上传,无需安装。 🌐 **在线 Web 应用:** [grumpytanker.github.io/fluke-3540-analyzer](https://grumpytanker.github.io/fluke-3540-analyzer/) ## 为什么会有这个项目 Fluke 3540 FC 是一款出色的小型三相电能记录仪,但读取其会话文件(包含 `trend.bin` 的 `.fel` 档案)的唯一官方途径是 **Fluke Energy Analyze Plus**——仅限 Windows、闭源,且导出功能有限。它没有 Linux/macOS 客户端,没有用于批量分析的 CLI,也没有跨大量会话编写报告脚本的理想方法。 本项目为您提供: - **文档化的二进制格式**,适用于 3540 FC 的 `trend.bin` 文件——参见 [`docs/FILE_FORMAT.md`](docs/FILE_FORMAT.md) - **一个在浏览器中运行的 Web 应用**。拖放一个 `trend.bin`,即可获取图表、选择事件并导出 CSV / XLSX / PNG。不上传任何数据——所有解析均通过 JavaScript 在客户端完成。 - **一个 Python CLI**,用于编写脚本、批量作业以及生成出版级质量的 gnuplot 输出。只需 `pip install -e .` 即可开始。 - **自动事件检测**——停电、电压暂降、电压暂升、电流峰值、频率偏差、NEMA 不平衡尖峰、突发负载阶跃。 - **CT 反接校正**——`--reverse-cts` 标志可处理反向安装的 iFlex 探头(极其常见的错误)。参见 [`docs/CT_REVERSAL.md`](docs/CT_REVERSAL.md)。 - **主动/待机负载状态分离**——对于双峰负载(例如,在重负载主动消耗和轻负载待机之间切换的整流器),系统会根据电流对每条记录进行分类,分别报告这两种状态,突出显示主动状态下的功率因数,并以三种方式校正会话能量。参见 [`docs/LOAD_STATES.md`](docs/LOAD_STATES.md)。 ## Web 应用——无需安装 访问 **[grumpytanker.github.io/fluke-3540-analyzer](https://grumpytanker.github.io/fluke-3540-analyzer/)**,并将您的 `trend.bin`(或整个解压后的 `ES.NNN/` 会话文件夹,这样也能读取 `ES.NNN-config.json` 中的资产名称)拖放到页面上。 浏览器会在 Web Worker 中本地解析文件,运行事件检测 + 洞察分析,并显示: - 摘要面板(记录数、时间范围、资产) - **Insights (洞察)** 部分,包含带有严重性颜色标记的卡片,解释了发现的问题及相应对策(参见 [`docs/INSIGHTS.md`](docs/INSIGHTS.md)) - 事件表格,包含严重性、受影响相位、搜索/过滤、可排序列以及一键缩放功能 - 平静基线窗口的快照列表 - **range select (区间选择)** 小地图——通过拖拽刷选来限定所有图表范围,并导出到特定时间窗口 - 带有异常带、拖拽框选缩放、滚轮缩放、Shift+拖拽平移功能的图表 - 图表选择器(电压 / 电流 / 功率 / 功率因数 / 频率 / THD) - 单图表下载为 PNG 或 CSV - 完整工作簿 (XLSX)、独立 HTML 报告、**PDF 报告**,以及“下载所有内容 (.zip)”压缩包 - IndexedDB 缓存:再次拖放同一文件 → 第二次将跳过解析步骤 - 键盘快捷键(按 `?` 查看)和页脚处的深色模式切换开关 **数据绝不会离开您的设备。** 您可以在 DevTools → Network 中自行验证:页面加载后没有任何对外请求。Insights 引擎基于本地规则运行——不涉及云端 LLM,也不需要 API key。 ## Python CLI——用于编写脚本及生成出版级图表 ``` # 从 PyPI (v0.2.0+) pip install fluke-3540-analyzer # 或者从源码进行开发 git clone https://github.com/GrumpyTanker/fluke-3540-analyzer cd fluke-3540-analyzer pip install -e "python/[dev]" ``` 您需要安装 [gnuplot](http://www.gnuplot.info/) 才能渲染图表(`apt install gnuplot` / `brew install gnuplot` / `choco install gnuplot`)。CLI 会依次通过 `$GNUPLOT`、`$PATH` 以及 `C:\Program Files\gnuplot\bin\gnuplot.exe` 自动发现它。 ``` # auto: parse + detect + render everything fluke-analyze path/to/ES.NNN -o output/ --reverse-cts # interactive: walk through event picker fluke-analyze path/to/ES.NNN -o output/ --interactive # parse only — write CSV + events.json + summary.txt, no charts fluke-analyze path/to/ES.NNN -o output/ --parse-only # plot only — reuse existing CSV + events.json, just (re-)render charts fluke-analyze path/to/ES.NNN -o output/ --plot-only --plot voltage,current # time-window slice + chart subset fluke-analyze path/to/ES.NNN -o output/ \ --from "2024-01-13T22:50:00" --to "2024-01-13T22:55:00" \ --events 0,3,5 --plot power,current --pre 60 --post 120 ``` ### CLI 标志参考 | 标志 | 默认值 | 说明 | |---|---|---| | `SESSION_DIR` | 必填 | 指向 `ES.NNN/` 会话目录的路径 | | `-o`, `--output` | `_out/` | 输出目录 | | `--auto` | (默认) | 解析 + 检测 + 渲染所有内容 | | `--interactive` | | 提示选择要渲染的事件/物理量 | | `--parse-only` | | 仅写出 CSV + events.json + summary.txt | | `--plot-only` | | 复用现有的 CSV/events.json,仅渲染图表 | | `--from ISO_TIME` | | 将事件扫描和缩放范围限制为 ≥ 此时间 | | `--to ISO_TIME` | | 将事件扫描和缩放范围限制为 ≤ 此时间 | | `--pre SECS` | `30` | 事件前缩放填充时间 | | `--post SECS` | `60` | 事件后缩放填充时间 | | `--events IDS` | all | 要渲染的事件 ID,以逗号分隔 | | `--plot QTYS` | `voltage,current,power,thd,pf,frequency` | 要绘制图表的物理量 | | `--snapshots N` | `3` | 要选取的平静快照数量 | | `--reverse-cts [PHASES]` | off | 对 P/Q/PF/DPF/Wh/VARh 取反。直接使用该标志 = 所有相位;传入 `a` 或 `a,c` 以选择特定相位(总计项随之改变)。参见 `docs/CT_REVERSAL.md` | | `--every K` | `1` | 将每第 K 条记录写入 CSV | | `--max-csv-rows N` | off | 针对长达一周的会话,将完整 CSV 的行数限制在约 N 行;步幅会自动调大并记录降采样操作。1分钟 CSV + 分析保持全分辨率。 | | `--anchor-start ISO_TIME` | off | 固定真实的挂钟**开始时间**,以校正错误的仪表 RTC(平移所有时间戳)。与 `--anchor-end` 互斥。 | | `--anchor-end ISO_TIME` | off | 固定真实的挂钟**结束时间**(例如已知的停机时间)。 | | `--split-by PERIOD` | off | 划分为不同时间档(`hour`\|`day`\|`week`,如 `30m`/`6h`/`2d` 的时间段,或用于命名班次窗口的 `shifts`)。输出完整的按档分类报告(`
标签:Python, 数据可视化, 数据解析, 无后门, 电力分析, 逆向工具