# AC_Controller **Repository Path**: wzjahucm/ac_controller ## Basic Information - **Project Name**: AC_Controller - **Description**: AC控制器,三合一版本 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-03-09 - **Last Updated**: 2025-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Instruction ## 16A插座式空调控制器MQTT交互手册V2.1 [三合一(视觉+PIR红外+毫米波雷达)空调控制器MQTT交互手册](https://gitee.com/wzjahucm/ac_controller/blob/master/readme_cam.md) **本控制器虽然提供了诸多远程配置项,但旨在全自动运转,可做到零配置即可实现空调的节能。** ### 串口配置设备编号 输入SETID=AC2025051001即可配置设备的编号。 ### 零电压校准 注意,在空载时,输入CALIBRATE_ZERO_VOLT,进行零电压校准!!! ### 监测数据上报 | 属性 | 名称 | 备注 | | ----------- | ---------------------- | ------------------------------------ | | device_id | 设备编号 | | | acs_current | acs712采集电流 | 可检测空调运行的电流,单位为A | | temp | 当前温度值 | | | target_temp | 目标温度值 | 目标温度值须正整数(大于16且小于30) | | set_temp | PID设定温度 | | | heat_mode | 加热/制冷模式 | 1为加热模式,0为制冷模式,2为自动 | | ac_status | 空调运行状态 | 1为空调已启动,0为空调关闭 | | kwh | 空调在当前月消耗的电量 | 单位千瓦时 | | run_count | 设备运行分钟数 | 值越大说明设备越稳定,最大值为65535 | | running_min | 空调开启分钟数 | 空调一直开启持续时间 | | date | 当前日期时间 | | ``` # 监测数据主题(所有设备均往该数据主题上报,以device_id区分不同设备) /ac/data { "device_id": "AC2025051017", "acs_current": 1.04, "temp": 26.50, "target_temp": 26, "set_temp": 25, "heat_mode": 1, "ac_status": 1,     "kwh":2.53, "run_count": 40001, "running_min": 60, "date": "2025/4/6 22:55:06" } ``` ### 调控数据上报 | 属性 | 名称 | 备注 | | ---------- | ------------- | ---------------------------------------------- | | device_id | 设备编号 | | | set_status | 空调状态设置 | 1为开启空调,0为关闭空调 | | set_mode | 空调模式设置 | 1为制热,0为制冷 | | set_temp | PID设定温度值 | | | set_wspeed | 风速设定值 | 0为自动风速,1为一档风、2为二档风、3为最高档风 | | set_light | 设定背光 | 1为开启背光,0为关闭背光(有的空调不支持) | | date | 当前日期时间 | | ``` # 调控数据主题(所有设备均往该数据主题上报,以device_id区分不同设备) /ac/data { "device_id":"AC2025051017", "set_status":1", "set_mode":0, "set_temp":26, "set_wspeed":1, "set_light":0, "date":"2025/6/23 19:40:14" } ``` ### 远程配置 | 命令属性 | 名称 | 备注 | 缺省值 | | ------------ | -------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | device_id | 设备编号 | 必须设置且正确 | | | code_list | 码值列表 | 可选,若设置为单个选项,则指定当前码值为该单个选项,若设置多个选型,则自适匹配应码值 | **默认为空** | | winter_temp | 冬季目标温度值 | 可选,必须为正整数 | **默认为20℃**,若heat_mode为1则目标温度切换为该温度 | | summer_temp | 夏季目标温度 | 可选,必须为正整数 | **默认为26℃**,若heat_mode为0则目标温度切换为该温度 | | heat_mode | 加热/制冷模式 | 可选,1为加热模式,0为制冷模式,2为自动 | 若heat_mode为2,表示自动模式,月份>=5且<=10则heat_mode为制冷26℃,反之为制热20℃,**默认为2** | | kp | kp参数 | 可选,PID控温的参数 | **0.5** | | ki | ki参数 | 可选,PID控温的参数(暂不考虑使用) | **0** | | acs_th | acs712电流阈值 | 可选,若acs712采集电流大于该阈值,则认为空调已开启,否则,空调已关闭,单位为安培;**实际测试中,像海尔1匹壁挂空调,空调待机电流有的时候最高大概是0.32A,因此该值一定要设置比待机电流大一些,防止误判** | **0.8** | | ctl_cycle | 温度控制周期 | 可选,温度控制的周期,若设置太频繁,可能会嘀嘀频繁叫,单位:秒。(**当空调持续打开30min及以上,则不再使用原有的控制周期5min,统一使用30min控制周期。**) | **默认为300s(5分钟)** | | rep_cycle | 空调运行数据上报周期 | 可选,当空调处于运行时的上报周期,单位:秒 | **默认为300s(5分钟)** | | idle_cycle | 空闲上报周期 | 可选,当空调处于空闲时的上报周期,单位:秒 | **默认为40分钟** | | shutdowns | 关机时间列表 | 可选,示例:[690, 1050, 1380] 即690=11\*60+30=11:30,1050=17\*60+30=17:30,1380=23\*60+0=23:00 | **默认为空** | | is_match_all | 出厂码值匹配开关 | **设备出厂涵盖了美的、格力、海尔三种空调品牌的所有码值,首次上电约1min后会自动进行码值匹配,匹配过程最长需要约5min,此过程切勿开启空调,因为是根据开机电流检测码值是否匹配成功的。匹配完成后该值会变成0。** | **默认为0** | | wind_speed | 风速 | 风速值三挡可调,0为自动风速,1为一档风、2为二档风、3为最高档风。 | **默认为0** | | zero_volt | 校零电压值 | **通常在2.5V附近,每个设备出厂需要手动校零一次,可通过串口校零,或采用4G远程校零** | | | light_on | 背光显示 | 1为打开,0为关闭 | **默认为1** | | is_control | 是否控制 | 0为不控制,1为控制 | **默认为1** | ### 查询所有配置信息 ``` # 查询所有配置信息(测试OK) /ac/{device_id}/command { "device_id": "AC2025051017" } # 配置响应主题(测试OK) /ac/{device_id}/commandResponse { "device_id": "ACSCKT01",   "code_list": [45, 46, 47, 48, 49, 50],   "current_code": 45, // 此处会返回匹配后的码值 "winter_temp": 20, "summer_temp": 26,   "heat_mode": 1, "kp": 1.0, "ki": 0.1, "acs_th": 0.5 "ctl_cycle": 300,   "rep_cycle": 2400,   "idle_cycle" 2400,   "shutdowns": [690, 1050, 1380],   "is_match_all": 0,   "is_match_part" 0,   "wind_speed": 0,   "zero_volt": 2.46,   "light_on": 1,   "is_control": 1 } ``` ### 远程配置逻辑非常简单,就是你需要改什么参数就发送什么,不修改的参数不要放在command指令中!!! ### 空调目标温度远程控制 ``` # 示例:配置为自动模式,月份>=5且<=10则heat_mode为制冷24℃,反之为制热20℃(推荐使用)(测试OK) { "device_id": "AC2025051017", "summer_temp": 24, "winter_temp": 22 } ``` ### 空调控制周期和上报周期设置 ``` # 示例:配置上报周期1min(测试OK) { "device_id": "AC2025051017", "rep_cycle": 60 } ``` **当空调持续打开15min以上,则不再使用原有的控制周期5min,统一使用30min控制周期(TODO:夜间2h)。** ### 空调红外码值匹配 ``` # 示例:配置指定的红外码值(测试OK) { "device_id": "AC2025051017", "code_list": [47] } ``` ``` # 示例:配置自适应码值(暂未测试) { "device_id": "AC2025051017", "code_list": [47, 48, 49, 50, 51] } ``` **设备出厂涵盖了美的、格力、海尔三种空调品牌的所有码值,首次上电约1min后会自动进行码值匹配,匹配过程最长需要约5min,此过程切勿开启空调,因为是根据开机电流检测码值是否匹配成功的。** ``` # 示例:配置美的、格力、海尔三种空调品牌的码值自动匹配(测试OK) { "device_id": "AC2025051017", "is_match_all": 1 } ``` ### 空调PI调控参数设置 ``` # 示例:配置调控参数(测试OK) { "device_id": "AC2025051017", "kp": 0.6 } ``` ### 每日关机时间列表设置 ``` # 配置关机时间列表,如690=11*60+30=11:30,1050=17*60+30=17:30,1380=23*60+0=23:00 # 示例:测试下午16:00和16:05关闭空调(测试OK) { "device_id": "AC2025051017", "shutdowns": [960, 965] } ``` ### 远程开启或关闭空调 ``` # 示例:status_cmd为ON则开启空调,status_cmd为OFF则关闭空调(测试OK) { "device_id": "AC2025051017", "status_cmd": "OFF" } ``` ### 关闭温控、定时关机控制 ``` # 示例(测试OK) { "device_id": "AC2025051017", "is_control": 1 } ``` ### 风速调整 ``` # 示例(测试OK) { "device_id": "AC2025051017", "wind_speed": 1 } ``` ### 关闭灯光(有的空调不支持) ``` # 示例 { "device_id": "AC2025051017", "light_on": 0 } ``` ### 远程校零 ``` # 示例(测试OK) { "device_id": "AC2025051017", "calibrate_zero": "ON" } ``` ### 问题汇总 - 发现当夏季目标温度设置过高,如设置为28摄氏度,而环境温度也接近28摄氏度,则空调会PID控温设置为27摄氏度,此时,发现空调虽然在运转,但电流非常小,很难检测到是否开机!!!此时,若认为的将空调设置到16摄氏度,虽然能够短暂增大电流,但是5min后,PID控温会将其恢复到27摄氏度设定值,电流值又会变得很小难以检测是否开机。因此,推荐将夏季目标温度设置最低为26摄氏度,不宜过高!!! 通过手动校零,同时提高采样率并使用RMS计算电流,现在电流准确度很高,在空载的时候只有0.07A,空调在制冷、27摄氏度、风速最低的情况下检测电流1.5A。同时,我们增加了连续3s检测空调未运行,才说明空调真的未运行的逻辑判断。 2025年06月22日:目前该问题仍存在,主要是因为空调设定温度达到了环境温度,此时空调只有风扇在运转,几乎没有电流。 2025年06月23日:修改逻辑,如果5分钟内只要有电流大于acs_th,则认为空调是运行的,此时running_min直接加5,runing_min只会影响PID控温的间隔,PID控温会根据电流的实时值来判断空调是否真实运行的,如果实时电流值大于acs_th,则ac_status为1,只有ac_status等于1的情况下,才可以进行PID控温(因为控温是组合状态,会默认开启空调,必须保证空调本来就是开的才可以控温)。 2025年06月24日:改为30分钟内,只要有电流大于acs_th,则认为空调是运行的,若30分钟内,没有电流大于acs_th,则认为空调是关闭的,running_min等于0。running_min的作用就是为了防止空调被过度控制,因为滴滴叫很烦人。空调在开启的时候控制一下,后面30分钟间隔控制一下就可以了。 2025年06月24日:将PID控温操作放在了电流检测任务,电流检测若超过acs_th阈值,且空调上次打开空调距离现在已经超过了控制周期(或上次控制的时间距离现在已经超过了控制周期)才会执行PID控温,这样控温的逻辑更合理且反应更快速。控制周期说明:当空调持续打开15min以上,则不再使用原有的控制周期5min,统一使用30min控制周期。 2025年06月24日:修改控制周期:当空调被控制3次以上时,则不再使用原有的控制周期5min,统一使用30min控制周期。加了30min的窗口区,如果这30min空调电流一直很小,就认为空调运行时间等于0,且控制次数清零。 - 目前发现,有个别空调在设置24摄氏度的时候,会关闭空调,怀疑是GMIRV码值芯片的问题。 该问题属于严重bug,问题出现在只改调温的寄存器,因为芯片默认认为空调是关闭的,因此你只修改调温的寄存器,空调会被关闭,因此需要使用组合寄存器,保证芯片默认是打开空调的操作,目前,该问题已解决。