PID Climate
pid 温控平台允许您使用 PID 控制器来调节某个值。
PID 控制器擅长调节输出信号以使传感器读数达到指定设定点。例如,它可用于调节加热单元的功率以使温度达到用户指定的设定点。
NOTE
PID 就像汽车中的巡航控制:它通过根据负载测量持续调整燃油量来保持汽车速度恒定。例如,当汽车必须爬坡时,系统注意到负载增加,因此立即给发动机提供更多燃油;当从山坡的另一边下坡时,它注意到负载减少,因此减少或完全切断燃油,以便汽车速度尽可能保持恒定。计算考虑了车重、风阻等常数。
这种数学也可用于加热或制冷系统,自动调谐算法可以帮助确定这些常数,主要描述房间或建筑物的热损失。目标是使温度尽可能保持恒定,并消除传统温控器产生的振荡。
# 示例配置条目climate: - platform: pid name: "PID Climate Controller" sensor: temperature_sensor default_target_temperature: 21°C heat_output: heater control_parameters: kp: 0.49460 ki: 0.00487 kd: 12.56301 output_averaging_samples: 5 # 在 5 个样本上平滑输出 derivative_averaging_samples: 5 # 在 10 个样本上平滑导数值 deadband_parameters: threshold_high: 0.5°C # 目标温度 +/-0.5°C 范围内的死区 threshold_low: -0.5°C-
sensor (必填, ID): 用于测量当前温度的传感器。
-
humidity_sensor (可选, ID): 如果指定,此传感器用于测量当前湿度。这仅用于信息显示,不影响温度控制。
-
default_target_temperature (必填, float): 控制算法的默认目标温度(设定点)。稍后可以在前端动态设置。
-
heat_output (可选, ID): 增加当前温度的 浮点输出 的 ID。
heat_output和cool_output中至少必须指定一个。 -
cool_output (可选, ID): 降低当前温度的 浮点输出 的 ID。
heat_output和cool_output中至少必须指定一个。 -
control_parameters (必填): PID 控制器的控制参数。
-
kp (必填, float): PID 控制器比例项的系数。
-
ki (可选, float): PID 控制器积分项的系数。 默认为
0。 -
kd (可选, float): PID 控制器微分项的系数。 默认为
0。 -
min_integral (可选, float): 积分项乘以
ki后的最小值,用于防止积分饱和。默认为-1。 -
max_integral (可选, float): 积分项乘以
ki后的最大值,用于防止积分饱和。默认为1。 -
starting_integral_term (可选, float): 通过预设积分项来设置初始输出。这适用于系统重新启动时不想等待它恢复平衡的情况。
-
output_averaging_samples (可选, int): 在此样本数上平均输出。PID 控制器对输入传感器的微小变化可能相当敏感。通过平均最后 X 个输出样本,温度可以更稳定。但是,采样窗口越大,PID 控制器的响应越慢。默认为
1,即不采样/平均。 -
derivative_averaging_samples (可选, int): 在此样本数上平均微分项。许多控制器不使用微分项,因为它对输入传感器的微小变化敏感。通过取微分项的平均值,它可能对您更有用。大多数 PID 控制器称之为微分滤波。微分项用于预判,所以不要滤波太多。默认为
1,即不采样/平均。
-
-
deadband_parameters (可选): 启用死区以在温度接近目标温度时稳定并最小化输出变化。请参阅 死区设置。
-
threshold_high/threshold_low (必填, float): 指定定义目标温度周围死区的高/低阈值。例如,
default_target_temperature为21°C,阈值为+/-0.5°C时,死区将在20.5°C - 21.5°C之间。PID 控制器将限制死区内的输出变化。 -
kp_multiplier (可选, float): 在死区内设置
kp增益。默认为0。 -
ki_multiplier (可选, float): 在死区内设置
ki增益。默认为0。 -
kd_multiplier (可选, float): 在死区内设置
kd增益。建议设置为0。默认为0。 -
deadband_output_averaging_samples (可选, int): 通常当在死区内时,PID 控制器已达到平衡状态,因此使用更多的输出样本(如 10-30 个样本)是有利的。默认为
1,即不采样/平均。
-
-
Climate 的所有其他选项。
PID 控制器设置
Section titled “PID 控制器设置”要设置 PID 温控器,您需要几个组件:
-
一个用于读取当前温度的 传感器(
sensor)。 -
至少一个用于驱动加热或制冷(或两者)的 浮点输出。 这可以例如是通过 Sigma Delta 输出 或 慢速 PWM 驱动加热单元的 PWM 输出。
请注意,输出必须可以用连续值控制(不仅仅是开/关,而是介于两者之间的任何状态,例如 50% 加热功率)。
NOTE
传感器应具有较短的更新间隔。PID 更新频率与传感器的更新间隔绑定。在传感器上设置较短的 update_interval,如 5s。
我们建议在传感器上放置滤波器(请参阅 传感器 中的滤波器),并使用 output_averaging_samples 来使 PID 传感器免受噪声输入传感器的影响。
死区用于防止 PID 控制器在温度稳定在目标温度范围内后继续调整功率。
我们通过指定目标温度的高/低阈值来做到这一点。
要理解其好处,考虑一个不断在加热和制冷之间振荡的 HVAC 系统,因为温控器记录了 +0.1º 到 -0.1º 的微小变化。这显然是不可取的,会导致 HVAC 振荡时的磨损。有了死区,加热器在温控器突破低阈值之前不会激活,制冷器在温控器突破高阈值之前不会激活。
最基本的设置如下指定目标温度周围的阈值:
default_target_temperature: 21°C...deadband_parameters: threshold_high: 0.5°C threshold_low: -1.0°C在此示例中,死区在 20.0°C - 21.5°C 之间。PID 控制器将限制此死区内的任何输出变化。它如何限制取决于您如何设置 死区乘数。
死区乘数告诉控制器在死区内如何操作。
p、i 和 d 项都可以使用 kp、ki 和 kd 乘数来控制。例如,如果 kp_multiplier 设置为 0.05,则死区内的最终比例项将设置为其正常值的 5%。
如果所有乘数都设置为 0,则控制器在死区内完全不会调整功率。这是默认行为。
大多数死区实现将 kp 和 ki 乘数设置为小增益如 0.05,并将微分设置为 0。这意味着 PID 输出将平静地以 20 倍更长的时间框架进行小幅调整以保持在死区范围内。
首先我们建议只将 ki_multiplier 设置为 0.05(5%)。如果控制器太频繁地脱离死区,则将 kp_multiplier 设置为 0.05(5%)。
default_target_temperature: 21°C...deadband_parameters: threshold_high: 0.5°C threshold_low: -1.0°C kp_multiplier: 0.0 # 死区内关闭比例增益 ki_multiplier: 0.05 # 积分仅以正常 ki 的 5% 累积 kd_multiplier: 0.0 # 死区内关闭微分 deadband_output_averaging_samples: 15 # 在死区内平均 15 个样本的输出
死区输出平均样本
Section titled “死区输出平均样本”由于我们预期 PID 控制器在死区内处于平衡状态,我们可以在更长的样本范围内平均输出,如 15 个样本。这进一步有助于温度和控制器稳定性。
手动为 PID 控制器找到合适的 kp、ki 和 kd 控制参数需要一些 PID 控制器的经验。ESPHome 有一个自动调谐算法,使用 Ziegler-Nichols 方法配合继电器自动调谐(Åström 和 Hägglund)的改进版本自动找到合适的 PID 参数。
要自动调谐控制参数:
-
设置 PID 控制器,将所有控制参数设置为零:
climate:- platform: pidid: pid_climatename: "PID Climate Controller"sensor: temperature_sensordefault_target_temperature: 21°Cheat_output: heatercontrol_parameters:kp: 0.0ki: 0.0kd: 0.0 -
创建一个 模板按钮 以稍后启动自动调谐:
button:- platform: templatename: "PID Climate Autotune"on_press:- climate.pid.autotune: pid_climate -
编译并上传新固件。
现在您应该可以在您选择的前端看到一个名为 PID Climate Controller 的温控实体和一个名为 PID Climate Autotune 的按钮。
自动调谐算法通过反复将加热/制冷输出切换到全功率和关闭来工作。这会诱发观测温度的振荡,测量到的周期和振幅会自动计算。为此,它需要观察至少 3 个振荡周期。
NOTE
您必须将温控器的设定点设置为设备可以达到的值。例如,如果要控制房间温度,设定点需要高于环境温度。如果环境温度为 20°C,温控设备的设定点应至少设置为约 ~24°C,以便能够诱发振荡。
还要注意外部影响,例如房间温度严重受户外天气如阳光影响,如果它与加热并行开始使房间变暖,自动调谐可能会失败或给出错误结果。
-
设置适当的设定点(见上文说明)并开启温控器(加热、制冷或自动)。
-
点击 PID Climate Autotune 按钮并查看设备的日志。
您应该看到类似以下的输出:
PID Autotune:Autotune is still running!Status: Trying to reach 24.25 °CStats so far:Phases: 4Detected 5 zero-crossings# ...NOTE
在上面的输出中,自动调谐器正在以 100% 驱动加热输出,尝试达到 24.25 °C。
这将持续一段时间,直到获取 3 个阶段(6 次越过设定点;或更多一点,取决于数据质量)的数据。
自动调谐算法可能需要很长时间才能完成,这取决于重现所需的加热和冷却振荡次数所需的时间。
-
当 PID 自动调谐器成功时,可以看到类似以下输出:
PID Autotune:State: Succeeded!All checks passed!Calculated PID parameters ("Ziegler-Nichols PID" rule):control_parameters:kp: 0.49460ki: 0.00487kd: 12.56301Please copy these values into your YAML configuration! They will reset on the next reboot.一旦自动调谐过程完成,温控器开始使用计算出的参数工作,以便可以立即验证预期操作。
如果满意,将
control_parameters中的值复制到您的配置中:climate:- platform: pid# ...control_parameters:kp: 0.49460ki: 0.00487kd: 12.56301如果结果令人满意,可以从配置中删除 PID Climate Autotune 按钮,不再需要它。
-
完成,编译并上传更新后的固件。
如果计算出的 PID 参数不理想,您可以尝试日志输出中主控制参数下方打印的一些替代参数。
climate.pid.autotune 动作
Section titled “climate.pid.autotune 动作”此动作启动 PID 控制器的自动调谐过程。
on_...: # 基本 - climate.pid.autotune: pid_climate
# 高级 - climate.pid.autotune: id: pid_climate noiseband: 0.25 positive_output: 25% negative_output: -25%配置变量:
-
id (必填, ID): 要开始自动调谐的 PID Climate 的 ID。
-
noiseband (可选, float): 过程(=传感器)变量的噪声带。PID 控制器的值必须能够达到此值。默认为
0.25。 -
positive_output (可选, float): 驱动加热输出的正输出功率。 默认为
1.0。 -
negative_output (可选, float): 驱动制冷输出的负输出功率。 默认为
-1.0。
positive_output 和 negative_output 参数可用于在自动调谐期间补偿加热或制冷过程,当它们以不同速率改变温度时,导致不对称振荡。当建议使用此类参数配置重复整个过程时,自动调谐结果将打印一条消息。
climate.pid.set_control_parameters 动作
Section titled “climate.pid.set_control_parameters 动作”此动作为 PID 控制器设置新的控制参数值。这可用于手动调谐 PID 控制器。确保在 YAML 文件中更新您想要的值!它们将在下次重启时重置。
on_...: - climate.pid.set_control_parameters: id: pid_climate kp: 0.0 ki: 0.0 kd: 0.0配置变量:
-
id (必填, ID): 要开始自动调谐的 PID Climate 的 ID。
-
kp (必填, float): PID 控制器比例项的系数。
-
ki (可选, float): PID 控制器积分项的系数。 默认为
0。 -
kd (可选, float): PID 控制器微分项的系数。 默认为
0。
climate.pid.reset_integral_term 动作
Section titled “climate.pid.reset_integral_term 动作”此动作将 PID 控制器的积分项重置为 0。在某些情况下,这可能是避免控制回路超过(或低于)目标所必需的。
on_...: # 基本 - climate.pid.reset_integral_term: pid_climate配置变量:
- id (必填, ID): 要重置的 PID Climate 的 ID。
pid 传感器
Section titled “pid 传感器”此外,PID 温控平台提供了一个可选的传感器平台来监视计算出的 PID 参数,以帮助找到好的 PID 值。
sensor: - platform: pid name: "PID Climate Result" type: RESULT配置变量:
-
type (*必填, string): 要监视的值。可选:
RESULT- 结果值(P、I 和 D 项之和)。ERROR- 计算出的误差(设定点 - 过程变量)PROPORTIONAL- PID 控制器的比例项。INTEGRAL- PID 控制器的积分项。DERIVATIVE- PID 控制器的微分项。HEAT- 提供给heat_output的结果加热功率。COOL- 提供给cool_output的结果制冷功率。KP- PID 控制器比例项的当前系数。KI- PID 控制器积分项的当前系数。KD- PID 控制器微分项的当前系数。
-
Sensor 的所有其他选项。
高级选项:
- climate_id (可选, ID): 要获取值的 pid 温控器的 ID。
-
Ziegler-Nichols 方法:Nichols, N. B. and J. G. Ziegler (1942), ‘Optimum settings for automatic controllers’, Transactions of the ASME, 64, 759-768
-
Åström, K. J. and T. Hägglund (1984a), ‘Automatic tuning of simple regulators’, Proceedings of IFAC 9th World Congress, Budapest, 1867-1872
- API Reference: pid_climate.h
- API Reference: PID 自动调谐器