code: def parse_number_from_substring(substring) -> Optional[float]:
      '''
      Returns the number in the expected string "N:12.3", where "N" is the
      key, and "12.3" is a floating point value
  
      For the temp-deck or thermocycler's temperature response, one expected
      input is something like "T:none", where "none" should return a None value
      '''
      try:
          value = substring.split(':')[1]
          if value.strip().lower() == 'none':
              return None
          return round(float(value), GCODE_ROUNDING_PRECISION)
      except (ValueError, IndexError, TypeError, AttributeError):
          log.exception('Unexpected argument to parse_number_from_substring:')
          raise ParseError(
              'Unexpected argument to parse_number_from_substring: {}'.format(
                  substring)f parse_number_from_substring(substring) -> Optional[float]:
      '''
      Returns the number in the expected string "N:12.3", where "N" is the
      key, and "12.3" is a floating point value
  
      For the temp-deck or thermocycler's temperature response, one expected
      input is something like "T:none", where "none" should return a None value
      '''
      try:
          value = substring.split(':')[1]
          if value.strip().lower() == 'none':
              return None
          return round(float(value), GCODE_ROUNDING_PRECISION)
      except (ValueError, IndexError, TypeError, AttributeError):
          log.exception('Unexpected argument to parse_number_from_substring:')
          raise ParseError(
              'Unexpected argument to parse_number_from_substring: {}'.format(
                  substring))
docs: Returns the number in the expected string "N:12.3", where "N" is the
      key, and "12.3" is a floating point value
  
      For the temp-deck or thermocycler's temperature response, one expected
      input is something like "T:none", where "none" should return a None value