Ejemplo n.º 1
0
async def async_setup_platform(hass: HomeAssistant,
                               config: ConfigEntry,
                               async_add_entities,
                               discover_info=None):
    """Set up the Mopidy platform."""
    host = config.get(CONF_HOST)
    port = config.get(CONF_PORT)
    name = config.get(CONF_NAME)

    entity = MopidyMediaPlayerEntity(host, port, name)
    async_add_entities([entity], True)
Ejemplo n.º 2
0
async def async_setup_platform(hass: HomeAssistant,
                               config: ConfigEntry,
                               async_add_entities: AddEntitiesCallback,
                               discovery_info=None):
    name = config.get(CONF_NAME)
    device_class = config.get(CONF_DEVICE_CLASS)
    method = config.get(CONF_METHOD)
    weather = config.get(CONF_WEATHER)

    async_add_entities(
        [WeatherSummary(name, device_class, method, weather)],
        False,
    )
Ejemplo n.º 3
0
async def async_setup_entry(hass: HomeAssistant,
                            config_entry: ConfigEntry,
                            async_add_entities,
                            discovery_info=None):
    prana_client: PranaRCAsyncClient = hass.data[const.DOMAIN][
        config_entry.entry_id][const.DATA_API_CLIENT]
    entities: List[PranaEntity] = []

    if config_entry.data.get(
            const.CONF_CONNECTION_TYPE
    ) == const.ConnectionType.REMOTE_HTTP_SERVER.value:
        for device_config in config_entry.options.get(const.OPT_DEVICES,
                                                      {}).values():
            device_coordinator, device_entities = await setup_prana_device(
                hass, prana_client, device_config, config_entry.data)
            entities += device_entities
    else:
        _LOGGER.warning(
            "Connection type {} is not yet supported. This config entry will be ignored."
            .format(config_entry.get(const.CONF_CONNECTION_TYPE)))

    if len(entities) > 0:
        hass.data[const.DOMAIN][config_entry.entry_id][
            const.DATA_MAIN_ENTITIES] += entities
        # At the moment we registered just main entities. Let's build supplementary fans
        for main_entity in entities.copy():
            entities.append(PranaInputFan(main_entity))
            entities.append(PranaOutputFan(main_entity))
        hass.data[const.DOMAIN][config_entry.entry_id][
            const.DATA_ENTITIES] += entities
        async_add_entities(entities)

    async_dispatcher_send(hass, const.SIGNAL_PRANA_MAIN_INITIALIZED)

    return True
Ejemplo n.º 4
0
async def async_setup_platform(hass: HomeAssistant,
                               config: ConfigEntry,
                               async_add_entities: AddEntitiesCallback,
                               discovery_info=None) -> None:
    """Set up the OpenWeatherMap weather platform."""

    name = config.get(CONF_NAME)
    phone_id = config.get(PHONE_ID)

    device_ids = []
    for device_id in config[CONF_DEVICE_ID]:
        device_ids.append(device_id)

    mad = MobileAlertsData(phone_id, device_ids)
    async_add_entities(
        [MobileAlertsWeather(name, mad)],
        True,
    )
Ejemplo n.º 5
0
async def async_setup_platform(hass: HomeAssistant,
                               config: ConfigEntry,
                               async_add_entities: AddEntitiesCallback,
                               discovery_info=None):
    name = config.get(CONF_NAME)
    device_class = config.get(CONF_DEVICE_CLASS)
    device_id = config.get(CONF_DEVICE_ID)

    if device_id != "":  # historic
        method = config.get(CONF_METHOD)
        duration = config.get(CONF_DURATION)
        mad = MobileAlertsData(hass, device_id, device_class, method, duration)
        async_add_entities(
            [MobileAlertsWeather.historic(name, mad)],
            True,
        )
    else:  # current
        ma_weather = config.get(CONF_WEATHER)
        if hass.states.get(ma_weather) is None:
            raise Exception("weather Entity {0} not found".format(ma_weather))
        for device_class in config[CONF_DEVICES]:
            sensor_name = name.lower() + "_" + device_class
            async_add_entities(
                [
                    MobileAlertsWeather.current(sensor_name, device_class,
                                                ma_weather)
                ],
                False,
            )
