๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IoT ๐Ÿ /HomeAssistant

[Python] Home Assistant Smarthings IR ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘

by GeekSean 2026. 7. 8.
๋ฐ˜์‘ํ˜•

 

์ €๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ Home Assistant ๊ธฐ๋ณธ ๊ตฌ์ถ•๊ณผ ๋”๋ถˆ์–ด, ๊ธฐ๋ณธ์ ์ธ ๋Œ€์‹œ๋ณด๋“œ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋‹ค.

์ด๋ฒˆ์—”, Smartthings ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ปค๋ฒ„ํ•˜์ง€ ๋ชปํ•˜๋Š” Galaxy Home mini์˜ IR ์„ผ์„œ ๋™์ž‘๋“ค์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ๋‹ค.

 

 

Smartthings Extra

 

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ์ž‘ํ•˜๊ธฐ์ „์— ๋ฒค์น˜๋งˆํ‚น ํ•˜๊ธฐ ์ข‹์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

Smartthings Extra๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด์—ˆ๋Š”๋ฐ.

Smartthings ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ OAuth ์ธ์ฆ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ–ˆ๋‹ค.

https://github.com/mik-laj/ha_smartthing_extra

 

GitHub - mik-laj/ha_smartthing_extra

Contribute to mik-laj/ha_smartthing_extra development by creating an account on GitHub.

github.com

 

์ด ๋ฐฉ์‹์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์ง€๋งŒ, ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์—ญ์‹œ deprecated๋œ IR ๋™์ž‘์„ ์ง€์›ํ•˜์ง€ ์•Š์•˜๋‹ค.

๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ฒค์น˜๋งˆํ‚นํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

์ฝ”๋“œ์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋ณด์ž

์•„๋ž˜๋Š” ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ OAuth ํด๋ผ์ด์–ธํŠธ ์ €์žฅ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๋กœ์ง์ด๋‹ค.

st_entry_id: Optional[str] = None
for entry_id in device_entry.config_entries:
    entry = hass.config_entries.async_get_entry(entry_id)
    if entry and entry.domain == ST_DOMAIN and entry.state == ConfigEntryState.LOADED:
        st_entry_id = entry.entry_id
        break
 

 

๊ทธ๋ฆฌ๊ณ  OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ํš๋“ํ•˜๋Š” ๋กœ์ง

entry: ConfigEntry | None = hass.config_entries.async_get_entry(st_entry_id)
if not entry or not entry.runtime_data:
    raise HomeAssistantError("SmartThings entry not available or not loaded.")

client = entry.runtime_data.client
 

 

๋งˆ์ง€๋ง‰์œผ๋กœ, device id์— ๋ช…๋ น ์ „์†ก ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

async def _resolve_st_ids(ha_device_id: str) -> Tuple[str, str]:
    dev_reg = dr.async_get(hass)
    device_entry = dev_reg.async_get(ha_device_id)
    if not device_entry:
        raise HomeAssistantError(f"No HA device found: {ha_device_id}")

    st_device_id: Optional[str] = None
    for domain, ident in device_entry.identifiers:
        if domain == ST_DOMAIN:
            st_device_id = ident
            break

    st_entry_id: Optional[str] = None
    for entry_id in device_entry.config_entries:
        entry = hass.config_entries.async_get_entry(entry_id)
        if entry and entry.domain == ST_DOMAIN and entry.state == ConfigEntryState.LOADED:
            st_entry_id = entry.entry_id
            break

    return st_device_id, st_entry_id
 

 

์ด์ œ ํ•„์š”ํ•œ ๋กœ์ง์€ ํŒŒ์•…ํ–ˆ์œผ๋‹ˆ ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘์„ ํ•ด๋ณด์ž

 

 

ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌํ˜„

 

๋จผ์ € ํ†ตํ•ฉ ์ •๋ณด์ธ manifest.json์„ ๊ตฌํ˜„ํ•˜์ž

ํ•„์š”ํ•œ aiohttp์™€, ๋ช…๋ น ์ „์†ก์„ ์œ„ํ•œ pysmartthings ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๋‹ค.

{
  "domain": "smartthings_ir",
  "name": "SmartThings IR Controller",
  "version": "1.0.0",
  "requirements": ["aiohttp>=3.8.0", "pysmartthings>=0.8.2"],
  "dependencies": [],
  "codeowners": ["@101Sean"],
  "config_flow": true,
  "iot_class": "cloud_polling"
}
 

 

