Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .strict-typing
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,7 @@ homeassistant.components.lawn_mower.*
homeassistant.components.lcn.*
homeassistant.components.ld2410_ble.*
homeassistant.components.led_ble.*
homeassistant.components.led_infrared.*
homeassistant.components.lektrico.*
homeassistant.components.letpot.*
homeassistant.components.lg_infrared.*
Expand Down
2 changes: 2 additions & 0 deletions CODEOWNERS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 43 additions & 0 deletions homeassistant/components/edifier_infrared/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from infrared_protocols.codes.edifier.r1700bt import EdifierR1700BTCode
from infrared_protocols.codes.edifier.rc20g import EdifierRC20GCode
from infrared_protocols.codes.edifier.s360db import EdifierS360DBCode
from infrared_protocols.codes.edifier.s3000pro import EdifierS3000ProCode

from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.components.infrared import InfraredEmitterConsumerEntity
Expand Down Expand Up @@ -141,6 +142,48 @@ class EdifierIrButtonEntityDescription(ButtonEntityDescription):
command_code=EdifierRC20GCode.COAX,
),
),
EdifierCommandSet.S3000PRO: (
EdifierIrButtonEntityDescription(
key="usb",
translation_key="usb",
command_code=EdifierS3000ProCode.USB,
),
EdifierIrButtonEntityDescription(
key="bluetooth",
translation_key="bluetooth",
command_code=EdifierS3000ProCode.BLUETOOTH,
),
EdifierIrButtonEntityDescription(
key="line_bal",
translation_key="line_bal",
command_code=EdifierS3000ProCode.LINE_BAL,
),
EdifierIrButtonEntityDescription(
key="opt_coax",
translation_key="opt_coax",
command_code=EdifierS3000ProCode.OPT_COAX,
),
EdifierIrButtonEntityDescription(
key="eq_monitor",
translation_key="eq_monitor",
command_code=EdifierS3000ProCode.EQ_MONITOR,
),
EdifierIrButtonEntityDescription(
key="eq_dynamic",
translation_key="eq_dynamic",
command_code=EdifierS3000ProCode.EQ_DYNAMIC,
),
EdifierIrButtonEntityDescription(
key="eq_classic",
translation_key="eq_classic",
command_code=EdifierS3000ProCode.EQ_CLASSIC,
),
EdifierIrButtonEntityDescription(
key="eq_vocal",
translation_key="eq_vocal",
command_code=EdifierS3000ProCode.EQ_VOCAL,
),
),
}


Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/edifier_infrared/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from infrared_protocols.codes.edifier.r1700bt import EdifierR1700BTCode
from infrared_protocols.codes.edifier.rc20g import EdifierRC20GCode
from infrared_protocols.codes.edifier.s360db import EdifierS360DBCode
from infrared_protocols.codes.edifier.s3000pro import EdifierS3000ProCode

DOMAIN = "edifier_infrared"
CONF_INFRARED_ENTITY_ID = "infrared_entity_id"
Expand All @@ -16,4 +17,5 @@
| EdifierR1280TCode
| EdifierS360DBCode
| EdifierRC20GCode
| EdifierS3000ProCode
)
14 changes: 14 additions & 0 deletions homeassistant/components/edifier_infrared/media_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from infrared_protocols.codes.edifier.r1700bt import EdifierR1700BTCode
from infrared_protocols.codes.edifier.rc20g import EdifierRC20GCode
from infrared_protocols.codes.edifier.s360db import EdifierS360DBCode
from infrared_protocols.codes.edifier.s3000pro import EdifierS3000ProCode

from homeassistant.components.infrared import InfraredEmitterConsumerEntity
from homeassistant.components.media_player import (
Expand Down Expand Up @@ -92,6 +93,19 @@
MediaPlayerEntityFeature.NEXT_TRACK: (EdifierRC20GCode.FORWARD,),
MediaPlayerEntityFeature.PREVIOUS_TRACK: (EdifierRC20GCode.PREVIOUS,),
},
EdifierCommandSet.S3000PRO: {
MediaPlayerEntityFeature.TURN_ON: (EdifierS3000ProCode.POWER,),
MediaPlayerEntityFeature.TURN_OFF: (EdifierS3000ProCode.POWER,),
MediaPlayerEntityFeature.VOLUME_STEP: (
(EdifierS3000ProCode.VOLUME_UP,),
(EdifierS3000ProCode.VOLUME_DOWN,),
),
MediaPlayerEntityFeature.VOLUME_MUTE: (EdifierS3000ProCode.MUTE,),
MediaPlayerEntityFeature.PLAY: (EdifierS3000ProCode.PLAY_PAUSE,),
MediaPlayerEntityFeature.PAUSE: (EdifierS3000ProCode.PLAY_PAUSE,),
MediaPlayerEntityFeature.NEXT_TRACK: (EdifierS3000ProCode.NEXT,),
MediaPlayerEntityFeature.PREVIOUS_TRACK: (EdifierS3000ProCode.PREVIOUS,),
},
}