Ejemplo n.º 6
0
def process_emails(hass: HomeAssistant, config: ConfigEntry) -> dict:
    """Process emails and return value.

    Returns dict containing sensor data
    """
    host = config.get(CONF_HOST)
    port = config.get(CONF_PORT)
    user = config.get(CONF_USERNAME)
    pwd = config.get(CONF_PASSWORD)
    folder = config.get(CONF_FOLDER)
    resources = config.get(CONF_RESOURCES)

    # Create the dict container
    data = {}

    # Login to email server and select the folder
    account = login(host, port, user, pwd)

    # Do not process if account returns false
    if not account:
        return data

    if not selectfolder(account, folder):
        # Bail out on error
        return data

    # Create image file name dict container
    _image = {}

    # USPS Mail Image name
    image_name = image_file_name(hass, config)
    _LOGGER.debug("Image name: %s", image_name)
    _image[ATTR_IMAGE_NAME] = image_name

    # Amazon delivery image name
    image_name = image_file_name(hass, config, True)
    _LOGGER.debug("Amazon Image Name: %s", image_name)
    _image[ATTR_AMAZON_IMAGE] = image_name

    image_path = config.get(CONF_PATH)
    _LOGGER.debug("Image path: %s", image_path)
    _image[ATTR_IMAGE_PATH] = image_path
    data.update(_image)

    # Only update sensors we're intrested in
    for sensor in resources:
        fetch(hass, config, account, data, sensor)

    # Copy image file to www directory if enabled
    if config.get(CONF_ALLOW_EXTERNAL):
        copy_images(hass, config)

    return data
Ejemplo n.º 7
0
async def async_setup(hass: HomeAssistantType, config: ConfigEntry):
    """Establish connection with MELCloud."""
    if DOMAIN not in config:
        return True

    conf = config.get(DOMAIN)

    hass.async_create_task(
        hass.config_entries.flow.async_init(
            DOMAIN,
            context={"source": SOURCE_IMPORT},
            data=conf,
        ))
    return True
Ejemplo n.º 8
0
async def async_setup(hass: HomeAssistant, config: ConfigEntry) -> bool:
    """Import the ImageProcessor component from config."""
    conf = config.get(DOMAIN)
    if conf is None:
        conf = {}

    hass.data[DOMAIN] = {}

    if DOMAIN in conf:
        for entry in config[DOMAIN]:
            hass.async_create_task(
                hass.config_entries.flow.async_init(
                    DOMAIN, context={"source": SOURCE_IMPORT}, data=entry))

    return True
