docs: def _derive_charge(self, config):
          """Use a temperature window to identify the roast charge.
  
          The charge will manifest as a sudden downward trend on the temperature.
          Once found, we save it and avoid overwriting. The charge is needed in
          order to derive the turning point.
  
          :param config: Current snapshot of the configuration
          :type config: dict
          :returns: None
          """
          if self._roast.get('charge'):
              return None
          self._window.append(config)
          time, temp = list(), list()
          for x in list(self._window):
              time.append(x['time'])
              temp.append(x['bean_temp'])
          slope, intercept, r_value, p_value, std_err = linregress(time, temp)
          if slope < 0:
              self._roast['charge'] = self._roast['last']
              self.add_roast_event({'event': 'Charge'})
              return config
          return None