def load_hardware(self, reload = False):
    # Get hardware cache key based on the combination of hardware and address
    hardware_cache_key = md5(f'HW-{self.HARDWARE}-{self.address}'.encode()).hexdigest()
    # Load hardware device from cache
    hardware = self._sensor_cache.get_data(hardware_cache_key)
    if reload or hardware is None:
      # Could not find valid hardware cache. So create a new hardware device
      try:
        hardware = func_timeout(self._UPDATE_TIME_OUT, self._load_hardware)
        if hardware is not None:
          # Store the hardware in the cache for unlimited of time
          self._sensor_cache.set_data(hardware_cache_key,hardware,-1)
        else:
          # Raise error that hard is not loaded with an unknown message :(
          raise terrariumSensorLoadingException(f'Unable to load sensor {self}: Did not return a device.')

      except FunctionTimedOut:
      # What ever fails... does not matter, as the data is still None and will raise a terrariumSensorUpdateException and trigger the retry
        raise terrariumSensorLoadingException(f'Unable to load sensor {self}: timed out ({self._UPDATE_TIME_OUT} seconds) during loading.')

      except Exception as ex:
        raise terrariumSensorLoadingException(f'Unable to load sensor {self}: {ex}')

    self._device['device'] = hardware
    # Check for power management features and enable it if set
    if self._device['power_mngt'] is not None:
      GPIO.setup(self._device['power_mngt'], GPIO.OUT)