Ejemplo n.º 9
0
def fetch(
    hass: HomeAssistant, config: ConfigEntry, account: Any, data: dict, sensor: str
) -> int:
    """Fetch data for a single sensor, including any sensors it depends on."""

    img_out_path = f"{hass.config.path()}/{config.get(const.CONF_PATH)}"
    gif_duration = config.get(const.CONF_DURATION)
    generate_mp4 = config.get(const.CONF_GENERATE_MP4)
    amazon_fwds = config.get(const.CONF_AMAZON_FWDS)
    image_name = data[const.ATTR_IMAGE_NAME]
    amazon_image_name = data[const.ATTR_AMAZON_IMAGE]

    if sensor in data:
        return data[sensor]

    count = {}

    if sensor == "usps_mail":
        count[sensor] = get_mails(
            account,
            img_out_path,
            gif_duration,
            image_name,
            generate_mp4,
        )
    elif sensor == const.AMAZON_PACKAGES:
        count[sensor] = get_items(account, const.ATTR_COUNT, amazon_fwds)
        count[const.AMAZON_ORDER] = get_items(account, const.ATTR_ORDER)
    elif sensor == const.AMAZON_HUB:
        value = amazon_hub(account, amazon_fwds)
        count[sensor] = value[const.ATTR_COUNT]
        count[const.AMAZON_HUB_CODE] = value[const.ATTR_CODE]
    elif "_packages" in sensor:
        prefix = sensor.split("_")[0]
        delivering = fetch(hass, config, account, data, f"{prefix}_delivering")
        delivered = fetch(hass, config, account, data, f"{prefix}_delivered")
        count[sensor] = delivering + delivered
    elif "_delivering" in sensor:
        prefix = sensor.split("_")[0]
        delivered = fetch(hass, config, account, data, f"{prefix}_delivered")
        info = get_count(account, sensor, True)
        count[sensor] = max(0, info[const.ATTR_COUNT] - delivered)
        count[f"{prefix}_tracking"] = info[const.ATTR_TRACKING]
    elif sensor == "zpackages_delivered":
        count[sensor] = 0  # initialize the variable
        for shipper in const.SHIPPERS:
            delivered = f"{shipper}_delivered"
            if delivered in data and delivered != sensor:
                count[sensor] += fetch(hass, config, account, data, delivered)
    elif sensor == "zpackages_transit":
        total = 0
        for shipper in const.SHIPPERS:
            delivering = f"{shipper}_delivering"
            if delivering in data and delivering != sensor:
                total += fetch(hass, config, account, data, delivering)
        count[sensor] = max(0, total)
    elif sensor == "mail_updated":
        count[sensor] = update_time()
    else:
        count[sensor] = get_count(
            account, sensor, False, img_out_path, hass, amazon_image_name
        )[const.ATTR_COUNT]

    data.update(count)
    _LOGGER.debug("Sensor: %s Count: %s", sensor, str(count[sensor]))
    return count[sensor]
Ejemplo n.º 10
0
def fetch(hass: HomeAssistant, config: ConfigEntry, account: Any, data: dict,
          sensor: str) -> int:
    """Fetch data for a single sensor, including any sensors it depends on.

    Returns integer of sensor passed to it
    """
    img_out_path = f"{hass.config.path()}/{config.get(CONF_PATH)}"
    gif_duration = config.get(CONF_DURATION)
    generate_mp4 = config.get(CONF_GENERATE_MP4)
    amazon_fwds = config.get(CONF_AMAZON_FWDS)
    image_name = data[ATTR_IMAGE_NAME]
    amazon_image_name = data[ATTR_AMAZON_IMAGE]
    amazon_days = config.get(CONF_AMAZON_DAYS)

    if config.get(CONF_CUSTOM_IMG):
        nomail = config.get(CONF_CUSTOM_IMG_FILE)
    else:
        nomail = None

    if sensor in data:
        return data[sensor]

    count = {}

    if sensor == "usps_mail":
        count[sensor] = get_mails(
            account,
            img_out_path,
            gif_duration,
            image_name,
            generate_mp4,
            nomail,
        )
    elif sensor == AMAZON_PACKAGES:
        count[sensor] = get_items(
            account=account,
            param=ATTR_COUNT,
            fwds=amazon_fwds,
            days=amazon_days,
        )
        count[AMAZON_ORDER] = get_items(
            account=account,
            param=ATTR_ORDER,
            fwds=amazon_fwds,
            days=amazon_days,
        )
    elif sensor == AMAZON_HUB:
        value = amazon_hub(account, amazon_fwds)
        count[sensor] = value[ATTR_COUNT]
        count[AMAZON_HUB_CODE] = value[ATTR_CODE]
    elif sensor == AMAZON_EXCEPTION:
        info = amazon_exception(account, amazon_fwds)
        count[sensor] = info[ATTR_COUNT]
        count[AMAZON_EXCEPTION_ORDER] = info[ATTR_ORDER]
    elif "_packages" in sensor:
        prefix = sensor.replace("_packages", "")
        delivering = fetch(hass, config, account, data, f"{prefix}_delivering")
        delivered = fetch(hass, config, account, data, f"{prefix}_delivered")
        count[sensor] = delivering + delivered
    elif "_delivering" in sensor:
        prefix = sensor.replace("_delivering", "")
        delivered = fetch(hass, config, account, data, f"{prefix}_delivered")
        info = get_count(account, sensor, True)
        count[sensor] = max(0, info[ATTR_COUNT] - delivered)
        count[f"{prefix}_tracking"] = info[ATTR_TRACKING]
    elif sensor == "zpackages_delivered":
        count[sensor] = 0  # initialize the variable
        for shipper in SHIPPERS:
            delivered = f"{shipper}_delivered"
            if delivered in data and delivered != sensor:
                count[sensor] += fetch(hass, config, account, data, delivered)
    elif sensor == "zpackages_transit":
        total = 0
        for shipper in SHIPPERS:
            delivering = f"{shipper}_delivering"
            if delivering in data and delivering != sensor:
                total += fetch(hass, config, account, data, delivering)
        count[sensor] = max(0, total)
    elif sensor == "mail_updated":
        count[sensor] = update_time()
    else:
        count[sensor] = get_count(account, sensor, False, img_out_path, hass,
                                  amazon_image_name)[ATTR_COUNT]

    data.update(count)
    _LOGGER.debug("Sensor: %s Count: %s", sensor, str(count[sensor]))
    return count[sensor]
