<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def set_extana_led(self, r, g, b, check_state=True):
 """Update the colour of the RGB LED on the SK8-ExtAna board. Args: r (int):
 red channel, 0-255 g (int):
 green channel, 0-255 b (int):
 blue channel, 0-255 check_state (bool):
 if True (default) and the locally cached LED state matches the given (r, g, b) triplet, pysk8 will NOT send any LED update command to the SK8. If you want to force the command to be sent even if the local state matches the new colour, set this to False. Returns: True on success, False if an error occurred. """


        r, g, b = map(int, [r, g, b])

        if min([r, g, b]) < LED_MIN or max([r, g, b]) > LED_MAX:
            logger.warn('RGB channel values must be {}-{}'.format(LED_MIN, LED_MAX))
            return False

        if check_state and (r, g, b) == self.led_state:
            return True

        # internally range is 0-3000
        ir, ig, ib = map(lambda x: int(x * (INT_LED_MAX / LED_MAX)), [r, g, b])
        val = struct.pack('<HHH', ir, ig, ib)

        extana_led = self.get_characteristic_handle_from_uuid(UUID_EXTANA_LED)
        if extana_led is None:
            logger.warn('Failed to find handle for ExtAna LED')
            return None
            
        if not self.dongle._write_attribute(self.conn_handle, extana_led, val):
            return False

        # update cached LED state if successful
        self.led_state = (r, g, b)
        return True