@apocaliss92/nodewitt

中文文档
1.4.2发布于 2026/07/02MITTypeScriptESM + CJS近 30 天下载 2048

Ecowitt气象站的Node.js/TypeScript客户端(地方民意调查+推)

中文使用文档
文档目录11 节
  1. 安装
  2. 运输
  3. 使用量
  4. 地方民意调查
  5. 推动收听器
  6. 活动
  7. 统一 Sensor
  8. 诊断垃圾堆
  9. 共享垃圾堆以扩展传感器表
  10. 承认
  11. 许可证

节点

Ecowitt气象站的Node.js/TypeScript客户端——地方民意调查+推取,一个统一的传感器模型.

事件驱动库——不是UI.

安装

npm install @apocaliss92/nodewitt

运输

实施了两种运输方式:本地输入客户端和HTTP推收器(内部) node:http 接收网关“ 自定义”的服务器 x-www-form-urlencoded 上传和 将它们解码为相同的SI正态读取. 都暴露在单曲背后 Ecowitt 外表,使它们合为一体 Sensor 带有已键入事件流的模型.

使用量

这个 Ecowitt 外观是唯一的公共入口. 选择运输工具 Ecowitt.createLocal (打开HTTP的网关)或 Ecowitt.createListener (接收网关的上传),那么 用同样的生命周期驱动它: start() 编号 : stop(),订阅 on(...) 编号 : off(...) 编号 : once(...),并读取时点快照 getStation() (或 getSensors()) (中文(简体) ).

stop() 实值 终端:它撕裂了运输,并清除了所有的听众,以及实例 无法重新启动 。 创建新 Ecowitt 通过 createLocal 编号 : createListener 继续.

地方民意调查

import { Ecowitt } from '@apocaliss92/nodewitt';

const client = Ecowitt.createLocal({
  host: '192.168.20.181',
  // port: 80,                 // gateway HTTP port (default 80)
  // password: 'secret',       // newer firmware
  // pollIntervalMs: 60000,    // live-data poll interval (default 60000)
  // mappingIntervalMs: 600000 // sensor-map refresh interval (default 600000)
});

client.on('update', (sensors) => {
  for (const s of sensors) {
    console.log(s.id, s.quantity, s.value, s.unit, s.battery ?? '', s.batteryUnit ?? '');
  }
});
client.on('sensorChanged', (s) => console.log('changed', s.id, s.value));
client.on('snapshot', (snap) => console.log('sensors:', snap.sensors.length));
client.on('error', (err) => console.error('ecowitt error', err.message));

await client.start();
// ... later
console.log(client.getStation().sensors.length);
await client.stop();

推动收听器

import { Ecowitt } from '@apocaliss92/nodewitt';

const client = Ecowitt.createListener({ port: 4199 }); // port: 0 for an ephemeral port
client.on('update', (sensors) => console.log('push update', sensors.length));

await client.start();
console.log('listening on', client.getAddress()); // point the gateway "Customized" upload here
// ... later
await client.stop();

活动

事件有效载数何时
updateSensor[]值或电池在最新摄入量上发生变化的传感器
sensorChangedSensor一个传感器被改变(每个被改变的传感器一次接收)
snapshotStationSnapshot每一次摄入后 整个车站的快照
errorError运输/解码器出错(从未投入消费者)
rawFrameRawFrame用于诊断的原始、未解码的运输框架(poll活数据/推取形式)

统一 Sensor

字段含义
id站内稳定身份
hardwareId?传感器硬件代号(只投出)
model? 编号 : channel?传感器模型符号/通道 (1.8)
quantitytemperature | humidity | pressure | wind_speed |..
value 编号 : unit 编号 : rawSI 值, SI 单位, 原始字符串
battery? 编号 : batteryUnit?电池电位- '%' (解码百分比)或 'V' (拉电压)
signal?信号强度(波浪,已知时)
lastUpdated时代小米

两种传动都集中在这个模型上:通过硬件 id(在电池之间稳定)进行传票键传感器 互换; 按键通过 PASSKEY +频道. 值在内部是 SI , 保留了原始字符串 . 电池的表面与运输产生的电池(百分比或电压)完全相同——从未重新被解码.

