mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add Integral Reset Action to PIDClimate (#1104)
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							7a16f846eb
						
					
				
				
					commit
					33212d1abf
				
			| @@ -7,6 +7,7 @@ from esphome.const import CONF_ID, CONF_SENSOR | |||||||
| pid_ns = cg.esphome_ns.namespace('pid') | pid_ns = cg.esphome_ns.namespace('pid') | ||||||
| PIDClimate = pid_ns.class_('PIDClimate', climate.Climate, cg.Component) | PIDClimate = pid_ns.class_('PIDClimate', climate.Climate, cg.Component) | ||||||
| PIDAutotuneAction = pid_ns.class_('PIDAutotuneAction', automation.Action) | PIDAutotuneAction = pid_ns.class_('PIDAutotuneAction', automation.Action) | ||||||
|  | PIDResetIntegralTermAction = pid_ns.class_('PIDResetIntegralTermAction', automation.Action) | ||||||
|  |  | ||||||
| CONF_DEFAULT_TARGET_TEMPERATURE = 'default_target_temperature' | CONF_DEFAULT_TARGET_TEMPERATURE = 'default_target_temperature' | ||||||
|  |  | ||||||
| @@ -64,6 +65,18 @@ def to_code(config): | |||||||
|     cg.add(var.set_default_target_temperature(config[CONF_DEFAULT_TARGET_TEMPERATURE])) |     cg.add(var.set_default_target_temperature(config[CONF_DEFAULT_TARGET_TEMPERATURE])) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @automation.register_action( | ||||||
|  |     'climate.pid.reset_integral_term', | ||||||
|  |     PIDResetIntegralTermAction, | ||||||
|  |     automation.maybe_simple_id({ | ||||||
|  |         cv.Required(CONF_ID): cv.use_id(PIDClimate), | ||||||
|  |     }) | ||||||
|  | ) | ||||||
|  | def pid_reset_integral_term(config, action_id, template_arg, args): | ||||||
|  |     paren = yield cg.get_variable(config[CONF_ID]) | ||||||
|  |     yield cg.new_Pvariable(action_id, template_arg, paren) | ||||||
|  |  | ||||||
|  |  | ||||||
| @automation.register_action('climate.pid.autotune', PIDAutotuneAction, automation.maybe_simple_id({ | @automation.register_action('climate.pid.autotune', PIDAutotuneAction, automation.maybe_simple_id({ | ||||||
|     cv.Required(CONF_ID): cv.use_id(PIDClimate), |     cv.Required(CONF_ID): cv.use_id(PIDClimate), | ||||||
|     cv.Optional(CONF_NOISEBAND, default=0.25): cv.float_, |     cv.Optional(CONF_NOISEBAND, default=0.25): cv.float_, | ||||||
|   | |||||||
| @@ -148,5 +148,7 @@ void PIDClimate::start_autotune(std::unique_ptr<PIDAutotuner> &&autotune) { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void PIDClimate::reset_integral_term() { this->controller_.reset_accumulated_integral(); } | ||||||
|  |  | ||||||
| }  // namespace pid | }  // namespace pid | ||||||
| }  // namespace esphome | }  // namespace esphome | ||||||
|   | |||||||
| @@ -39,6 +39,7 @@ class PIDClimate : public climate::Climate, public Component { | |||||||
|     default_target_temperature_ = default_target_temperature; |     default_target_temperature_ = default_target_temperature; | ||||||
|   } |   } | ||||||
|   void start_autotune(std::unique_ptr<PIDAutotuner> &&autotune); |   void start_autotune(std::unique_ptr<PIDAutotuner> &&autotune); | ||||||
|  |   void reset_integral_term(); | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   /// Override control to change settings of the climate device. |   /// Override control to change settings of the climate device. | ||||||
| @@ -90,5 +91,15 @@ template<typename... Ts> class PIDAutotuneAction : public Action<Ts...> { | |||||||
|   PIDClimate *parent_; |   PIDClimate *parent_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | template<typename... Ts> class PIDResetIntegralTermAction : public Action<Ts...> { | ||||||
|  |  public: | ||||||
|  |   PIDResetIntegralTermAction(PIDClimate *parent) : parent_(parent) {} | ||||||
|  |  | ||||||
|  |   void play(Ts... x) { this->parent_->reset_integral_term(); } | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   PIDClimate *parent_; | ||||||
|  | }; | ||||||
|  |  | ||||||
| }  // namespace pid | }  // namespace pid | ||||||
| }  // namespace esphome | }  // namespace esphome | ||||||
|   | |||||||
| @@ -40,6 +40,8 @@ struct PIDController { | |||||||
|     return proportional_term + integral_term + derivative_term; |     return proportional_term + integral_term + derivative_term; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   void reset_accumulated_integral() { accumulated_integral_ = 0; } | ||||||
|  |  | ||||||
|   /// Proportional gain K_p. |   /// Proportional gain K_p. | ||||||
|   float kp = 0; |   float kp = 0; | ||||||
|   /// Integral gain K_i. |   /// Integral gain K_i. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user