์ง„์ž…์ ์ธ __init__.py, Home Assistant๊ฐ€ ๋กœ๋“œํ• ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.

async_setup_entry ๋ฉ”์†Œ๋“œ๋กœ climate์™€ media_player๋ฅผ ๋กœ๋“œํ•˜๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค. (ํ•„์š”ํ•œ ์•…์„ธ์„œ๋ฆฌ)

PLATFORMS = [Platform.CLIMATE, Platform.MEDIA_PLAYER]

async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    hass.data.setdefault(DOMAIN, {})
    hass.data[DOMAIN][entry.entry_id] = entry.data
    await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
    return True

async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
        hass.data[DOMAIN].pop(entry.entry_id)
    return unload_ok
 

 

์ด์ œ Extra์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  api.py๋ฅผ ๊ตฌํ˜„ํ•˜์ž

๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ OAuth ์ธ์ฆ์„ ์žฌ์‚ฌ์šฉ ํ•˜๊ณ , device_id ๋ณ€ํ™˜๊ณผ capability ๋งคํ•‘์„ ํ•  ๊ฒƒ์ด๋‹ค.

 

device_id๋ฅผ Smartthings UUID๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

๊ธฐ๊ธฐ ์ •๋ณด ์กฐํšŒ > UUID ์ถ”์ถœ > Entry ID๋ฅผ ์ฐพ์•„ ๋ณ€ํ™˜ ํ•˜๋Š” ์ˆœ์„œ์ด๋‹ค.

async def _resolve_st_ids(self, ha_device_id: str) -> Tuple[str, str]:
    dev_reg = dr.async_get(self.hass)
    device_entry = dev_reg.async_get(ha_device_id)
    if not device_entry:
        raise HomeAssistantError(f"No HA device found: {ha_device_id}")

    st_device_id: Optional[str] = None
    for domain, ident in device_entry.identifiers:
        if domain == ST_DOMAIN:
            st_device_id = ident
            break
    if not st_device_id:
        raise HomeAssistantError("Device is not linked to SmartThings.")

    st_entry_id: Optional[str] = None
    for entry_id in device_entry.config_entries:
        entry = self.hass.config_entries.async_get_entry(entry_id)
        if entry and entry.domain == ST_DOMAIN and entry.state == ConfigEntryState.LOADED:
            st_entry_id = entry.entry_id
            break
    if not st_entry_id:
        raise HomeAssistantError("No loaded SmartThings config entry for this device.")

    return st_device_id, st_entry_id
 

 

๋‹ค์Œ์œผ๋กœ๋Š”, ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ OAuth ์ธ์ฆ๋œ API ํด๋ผ์ด์–ธํŠธ๋ฅผ ํš๋“ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

async def _get_client(self, st_entry_id: str):
    entry = self.hass.config_entries.async_get_entry(st_entry_id)
    if not entry or not entry.runtime_data:
        raise HomeAssistantError("SmartThings entry not available or not loaded.")
    return entry.runtime_data.client
 

 

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š”, ์‹ค์ œ Smartthings ๊ธฐ๊ธฐ์— ๋ช…๋ น ์ „์†กํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

special_caps ๋งคํ•‘์œผ๋กœ, deprecated๋œ IR ๋ช…๋ น๋“ค๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.

async def command(
    self,
    ha_device_id: str,
    capability: str,
    command: str,
    arguments: Optional[list] = None,
    component: str = "main",
) -> bool:
    try:
        st_device_id, st_entry_id = await self._resolve_st_ids(ha_device_id)
        client = await self._get_client(st_entry_id)

        special_caps = {
            "STATELESS_AUDIO_VOLUME_BUTTON": "statelessAudioVolumeButton",
            "STATELESS_CHANNEL_BUTTON": "statelessChannelButton",
            "STATELESS_AUDIO_MUTE_BUTTON": "statelessAudioMuteButton",
            "STATELESS_POWER_TOGGLE_BUTTON": "statelessPowerToggleButton",
        }

        upper_input = capability.upper()
        if upper_input in special_caps:
            mapped_capability = special_caps[upper_input]
        else:
            mapped_capability = getattr(Capability, upper_input, capability)

        mapped_command = getattr(Command, command.upper(), command)

        _LOGGER.debug(
            "Command -> device=%s, capability=%s, command=%s, args=%s",
            st_device_id, mapped_capability, mapped_command, arguments
        )

        await client.execute_device_command(
            device_id=st_device_id,
            capability=mapped_capability,
            command=mapped_command,
            component=component,
            argument=arguments or [],
        )

        return True

    except Exception as e:
        _LOGGER.error("Command failed: %s", e)
        return False
 

 