Ejemplo n.º 11
0
def image_file_name(hass: HomeAssistant,
                    config: ConfigEntry,
                    amazon: bool = False) -> str:
    """Determine if filename is to be changed or not.

    Returns filename
    """
    mail_none = None
    path = None
    image_name = None

    if amazon:
        mail_none = f"{os.path.dirname(__file__)}/no_deliveries.jpg"
        image_name = "no_deliveries.jpg"
        path = f"{hass.config.path()}/{config.get(CONF_PATH)}amazon"
    else:
        path = f"{hass.config.path()}/{config.get(CONF_PATH)}"
        if config.get(CONF_CUSTOM_IMG):
            mail_none = config.get(CONF_CUSTOM_IMG_FILE)
        else:
            mail_none = f"{os.path.dirname(__file__)}/mail_none.gif"
        image_name = os.path.split(mail_none)[1]

    # Path check
    path_check = os.path.exists(path)
    if not path_check:
        try:
            os.makedirs(path)
        except OSError as err:
            _LOGGER.error("Problem creating: %s, error returned: %s", path,
                          err)
            return image_name

    # SHA1 file hash check
    try:
        sha1 = hash_file(mail_none)
    except OSError as err:
        _LOGGER.error("Problem accessing file: %s, error returned: %s",
                      mail_none, err)
        return image_name

    ext = None
    ext = ".jpg" if amazon else ".gif"

    for file in os.listdir(path):
        if file.endswith(".gif") or (file.endswith(".jpg") and amazon):
            try:
                created = datetime.datetime.fromtimestamp(
                    os.path.getctime(os.path.join(path,
                                                  file))).strftime("%d-%b-%Y")
            except OSError as err:
                _LOGGER.error("Problem accessing file: %s, error returned: %s",
                              file, err)
                return image_name
            today = get_formatted_date()
            _LOGGER.debug("Created: %s, Today: %s", created, today)
            # If image isn't mail_none and not created today,
            # return a new filename
            if sha1 != hash_file(os.path.join(path,
                                              file)) and today != created:
                image_name = f"{str(uuid.uuid4())}{ext}"
            else:
                image_name = file

    # If we find no images in the image directory generate a new filename
    if image_name in mail_none:
        image_name = f"{str(uuid.uuid4())}{ext}"
    _LOGGER.debug("Image Name: %s", image_name)

    # Insert place holder image
    _LOGGER.debug("Copying %s to %s", mail_none,
                  os.path.join(path, image_name))

    copyfile(mail_none, os.path.join(path, image_name))

    return image_name