ESP32 (ESPectre)+Grafana构建专业级CSI监控面板

ESP32 (ESPectre)+Grafana构建专业级CSI监控面板

适合:养老院、看护中心、项目交付、客户演示效果:专业级 CSI 波形图 + 运动强度曲线 + 多房间监控墙

一、整体数据流

1. 硬件环境

ESP32S3 Dev Module开发板(主要是国内兼容版本的ESP32S3-N16R8开发板)

2. 软件环境

  • ESPectre(ESP32)
  • Home Assistant
  • InfluxDB 数据库(存历史数据)
  • Grafana(可视化面板)

建议通过Linux 服务器运维管理面板1Panel进行安装相关服务组件 。

3. 整体数据流

ESP32 ESPectre → ESPHome → Home Assistant → InfluxDB 2.8 → Grafana 专业面板

ESP32 (ESPectre) ↓(ESPHome 本地直连) Home Assistant(已实现) ↓(HA 自带集成:自动转发) InfluxDB(存历史数据) ↓ Grafana(专业可视化)

二、 HA 配置 InfluxDB 集成

1. 安装 InfluxDB

你可以用 1Panel / 群晖 / Docker 安装

创建:

  • 数据库名:homeassistant

2. HA 里添加 InfluxDB 集成

  1. 打开 Home Assistant
  2. 设置 → 设备与服务 → 添加集成
  3. 搜索 InfluxDB()
  4. 输入:
    • URL:http://IP:8086(不能漏 http://,不能加 https)
    • 组织:你的 InfluxDB 组织名
    • 数据库:homeassistant
    • API令牌:InfluxDB 管理员全局 Token

HA 会自动把所有实体数据写入 InfluxDB包括:

  • sensor.movement_score
  • binary_sensor.motion_detected
  • 所有 ESPHome 设备数据
     

HA的configration.yaml配置文件添加influxdb的序列化数据条目。

# INFLUXDB 2.x 写入配置(直接复制) influxdb: include: entities: - sensor.espectre_movement_score - binary_sensor.espectre_motion_detected


三、InfluxDB测试数据源

1. Home Assistant端验证

HA 里能看到:

  • 运动强度 Movement Score
  • 运动检测
  • 校准开关

2. InfluxDB 端验证

  1. 打开 InfluxDB 2.8 → Data Explorer
  2. 选择 Bucket:homeassistant
  3. 筛选 measurement:sensor.movement_score

只要出现数据 → 成功!


四、Grafana 配置InfluxDB 数据源

1. 数据源配置

  1. 打开 Grafana → 左侧边栏 ⚙️ Configuration → Data sources
  2. 点击 Add data source,选择 InfluxDB

2. 关键参数填写

配置项

填写内容

注意事项

Query Language

Flux

必须选 Flux!InfluxDB 2.x 不支持 InfluxQL

URL

http://你的InfluxDB服务器IP:8086

必须加 http://

,不能漏端口 8086

Organization

你的 InfluxDB 组织名

和 InfluxDB 网页里的组织名完全一致(大小写敏感)

Token

InfluxDB 管理员全局 Token

复制 InfluxDB → Load Data → API Tokens 里的 All Access Token

Default Bucket

homeassistant

你提前建好的桶名,大小写一致

Min time interval

5s

匹配 ESPectre 数据上报频率,保证曲线流畅

3. 测试连通性

拉到页面最底部,点击 Save & test

  • 显示 Data source is working:配置成功
  • 报错:检查 Token 权限、Bucket 名、IP 端口、防火墙

五、Grafana 查询 ESPectre 数据

1. 测试 Flux 语句

from(bucket: "homeassistant") |> range(start: -1h) |> filter(fn: (r) => r["_measurement"] == "sensor.espectre_movement_score") |> filter(fn: (r) => r["_field"] == "value") |> yield()

2. 查询内容

  • 最近 1 小时
  • 查你的实体 sensor.espectre_movement_score
  • 最简单、最快、不报错

六、导入仪表板

1. 操作步骤

  1. 点击「导入仪表板」点击你截图右下角那个 「导入仪表板」 按钮。
  2. 选择 JSON 文件弹出窗口后,点击 “从文件上传”(通常是一个上传图标或文字链接),找到你下载的 JSON 文件选中。
  3. 完成导入下方会出现一个 “导入” 按钮,点击它,仪表盘就会自动生成。

