예제 #1
0
def to_code(config):
    from PIL import Image

    path = CORE.relative_path(config[CONF_FILE])
    try:
        image = Image.open(path)
    except Exception as e:
        raise core.EsphomeError(u"Could not load image file {}: {}".format(path, e))

    if CONF_RESIZE in config:
        image.thumbnail(config[CONF_RESIZE])

    image = image.convert('1', dither=Image.NONE)
    width, height = image.size
    if width > 500 or height > 500:
        _LOGGER.warning("The image you requested is very big. Please consider using the resize "
                        "parameter")
    width8 = ((width + 7) // 8) * 8
    data = [0 for _ in range(height * width8 // 8)]
    for y in range(height):
        for x in range(width):
            if image.getpixel((x, y)):
                continue
            pos = x + y * width8
            data[pos // 8] |= 0x80 >> (pos % 8)

    rhs = safe_exp([HexInt(x) for x in data])
    prog_arr = progmem_array(config[CONF_RAW_DATA_ID], rhs)

    rhs = App.make_image(prog_arr, width, height)
    Pvariable(config[CONF_ID], rhs)
예제 #2
0
def transmitter_base(full_config):
    name = full_config[CONF_NAME]
    key, config = next(
        (k, v) for k, v in full_config.items() if k in REMOTE_KEYS)

    if key == CONF_JVC:
        return JVCTransmitter.new(name, config[CONF_DATA])
    if key == CONF_LG:
        return LGTransmitter.new(name, config[CONF_DATA], config[CONF_NBITS])
    if key == CONF_NEC:
        return NECTransmitter.new(name, config[CONF_ADDRESS],
                                  config[CONF_COMMAND])
    if key == CONF_PANASONIC:
        return PanasonicTransmitter.new(name, config[CONF_ADDRESS],
                                        config[CONF_COMMAND])
    if key == CONF_SAMSUNG:
        return SamsungTransmitter.new(name, config[CONF_DATA])
    if key == CONF_SONY:
        return SonyTransmitter.new(name, config[CONF_DATA], config[CONF_NBITS])
    if key == CONF_RC5:
        return RC5Transmitter.new(name, config[CONF_ADDRESS],
                                  config[CONF_COMMAND])
    if key == CONF_RAW:
        arr = progmem_array(config[CONF_ID], config[CONF_DATA])
        return RawTransmitter.new(name, arr, len(config[CONF_DATA]),
                                  config.get(CONF_CARRIER_FREQUENCY))
    if key == CONF_RC_SWITCH_RAW:
        return RCSwitchRawTransmitter.new(
            name, build_rc_switch_protocol(config[CONF_PROTOCOL]),
            binary_code(config[CONF_CODE]), len(config[CONF_CODE]))
    if key == CONF_RC_SWITCH_TYPE_A:
        return RCSwitchTypeATransmitter.new(
            name, build_rc_switch_protocol(config[CONF_PROTOCOL]),
            binary_code(config[CONF_GROUP]), binary_code(config[CONF_DEVICE]),
            config[CONF_STATE])
    if key == CONF_RC_SWITCH_TYPE_B:
        return RCSwitchTypeBTransmitter.new(
            name, build_rc_switch_protocol(config[CONF_PROTOCOL]),
            config[CONF_ADDRESS], config[CONF_CHANNEL], config[CONF_STATE])
    if key == CONF_RC_SWITCH_TYPE_C:
        return RCSwitchTypeCTransmitter.new(
            name, build_rc_switch_protocol(config[CONF_PROTOCOL]),
            ord(config[CONF_FAMILY][0]) - ord('a'), config[CONF_GROUP],
            config[CONF_DEVICE], config[CONF_STATE])
    if key == CONF_RC_SWITCH_TYPE_D:
        return RCSwitchTypeDTransmitter.new(
            name, build_rc_switch_protocol(config[CONF_PROTOCOL]),
            ord(config[CONF_GROUP][0]) - ord('a'), config[CONF_DEVICE],
            config[CONF_STATE])

    raise NotImplementedError("Unknown transmitter type {}".format(config))
예제 #3
0
def to_code(config):
    from PIL import ImageFont

    path = CORE.relative_path(config[CONF_FILE])
    try:
        font = ImageFont.truetype(path, config[CONF_SIZE])
    except Exception as e:
        raise core.EsphomeError(u"Could not load truetype file {}: {}".format(
            path, e))

    ascent, descent = font.getmetrics()

    glyph_args = {}
    data = []
    for glyph in config[CONF_GLYPHS]:
        mask = font.getmask(glyph, mode='1')
        _, (offset_x, offset_y) = font.font.getsize(glyph)
        width, height = mask.size
        width8 = ((width + 7) // 8) * 8
        glyph_data = [0 for _ in range(height * width8 // 8)]  # noqa: F812
        for y in range(height):
            for x in range(width):
                if not mask.getpixel((x, y)):
                    continue
                pos = x + y * width8
                glyph_data[pos // 8] |= 0x80 >> (pos % 8)
        glyph_args[glyph] = (len(data), offset_x, offset_y, width, height)
        data += glyph_data

    rhs = safe_exp([HexInt(x) for x in data])
    prog_arr = progmem_array(config[CONF_RAW_DATA_ID], rhs)

    glyphs = []
    for glyph in config[CONF_GLYPHS]:
        glyphs.append(Glyph(glyph, prog_arr, *glyph_args[glyph]))

    rhs = App.make_font(glyphs, ascent, ascent + descent)
    Pvariable(config[CONF_ID], rhs)