Generic Platform Discovery

New controller or hub components often need to add platforms in sub-components (i.e. Lights & Switches) without additional configuration. This can be achieved using the homeassistant.components.discovery.load_platform method:

def load_platform(hass, component, platform, info=None, hass_config=None)

From more info on how this works, refer to the load_platform method.


Say you need to implement your new MyFlashyHub that controls both Switches & Lights, you can follow these steps:

Configuration required for your new hub component:

   example: setting

The source for your component can be located in your configuration directory for now:


In the hub component you can call your light and switch components. To pass any non-serializable information to the platforms in the sub-component, you can use a global variable.

from homeassistant.components.discovery import load_platform
DOMAIN = 'myflashyhub'


def setup(hass, config):
    """Your controller/hub specific code."""
    global MFH_GLOBAL
    if MFH_GLOBAL is None:
        MFH_GLOBAL = SomeObjectToInitialiseGlobal
    #--- snip ---
    load_platform(hass, 'light', DOMAIN)
    load_platform(hass, 'switch', DOMAIN, {'optional': 'arguments'})

Add your custom device specific code to the setup_platform method in light/ and switch/myflashyhub.

import homeassistant.components.myflashyhub as myflashyhub

# 'switch' will receive discovery_info={'optional': 'arguments'} 
# as passed in above. 'light' will receive discovery_info=None
def setup_platform(hass, config, add_devices, discovery_info=None):
    """Your switch/light specific code."""
    # You can now use myflashyhub.MFH_GLOBAL

The load_platform method allows the platforms to be loaded with the need for any additional platform entries in your configuration.yaml file, which normally would have been:

#  platform: myflashyhub
#  platform: myflashyhub

In the past, this was achieved by adding your component to the DISCOVERY_PLATFORMS in the target sub-component. Generic discovery through load_platform() allows you to load any sub-component, including custom components, without changing the sub-component.