诊断垃圾堆

createDumper 附上a 只读 现场诊断记录器 Ecowitt 客户端。 节点 没有发布命令——只发布倾卸器 观察 事件流加传感器快照——这样它就可以 永远不要改变网关。 它记录了车站在运营期间暴露的情况(传感器模型, 信道、测量键、电池编码和可选的生框)和导出a 匿名 DeviceDump JSON在共享的跨图书馆堆放格式.

import { Ecowitt, createDumper } from '@apocaliss92/nodewitt';

const client = Ecowitt.createLocal({ host: '192.168.20.181' });
const dumper = createDumper(client, { captureRawFrames: true });
await client.start();
dumper.start();
// ...let the station report for a while (one or more poll ticks)...
dumper.stop();
const json = dumper.exportJson(); // anonymized, share-safe JSON
await client.stop();

输出为 匿名: 网关 mac 编号 : PASSKEY / SSID / IP / 主机 / 纬度/经度 并用 [redacted]抓获时和抓获时均对活框进行擦拭 导出,所以 PASSKEY 或者说 mac 在民意测验/推力框中 从未到达JSON.

共享垃圾堆以扩展传感器表

条目 observations.properties 带有 无空 unmapped 数组 命名节点 尚未确认:

  • model:<img> ——感应模型符号(如:全新的 wh99)没有出现在协议表中.
  • key:<rawKey> - 测量/推出键(如新的六分位码或固件字段),用于 classifyKey 无法映射 .
  • battery:<rawKey> ——一个电池键,其编码无一能解码.

在 GitHub 问题上附加匿名的 JSON 使维护者可以将新的传感器类型折叠成 protocol/sensor-models.ts 编号 : protocol/hex-ids.ts 编号 : protocol/battery.ts。 。 。 .

说明: captureRawFrames (默认关闭)需要表面未知的原始测量键 和不可解密的电池。 这个 Station 放弃任何无法分类的读取, 因此这些密钥只能是 在原始民意测验/推力框中出现——当这面旗帜是时,倾卸者才会捕捉到(并修改) 继续 还没画好的..模式 信号没有它.

承认

局部层端口 alexlenk/ ecowitt 当地语 (麻省理工学院). 推力层是Ecowitt记录的推力协议的独立实施,基于 灰尘/ 皮克威特 财务报告和审定财务报表 护身符/ 护身符 ecowit (Apache-2.0) 作为 协议参考。 见 LICENSE。 。 。 .

许可证

麻省理工学院.

版本与发布记录

@apocaliss92/nodewitt 共发布 10 个版本,首次发布于 2026/06/05;过去 12 个月发布了 10 个版本。

版本发布日期距今
1.4.2latest2026/07/024 个月前
1.4.12026/07/024 个月前
1.4.02026/07/024 个月前
1.3.02026/07/014 个月前
1.2.12026/07/014 个月前
1.2.02026/06/304 个月前

关于 @apocaliss92/nodewitt 的常见问题

@apocaliss92/nodewitt 是什么?

Ecowitt气象站的Node.js/TypeScript客户端(地方民意调查+推)

如何安装 @apocaliss92/nodewitt?

在项目目录运行 npm install @apocaliss92/nodewitt,或使用 pnpm add / yarn add / bun add。

@apocaliss92/nodewitt 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@apocaliss92/nodewitt 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@apocaliss92/nodewitt 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@apocaliss92/nodewitt 可以商用吗?

@apocaliss92/nodewitt 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@apocaliss92/nodewitt 的下载量有多少?

根据 npm 官方下载统计,@apocaliss92/nodewitt 在 2026/10/07 – 2026/11/05 这 30 天内被下载 2,048 次,日均约 68 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@apocaliss92/nodewitt 还在维护吗?

最新版本 1.4.2 发布于 2026/07/02(4 个月前);至今共发布 10 个版本,其中过去 12 个月发布了 10 个;首次发布于 2026/06/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。