仪表盘JSON文件:

{ "annotations": { "list": [ { "builtIn": 1, "datasource": { "type": "grafana", "uid": "-- Grafana --" }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, "links": [], "panels": [ { "datasource": { "type": "influxdb", "uid": "influxdb" }, "description": "ESPectre Wi-Fi CSI 实时运动强度曲线", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "活动强度 Movement Score", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 30, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "showValues": false, "spanNulls": true, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "area" } }, "mappings": [], "max": 0.001, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": 0 }, { "color": "yellow", "value": 0.0001 }, { "color": "green", "value": 0.0002 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 24, "x": 0, "y": 0 }, "id": 1, "options": { "legend": { "calcs": [ "mean", "max", "min", "last" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "max": true, "mode": "single", "sort": "none" } }, "pluginVersion": "12.4.2", "targets": [ { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"homeassistant\")\n |> range(start: -24h)\n |> filter(fn: (r) => r[\"_measurement\"] == \"sensor.espectre_movement_score\")\n |> filter(fn: (r) => r[\"_field\"] == \"value\")\n |> aggregateWindow(every: 30s, fn: mean)\n |> yield()", "refId": "A", "type": "flux" } ], "title": "ESPectre 实时 Movement Score 曲线(养老看护)", "type": "timeseries" }, { "datasource": { "type": "influxdb", "uid": "influxdb" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "max": 0.001, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": 0 }, { "color": "yellow", "value": 0.0001 }, { "color": "green", "value": 0.0002 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 4, "w": 8, "x": 0, "y": 10 }, "id": 2, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "12.4.2", "targets": [ { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"homeassistant\")\n |> range(start: -5m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"sensor.espectre_movement_score\")\n |> filter(fn: (r) => r[\"_field\"] == \"value\")\n |> last()\n |> yield()", "refId": "A", "type": "flux" } ], "title": "当前实时 Movement Score", "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "influxdb" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [ { "options": { "0": { "color": "green", "index": 1, "text": "静默" }, "1": { "color": "red", "index": 0, "text": "活动" } }, "type": "value" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": 0 }, { "color": "red", "value": "on" } ] }, "unit": "none" }, "overrides": [] }, "gridPos": { "h": 4, "w": 8, "x": 8, "y": 10 }, "id": 3, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "12.4.2", "targets": [ { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"homeassistant\")\n |> range(start: -5m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"binary_sensor.espectre_motion_detected\")\n |> filter(fn: (r) => r[\"_field\"] == \"value\")\n |> last()\n |> yield()", "refId": "A", "type": "flux" } ], "title": "当前检测状态", "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "influxdb" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "max": 0.001, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": 0 }, { "color": "yellow", "value": 0.0001 }, { "color": "green", "value": 0.0002 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 4, "w": 8, "x": 16, "y": 10 }, "id": 4, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "min" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "12.4.2", "targets": [ { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"homeassistant\")\n |> range(start: -24h)\n |> filter(fn: (r) => r[\"_measurement\"] == \"sensor.espectre_movement_score\")\n |> filter(fn: (r) => r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r[\"_value\"] > 0)\n |> min()\n |> yield()", "refId": "A", "type": "flux" } ], "title": "24小时最低分值", "type": "stat" } ], "preload": false, "refresh": "5s", "schemaVersion": 42, "tags": [ "ESPectre", "Wi-Fi CSI", "养老看护", "监控大屏" ], "templating": { "list": [] }, "time": { "from": "now-24h", "to": "now" }, "timepicker": {}, "timezone": "Asia/Shanghai", "title": "ESPectre 养老看护 Wi-Fi CSI 专业监控大屏", "uid": "espectre-elderly-final-final", "version": 3, "weekStart": "" }

2. 曲线解读

  • 红色区域(<0.0001):长期静默,老人躺卧 / 不动,属于正常状态,可作为跌倒 / 异常告警的触发阈值
  • 黄色区域(0.0001~0.0002):低活动,老人轻微动作
  • 绿色区域(>0.0002):正常活动,老人走动 / 起身,20:20 后的峰值就是典型的活动信号
  • 统计值:Mean (均值 0.000106)、Max (峰值 0.000461)、Min (最低 0.000181,修复后显示真实值)、Last (当前 0.0000636,静默状态)