์ด์ œ ์—์–ด์ปจ์„ ์ œ์–ด ํ•  climate.py๋ฅผ ๊ตฌํ˜„ํ•˜์ž.

IR๋กœ ์ œ์–ดํ•˜๋Š” ์—์–ด์ปจ์„ Home Assistant์˜ Climate ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ ํ•  ๊ฒƒ์ด๋‹ค.

https://www.home-assistant.io/integrations/climate/

 

Climate

Instructions on how to set up climate control devices within Home Assistant.

www.home-assistant.io

 

๊ธฐ๋ณธ ๊ธฐ๊ธฐ ์ •๋ณด ์ €์žฅ์„ ํ•  ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ 

class SmartThingsIRClimate(ClimateEntity):
    _attr_temperature_unit = UnitOfTemperature.CELSIUS
    _attr_min_temp = 18
    _attr_max_temp = 30
    _attr_target_temperature_step = 1
    _attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE | ClimateEntityFeature.FAN_MODE
    _attr_hvac_modes = [HVACMode.OFF, HVACMode.COOL, HVACMode.DRY, HVACMode.AUTO]
    _attr_fan_modes = ["low", "medium", "high"]

    def __init__(self, hass, device_id, name):
        self.hass = hass
        self._device_id = device_id
        self._attr_name = name
        self._attr_unique_id = f"smartthings_ir_climate_{device_id}"
        self._attr_target_temperature = 24
        self._attr_hvac_mode = HVACMode.OFF
        self._attr_fan_mode = "medium"
        self._api = SmartThingsIRAPI(hass)
 

 

์—์–ด์ปจ ๋ชจ๋“œ ๋ณ€๊ฒฝ ๋ฉ”์†Œ๋“œ ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์—์–ด์ปจ์˜ ๋ชจ๋“œ(๋ƒ‰๋ฐฉ, ์ œ์Šต, ์ž๋™)๋“ฑ๊ณผ on, off๋ฅผ ๋งคํ•‘

async def async_set_hvac_mode(self, hvac_mode: str) -> None:
    if hvac_mode == HVACMode.OFF:
        await self._send_command("switch", "off")
    else:
        await self._send_command("switch", "on")
        mode_map = {
            HVACMode.COOL: "cool",
            HVACMode.DRY: "dry",
            HVACMode.AUTO: "auto"
        }
        await self._send_command("AIR_CONDITIONER_MODE", "SET_AIR_CONDITIONER_MODE", [mode_map.get(hvac_mode, "cool")])
    self._attr_hvac_mode = hvac_mode
    self.async_write_ha_state()
 

 

๋‹ค์Œ์œผ๋กœ๋Š” ์˜จ๋„ ์„ค์ • ๋ฉ”์†Œ๋“œ

async def async_set_temperature(self, **kwargs) -> None:
    temp = kwargs.get(ATTR_TEMPERATURE)
    if temp is not None:
        self._attr_target_temperature = temp
        await self._send_command("THERMOSTAT_COOLING_SETPOINT", "SET_COOLING_SETPOINT", [temp])
        self.async_write_ha_state()
 

 

๊ทธ๋ฆฌ๊ณ  ํŒฌ ์†๋„ ๋ณ€๊ฒฝ ๋ฉ”์†Œ๋“œ๊นŒ์ง€ ๊ตฌํ˜„ ํ•˜๋ฉด, ๋™์ž‘ ๊ตฌํ˜„์€ ๋์ด๋‹ค.

async def async_set_fan_mode(self, fan_mode: str) -> None:
    self._attr_fan_mode = fan_mode
    await self._send_command("AIR_CONDITIONER_FAN_MODE", "SET_FAN_MODE", [fan_mode])
    self.async_write_ha_state()
 

 

๋งˆ์ง€๋ง‰์œผ๋กœ API ํ˜ธ์ถœ์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ ๊นŒ์ง€ ๊ตฌํ˜„

