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

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