diff options
Diffstat (limited to 'pi_temp_pid.py')
| -rw-r--r-- | pi_temp_pid.py | 35 | 
1 files changed, 21 insertions, 14 deletions
| diff --git a/pi_temp_pid.py b/pi_temp_pid.py index 24b0428..edb6c29 100644 --- a/pi_temp_pid.py +++ b/pi_temp_pid.py @@ -30,8 +30,9 @@ import signal  import logging  import io  import getpass +from csv import writer -from pydantic import BaseSettings +from pydantic import BaseSettings, BaseModel, Field  try:      from PID import PID      import pigpio @@ -173,11 +174,17 @@ class ShroomboxSettings(BaseSettings):          case_sensitive = True -try: -    settings = ShroomboxSettings() -except Exception as exception: -    print(f"Failed to read settings: {exception}") -    sys.exit() +settings = read_settings() + + +def read_settings(): +    global settings +    try: +        settings = ShroomboxSettings() +    except Exception as exception: +        print(f"Failed to read settings: {exception}") +        sys.exit() +    return settings  class ShroomboxManager: @@ -210,7 +217,7 @@ class ShroomboxManager:              val = self.temp_control(temp)              # Set MOSFET to PID value              self.mosfet_set(val) -            time.sleep(settings.read_fqcy) +            time.sleep(settings.read_frequency_sec)      def read(          self, @@ -254,7 +261,7 @@ class ShroomboxManager:          result = True          if not os.path.exists(DATA_FILE):              try: -                os.makedirs(DATA_FILE) +                os.makedirs(DATA_FOLDER)                  with open(DATA_FILE, 'w', encoding='UTF-8') as _file:                      header = "timestamp,temperature"                      _file.write(header) @@ -264,9 +271,9 @@ class ShroomboxManager:                  result = True          try:              with open(DATA_FILE, 'a', encoding='UTF-8') as _file: +                wrtr = writer(_file)                  timestamp = time.strftime(TIMEFORMAT) -                data_point = f'{timestamp},{datum}' -                _file.write(data_point) +                wrtr.writerow((timestamp, datum))                  result = False          except FileNotFoundError as exc:              result = True @@ -298,7 +305,7 @@ class ShroomboxManager:      @staticmethod      def temp_control(              current_temperature: float, -    ) -> int: +    ) -> PidValue:          """          Calculate value to pass to mosfet.          :param current_temperature: float @@ -312,7 +319,7 @@ class ShroomboxManager:          )          pid.output_limits = (0, 255)          pid.sample_time = settings.sample_time -        return pid(current_temperature) +        return int(pid(current_temperature))  # TODO: check if it can be done nicer      def mosfet_set(              self, @@ -325,7 +332,7 @@ class ShroomboxManager:          """          logger.debug(f'Changing pin {settings.mosfet_pin} to {value}')          try: -            self.gpio.write(settings.mosfet_pin, value) +            self.gpio.set_PWM_dutycycle(settings.mosfet_pin, value)              result = False          except Exception as exc:              logger.warning('Failed to set mosfet value: %exc.') @@ -340,7 +347,7 @@ def time_now():  if __name__ == '__main__':      controller = ShroomboxManager() -    signal.signal(signal.SIGHUP, settings.ShroomboxSettings) +    signal.signal(signal.SIGHUP, read_settings)      while True:          controller.callback()          time.sleep(settings.read_frequency_sec) | 