capability, command, argument๋กœ Smartthings API ๊ทœ์•ฝ์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.

async def _send_command(self, capability, command, arguments=None):
    await self._api.command(
        ha_device_id=self._device_id,
        capability=capability,
        command=command,
        arguments=arguments or [],
    )
 

 

์ด์ œ, TV์™€ Settop์„ ๋งคํ•‘ํ•  media_player.py์ด๋‹ค.

IR๋กœ ์ œ์–ดํ•˜๋Š” ๋‘ ๊ธฐ๊ธฐ๋ฅผ Home Assistant์˜ Media Player ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•  ๊ฒƒ์ด๋‹ค.

https://www.home-assistant.io/integrations/media_player/

 

Media player

Instructions on how to set up your media players with Home Assistant.

www.home-assistant.io

 

์—ญ์‹œ, ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๊ธฐ ์ •๋ณด๋ฅผ ์ €์žฅ ํ•  ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ

ON/OFF์˜ ๊ตฌ๋ถ„์€ ํ•„์š” ์—†์–ด์„œ TURN_ON์€ ์ œ๊ฑฐ ํ–ˆ๋‹ค.

class SmartThingsIRMediaPlayer(MediaPlayerEntity):
    _attr_supported_features = (
        MediaPlayerEntityFeature.TURN_OFF |
        MediaPlayerEntityFeature.VOLUME_STEP |
        MediaPlayerEntityFeature.VOLUME_MUTE |
        MediaPlayerEntityFeature.NEXT_TRACK |
        MediaPlayerEntityFeature.PREVIOUS_TRACK
    )
    _attr_assumed_state = True

    def __init__(self, hass, device_id, name, device_type):
        self.hass = hass
        self._device_id = device_id
        self._attr_name = name
        self._attr_device_class = "tv"
        self._attr_unique_id = f"smartthings_ir_media_player_{device_id}"
        self._attr_state = MediaPlayerState.ON
        self._device_type = device_type
        self._api = SmartThingsIRAPI(hass)
 

 

์ „์› ํ† ๊ธ€์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ 

async def async_turn_off(self):
    await self._send_command("STATELESS_POWER_TOGGLE_BUTTON", "SET_BUTTON", ["powerToggle"])
    self._attr_state = MediaPlayerState.ON
    self.async_write_ha_state()
 

 

๋ณผ๋ฅจ ์กฐ์ ˆ๋„ ๊ตฌํ˜„

async def async_volume_up(self):
    await self._send_command("STATELESS_AUDIO_VOLUME_BUTTON", "SET_BUTTON", ["volumeUp"])

async def async_volume_down(self):
    await self._send_command("STATELESS_AUDIO_VOLUME_BUTTON", "SET_BUTTON", ["volumeDown"])
 

 

์ฑ„๋„ ๋ณ€๊ฒฝ์€, Media Player์˜ ํŠธ๋ž™ ๋ณ€๊ฒฝ์—๋‹ค๊ฐ€ ๋งคํ•‘์„ ํ•ด์ฃผ์—ˆ๋‹ค.

async def async_media_next_track(self):
    await self._send_command("STATELESS_CHANNEL_BUTTON", "SET_BUTTON", ["channelUp"])

async def async_media_previous_track(self):
    await self._send_command("STATELESS_CHANNEL_BUTTON", "SET_BUTTON", ["channelDown"])
 

 

๋™์ผํ•˜๊ฒŒ ์‹ค์ œ API๋กœ ์ „์†กํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊นŒ์ง€ ๊ตฌํ˜„ ์™„๋ฃŒ

async def _send_command(self, capability, command, arguments=None):
    await self._api.command(
        ha_device_id=self._device_id,
        capability=capability,
        command=command,
        arguments=arguments or [],
    )
 

 

์ด์ œ device_id๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์–ด๋–ค id๋ฅผ ์‚ฌ์šฉ์ค‘์ธ์ง€ ์ง์ ‘ ์•Œ ์ˆ˜ ์—†์–ด์„œ

extra ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ฐฉ์‹์„ ์ฐฉ์•ˆํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋ ค๊ณ  ํ•œ๋‹ค.

 

services.py ์ƒ์„ฑ ํ›„, ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๊ธฐ ์„ ํƒ๊ณผ, UUID ๋ณ€ํ™˜/ํ™•์ธ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

