michaelsthr/pyvse
GitHub: michaelsthr/pyvse
用于与 IFM VSE100/VSA004 振动传感器通信的 Python SDK,支持高频加速度数据的采集、流式传输与导出。
Stars: 1 | Forks: 0
# pyvse
用于 IFM VSE100 / VSA004 加速度传感器的 Python SDK。通信协议为逆向工程获得。与 IFM 无关,也未获得其认可。
## 安装
```
pip install pyvse
```
**依赖项:** `numpy`(必需),`pandas` + `matplotlib`(可选,用于导出/可视化)。
## 快速入门
### 单次采集
```
import pyvse
with pyvse.connect("192.168.0.1") as client:
data = client.raw("50K").collect(seconds=5.0)
data.to_csv("run1.csv")
df = data.to_dataframe() # pandas DataFrame: time_s, accel_g
arr = data.to_numpy() # np.ndarray shape (N,), unit: g
```
### 实时流
```
import pyvse
with pyvse.connect("192.168.0.1") as client:
for frame in client.raw("50K").stream(batch_size=700):
print(frame.g_values.mean()) # np.ndarray shape (700,), unit: g
```
### 流式传输到 CSV(内存高效)
```
import pyvse
with pyvse.connect("192.168.0.1") as client:
with pyvse.CSVSink("run1.csv", sample_rate=50_000) as sink:
for frame in client.raw("50K").stream():
sink.push(frame.g_values)
```
### 流式传输到 PlotJuggler
```
import pyvse
with pyvse.connect("192.168.0.1") as client:
with pyvse.PlotJugglerSink() as pj: # default: 127.0.0.1:9870 UDP
for frame in client.raw("50K").stream():
pj.push_all(frame.g_values) # one UDP message per sample
```
## API 参考
### `pyvse.connect(host, port=3321, timeout=5.0) → VSEClient`
返回一个上下文管理器。使用 `with` 以确保干净地断开连接。
### `VSEClient`
| 方法 | 返回值 | 描述 |
|--------|---------|-------------|
| `raw(rate="50K")` | `RawCommand` | rate:`"50K"` 或 `"100K"` |
### `RawCommand`
| 方法 | 返回值 | 描述 |
|--------|---------|-------------|
| `collect(seconds)` | `RawData` | 采集固定长度的数据 |
| `stream(batch_size=700)` | `Iterator[RawFrame]` | 实时流;持续运行直到被中断 |
### `RawData`
| 属性 / 方法 | 描述 |
|--------------------|-------------|
| `g_values` | `np.ndarray`,形状为 `(N,)`,float64,单位:g |
| `sample_rate` | `int`,Hz |
| `time_axis` | 以秒为单位的 `np.ndarray` 时间戳 |
| `to_numpy()` | 返回 `g_values` |
| `to_dataframe()` | 包含 `time_s` 和 `accel_g` 列的 pandas DataFrame |
| `to_csv(path)` | 写入包含 `time_s` 和 `accel_g` 列的 CSV 文件 |
### `RawFrame`
| 属性 | 描述 |
|-----------|-------------|
| `g_values` | `np.ndarray`,形状为 `(batch_size,)`,float64,单位:g |
| `sample_rate` | `int`,Hz |
### `CSVSink(path, sample_rate)`
对流友好的 CSV 写入器。用作上下文管理器,每帧调用 `.push(g_values)`。
### `PlotJugglerSink(host="127.0.0.1", port=9870)`
通过 UDP JSON 流将数据推送到 PlotJuggler。
| 方法 | 描述 |
|--------|-------------|
| `push(g_values, channel="accel_g")` | 将批次均值作为单条消息发送 |
| `push_all(g_values, channel="accel_g")` | 将每个样本作为单独的消息发送 |
### 异常
| 异常 | 何时抛出 |
|-----------|-------------|
| `VSEConnectionError` | TCP 连接失败时 |
| `VSETimeoutError` | Socket 读取超时时 |
| `VSEProtocolError` | 设备返回意外响应时 |
| `VSEError` | 所有 pyvse 错误的基类 |
## 免责声明
通过观察设备通信独立开发的实现。与 IFM 无关,也未获得其认可。
标签:Python, 传感器, 命令控制, 工业控制, 数据采集, 无后门, 物联网, 状态监测, 逆向工具