跳转到内容

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_outputcool_output 中至少必须指定一个。

  • cool_output (可选, ID): 降低当前温度的 浮点输出 的 ID。heat_outputcool_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_temperature21°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 温控器,您需要几个组件:

  • 一个用于读取当前温度的 传感器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 个样本的输出

由于我们预期 PID 控制器在死区内处于平衡状态,我们可以在更长的样本范围内平均输出,如 15 个样本。这进一步有助于温度和控制器稳定性。

手动为 PID 控制器找到合适的 kpkikd 控制参数需要一些 PID 控制器的经验。ESPHome 有一个自动调谐算法,使用 Ziegler-Nichols 方法配合继电器自动调谐(Åström 和 Hägglund)的改进版本自动找到合适的 PID 参数。

要自动调谐控制参数:

  1. 设置 PID 控制器,将所有控制参数设置为零:

    climate:
    - platform: pid
    id: pid_climate
    name: "PID Climate Controller"
    sensor: temperature_sensor
    default_target_temperature: 21°C
    heat_output: heater
    control_parameters:
    kp: 0.0
    ki: 0.0
    kd: 0.0
  2. 创建一个 模板按钮 以稍后启动自动调谐:

    button:
    - platform: template
    name: "PID Climate Autotune"
    on_press:
    - climate.pid.autotune: pid_climate
  3. 编译并上传新固件。

    现在您应该可以在您选择的前端看到一个名为 PID Climate Controller 的温控实体和一个名为 PID Climate Autotune 的按钮。

    自动调谐算法通过反复将加热/制冷输出切换到全功率和关闭来工作。这会诱发观测温度的振荡,测量到的周期和振幅会自动计算。为此,它需要观察至少 3 个振荡周期。

    NOTE

    必须将温控器的设定点设置为设备可以达到的值。例如,如果要控制房间温度,设定点需要高于环境温度。如果环境温度为 20°C,温控设备的设定点应至少设置为约 ~24°C,以便能够诱发振荡。

    还要注意外部影响,例如房间温度严重受户外天气如阳光影响,如果它与加热并行开始使房间变暖,自动调谐可能会失败或给出错误结果。

  4. 设置适当的设定点(见上文说明)并开启温控器(加热、制冷或自动)。

  5. 点击 PID Climate Autotune 按钮并查看设备的日志。

    您应该看到类似以下的输出:

    PID Autotune:
    Autotune is still running!
    Status: Trying to reach 24.25 °C
    Stats so far:
    Phases: 4
    Detected 5 zero-crossings
    # ...

    NOTE

    在上面的输出中,自动调谐器正在以 100% 驱动加热输出,尝试达到 24.25 °C。

    这将持续一段时间,直到获取 3 个阶段(6 次越过设定点;或更多一点,取决于数据质量)的数据。

    自动调谐算法可能需要很长时间才能完成,这取决于重现所需的加热和冷却振荡次数所需的时间。

  6. 当 PID 自动调谐器成功时,可以看到类似以下输出:

    PID Autotune:
    State: Succeeded!
    All checks passed!
    Calculated PID parameters ("Ziegler-Nichols PID" rule):
    control_parameters:
    kp: 0.49460
    ki: 0.00487
    kd: 12.56301
    Please copy these values into your YAML configuration! They will reset on the next reboot.

    一旦自动调谐过程完成,温控器开始使用计算出的参数工作,以便可以立即验证预期操作。

    如果满意,将 control_parameters 中的值复制到您的配置中:

    climate:
    - platform: pid
    # ...
    control_parameters:
    kp: 0.49460
    ki: 0.00487
    kd: 12.56301

    如果结果令人满意,可以从配置中删除 PID Climate Autotune 按钮,不再需要它。

  7. 完成,编译并上传更新后的固件。

    如果计算出的 PID 参数不理想,您可以尝试日志输出中主控制参数下方打印的一些替代参数。

此动作启动 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_outputnegative_output 参数可用于在自动调谐期间补偿加热或制冷过程,当它们以不同速率改变温度时,导致不对称振荡。当建议使用此类参数配置重复整个过程时,自动调谐结果将打印一条消息。

此动作为 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

此动作将 PID 控制器的积分项重置为 0。在某些情况下,这可能是避免控制回路超过(或低于)目标所必需的。

on_...:
# 基本
- climate.pid.reset_integral_term: pid_climate

配置变量:

  • id (必填, ID): 要重置的 PID Climate 的 ID。

此外,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。