async def async_register_services(hass: HomeAssistant) -> None:
    
    async def handle_show_device_id(call: ServiceCall) -> None:
        ha_device_id = call.data.get("device_id")
        
        if not ha_device_id:
            raise HomeAssistantError("device_id is required")
        
        api = SmartThingsIRAPI(hass)
        st_device_id, st_entry_id = await api._resolve_st_ids(ha_device_id)
    
    hass.services.async_register(DOMAIN, "show_device_id", handle_show_device_id)


async def async_unregister_services(hass: HomeAssistant) -> None:
    hass.services.async_remove(DOMAIN, "show_device_id")
 

 

๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค ํ‹€๊นŒ์ง€ ์ •์˜ ํ•˜๋ฉด ๋

show_device_id:
  name: Show Device UUID
  description: Display the SmartThings UUID for a selected device
  fields:
    device_id:
      name: Device
      description: Select a SmartThings device
      required: true
      selector:
        device:
          filter:
            - integration: smartthings
 

 

๋งˆ์ง€๋ง‰์œผ๋กœ config_flow.py๋ฅผ ๊ตฌํ˜„ํ•ด์„œ,

ํ†ตํ•ฉ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋‚˜์˜ค๋Š” ์„ค์ • ํ™”๋ฉด๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋‹ค. (์ฝ”๋“œ์ƒ๋žต)

https://github.com/101Sean/hass_smartthings_ir

 

 

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก

 

์ด์ œ ์™„์„ฑ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ HACS๋ฅผ ํ†ตํ•ด ์ €์žฅ์†Œ ์ถ”๊ฐ€๋ฅผ ํ•ด๋ณด์ž

 

HACS > ์šฐ์ธก ์ƒ๋‹จ ๋ฉ”๋‰ด > Custom repositories ๋ฉ”๋‰ด ์„ ํƒ

Repository ์ถ”๊ฐ€์™€ ํƒ€์ž…์€ ํ†ตํ•ฉ์œผ๋กœ ์ถ”๊ฐ€

 

์ถ”๊ฐ€ ํ›„, ํ†ตํ•ฉ๊ตฌ์„ฑ์š”์†Œ์—์„œ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋“ฑ๋กํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

 

์ด์ œ ์„ค์ • > ๊ฐœ๋ฐœ์ž ๋„๊ตฌ > ๋™์ž‘

services.py์—์„œ ๊ตฌํ˜„ํ•œ show_device_id ์„ ํƒ

 

๊ธฐ๊ธฐ ์„ ํƒ ํ›„, YAML ๋ชจ๋“œ๋ฅผ ํด๋ฆญํ•˜๋ฉด device_id๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ๊ธฐ๊ธฐ ์ถ”๊ฐ€์— device_id๋ฅผ ๋„ฃ๊ณ  ๋“ฑ๋กํ•˜๋ฉด ๋

 

์‚ฌ์šฉ์ค‘์ธ ๋””๋ฐ”์ด์Šค 3๊ฐœ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋“ฑ๋ก ํ–ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋Œ€์‹œ๋ณด๋“œ์— ํƒ€์ผ๋กœ ์ถ”๊ฐ€ ์™„๋ฃŒ

 

 

์ด์ œ Home Assistant์—์„œ๋„ Smartthings์˜ ๋ชจ๋“  ๋™์ž‘์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฐจ๊ทผ์ฐจ๊ทผ Homebridge์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์˜ฎ๊ธฐ๋ฉด์„œ ์˜์กด๋„๋ฅผ ์ค„์—ฌ ๋‚˜๊ฐ€๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

 

์›๋ณธ ๊ฒŒ์‹œ๊ธ€

https://blog.naver.com/101artspace/224331267850

 

[Python] Home Assistant Smarthings IR ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘

์ €๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ Home Assistant ๊ธฐ๋ณธ ๊ตฌ์ถ•๊ณผ ๋”๋ถˆ์–ด, ๊ธฐ๋ณธ์ ์ธ ๋Œ€์‹œ๋ณด๋“œ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋‹ค. ์ด๋ฒˆ์—”, Sma...

blog.naver.com

๋ฐ˜์‘ํ˜•

'IoT ๐Ÿ  > HomeAssistant' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Home Assistant ๊ตฌ์ถ• ๋ฐ ๊ธฐ๊ธฐ ์—ฐ๋™  (0) 2026.07.07