mirror of
https://git.beihong.wang/wangbeihong/iot-bedroom-environment-controller.git
synced 2026-04-23 10:43:04 +08:00
348 lines
10 KiB
Markdown
348 lines
10 KiB
Markdown
# 智能家居控制系统
|
||
|
||
这是一个基于微信小程序的智能家居控制系统,通过 MQTT 协议与 ESP32 等物联网设备进行通信。
|
||
|
||
## 功能特点
|
||
|
||
- 实时监控 ESP32 设备传感器数据(温度、湿度等)
|
||
- 远程控制智能家居设备(LED、风扇、窗帘等)
|
||
- 设备状态管理
|
||
- 统一的物联网设备通信协议
|
||
|
||
## 通信协议
|
||
|
||
### 消息结构
|
||
|
||
所有通信消息均采用统一的 JSON 格式:
|
||
|
||
```json
|
||
{
|
||
"type": "device_message|control_command|response",
|
||
"device_id": "string",
|
||
"device_type": "string",
|
||
"timestamp": 1234567890123,
|
||
"message_type": "string",
|
||
"request_id": "string (optional)",
|
||
"data": {
|
||
// 具体数据内容
|
||
},
|
||
"status_code": 200,
|
||
"status_message": "string (optional)"
|
||
}
|
||
```
|
||
|
||
### 字段说明
|
||
|
||
- `type`: 消息类型
|
||
- `device_message`: 设备主动上报的消息(如传感器数据、状态变化)
|
||
- `control_command`: 控制命令(如开关设备、设置参数,包含配置更新)
|
||
- `response`: 响应消息(设备对命令的响应)
|
||
- `device_id`: 设备唯一标识符,例如:"esp32_bedroom_001"
|
||
- `device_type`: 设备类型,固定为:"bedroom_controller"(卧室控制器)
|
||
- `timestamp`: Unix 时间戳(毫秒),由设备或服务器提供
|
||
- `message_type`: 消息子类型,如:"sensor_data", "status_report", "control_request", "config_set"
|
||
- `request_id`: 请求 ID,用于匹配请求和响应,格式为"req_YYYYMMDDHHMMSS_xxx"
|
||
- `data`: 具体的数据内容,包含状态、遥测、控制或配置信息
|
||
- `status_code`: 状态码(200 表示成功,其他表示错误)
|
||
- `status_message`: 状态描述,可选字段
|
||
|
||
## 3. 智能卧室系统专用消息类型
|
||
|
||
### 3.1 传感器数据上传 (device_message)
|
||
|
||
ESP32 定期上报卧室环境数据:
|
||
|
||
```json
|
||
{
|
||
"type": "device_message",
|
||
"device_id": "esp32_bedroom_001",
|
||
"device_type": "bedroom_controller",
|
||
"timestamp": 1768223104055,
|
||
"message_type": "sensor_data",
|
||
"data": {
|
||
"state": {
|
||
"online": true,
|
||
"current_mode": "night_mode",
|
||
"home_status": true,
|
||
"standby_mode": false,
|
||
"error_code": 0
|
||
},
|
||
"telemetry": {
|
||
"temperature": 23.5,
|
||
"humidity": 65.2,
|
||
"light_intensity": 300,
|
||
"air_quality": 850,
|
||
"curtain_state": "closed",
|
||
"led_state": true,
|
||
"led_brightness": 80,
|
||
"fan_state": false,
|
||
"fan_speed": 0,
|
||
"buzzer_state": false,
|
||
"battery_level": 100,
|
||
"signal_strength": -55
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**参数解释:**
|
||
|
||
- `state.online`: 设备是否在线
|
||
- `state.current_mode`: 当前运行模式("away_mode", "home_mode", "wake_mode", "day_mode", "night_mode", "cooling_mode", "high_temp_alert", "display_on", "ventilation_mode")
|
||
- `state.home_status`: 用户是否在家状态(对应"到家状态")
|
||
- `state.standby_mode`: 是否处于待机状态
|
||
- `telemetry.temperature`: 温度传感器(DHT22)读取的当前温度(摄氏度)
|
||
- `telemetry.humidity`: 湿度传感器(DHT22)读取的当前湿度(百分比)
|
||
- `telemetry.light_intensity`: 光敏电阻读取的光照强度(数值越大表示越亮)
|
||
- `telemetry.air_quality`: 空气质量传感器读取的 CO2 浓度(ppm)
|
||
- `telemetry.curtain_state`: 舵机控制的窗帘状态("open", "closed")
|
||
- `telemetry.led_state`: LED 灯开关状态
|
||
- `telemetry.led_brightness`: LED 灯亮度(0-100 百分比)
|
||
- `telemetry.fan_state`: 风扇开关状态
|
||
- `telemetry.fan_speed`: 风扇速度档位(0-3)
|
||
- `telemetry.buzzer_state`: 蜂鸣器开关状态
|
||
|
||
### 控制命令消息格式
|
||
|
||
微信小程序向 ESP32 发送控制指令,同时包含设备控制和配置更新:
|
||
|
||
```json
|
||
{
|
||
"type": "control_command",
|
||
"device_id": "esp32_bedroom_001",
|
||
"device_type": "bedroom_controller",
|
||
"timestamp": 1768223104055,
|
||
"message_type": "control_request",
|
||
"request_id": "req_123456789_abcde",
|
||
"data": {
|
||
"controls": {
|
||
"mode": "night_mode",
|
||
"curtain": "open",
|
||
"led_power": true,
|
||
"led_brightness": 80,
|
||
"fan_power": true,
|
||
"fan_speed": 2,
|
||
"buzzer_power": false
|
||
},
|
||
"config": {
|
||
"wake_up_time": "08:00",
|
||
"day_mode_start": "06:00",
|
||
"night_mode_start": "18:00",
|
||
"cooling_temp_threshold": 26,
|
||
"high_temp_alarm_threshold": 35,
|
||
"ventilation_air_quality_threshold": 1000,
|
||
"report_interval": 30,
|
||
"oled_display_enabled": true
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**参数解释:**
|
||
|
||
- `controls.mode`: 设置系统运行模式("wake_mode", "day_mode", "night_mode", "cooling_mode", "ventilation_mode"等)
|
||
- `controls.curtain`: 控制窗帘开关("open", "close")
|
||
- `controls.led_power`: 控制 LED 灯开关
|
||
- `controls.led_brightness`: 设置 LED 灯亮度(0-100 百分比)
|
||
- `controls.fan_power`: 控制风扇开关
|
||
- `controls.fan_speed`: 设置风扇速度(0-3 档)
|
||
- `controls.buzzer_power`: 控制蜂鸣器开关
|
||
- `config.wake_up_time`: 起床模式触发时间(HH:MM 格式)
|
||
- `config.day_mode_start`: 白天模式开始时间
|
||
- `config.night_mode_start`: 夜间模式开始时间
|
||
- `config.cooling_temp_threshold`: 降温模式启动温度阈值(摄氏度)
|
||
- `config.high_temp_alarm_threshold`: 高温提醒阈值(35°C 时触发)
|
||
- `config.ventilation_air_quality_threshold`: 自动通风启动空气质量阈值(CO2>1000ppm 时启动)
|
||
- `config.report_interval`: 传感器数据上报间隔(秒)
|
||
- `config.oled_display_enabled`: OLED 显示屏是否启用
|
||
|
||
### 设备状态上报消息格式
|
||
|
||
```json
|
||
{
|
||
"type": "device_message",
|
||
"device_id": "esp32_bedroom_001",
|
||
"device_type": "bedroom_controller",
|
||
"timestamp": 1768223104055,
|
||
"message_type": "sensor_data",
|
||
"data": {
|
||
"state": {
|
||
"online": true,
|
||
"current_mode": "day_mode",
|
||
"led_state": true,
|
||
"fan_state": false
|
||
},
|
||
"telemetry": {
|
||
"temperature": 23.5,
|
||
"humidity": 65.2,
|
||
"light_intensity": 300,
|
||
"air_quality": 45
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 响应消息 (response)
|
||
|
||
ESP32 对控制命令的响应:
|
||
|
||
```json
|
||
{
|
||
"type": "response",
|
||
"device_id": "esp32_bedroom_001",
|
||
"device_type": "bedroom_controller",
|
||
"timestamp": 1768223104060,
|
||
"message_type": "control_response",
|
||
"request_id": "req_123456789_abcde",
|
||
"data": {
|
||
"result": {
|
||
"led_power": true,
|
||
"led_brightness": 80,
|
||
"execution_time": 120
|
||
}
|
||
},
|
||
"status_code": 200,
|
||
"status_message": "Command executed successfully"
|
||
}
|
||
```
|
||
|
||
**参数解释:**
|
||
|
||
- `request_id`: 对应的请求 ID,用于匹配请求和响应
|
||
- `result.execution_time`: 命令执行耗时(毫秒)
|
||
- `status_code`: 执行结果状态码(200 成功,500 失败等)
|
||
- `status_message`: 执行结果描述
|
||
|
||
## MQTT 主题
|
||
|
||
- **设备数据上报**: `sensor/{device_id}`
|
||
- **控制命令下发**: `control/{device_id}`
|
||
|
||
## 设备管理
|
||
|
||
- 自动注册:设备首次发送消息时自动添加到系统
|
||
- 数据更新:根据设备发送的消息自动更新状态
|
||
- 在线状态:实时跟踪设备连接状态
|
||
|
||
## 控制功能
|
||
|
||
- LED 开关控制
|
||
- 风扇开关和速度控制
|
||
- 窗帘开关控制
|
||
- 设备配置更新(温度阈值、警报阈值等)
|
||
|
||
## 使用方法
|
||
|
||
1. 配置 MQTT 服务器参数
|
||
2. 连接到 ESP32 设备
|
||
3. 实时查看传感器数据
|
||
4. 通过控制面板发送控制命令
|
||
5. 更新设备配置参数
|
||
|
||
```javascript
|
||
/**
|
||
* 示例:切换LED状态
|
||
*/
|
||
toggleLed() {
|
||
// 获取当前LED状态
|
||
const currentLedState = this.extractESP32Info("data.telemetry.led_state");
|
||
|
||
// 发送控制命令切换LED状态
|
||
this.sendControlCommand({
|
||
led_power: !currentLedState,
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 示例:打开窗帘
|
||
*/
|
||
setCurtainOpen() {
|
||
this.sendControlCommand({
|
||
curtain: "open",
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 示例:关闭窗帘
|
||
*/
|
||
setCurtainClose() {
|
||
this.sendControlCommand({
|
||
curtain: "close",
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 示例:设置风扇速度
|
||
*/
|
||
setFanSpeed(speed) {
|
||
this.sendControlCommand({
|
||
fan_power: true,
|
||
fan_speed: parseInt(speed),
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 示例:更新设备配置
|
||
*/
|
||
updateDeviceConfig(config) {
|
||
// 发送配置更新命令(现在通过控制命令发送)
|
||
this.sendControlCommand({}, { config: config });
|
||
},
|
||
|
||
/**
|
||
* 示例:设置温度阈值
|
||
*/
|
||
setTemperatureThreshold(threshold) {
|
||
this.updateDeviceConfig({
|
||
cooling_temp_threshold: threshold,
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 示例:设置高温警报阈值
|
||
*/
|
||
setHighTempAlarmThreshold(threshold) {
|
||
this.updateDeviceConfig({
|
||
high_temp_alarm_threshold: threshold,
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 示例:显示设备最新数据
|
||
*/
|
||
showLatestData() {
|
||
// 提取温度
|
||
const temperature = this.extractESP32Info("data.telemetry.temperature");
|
||
console.log("当前温度:", temperature);
|
||
|
||
// 提取湿度
|
||
const humidity = this.extractESP32Info("data.telemetry.humidity");
|
||
console.log("当前湿度:", humidity);
|
||
|
||
// 提取当前模式
|
||
const mode = this.extractESP32Info("data.state.current_mode");
|
||
console.log("当前模式:", mode);
|
||
|
||
// 提取所有设备数据
|
||
const allData = this.extractESP32Info();
|
||
console.log("全部数据:", allData);
|
||
},
|
||
|
||
```
|
||
|
||
以上的代码片段中,我们定义了一些示例方法,用于切换 LED 状态、打开窗帘、关闭窗帘、设置风扇速度、更新设备配置、设置温度阈值、设置高温警报阈值和显示设备最新数据。
|
||
这些方法通过调用`this.sendControlCommand()`和`this.updateDeviceConfig()`方法来发送控制命令和配置更新命令,并使用`this.extractESP32Info()`方法来提取设备数据。
|
||
这些方法中,`this.sendControlCommand()`和`this.updateDeviceConfig()`方法用于发送控制命令和配置更新命令, respectively。 它们接受一个参数,即控制命令或配置更新。
|
||
`this.extractESP32Info()`方法用于从设备数据中提取信息。 它接受一个参数,即要提取的信息的路径。 例如,`this.extractESP32Info("data.telemetry.temperature")`将返回当前温度。
|
||
|
||
```javascript
|
||
this.sendControlCommand(
|
||
{ light: "on", fan: "off" }, // 控制参数
|
||
{ brightness: 80 }, // 配置参数
|
||
(response) => {
|
||
// 回调函数
|
||
console.log("响应:", response);
|
||
}
|
||
);
|
||
```
|