def update(self): """Update the valve state. """ if self._state.is_state(ValveState.Prepare): delta_pos = self.target_position - self.current_position if delta_pos == 0: self.__stop() self._state.set_state(ValveState.Wait) return time_to_move = self.__to_time(abs(delta_pos)) self.__logger.debug("Time: {}".format(time_to_move)) self.__move_timer.expiration_time = time_to_move self.__move_timer.update_last_time() if delta_pos > 0: self.__open_valve() elif delta_pos < 0: self.__close_valve() self._state.set_state(ValveState.Execute) elif self._state.is_state(ValveState.Execute): self.__move_timer.update() if self.__move_timer.expired: self.__move_timer.clear() self.__stop() self._current_position = self.target_position self._state.set_state(ValveState.Wait) cw_limit_state = False # self.__get_close_limit() ccw_limit_state = False # self.__get_open_limit() if cw_limit_state or ccw_limit_state: self.__stop() GlobalErrorHandler.log_hardware_limit( self.__logger, "{} has raised end position.".format(self.name)) self._current_position = self.target_position self._state.set_state(ValveState.Wait) elif self._state.is_state(ValveState.Calibrate): # Wait to start. if self.__calibration_state.is_state(CalibrationState.NONE): self.__calibration_state.set_state(CalibrationState.OpenValve) self.__stop() # Open the valve. if self.__calibration_state.is_state(CalibrationState.OpenValve): self.__stop() self.__open_valve() self.__calibration_state.set_state(CalibrationState.EnsureOpen) self.__limit_timer.update_last_time() # Wait until it si open at 100%. if self.__calibration_state.is_state(CalibrationState.EnsureOpen): # Get CCW limit switch state. ccw_limit_state = self.__get_open_limit() if ccw_limit_state: self.__t0 = time.time() self.__calibration_state.set_state( CalibrationState.CloseValve) # Prevent with timer, # if the valve is not reacting properly. self.__limit_timer.update() if self.__limit_timer.expired: self.__limit_timer.clear() self.__calibration_state.set_state(CalibrationState.Error) # Close the valve. if self.__calibration_state.is_state(CalibrationState.CloseValve): self.__stop() self.__close_valve() self.__calibration_state.set_state( CalibrationState.EnsureClose) self.__limit_timer.update_last_time() # Wait until it si open at 100%. if self.__calibration_state.is_state(CalibrationState.EnsureClose): # Get CW limit switch state. cw_limit_state = self.__get_close_limit() if cw_limit_state: self.__t1 = time.time() self.__calibration_state.set_state( CalibrationState.YouDoTheMath) # Prevent with timer, # if the valve is not reacting properly. self.__limit_timer.update() if self.__limit_timer.expired: self.__limit_timer.clear() self.__calibration_state.set_state(CalibrationState.Error) # Make calculations. if self.__calibration_state.is_state( CalibrationState.YouDoTheMath): self.__stop() self.__dt = self.__t1 - self.__t0 self._state.set_state(ValveState.Wait) # Close the valve. if self.__calibration_state.is_state(CalibrationState.Error): GlobalErrorHandler.log_hardware_malfunction( self.__logger, "The valve {} can not calibrated.".format(self.name)) self._state.set_state(ValveState.Wait)
def update(self): if self.__blinds_state.is_state(BlindsState.Prepare): delta_pos = self.__new_position - self.__current_position if delta_pos == 0: self.__stop() self.__blinds_state.set_state(BlindsState.Wait) return time_to_move = self.__to_time(abs(delta_pos)) self.__logger.debug("Time: {}".format(time_to_move)) self.__move_timer.expiration_time = time_to_move self.__move_timer.update_last_time() if delta_pos > 0: self.__turn_cw() elif delta_pos < 0: self.__turn_ccw() self.__blinds_state.set_state(BlindsState.Execute) elif self.__blinds_state.is_state(BlindsState.Execute): self.__move_timer.update() if self.__move_timer.expired: self.__move_timer.clear() self.__stop() self.__current_position = self.__new_position self.__blinds_state.set_state(BlindsState.Wait) input_fb = self.__reed_fb() if input_fb: self.__stop() GlobalErrorHandler.log_hardware_limit(self.__logger, "{} has raised end position.".format(self.name)) self.__current_position = self.__new_position self.__blinds_state.set_state(BlindsState.Wait) elif self.__blinds_state.is_state(BlindsState.Calibrate): if self.__calibration_state.is_state(CalibrationState.Stop): self.__stop() self.__current_position = 0 self.__new_position = 0 self.__calibration_state.set_state(CalibrationState.TurnCW) elif self.__calibration_state.is_state(CalibrationState.TurnCW): self.__turn_cw() self.__calibration_state.set_state(CalibrationState.WaitCurStabCW) elif self.__calibration_state.is_state(CalibrationState.WaitCurStabCW): if self.__timout_counter >= 5: self.__timout_counter = 0 self.__calibration_state.set_state(CalibrationState.WaitLimitCW) else: self.__timout_counter += 1 elif self.__calibration_state.is_state(CalibrationState.WaitLimitCW): fb_value = self.__reed_fb() if fb_value: self.__stop() self.__t1 = time.time() self.__calibration_state.set_state(CalibrationState.TurnCCW) elif self.__calibration_state.is_state(CalibrationState.TurnCCW): self.__turn_ccw() self.__calibration_state.set_state(CalibrationState.WaitCurStabCCW) elif self.__calibration_state.is_state(CalibrationState.WaitCurStabCCW): if self.__timout_counter >= 5: self.__timout_counter = 0 self.__calibration_state.set_state(CalibrationState.WaitLimitCCW) else: self.__timout_counter += 1 elif self.__calibration_state.is_state(CalibrationState.WaitLimitCCW): fb_value = self.__reed_fb() if fb_value: self.__stop() self.__t2 = time.time() time_delta = self.__t2 - self.__t1 time_delta -= 4 self.__deg_per_sec = 180 / time_delta self.__logger.info("DPS: {}".format(self.__deg_per_sec)) self.__turn_cw() self.__calibration_state.set_state(CalibrationState.ExitTightness) elif self.__calibration_state.is_state(CalibrationState.ExitTightness): if self.__timout_counter >= 12: self.__timout_counter = 0 self.__stop() self.__calibration_state.set_state(CalibrationState.WaitCurrentStab) else: self.__timout_counter += 1 elif self.__calibration_state.is_state(CalibrationState.WaitCurrentStab): if self.__timout_counter >= 4: self.__timout_counter = 0 self.__calibration_state.set_state(CalibrationState.GoTo90) else: self.__timout_counter += 1 elif self.__calibration_state.is_state(CalibrationState.GoTo90): self.__calibration_state.set_state(CalibrationState.NONE) self.__set_position(90) return