Read more

Unity_VR_Pico开发手册_一键配置开发环境无需手动配置环境(后来发现)

文章目录 * 一、配置开发环境 * 1.下载PICO Unity Integration SDK * 2.安装 Unity 编辑器(添加安卓开发平台模块) * 3.导入下载的SDK * 4.项目配置和切换开发平台 * 5.导入 XR Interaction Toolkit * 6.安装 Universal RP(通用渲染管线)并设置 (选做) * 二、调试环境搭建(无PICO设备/有PICO设备两种调试方式并不互斥,但不能同时运行) * 1.无PICO设备 * 2.有PICO设备 * 3.PICO设备开启开发者模式 * 4.模拟设备和串流调试如何切换 * 三、发布所需材料以及构建安装包前配置信息 * 1.账号注册并创建组织(重点,这里关乎后面上传打包好的apk,如果不做无法上传) * 2.

OpenClaw配置飞书机器人完整指南

OpenClaw配置飞书机器人完整指南 使用openclaw channels add配置飞书机器人需完成插件安装→飞书应用创建→通道配置→事件订阅→发布应用五个核心步骤,以下是可直接执行的详细流程。 文章目录 * OpenClaw配置飞书机器人完整指南 * 一、前置准备 * 二、通道配置(openclaw channels add) * 方法1:交互式向导配置(推荐) * 方法2:非交互式命令配置(适合脚本) * 方法3:手动编辑配置文件 * 三、事件订阅与发布(关键步骤) * 四、测试与验证 * 五、常见问题排查 一、前置准备 1. 飞书开放平台创建应用(获取凭证) 1. 访问飞书开放平台:https://open.feishu.cn/app 2. 创建企业自建应用,填写名称(如"

低代码Web界面开发实战:用Dify Workflow 5分钟构建专业表单

低代码Web界面开发实战:用Dify Workflow 5分钟构建专业表单 【免费下载链接】Awesome-Dify-Workflow分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-Workflow 还在为复杂的前端代码头疼吗?想快速搭建Web界面却不懂JavaScript?别担心,Dify Workflow可视化工具能帮你解决这些困扰。作为一款强大的低代码开发平台,它让Web界面开发变得像搭积木一样简单有趣。Awesome-Dify-Workflow项目汇集了丰富的DSL工作流模板,让你零基础也能快速上手。 为什么选择低代码开发? 传统Web开发需要掌握HTML、CSS、JavaScript等多种技术,而低代码平台通过可视化组件和预置模板,让你用拖拽的方式就能完成界面构建。 开发方式学习成本开发周期维护难度传统编码开发高 ✅ 需要专业前端知识长 🕐 通常需要数天到数周高 📈 需

Gemma-3-12B-IT WebUI效果呈现:强化学习对齐+RLHF训练流程解析

Gemma-3-12B-IT WebUI效果呈现:强化学习对齐+RLHF训练流程解析 1. 引言:从聊天界面到模型灵魂 当你打开Gemma-3-12B-IT的WebUI界面,输入一个问题,几秒钟后就能得到一个流畅、准确、甚至充满人情味的回答。这个看似简单的交互背后,隐藏着一套复杂而精密的训练体系——强化学习对齐(Reinforcement Learning Alignment)和RLHF(Reinforcement Learning from Human Feedback)训练流程。 你可能已经体验过Gemma-3-12B-IT的强大对话能力:它能理解你的意图,生成高质量的代码,解释复杂概念,甚至进行创意写作。但你是否想过,这个模型是如何学会“好好说话”的?它为什么不会像早期的聊天机器人那样胡言乱语,或者给出有害的建议? 今天,我们就来深入解析Gemma-3-12B-IT背后的训练秘密。这不是一篇枯燥的技术论文,而是一次带你走进大模型“训练营”的旅程。我们会用最直白的方式,解释强化学习对齐和RLHF到底是什么,它们如何让一个“原始”的语言模型变成现在这个聪明、有用、安全的对话