Expand Down
21 changes: 21 additions & 0 deletions homeassistant/components/edifier_infrared/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,18 @@
"coax": {
"name": "Coaxial"
},
"eq_classic": {
"name": "Classic EQ"
},
"eq_dynamic": {
"name": "Dynamic EQ"
},
"eq_monitor": {
"name": "Monitor EQ"
},
"eq_vocal": {
"name": "Vocal EQ"
},
"fx_off": {
"name": "FX off"
},
Expand All @@ -42,11 +54,20 @@
"line_2": {
"name": "Line 2"
},
"line_bal": {
"name": "Line / Balanced"
},
"opt_coax": {
"name": "Optical / Coaxial"
},
"optical": {
"name": "Optical"
},
"pc": {
"name": "PC"
},
"usb": {
"name": "USB"
}
}
}
Expand Down
18 changes: 18 additions & 0 deletions homeassistant/components/led_infrared/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"""The LED Infrared integration."""

from homeassistant.config_entries import ConfigEntry
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant

PLATFORMS: list[Platform] = [Platform.LIGHT]


async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up LED Infrared from a config entry."""
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True


async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
94 changes: 94 additions & 0 deletions homeassistant/components/led_infrared/config_flow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
"""Config flow for the LED Infrared integration."""

from typing import TYPE_CHECKING, Any, override

import voluptuous as vol

from homeassistant.components.infrared import (
DOMAIN as INFRARED_DOMAIN,
async_get_emitters,
)
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.selector import (
EntitySelector,
EntitySelectorConfig,
SelectSelector,
SelectSelectorConfig,
SelectSelectorMode,
)

from .const import CONF_DEVICE_TYPE, CONF_INFRARED_ENTITY_ID, DOMAIN, LEDIrDeviceType

DEVICE_NAMES = {
LEDIrDeviceType.GENERIC_24_KEY: "24-key remote",
LEDIrDeviceType.GENERIC_13_KEY: "13-key remote",
}


class LEDIrConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for LED Infrared."""

@override
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the initial step."""
errors: dict[str, str] = {}
emitter_entity_ids = async_get_emitters(self.hass)
if not emitter_entity_ids:
return self.async_abort(reason="no_infrared_entities")

if user_input is not None:
emitter_id = user_input.get(CONF_INFRARED_ENTITY_ID)
if emitter_id:
self._async_abort_entries_match(
{
CONF_DEVICE_TYPE: user_input[CONF_DEVICE_TYPE],
CONF_INFRARED_ENTITY_ID: emitter_id,
}
)

title_entity_id = emitter_id
if TYPE_CHECKING:
assert title_entity_id is not None
ent_reg = er.async_get(self.hass)
entry = ent_reg.async_get(title_entity_id)
title_entity_name = (
entry.name or entry.original_name or title_entity_id
if entry
else title_entity_id
)
return self.async_create_entry(
title=f"LED light with {DEVICE_NAMES[LEDIrDeviceType(user_input[CONF_DEVICE_TYPE])]} via {title_entity_name}",
data=user_input,
)

errors["base"] = "missing_infrared_entity"

return self.async_show_form(
step_id="user",
data_schema=vol.Schema(
{
vol.Required(CONF_DEVICE_TYPE): SelectSelector(
SelectSelectorConfig(
options=[
device_type.value for device_type in LEDIrDeviceType
],
translation_key=CONF_DEVICE_TYPE,
mode=SelectSelectorMode.DROPDOWN,
)
),
vol.Optional(CONF_INFRARED_ENTITY_ID): EntitySelector(
EntitySelectorConfig(
domain=INFRARED_DOMAIN,
include_entities=emitter_entity_ids,
)
),
}
),
errors=errors,
description_placeholders={
"docs_url": "https://www.home-assistant.io/integrations/led_infrared"
},
)
14 changes: 14 additions & 0 deletions homeassistant/components/led_infrared/const.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""Constants for the LED Infrared integration."""

from enum import StrEnum

DOMAIN = "led_infrared"
CONF_INFRARED_ENTITY_ID = "infrared_entity_id"
CONF_DEVICE_TYPE = "device_type"


class LEDIrDeviceType(StrEnum):
"""LED Infrared device types."""

GENERIC_24_KEY = "generic_24_key"
GENERIC_13_KEY = "generic_13_key"
42 changes: 42 additions & 0 deletions homeassistant/components/led_infrared/icons.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"entity": {
"light": {
"light": {
"state_attributes": {
"effect": {
"state": {
"blue": "mdi:palette",
"cyan": "mdi:palette",
"dark_cyan": "mdi:palette",
"fade": "mdi:gradient-horizontal",
"flash": "mdi:flash",
"green": "mdi:palette",
"light_green": "mdi:palette",
"mode_1": "mdi:numeric-1-box",
"mode_2": "mdi:numeric-2-box",
"mode_3": "mdi:numeric-3-box",
"mode_4": "mdi:numeric-4-box",
"mode_5": "mdi:numeric-5-box",
"mode_6": "mdi:numeric-6-box",
"mode_7": "mdi:numeric-7-box",
"mode_8": "mdi:numeric-8-box",
"orange": "mdi:palette",
"orange_red": "mdi:palette",
"plum": "mdi:palette",
"purple": "mdi:palette",
"rebecca_purple": "mdi:palette",
"red": "mdi:palette",
"sky_blue": "mdi:palette",
"smooth": "mdi:looks",
"strobe": "mdi:light-flood-down",
"tomato": "mdi:palette",
"turquoise": "mdi:palette",
"white": "mdi:palette",
"yellow": "mdi:palette"
}
}
}
}
}
}
}
Loading
Loading