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, 数据可视化, 数据解析, 无后门, 电力分析, 逆向工具