跳转到内容

PID 气候控制器

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 (必填,浮点数):控制算法的默认目标温度(设定点)。 后续可以在前端动态设置。

  • heat_output (可选,ID):float 输出 的 ID, 用于升高当前温度。必须指定 heat_output 和 cool_output 中的至少一个。

  • cool_output (可选,ID):float 输出 的 ID, 用于降低当前温度。必须指定 heat_output 和 cool_output 中的至少一个。

  • control_parameters (必填):PID 控制器的控制参数。

    • kp (必填,浮点数):PID 控制器比例项的系数。

    • ki (可选,浮点数):PID 控制器积分项的系数。默认为 0。

    • kd (可选,浮点数):PID 控制器微分项的系数。默认为 0。

    • min_integral (可选,浮点数):积分项乘以 ki 后的最小值,以防止积分饱和。默认为 -1。

    • max_integral (可选,浮点数):积分项乘以 ki 后的最大值,以防止积分饱和。默认为 1。

    • starting_integral_term (可选,浮点数):通过对积分项预置值来设置初始输出。 这对于系统重启且不想等待其重新达到平衡的情况非常有用。

    • output_averaging_samples (可选,整数):对这么多样本进行输出平均。PID 控制器 对输入传感器的小变化非常敏感。通过对最近 X 个输出样本取平均, 可以使温度更加稳定。然而,采样窗口越大, PID 控制器的响应性就越差。默认为 1,即不进行采样/平均。

    • derivative_averaging_samples (可选,整数):对这么多样本进行微分项平均。许多 控制器不使用微分项,因为它对输入传感器的微小变化很敏感。 通过对微分项取平均,它可能会变得更实用。大多数 PID 控制器将 此称为微分滤波。微分项用于提前反应,因此不要过度滤波。默认为 1, 即不进行采样/平均。

  • deadband_parameters (可选):启用死区以在温度接近目标温度时稳定并最小化 输出的变化。请参见 死区设置。

    • threshold_high/threshold_low (必填,浮点数):指定一个高/低 阈值以定义目标温度周围的死区。例如使用 default_target_temperature 为 21°C,阈值为 +/-0.5°C,死区将 在 20.5°C - 21.5°C 之间。PID 控制器将限制死区内的输出变化。

    • kp_multiplier (可选,浮点数):设置在死区内时的 kp 增益。默认为 0。

    • ki_multiplier (可选,浮点数):设置在死区内时的 ki 增益。默认为 0。

    • kd_multiplier (可选,浮点数):设置在死区内时的 kd 增益。建议 设置为 0。默认为 0。

    • deadband_output_averaging_samples (可选,整数):通常当处于死区内时,PID 控制器 已达到平衡状态,因此使用更高的输出样本数 (如 10-30 个样本)是有利的。默认为 1,即不进行采样/平均。

  • Climate 中的所有其他选项。

设置 PID 气候控制器需要以下几个组件:

  • 一个 传感器 用于读取当前温度(sensor)。

  • 至少一个 float 输出 用于驱动加热或冷却(或两者)。 例如,可以是经过 Sigma Delta 输出 或 Slow Pwm 的 PWM 输出,用于驱动加热单元。

    请注意,输出必须可以用连续值控制(而不是只有开/关,还要能取中间状态, 例如 50% 加热功率)。

NOTE

传感器的更新间隔应该较短。PID 更新频率与传感器的更新 间隔相关。在传感器上设置较短的 update_interval,例如 5s。

我们建议在传感器上添加一个滤波器(参见 传感器 中的滤波器),并 使用 output_averaging_samples 来平息由噪声输入传感器引起的 PID 传感器波动。

死区用于防止 PID 控制器在温度已经稳定在目标温度附近的一个范围内后继续调节功率。

我们通过指定目标温度的高/低阈值来实现这一点。

为了理解其益处,请考虑一个不断 在加热和冷却之间振荡的暖通空调系统,因为恒温器记录的只是从 +0.1 度到 -0.1 度的微小 变化。这显然是不理想的,并且会导致暖通空调振荡时产生磨损。设置死区后,加热器将不会 激活,直到恒温器突破低阈值;冷却器将不会激活, 直到恒温器突破高阈值。

最基础的设置是在目标温度周围指定阈值,如下所示:

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 控制器寻找合适的 kp、ki 和 kd 控制参数 需要具备一定的 PID 控制器经验。ESPHome 拥有一个自整定算法,它会自动 寻找合适的 PID 参数,使用的是 Ziegler-Nichols 方法结合 继电器自整定的改编版本(Åström 和 Hägglund)。

要自动整定控制参数:

  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 气候的 ID。

  • noiseband (可选,浮点数):过程(=传感器)变量的噪声带。 PID 控制器的值必须能够达到此值。默认为 0.25。

  • positive_output (可选,浮点数):驱动加热输出的正输出功率。 默认为 1.0。

  • negative_output (可选,浮点数):驱动冷却输出的负输出功率。 默认为 -1.0。

positive_output 和 negative_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 气候的 ID。

  • kp (必填,浮点数,可模板化):PID 控制器比例项的系数。

  • ki (可选,浮点数,可模板化):PID 控制器积分项的系数。 默认为 0。

  • kd (可选,浮点数,可模板化):PID 控制器微分项的系数。 默认为 0。

此动作将 PID 控制器的积分项重置为 0。在某些 条件下,为了避免控制回路对目标值产生过冲(或欠冲),这可能是必要的。

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

配置变量:

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

此外,PID 气候平台提供了一个可选的传感器平台,用于监控 计算出的 PID 参数,以帮助你找到合适的 PID 值。

sensor:
- platform: pid
name: "PID Climate Result"
type: RESULT

配置变量:

  • type (必填,字符串):要监控的值。可选值之一:

    • 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。