diff --git a/homeassistant/components/3_day_blinds/manifest.json b/homeassistant/components/3_day_blinds/manifest.json new file mode 100644 index 00000000000..5baf52cfac9 --- /dev/null +++ b/homeassistant/components/3_day_blinds/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "3_day_blinds", + "name": "3 Day Blinds", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/amp_motorization/manifest.json b/homeassistant/components/amp_motorization/manifest.json new file mode 100644 index 00000000000..c8f6f935a24 --- /dev/null +++ b/homeassistant/components/amp_motorization/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "amp_motorization", + "name": "AMP Motorization", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/august_ble/manifest.json b/homeassistant/components/august_ble/manifest.json new file mode 100644 index 00000000000..882759b1209 --- /dev/null +++ b/homeassistant/components/august_ble/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "august_ble", + "name": "August Bluetooth", + "integration_type": "virtual", + "supported_by": "yalexs_ble" +} diff --git a/homeassistant/components/bliss_automation/manifest.json b/homeassistant/components/bliss_automation/manifest.json new file mode 100644 index 00000000000..ca0ae5c7fdf --- /dev/null +++ b/homeassistant/components/bliss_automation/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "bliss_automation", + "name": "Bliss Automation", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/bloc_blinds/manifest.json b/homeassistant/components/bloc_blinds/manifest.json new file mode 100644 index 00000000000..a0e318e2b2f --- /dev/null +++ b/homeassistant/components/bloc_blinds/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "bloc_blinds", + "name": "Bloc Blinds", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/brel_home/manifest.json b/homeassistant/components/brel_home/manifest.json new file mode 100644 index 00000000000..02e06705de8 --- /dev/null +++ b/homeassistant/components/brel_home/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "brel_home", + "name": "Brel Home", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/bswitch/manifest.json b/homeassistant/components/bswitch/manifest.json new file mode 100644 index 00000000000..62c6efb5bcb --- /dev/null +++ b/homeassistant/components/bswitch/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "bswitch", + "name": "BSwitch", + "integration_type": "virtual", + "supported_by": "switchbee" +} diff --git a/homeassistant/components/bticino/manifest.json b/homeassistant/components/bticino/manifest.json new file mode 100644 index 00000000000..39b618ad49b --- /dev/null +++ b/homeassistant/components/bticino/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "bticino", + "name": "BTicino", + "integration_type": "virtual", + "supported_by": "netatmo" +} diff --git a/homeassistant/components/bubendorff/manifest.json b/homeassistant/components/bubendorff/manifest.json new file mode 100644 index 00000000000..599dace5236 --- /dev/null +++ b/homeassistant/components/bubendorff/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "bubendorff", + "name": "Bubendorff", + "integration_type": "virtual", + "supported_by": "netatmo" +} diff --git a/homeassistant/components/cozytouch/manifest.json b/homeassistant/components/cozytouch/manifest.json new file mode 100644 index 00000000000..83b76211be0 --- /dev/null +++ b/homeassistant/components/cozytouch/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "cozytouch", + "name": "Atlantic Cozytouch", + "integration_type": "virtual", + "supported_by": "overkiz" +} diff --git a/homeassistant/components/dacia/manifest.json b/homeassistant/components/dacia/manifest.json new file mode 100644 index 00000000000..d637d7cc1e4 --- /dev/null +++ b/homeassistant/components/dacia/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "dacia", + "name": "Dacia", + "integration_type": "virtual", + "supported_by": "renault" +} diff --git a/homeassistant/components/denonavr/manifest.json b/homeassistant/components/denonavr/manifest.json index b43dbe3acb7..bb6e59053fb 100644 --- a/homeassistant/components/denonavr/manifest.json +++ b/homeassistant/components/denonavr/manifest.json @@ -56,8 +56,5 @@ } ], "iot_class": "local_polling", - "loggers": ["denonavr"], - "supported_brands": { - "marantz": "Marantz" - } + "loggers": ["denonavr"] } diff --git a/homeassistant/components/diaz/manifest.json b/homeassistant/components/diaz/manifest.json new file mode 100644 index 00000000000..50a8d865798 --- /dev/null +++ b/homeassistant/components/diaz/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "diaz", + "name": "Diaz", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/digital_loggers/manifest.json b/homeassistant/components/digital_loggers/manifest.json new file mode 100644 index 00000000000..b9d0e24c340 --- /dev/null +++ b/homeassistant/components/digital_loggers/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "digital_loggers", + "name": "Digital Loggers", + "integration_type": "virtual", + "supported_by": "wemo" +} diff --git a/homeassistant/components/dooya/manifest.json b/homeassistant/components/dooya/manifest.json new file mode 100644 index 00000000000..aa05d5b5475 --- /dev/null +++ b/homeassistant/components/dooya/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "dooya", + "name": "Dooya", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/flexom/manifest.json b/homeassistant/components/flexom/manifest.json new file mode 100644 index 00000000000..9242a48af48 --- /dev/null +++ b/homeassistant/components/flexom/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "flexom", + "name": "Bouygues Flexom", + "integration_type": "virtual", + "supported_by": "overkiz" +} diff --git a/homeassistant/components/gaviota/manifest.json b/homeassistant/components/gaviota/manifest.json new file mode 100644 index 00000000000..2581f3a505e --- /dev/null +++ b/homeassistant/components/gaviota/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "gaviota", + "name": "Gaviota", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/gree/manifest.json b/homeassistant/components/gree/manifest.json index 06b8b109175..97c0ec1780c 100644 --- a/homeassistant/components/gree/manifest.json +++ b/homeassistant/components/gree/manifest.json @@ -7,8 +7,5 @@ "dependencies": ["network"], "codeowners": ["@cmroche"], "iot_class": "local_polling", - "loggers": ["greeclimate"], - "supported_brands": { - "heiwa": "Heiwa" - } + "loggers": ["greeclimate"] } diff --git a/homeassistant/components/havana_shade/manifest.json b/homeassistant/components/havana_shade/manifest.json new file mode 100644 index 00000000000..e9499712bf7 --- /dev/null +++ b/homeassistant/components/havana_shade/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "havana_shade", + "name": "Havana Shade", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/heiwa/manifest.json b/homeassistant/components/heiwa/manifest.json new file mode 100644 index 00000000000..950578a82c0 --- /dev/null +++ b/homeassistant/components/heiwa/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "heiwa", + "name": "Heiwa", + "integration_type": "virtual", + "supported_by": "gree" +} diff --git a/homeassistant/components/hi_kumo/manifest.json b/homeassistant/components/hi_kumo/manifest.json new file mode 100644 index 00000000000..6b976b4574f --- /dev/null +++ b/homeassistant/components/hi_kumo/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "hi_kumo", + "name": "Hitachi Hi Kumo", + "integration_type": "virtual", + "supported_by": "overkiz" +} diff --git a/homeassistant/components/hunterdouglas_powerview/manifest.json b/homeassistant/components/hunterdouglas_powerview/manifest.json index 9eb3019984e..15b10dca0e0 100644 --- a/homeassistant/components/hunterdouglas_powerview/manifest.json +++ b/homeassistant/components/hunterdouglas_powerview/manifest.json @@ -17,8 +17,5 @@ ], "zeroconf": ["_powerview._tcp.local."], "iot_class": "local_polling", - "loggers": ["aiopvapi"], - "supported_brands": { - "luxaflex": "Luxaflex" - } + "loggers": ["aiopvapi"] } diff --git a/homeassistant/components/hurrican_shutters_wholesale/manifest.json b/homeassistant/components/hurrican_shutters_wholesale/manifest.json new file mode 100644 index 00000000000..1fb5bc5600d --- /dev/null +++ b/homeassistant/components/hurrican_shutters_wholesale/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "hurrican_shutters_wholesale", + "name": "Hurrican Shutters Wholesale", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/inkbird/manifest.json b/homeassistant/components/inkbird/manifest.json index e8076576f6e..97234de9d6d 100644 --- a/homeassistant/components/inkbird/manifest.json +++ b/homeassistant/components/inkbird/manifest.json @@ -13,8 +13,5 @@ "requirements": ["inkbird-ble==0.5.5"], "dependencies": ["bluetooth"], "codeowners": ["@bdraco"], - "iot_class": "local_push", - "supported_brands": { - "nutrichef": "Nutrichef" - } + "iot_class": "local_push" } diff --git a/homeassistant/components/inspired_shades/manifest.json b/homeassistant/components/inspired_shades/manifest.json new file mode 100644 index 00000000000..5c8f3bdc10b --- /dev/null +++ b/homeassistant/components/inspired_shades/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "inspired_shades", + "name": "Inspired Shades", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/ismartwindow/manifest.json b/homeassistant/components/ismartwindow/manifest.json new file mode 100644 index 00000000000..1e2ca875007 --- /dev/null +++ b/homeassistant/components/ismartwindow/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "ismartwindow", + "name": "iSmartWindow", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/legrand/manifest.json b/homeassistant/components/legrand/manifest.json new file mode 100644 index 00000000000..1437622e632 --- /dev/null +++ b/homeassistant/components/legrand/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "legrand", + "name": "Legrand", + "integration_type": "virtual", + "supported_by": "netatmo" +} diff --git a/homeassistant/components/luxaflex/manifest.json b/homeassistant/components/luxaflex/manifest.json new file mode 100644 index 00000000000..57c552c616a --- /dev/null +++ b/homeassistant/components/luxaflex/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "luxaflex", + "name": "Luxaflex", + "integration_type": "virtual", + "supported_by": "hunterdouglas_powerview" +} diff --git a/homeassistant/components/marantz/manifest.json b/homeassistant/components/marantz/manifest.json new file mode 100644 index 00000000000..00a9b0675ec --- /dev/null +++ b/homeassistant/components/marantz/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "marantz", + "name": "Marantz", + "integration_type": "virtual", + "supported_by": "denonavr" +} diff --git a/homeassistant/components/martec/manifest.json b/homeassistant/components/martec/manifest.json new file mode 100644 index 00000000000..67402e4722a --- /dev/null +++ b/homeassistant/components/martec/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "martec", + "name": "Martec", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/motion_blinds/manifest.json b/homeassistant/components/motion_blinds/manifest.json index 16f87dcf2ff..6d80d31a69d 100644 --- a/homeassistant/components/motion_blinds/manifest.json +++ b/homeassistant/components/motion_blinds/manifest.json @@ -19,25 +19,5 @@ ], "codeowners": ["@starkillerOG"], "iot_class": "local_push", - "loggers": ["motionblinds"], - "supported_brands": { - "amp_motorization": "AMP Motorization", - "bliss_automation": "Bliss Automation", - "bloc_blinds": "Bloc Blinds", - "brel_home": "Brel Home", - "3_day_blinds": "3 Day Blinds", - "diaz": "Diaz", - "dooya": "Dooya", - "gaviota": "Gaviota", - "havana_shade": "Havana Shade", - "hurrican_shutters_wholesale": "Hurrican Shutters Wholesale", - "inspired_shades": "Inspired Shades", - "ismartwindow": "iSmartWindow", - "martec": "Martec", - "raven_rock_mfg": "Raven Rock MFG", - "screenaway": "ScreenAway", - "smart_blinds": "Smart Blinds", - "smart_home": "Smart Home", - "uprise_smart_shades": "Uprise Smart Shades" - } + "loggers": ["motionblinds"] } diff --git a/homeassistant/components/netatmo/manifest.json b/homeassistant/components/netatmo/manifest.json index 28a4bad2dc5..5ad0fca3d7a 100644 --- a/homeassistant/components/netatmo/manifest.json +++ b/homeassistant/components/netatmo/manifest.json @@ -11,11 +11,5 @@ "models": ["Healty Home Coach", "Netatmo Relay", "Presence", "Welcome"] }, "iot_class": "cloud_polling", - "loggers": ["pyatmo"], - "supported_brands": { - "legrand": "Legrand", - "bubendorff": "Bubendorff", - "smarther": "Smarther", - "bticino": "BTicino" - } + "loggers": ["pyatmo"] } diff --git a/homeassistant/components/nexity/manifest.json b/homeassistant/components/nexity/manifest.json new file mode 100644 index 00000000000..31275f80eb4 --- /dev/null +++ b/homeassistant/components/nexity/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "nexity", + "name": "Nexity Eugénie", + "integration_type": "virtual", + "supported_by": "overkiz" +} diff --git a/homeassistant/components/nutrichef/manifest.json b/homeassistant/components/nutrichef/manifest.json new file mode 100644 index 00000000000..4d81d488123 --- /dev/null +++ b/homeassistant/components/nutrichef/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "nutrichef", + "name": "Nutrichef", + "integration_type": "virtual", + "supported_by": "inkbird" +} diff --git a/homeassistant/components/overkiz/manifest.json b/homeassistant/components/overkiz/manifest.json index 480b0b1d9ed..f09142c86f0 100644 --- a/homeassistant/components/overkiz/manifest.json +++ b/homeassistant/components/overkiz/manifest.json @@ -18,13 +18,5 @@ ], "codeowners": ["@imicknl", "@vlebourl", "@tetienne"], "iot_class": "cloud_polling", - "loggers": ["boto3", "botocore", "pyhumps", "pyoverkiz", "s3transfer"], - "supported_brands": { - "cozytouch": "Atlantic Cozytouch", - "flexom": "Bouygues Flexom", - "hi_kumo": "Hitachi Hi Kumo", - "nexity": "Nexity Eugénie", - "rexel": "Rexel Energeasy Connect", - "somfy": "Somfy" - } + "loggers": ["boto3", "botocore", "pyhumps", "pyoverkiz", "s3transfer"] } diff --git a/homeassistant/components/pcs_lighting/manifest.json b/homeassistant/components/pcs_lighting/manifest.json new file mode 100644 index 00000000000..3655032e270 --- /dev/null +++ b/homeassistant/components/pcs_lighting/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "pcs_lighting", + "name": "PCS Lighting", + "integration_type": "virtual", + "supported_by": "upb" +} diff --git a/homeassistant/components/raven_rock_mfg/manifest.json b/homeassistant/components/raven_rock_mfg/manifest.json new file mode 100644 index 00000000000..75085094888 --- /dev/null +++ b/homeassistant/components/raven_rock_mfg/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "raven_rock_mfg", + "name": "Raven Rock MFG", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/renault/manifest.json b/homeassistant/components/renault/manifest.json index 33dc8c3dc8d..5b2fc146e92 100644 --- a/homeassistant/components/renault/manifest.json +++ b/homeassistant/components/renault/manifest.json @@ -6,6 +6,5 @@ "requirements": ["renault-api==0.1.11"], "codeowners": ["@epenet"], "iot_class": "cloud_polling", - "loggers": ["renault_api"], - "supported_brands": { "dacia": "Dacia" } + "loggers": ["renault_api"] } diff --git a/homeassistant/components/rexel/manifest.json b/homeassistant/components/rexel/manifest.json new file mode 100644 index 00000000000..f3bfcf55c35 --- /dev/null +++ b/homeassistant/components/rexel/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "rexel", + "name": "Rexel Energeasy Connect", + "integration_type": "virtual", + "supported_by": "overkiz" +} diff --git a/homeassistant/components/roborock/manifest.json b/homeassistant/components/roborock/manifest.json new file mode 100644 index 00000000000..00f90271cfe --- /dev/null +++ b/homeassistant/components/roborock/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "roborock", + "name": "Roborock", + "integration_type": "virtual", + "supported_by": "xiaomi_miio" +} diff --git a/homeassistant/components/screenaway/manifest.json b/homeassistant/components/screenaway/manifest.json new file mode 100644 index 00000000000..b48e9348f48 --- /dev/null +++ b/homeassistant/components/screenaway/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "screenaway", + "name": "ScreenAway", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/sensorblue/manifest.json b/homeassistant/components/sensorblue/manifest.json new file mode 100644 index 00000000000..d74abde6fdb --- /dev/null +++ b/homeassistant/components/sensorblue/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "sensorblue", + "name": "SensorBlue", + "integration_type": "virtual", + "supported_by": "thermobeacon" +} diff --git a/homeassistant/components/simply_automated/manifest.json b/homeassistant/components/simply_automated/manifest.json new file mode 100644 index 00000000000..3fce8ae27c3 --- /dev/null +++ b/homeassistant/components/simply_automated/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "simply_automated", + "name": "Simply Automated", + "integration_type": "virtual", + "supported_by": "upb" +} diff --git a/homeassistant/components/smart_blinds/manifest.json b/homeassistant/components/smart_blinds/manifest.json new file mode 100644 index 00000000000..d0ddb30c5ee --- /dev/null +++ b/homeassistant/components/smart_blinds/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "smart_blinds", + "name": "Smart Blinds", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/smart_home/manifest.json b/homeassistant/components/smart_home/manifest.json new file mode 100644 index 00000000000..7e420fb5404 --- /dev/null +++ b/homeassistant/components/smart_home/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "smart_home", + "name": "Smart Home", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/smarther/manifest.json b/homeassistant/components/smarther/manifest.json new file mode 100644 index 00000000000..6e87dd866fe --- /dev/null +++ b/homeassistant/components/smarther/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "smarther", + "name": "Smarther", + "integration_type": "virtual", + "supported_by": "netatmo" +} diff --git a/homeassistant/components/somfy/manifest.json b/homeassistant/components/somfy/manifest.json new file mode 100644 index 00000000000..3090eb7b120 --- /dev/null +++ b/homeassistant/components/somfy/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "somfy", + "name": "Somfy", + "integration_type": "virtual", + "supported_by": "overkiz" +} diff --git a/homeassistant/components/switchbee/manifest.json b/homeassistant/components/switchbee/manifest.json index 5ca066e3bc0..75e5b2e9bfd 100644 --- a/homeassistant/components/switchbee/manifest.json +++ b/homeassistant/components/switchbee/manifest.json @@ -5,8 +5,5 @@ "documentation": "https://www.home-assistant.io/integrations/switchbee", "requirements": ["pyswitchbee==1.5.5"], "codeowners": ["@jafar-atili"], - "iot_class": "local_polling", - "supported_brands": { - "bswitch": "BSwitch" - } + "iot_class": "local_polling" } diff --git a/homeassistant/components/thermobeacon/manifest.json b/homeassistant/components/thermobeacon/manifest.json index 639d2362026..34321a66681 100644 --- a/homeassistant/components/thermobeacon/manifest.json +++ b/homeassistant/components/thermobeacon/manifest.json @@ -27,9 +27,5 @@ "requirements": ["thermobeacon-ble==0.3.2"], "dependencies": ["bluetooth"], "codeowners": ["@bdraco"], - "iot_class": "local_push", - "supported_brands": { - "thermoplus": "ThermoPlus", - "sensorblue": "SensorBlue" - } + "iot_class": "local_push" } diff --git a/homeassistant/components/thermoplus/manifest.json b/homeassistant/components/thermoplus/manifest.json new file mode 100644 index 00000000000..512cf216c05 --- /dev/null +++ b/homeassistant/components/thermoplus/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "thermoplus", + "name": "ThermoPlus", + "integration_type": "virtual", + "supported_by": "thermobeacon" +} diff --git a/homeassistant/components/upb/manifest.json b/homeassistant/components/upb/manifest.json index aaa26bfdd66..fd5d68e577f 100644 --- a/homeassistant/components/upb/manifest.json +++ b/homeassistant/components/upb/manifest.json @@ -6,9 +6,5 @@ "codeowners": ["@gwww"], "config_flow": true, "iot_class": "local_push", - "loggers": ["upb_lib"], - "supported_brands": { - "pcs_lighting": "PCS Lighting", - "simply_automated": "Simply Automated" - } + "loggers": ["upb_lib"] } diff --git a/homeassistant/components/uprise_smart_shades/manifest.json b/homeassistant/components/uprise_smart_shades/manifest.json new file mode 100644 index 00000000000..a0ddc2bfb2f --- /dev/null +++ b/homeassistant/components/uprise_smart_shades/manifest.json @@ -0,0 +1,6 @@ +{ + "domain": "uprise_smart_shades", + "name": "Uprise Smart Shades", + "integration_type": "virtual", + "supported_by": "motion_blinds" +} diff --git a/homeassistant/components/websocket_api/commands.py b/homeassistant/components/websocket_api/commands.py index 68dbffa7440..19ec505e449 100644 --- a/homeassistant/components/websocket_api/commands.py +++ b/homeassistant/components/websocket_api/commands.py @@ -21,7 +21,6 @@ from homeassistant.exceptions import ( TemplateError, Unauthorized, ) -from homeassistant.generated import supported_brands from homeassistant.helpers import config_validation as cv, entity, template from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.event import ( @@ -74,7 +73,6 @@ def async_register_commands( async_reg(hass, handle_unsubscribe_events) async_reg(hass, handle_validate_config) async_reg(hass, handle_subscribe_entities) - async_reg(hass, handle_supported_brands) async_reg(hass, handle_supported_features) async_reg(hass, handle_integration_descriptions) @@ -705,31 +703,6 @@ async def handle_validate_config( connection.send_result(msg["id"], result) -@decorators.websocket_command( - { - vol.Required("type"): "supported_brands", - } -) -@decorators.async_response -async def handle_supported_brands( - hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] -) -> None: - """Handle supported brands command.""" - data = {} - - ints_or_excs = await async_get_integrations( - hass, supported_brands.HAS_SUPPORTED_BRANDS - ) - for int_or_exc in ints_or_excs.values(): - if isinstance(int_or_exc, Exception): - raise int_or_exc - # Happens if a custom component without supported brands overrides a built-in one with supported brands - if "supported_brands" not in int_or_exc.manifest: - continue - data[int_or_exc.domain] = int_or_exc.manifest["supported_brands"] - connection.send_result(msg["id"], data) - - @callback @decorators.websocket_command( { diff --git a/homeassistant/components/wemo/manifest.json b/homeassistant/components/wemo/manifest.json index 5486a192787..b324ba060ea 100644 --- a/homeassistant/components/wemo/manifest.json +++ b/homeassistant/components/wemo/manifest.json @@ -14,8 +14,5 @@ }, "codeowners": ["@esev"], "iot_class": "local_push", - "loggers": ["pywemo"], - "supported_brands": { - "digital_loggers": "Digital Loggers" - } + "loggers": ["pywemo"] } diff --git a/homeassistant/components/xiaomi_miio/manifest.json b/homeassistant/components/xiaomi_miio/manifest.json index c84c6edc2e8..0f1a9dd92aa 100644 --- a/homeassistant/components/xiaomi_miio/manifest.json +++ b/homeassistant/components/xiaomi_miio/manifest.json @@ -7,8 +7,5 @@ "codeowners": ["@rytilahti", "@syssi", "@starkillerOG", "@bieniu"], "zeroconf": ["_miio._udp.local."], "iot_class": "local_polling", - "loggers": ["micloud", "miio"], - "supported_brands": { - "roborock": "Roborock" - } + "loggers": ["micloud", "miio"] } diff --git a/homeassistant/components/yalexs_ble/manifest.json b/homeassistant/components/yalexs_ble/manifest.json index 54638478dd5..7bc8bde5b30 100644 --- a/homeassistant/components/yalexs_ble/manifest.json +++ b/homeassistant/components/yalexs_ble/manifest.json @@ -12,8 +12,5 @@ "service_uuid": "0000fe24-0000-1000-8000-00805f9b34fb" } ], - "iot_class": "local_push", - "supported_brands": { - "august_ble": "August Bluetooth" - } + "iot_class": "local_push" } diff --git a/homeassistant/generated/integrations.json b/homeassistant/generated/integrations.json index 019529a94f0..866ad2a54ed 100644 --- a/homeassistant/generated/integrations.json +++ b/homeassistant/generated/integrations.json @@ -1,88 +1,93 @@ { "integration": { + "3_day_blinds": { + "name": "3 Day Blinds", + "integration_type": "virtual", + "supported_by": "motion_blinds" + }, "abode": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Abode", "integration_type": "hub", - "name": "Abode" + "config_flow": true, + "iot_class": "cloud_push" }, "accuweather": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "AccuWeather", "integration_type": "hub", - "name": "AccuWeather" + "config_flow": true, + "iot_class": "cloud_polling" }, "acer_projector": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Acer Projector", "integration_type": "hub", - "name": "Acer Projector" + "config_flow": false, + "iot_class": "local_polling" }, "acmeda": { - "config_flow": true, - "iot_class": "local_push", + "name": "Rollease Acmeda Automate", "integration_type": "hub", - "name": "Rollease Acmeda Automate" + "config_flow": true, + "iot_class": "local_push" }, "actiontec": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Actiontec", "integration_type": "hub", - "name": "Actiontec" + "config_flow": false, + "iot_class": "local_polling" }, "adax": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Adax", "integration_type": "hub", - "name": "Adax" + "config_flow": true, + "iot_class": "local_polling" }, "adguard": { - "config_flow": true, - "iot_class": "local_polling", + "name": "AdGuard Home", "integration_type": "service", - "name": "AdGuard Home" + "config_flow": true, + "iot_class": "local_polling" }, "ads": { - "config_flow": false, - "iot_class": "local_push", + "name": "ADS", "integration_type": "hub", - "name": "ADS" + "config_flow": false, + "iot_class": "local_push" }, "advantage_air": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Advantage Air", "integration_type": "hub", - "name": "Advantage Air" + "config_flow": true, + "iot_class": "local_polling" }, "aemet": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "AEMET OpenData", "integration_type": "hub", - "name": "AEMET OpenData" + "config_flow": true, + "iot_class": "cloud_polling" }, "aftership": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "AfterShip", "integration_type": "hub", - "name": "AfterShip" + "config_flow": false, + "iot_class": "cloud_polling" }, "agent_dvr": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Agent DVR", "integration_type": "hub", - "name": "Agent DVR" + "config_flow": true, + "iot_class": "local_polling" }, "airly": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Airly", "integration_type": "hub", - "name": "Airly" + "config_flow": true, + "iot_class": "cloud_polling" }, "airnow": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "AirNow", "integration_type": "hub", - "name": "AirNow" + "config_flow": true, + "iot_class": "cloud_polling" }, "airthings": { "name": "Airthings", @@ -102,52 +107,52 @@ } }, "airtouch4": { - "config_flow": true, - "iot_class": "local_polling", + "name": "AirTouch 4", "integration_type": "hub", - "name": "AirTouch 4" + "config_flow": true, + "iot_class": "local_polling" }, "airvisual": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "AirVisual", "integration_type": "hub", - "name": "AirVisual" + "config_flow": true, + "iot_class": "cloud_polling" }, "airzone": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Airzone", "integration_type": "hub", - "name": "Airzone" + "config_flow": true, + "iot_class": "local_polling" }, "aladdin_connect": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Aladdin Connect", "integration_type": "hub", - "name": "Aladdin Connect" + "config_flow": true, + "iot_class": "cloud_polling" }, "alarmdecoder": { - "config_flow": true, - "iot_class": "local_push", + "name": "AlarmDecoder", "integration_type": "hub", - "name": "AlarmDecoder" + "config_flow": true, + "iot_class": "local_push" }, "alert": { - "config_flow": false, - "iot_class": "local_push", + "name": "Alert", "integration_type": "hub", - "name": "Alert" + "config_flow": false, + "iot_class": "local_push" }, "almond": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Almond", "integration_type": "hub", - "name": "Almond" + "config_flow": true, + "iot_class": "local_polling" }, "alpha_vantage": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Alpha Vantage", "integration_type": "hub", - "name": "Alpha Vantage" + "config_flow": false, + "iot_class": "cloud_polling" }, "amazon": { "name": "Amazon", @@ -179,70 +184,75 @@ } }, "amberelectric": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Amber Electric", "integration_type": "hub", - "name": "Amber Electric" + "config_flow": true, + "iot_class": "cloud_polling" }, "ambiclimate": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Ambiclimate", "integration_type": "hub", - "name": "Ambiclimate" + "config_flow": true, + "iot_class": "cloud_polling" }, "ambient_station": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Ambient Weather Station", "integration_type": "hub", - "name": "Ambient Weather Station" + "config_flow": true, + "iot_class": "cloud_push" }, "amcrest": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Amcrest", "integration_type": "hub", - "name": "Amcrest" + "config_flow": false, + "iot_class": "local_polling" + }, + "amp_motorization": { + "name": "AMP Motorization", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "ampio": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Ampio Smart Smog System", "integration_type": "hub", - "name": "Ampio Smart Smog System" + "config_flow": false, + "iot_class": "cloud_polling" }, "android_ip_webcam": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Android IP Webcam", "integration_type": "hub", - "name": "Android IP Webcam" + "config_flow": true, + "iot_class": "local_polling" }, "androidtv": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Android TV", "integration_type": "hub", - "name": "Android TV" + "config_flow": true, + "iot_class": "local_polling" }, "anel_pwrctrl": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Anel NET-PwrCtrl", "integration_type": "hub", - "name": "Anel NET-PwrCtrl" + "config_flow": false, + "iot_class": "local_polling" }, "anthemav": { - "config_flow": true, - "iot_class": "local_push", + "name": "Anthem A/V Receivers", "integration_type": "hub", - "name": "Anthem A/V Receivers" + "config_flow": true, + "iot_class": "local_push" }, "apache_kafka": { - "config_flow": false, - "iot_class": "local_push", + "name": "Apache Kafka", "integration_type": "hub", - "name": "Apache Kafka" + "config_flow": false, + "iot_class": "local_push" }, "apcupsd": { - "config_flow": true, - "iot_class": "local_polling", + "name": "APC UPS Daemon", "integration_type": "hub", - "name": "APC UPS Daemon" + "config_flow": true, + "iot_class": "local_polling" }, "apple": { "name": "Apple", @@ -285,46 +295,46 @@ } }, "apprise": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Apprise", "integration_type": "hub", - "name": "Apprise" + "config_flow": false, + "iot_class": "cloud_push" }, "aprs": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "APRS", "integration_type": "hub", - "name": "APRS" + "config_flow": false, + "iot_class": "cloud_push" }, "aqualogic": { - "config_flow": false, - "iot_class": "local_push", + "name": "AquaLogic", "integration_type": "hub", - "name": "AquaLogic" + "config_flow": false, + "iot_class": "local_push" }, "aquostv": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Sharp Aquos TV", "integration_type": "hub", - "name": "Sharp Aquos TV" + "config_flow": false, + "iot_class": "local_polling" }, "arcam_fmj": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Arcam FMJ Receivers", "integration_type": "hub", - "name": "Arcam FMJ Receivers" + "config_flow": true, + "iot_class": "local_polling" }, "arest": { - "config_flow": false, - "iot_class": "local_polling", + "name": "aREST", "integration_type": "hub", - "name": "aREST" + "config_flow": false, + "iot_class": "local_polling" }, "arris_tg2492lg": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Arris TG2492LG", "integration_type": "hub", - "name": "Arris TG2492LG" + "config_flow": false, + "iot_class": "local_polling" }, "aruba": { "name": "Aruba", @@ -344,16 +354,16 @@ } }, "arwn": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Ambient Radio Weather Network", "integration_type": "hub", - "name": "Ambient Radio Weather Network" + "config_flow": false, + "iot_class": "local_polling" }, "aseko_pool_live": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Aseko Pool Live", "integration_type": "hub", - "name": "Aseko Pool Live" + "config_flow": true, + "iot_class": "cloud_polling" }, "asterisk": { "name": "Asterisk", @@ -373,28 +383,28 @@ } }, "asuswrt": { - "config_flow": true, - "iot_class": "local_polling", + "name": "ASUSWRT", "integration_type": "hub", - "name": "ASUSWRT" + "config_flow": true, + "iot_class": "local_polling" }, "atag": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Atag", "integration_type": "hub", - "name": "Atag" + "config_flow": true, + "iot_class": "local_polling" }, "aten_pe": { - "config_flow": false, - "iot_class": "local_polling", + "name": "ATEN Rack PDU", "integration_type": "hub", - "name": "ATEN Rack PDU" + "config_flow": false, + "iot_class": "local_polling" }, "atome": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Atome Linky", "integration_type": "hub", - "name": "Atome Linky" + "config_flow": false, + "iot_class": "cloud_polling" }, "august": { "name": "August Home", @@ -413,261 +423,296 @@ } } }, + "august_ble": { + "name": "August Bluetooth", + "integration_type": "virtual", + "supported_by": "yalexs_ble" + }, "aurora": { + "integration_type": "hub", "config_flow": true, - "iot_class": "cloud_polling", - "integration_type": "hub" + "iot_class": "cloud_polling" }, "aurora_abb_powerone": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Aurora ABB PowerOne Solar PV", "integration_type": "hub", - "name": "Aurora ABB PowerOne Solar PV" + "config_flow": true, + "iot_class": "local_polling" }, "aussie_broadband": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Aussie Broadband", "integration_type": "hub", - "name": "Aussie Broadband" + "config_flow": true, + "iot_class": "cloud_polling" }, "avion": { - "config_flow": false, - "iot_class": "assumed_state", + "name": "Avi-on", "integration_type": "hub", - "name": "Avi-on" + "config_flow": false, + "iot_class": "assumed_state" }, "awair": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Awair", "integration_type": "hub", - "name": "Awair" + "config_flow": true, + "iot_class": "local_polling" }, "axis": { - "config_flow": true, - "iot_class": "local_push", + "name": "Axis", "integration_type": "device", - "name": "Axis" + "config_flow": true, + "iot_class": "local_push" }, "baf": { - "config_flow": true, - "iot_class": "local_push", + "name": "Big Ass Fans", "integration_type": "hub", - "name": "Big Ass Fans" + "config_flow": true, + "iot_class": "local_push" }, "baidu": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Baidu", "integration_type": "hub", - "name": "Baidu" + "config_flow": false, + "iot_class": "cloud_push" }, "balboa": { - "config_flow": true, - "iot_class": "local_push", + "name": "Balboa Spa Client", "integration_type": "hub", - "name": "Balboa Spa Client" + "config_flow": true, + "iot_class": "local_push" }, "bayesian": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Bayesian", "integration_type": "hub", - "name": "Bayesian" + "config_flow": false, + "iot_class": "local_polling" }, "bbox": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Bbox", "integration_type": "hub", - "name": "Bbox" + "config_flow": false, + "iot_class": "local_polling" }, "beewi_smartclim": { - "config_flow": false, - "iot_class": "local_polling", + "name": "BeeWi SmartClim BLE sensor", "integration_type": "hub", - "name": "BeeWi SmartClim BLE sensor" + "config_flow": false, + "iot_class": "local_polling" }, "bitcoin": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Bitcoin", "integration_type": "hub", - "name": "Bitcoin" + "config_flow": false, + "iot_class": "cloud_polling" }, "bizkaibus": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Bizkaibus", "integration_type": "hub", - "name": "Bizkaibus" + "config_flow": false, + "iot_class": "cloud_polling" }, "blackbird": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Monoprice Blackbird Matrix Switch", "integration_type": "hub", - "name": "Monoprice Blackbird Matrix Switch" + "config_flow": false, + "iot_class": "local_polling" }, "blebox": { - "config_flow": true, - "iot_class": "local_polling", + "name": "BleBox devices", "integration_type": "hub", - "name": "BleBox devices" + "config_flow": true, + "iot_class": "local_polling" }, "blink": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Blink", "integration_type": "hub", - "name": "Blink" + "config_flow": true, + "iot_class": "cloud_polling" }, "blinksticklight": { - "config_flow": false, - "iot_class": "local_polling", + "name": "BlinkStick", "integration_type": "hub", - "name": "BlinkStick" + "config_flow": false, + "iot_class": "local_polling" + }, + "bliss_automation": { + "name": "Bliss Automation", + "integration_type": "virtual", + "supported_by": "motion_blinds" + }, + "bloc_blinds": { + "name": "Bloc Blinds", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "blockchain": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Blockchain.com", "integration_type": "hub", - "name": "Blockchain.com" + "config_flow": false, + "iot_class": "cloud_polling" }, "bloomsky": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "BloomSky", "integration_type": "hub", - "name": "BloomSky" + "config_flow": false, + "iot_class": "cloud_polling" }, "bluemaestro": { - "config_flow": true, - "iot_class": "local_push", + "name": "BlueMaestro", "integration_type": "hub", - "name": "BlueMaestro" + "config_flow": true, + "iot_class": "local_push" }, "bluesound": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Bluesound", "integration_type": "hub", - "name": "Bluesound" + "config_flow": false, + "iot_class": "local_polling" }, "bluetooth": { - "config_flow": true, - "iot_class": "local_push", + "name": "Bluetooth", "integration_type": "hub", - "name": "Bluetooth" + "config_flow": true, + "iot_class": "local_push" }, "bluetooth_le_tracker": { - "config_flow": false, - "iot_class": "local_push", + "name": "Bluetooth LE Tracker", "integration_type": "hub", - "name": "Bluetooth LE Tracker" + "config_flow": false, + "iot_class": "local_push" }, "bluetooth_tracker": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Bluetooth Tracker", "integration_type": "hub", - "name": "Bluetooth Tracker" + "config_flow": false, + "iot_class": "local_polling" }, "bmw_connected_drive": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "BMW Connected Drive", "integration_type": "hub", - "name": "BMW Connected Drive" + "config_flow": true, + "iot_class": "cloud_polling" }, "bond": { - "config_flow": true, - "iot_class": "local_push", + "name": "Bond", "integration_type": "hub", - "name": "Bond" + "config_flow": true, + "iot_class": "local_push" }, "bosch_shc": { - "config_flow": true, - "iot_class": "local_push", + "name": "Bosch SHC", "integration_type": "hub", - "name": "Bosch SHC" + "config_flow": true, + "iot_class": "local_push" + }, + "brel_home": { + "name": "Brel Home", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "broadlink": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Broadlink", "integration_type": "hub", - "name": "Broadlink" + "config_flow": true, + "iot_class": "local_polling" }, "brother": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Brother Printer", "integration_type": "hub", - "name": "Brother Printer" + "config_flow": true, + "iot_class": "local_polling" }, "brottsplatskartan": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Brottsplatskartan", "integration_type": "hub", - "name": "Brottsplatskartan" + "config_flow": false, + "iot_class": "cloud_polling" }, "browser": { - "config_flow": false, - "iot_class": "local_push", + "name": "Browser", "integration_type": "hub", - "name": "Browser" + "config_flow": false, + "iot_class": "local_push" }, "brunt": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Brunt Blind Engine", "integration_type": "hub", - "name": "Brunt Blind Engine" + "config_flow": true, + "iot_class": "cloud_polling" }, "bsblan": { - "config_flow": true, - "iot_class": "local_polling", + "name": "BSB-Lan", "integration_type": "hub", - "name": "BSB-Lan" + "config_flow": true, + "iot_class": "local_polling" + }, + "bswitch": { + "name": "BSwitch", + "integration_type": "virtual", + "supported_by": "switchbee" }, "bt_home_hub_5": { - "config_flow": false, - "iot_class": "local_polling", + "name": "BT Home Hub 5", "integration_type": "hub", - "name": "BT Home Hub 5" + "config_flow": false, + "iot_class": "local_polling" }, "bt_smarthub": { - "config_flow": false, - "iot_class": "local_polling", + "name": "BT Smart Hub", "integration_type": "hub", - "name": "BT Smart Hub" + "config_flow": false, + "iot_class": "local_polling" }, "bthome": { - "config_flow": true, - "iot_class": "local_push", + "name": "BTHome", "integration_type": "hub", - "name": "BTHome" + "config_flow": true, + "iot_class": "local_push" + }, + "bticino": { + "name": "BTicino", + "integration_type": "virtual", + "supported_by": "netatmo" + }, + "bubendorff": { + "name": "Bubendorff", + "integration_type": "virtual", + "supported_by": "netatmo" }, "buienradar": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Buienradar", "integration_type": "hub", - "name": "Buienradar" + "config_flow": true, + "iot_class": "cloud_polling" }, "caldav": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "CalDAV", "integration_type": "hub", - "name": "CalDAV" + "config_flow": false, + "iot_class": "cloud_polling" }, "canary": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Canary", "integration_type": "hub", - "name": "Canary" + "config_flow": true, + "iot_class": "cloud_polling" }, "cert_expiry": { + "integration_type": "hub", "config_flow": true, - "iot_class": "cloud_polling", - "integration_type": "hub" + "iot_class": "cloud_polling" }, "channels": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Channels", "integration_type": "hub", - "name": "Channels" + "config_flow": false, + "iot_class": "local_polling" }, "circuit": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Unify Circuit", "integration_type": "hub", - "name": "Unify Circuit" + "config_flow": false, + "iot_class": "cloud_push" }, "cisco": { "name": "Cisco", @@ -693,22 +738,22 @@ } }, "citybikes": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "CityBikes", "integration_type": "hub", - "name": "CityBikes" + "config_flow": false, + "iot_class": "cloud_polling" }, "clementine": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Clementine Music Player", "integration_type": "hub", - "name": "Clementine Music Player" + "config_flow": false, + "iot_class": "local_polling" }, "clickatell": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Clickatell", "integration_type": "hub", - "name": "Clickatell" + "config_flow": false, + "iot_class": "cloud_push" }, "clicksend": { "name": "ClickSend", @@ -728,182 +773,191 @@ } }, "cloud": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Home Assistant Cloud", "integration_type": "hub", - "name": "Home Assistant Cloud" + "config_flow": false, + "iot_class": "cloud_push" }, "cloudflare": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Cloudflare", "integration_type": "hub", - "name": "Cloudflare" + "config_flow": true, + "iot_class": "cloud_push" }, "cmus": { - "config_flow": false, - "iot_class": "local_polling", + "name": "cmus", "integration_type": "hub", - "name": "cmus" + "config_flow": false, + "iot_class": "local_polling" }, "co2signal": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "CO2 Signal", "integration_type": "hub", - "name": "CO2 Signal" + "config_flow": true, + "iot_class": "cloud_polling" }, "coinbase": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Coinbase", "integration_type": "hub", - "name": "Coinbase" + "config_flow": true, + "iot_class": "cloud_polling" }, "color_extractor": { - "config_flow": false, - "iot_class": null, + "name": "ColorExtractor", "integration_type": "hub", - "name": "ColorExtractor" + "config_flow": false }, "comed_hourly_pricing": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "ComEd Hourly Pricing", "integration_type": "hub", - "name": "ComEd Hourly Pricing" + "config_flow": false, + "iot_class": "cloud_polling" }, "comfoconnect": { - "config_flow": false, - "iot_class": "local_push", + "name": "Zehnder ComfoAir Q", "integration_type": "hub", - "name": "Zehnder ComfoAir Q" + "config_flow": false, + "iot_class": "local_push" }, "command_line": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Command Line", "integration_type": "hub", - "name": "Command Line" + "config_flow": false, + "iot_class": "local_polling" }, "compensation": { - "config_flow": false, - "iot_class": "calculated", + "name": "Compensation", "integration_type": "hub", - "name": "Compensation" + "config_flow": false, + "iot_class": "calculated" }, "concord232": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Concord232", "integration_type": "hub", - "name": "Concord232" + "config_flow": false, + "iot_class": "local_polling" }, "control4": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Control4", "integration_type": "hub", - "name": "Control4" + "config_flow": true, + "iot_class": "local_polling" }, "coolmaster": { - "config_flow": true, - "iot_class": "local_polling", + "name": "CoolMasterNet", "integration_type": "hub", - "name": "CoolMasterNet" + "config_flow": true, + "iot_class": "local_polling" }, "coronavirus": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Coronavirus (COVID-19)", "integration_type": "hub", - "name": "Coronavirus (COVID-19)" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "cozytouch": { + "name": "Atlantic Cozytouch", + "integration_type": "virtual", + "supported_by": "overkiz" }, "cpuspeed": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_push", - "integration_type": "hub" + "iot_class": "local_push" }, "crownstone": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Crownstone", "integration_type": "hub", - "name": "Crownstone" + "config_flow": true, + "iot_class": "cloud_push" }, "cups": { - "config_flow": false, - "iot_class": "local_polling", + "name": "CUPS", "integration_type": "hub", - "name": "CUPS" + "config_flow": false, + "iot_class": "local_polling" }, "currencylayer": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "currencylayer", "integration_type": "hub", - "name": "currencylayer" + "config_flow": false, + "iot_class": "cloud_polling" + }, + "dacia": { + "name": "Dacia", + "integration_type": "virtual", + "supported_by": "renault" }, "daikin": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Daikin AC", "integration_type": "hub", - "name": "Daikin AC" + "config_flow": true, + "iot_class": "local_polling" }, "danfoss_air": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Danfoss Air", "integration_type": "hub", - "name": "Danfoss Air" + "config_flow": false, + "iot_class": "local_polling" }, "darksky": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Dark Sky", "integration_type": "hub", - "name": "Dark Sky" + "config_flow": false, + "iot_class": "cloud_polling" }, "datadog": { - "config_flow": false, - "iot_class": "local_push", + "name": "Datadog", "integration_type": "hub", - "name": "Datadog" + "config_flow": false, + "iot_class": "local_push" }, "ddwrt": { - "config_flow": false, - "iot_class": "local_polling", + "name": "DD-WRT", "integration_type": "hub", - "name": "DD-WRT" + "config_flow": false, + "iot_class": "local_polling" }, "debugpy": { - "config_flow": false, - "iot_class": "local_push", + "name": "Remote Python Debugger", "integration_type": "hub", - "name": "Remote Python Debugger" + "config_flow": false, + "iot_class": "local_push" }, "deconz": { - "config_flow": true, - "iot_class": "local_push", + "name": "deCONZ", "integration_type": "hub", - "name": "deCONZ" + "config_flow": true, + "iot_class": "local_push" }, "decora": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Leviton Decora", "integration_type": "hub", - "name": "Leviton Decora" + "config_flow": false, + "iot_class": "local_polling" }, "decora_wifi": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Leviton Decora Wi-Fi", "integration_type": "hub", - "name": "Leviton Decora Wi-Fi" + "config_flow": false, + "iot_class": "cloud_polling" }, "delijn": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "De Lijn", "integration_type": "hub", - "name": "De Lijn" + "config_flow": false, + "iot_class": "cloud_polling" }, "deluge": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Deluge", "integration_type": "hub", - "name": "Deluge" + "config_flow": true, + "iot_class": "local_polling" }, "demo": { + "integration_type": "hub", "config_flow": false, - "iot_class": "calculated", - "integration_type": "hub" + "iot_class": "calculated" }, "denon": { "name": "Denon", @@ -929,16 +983,16 @@ } }, "deutsche_bahn": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Deutsche Bahn", "integration_type": "hub", - "name": "Deutsche Bahn" + "config_flow": false, + "iot_class": "cloud_polling" }, "device_sun_light_trigger": { - "config_flow": false, - "iot_class": "calculated", + "name": "Presence-based Lights", "integration_type": "hub", - "name": "Presence-based Lights" + "config_flow": false, + "iot_class": "calculated" }, "devolo": { "name": "devolo", @@ -958,52 +1012,62 @@ } }, "dexcom": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Dexcom", "integration_type": "hub", - "name": "Dexcom" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "diaz": { + "name": "Diaz", + "integration_type": "virtual", + "supported_by": "motion_blinds" + }, + "digital_loggers": { + "name": "Digital Loggers", + "integration_type": "virtual", + "supported_by": "wemo" }, "digital_ocean": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Digital Ocean", "integration_type": "hub", - "name": "Digital Ocean" + "config_flow": false, + "iot_class": "local_polling" }, "directv": { - "config_flow": true, - "iot_class": "local_polling", + "name": "DirecTV", "integration_type": "hub", - "name": "DirecTV" + "config_flow": true, + "iot_class": "local_polling" }, "discogs": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Discogs", "integration_type": "hub", - "name": "Discogs" + "config_flow": false, + "iot_class": "cloud_polling" }, "discord": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Discord", "integration_type": "hub", - "name": "Discord" + "config_flow": true, + "iot_class": "cloud_push" }, "dlib_face_detect": { - "config_flow": false, - "iot_class": "local_push", + "name": "Dlib Face Detect", "integration_type": "hub", - "name": "Dlib Face Detect" + "config_flow": false, + "iot_class": "local_push" }, "dlib_face_identify": { - "config_flow": false, - "iot_class": "local_push", + "name": "Dlib Face Identify", "integration_type": "hub", - "name": "Dlib Face Identify" + "config_flow": false, + "iot_class": "local_push" }, "dlink": { - "config_flow": false, - "iot_class": "local_polling", + "name": "D-Link Wi-Fi Smart Plugs", "integration_type": "hub", - "name": "D-Link Wi-Fi Smart Plugs" + "config_flow": false, + "iot_class": "local_polling" }, "dlna": { "name": "DLNA", @@ -1023,172 +1087,176 @@ } }, "dnsip": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "DNS IP", "integration_type": "hub", - "name": "DNS IP" + "config_flow": true, + "iot_class": "cloud_polling" }, "dominos": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Dominos Pizza", "integration_type": "hub", - "name": "Dominos Pizza" + "config_flow": false, + "iot_class": "cloud_polling" }, "doods": { - "config_flow": false, - "iot_class": "local_polling", + "name": "DOODS - Dedicated Open Object Detection Service", "integration_type": "hub", - "name": "DOODS - Dedicated Open Object Detection Service" + "config_flow": false, + "iot_class": "local_polling" }, "doorbird": { - "config_flow": true, - "iot_class": "local_push", + "name": "DoorBird", "integration_type": "hub", - "name": "DoorBird" + "config_flow": true, + "iot_class": "local_push" + }, + "dooya": { + "name": "Dooya", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "dovado": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Dovado", "integration_type": "hub", - "name": "Dovado" + "config_flow": false, + "iot_class": "local_polling" }, "downloader": { - "config_flow": false, - "iot_class": null, + "name": "Downloader", "integration_type": "hub", - "name": "Downloader" + "config_flow": false }, "dsmr": { - "config_flow": true, - "iot_class": "local_push", + "name": "DSMR Slimme Meter", "integration_type": "hub", - "name": "DSMR Slimme Meter" + "config_flow": true, + "iot_class": "local_push" }, "dsmr_reader": { - "config_flow": true, - "iot_class": "local_push", + "name": "DSMR Reader", "integration_type": "hub", - "name": "DSMR Reader" + "config_flow": true, + "iot_class": "local_push" }, "dte_energy_bridge": { - "config_flow": false, - "iot_class": "local_polling", + "name": "DTE Energy Bridge", "integration_type": "hub", - "name": "DTE Energy Bridge" + "config_flow": false, + "iot_class": "local_polling" }, "dublin_bus_transport": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Dublin Bus", "integration_type": "hub", - "name": "Dublin Bus" + "config_flow": false, + "iot_class": "cloud_polling" }, "duckdns": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Duck DNS", "integration_type": "hub", - "name": "Duck DNS" + "config_flow": false, + "iot_class": "cloud_polling" }, "dunehd": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Dune HD", "integration_type": "hub", - "name": "Dune HD" + "config_flow": true, + "iot_class": "local_polling" }, "dwd_weather_warnings": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Deutscher Wetterdienst (DWD) Weather Warnings", "integration_type": "hub", - "name": "Deutscher Wetterdienst (DWD) Weather Warnings" + "config_flow": false, + "iot_class": "cloud_polling" }, "dweet": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "dweet.io", "integration_type": "hub", - "name": "dweet.io" + "config_flow": false, + "iot_class": "cloud_polling" }, "eafm": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Environment Agency Flood Gauges", "integration_type": "hub", - "name": "Environment Agency Flood Gauges" + "config_flow": true, + "iot_class": "cloud_polling" }, "ebox": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "EBox", "integration_type": "hub", - "name": "EBox" + "config_flow": false, + "iot_class": "cloud_polling" }, "ebusd": { - "config_flow": false, - "iot_class": "local_polling", + "name": "ebusd", "integration_type": "hub", - "name": "ebusd" + "config_flow": false, + "iot_class": "local_polling" }, "ecoal_boiler": { - "config_flow": false, - "iot_class": "local_polling", + "name": "eSterownik eCoal.pl Boiler", "integration_type": "hub", - "name": "eSterownik eCoal.pl Boiler" + "config_flow": false, + "iot_class": "local_polling" }, "ecobee": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "ecobee", "integration_type": "hub", - "name": "ecobee" + "config_flow": true, + "iot_class": "cloud_polling" }, "econet": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Rheem EcoNet Products", "integration_type": "hub", - "name": "Rheem EcoNet Products" + "config_flow": true, + "iot_class": "cloud_push" }, "ecovacs": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Ecovacs", "integration_type": "hub", - "name": "Ecovacs" + "config_flow": false, + "iot_class": "cloud_push" }, "ecowitt": { - "config_flow": true, - "iot_class": "local_push", + "name": "Ecowitt", "integration_type": "hub", - "name": "Ecowitt" + "config_flow": true, + "iot_class": "local_push" }, "eddystone_temperature": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Eddystone", "integration_type": "hub", - "name": "Eddystone" + "config_flow": false, + "iot_class": "local_polling" }, "edimax": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Edimax", "integration_type": "hub", - "name": "Edimax" + "config_flow": false, + "iot_class": "local_polling" }, "edl21": { - "config_flow": false, - "iot_class": "local_push", + "name": "EDL21", "integration_type": "hub", - "name": "EDL21" + "config_flow": false, + "iot_class": "local_push" }, "efergy": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Efergy", "integration_type": "hub", - "name": "Efergy" + "config_flow": true, + "iot_class": "cloud_polling" }, "egardia": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Egardia", "integration_type": "hub", - "name": "Egardia" + "config_flow": false, + "iot_class": "local_polling" }, "eight_sleep": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Eight Sleep", "integration_type": "hub", - "name": "Eight Sleep" + "config_flow": true, + "iot_class": "cloud_polling" }, "elgato": { "name": "Elgato", @@ -1208,34 +1276,34 @@ } }, "eliqonline": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Eliqonline", "integration_type": "hub", - "name": "Eliqonline" + "config_flow": false, + "iot_class": "cloud_polling" }, "elkm1": { - "config_flow": true, - "iot_class": "local_push", + "name": "Elk-M1 Control", "integration_type": "hub", - "name": "Elk-M1 Control" + "config_flow": true, + "iot_class": "local_push" }, "elmax": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Elmax", "integration_type": "hub", - "name": "Elmax" + "config_flow": true, + "iot_class": "cloud_polling" }, "elv": { - "config_flow": false, - "iot_class": "local_polling", + "name": "ELV PCA", "integration_type": "hub", - "name": "ELV PCA" + "config_flow": false, + "iot_class": "local_polling" }, "emby": { - "config_flow": false, - "iot_class": "local_push", + "name": "Emby", "integration_type": "hub", - "name": "Emby" + "config_flow": false, + "iot_class": "local_push" }, "emoncms": { "name": "emoncms", @@ -1255,69 +1323,69 @@ } }, "emonitor": { - "config_flow": true, - "iot_class": "local_polling", + "name": "SiteSage Emonitor", "integration_type": "hub", - "name": "SiteSage Emonitor" + "config_flow": true, + "iot_class": "local_polling" }, "emulated_hue": { - "config_flow": false, - "iot_class": "local_push", + "name": "Emulated Hue", "integration_type": "hub", - "name": "Emulated Hue" + "config_flow": false, + "iot_class": "local_push" }, "emulated_kasa": { - "config_flow": false, - "iot_class": "local_push", + "name": "Emulated Kasa", "integration_type": "hub", - "name": "Emulated Kasa" + "config_flow": false, + "iot_class": "local_push" }, "emulated_roku": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_push", - "integration_type": "hub" + "iot_class": "local_push" }, "enigma2": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Enigma2 (OpenWebif)", "integration_type": "hub", - "name": "Enigma2 (OpenWebif)" + "config_flow": false, + "iot_class": "local_polling" }, "enocean": { - "config_flow": true, - "iot_class": "local_push", + "name": "EnOcean", "integration_type": "hub", - "name": "EnOcean" + "config_flow": true, + "iot_class": "local_push" }, "enphase_envoy": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Enphase Envoy", "integration_type": "hub", - "name": "Enphase Envoy" + "config_flow": true, + "iot_class": "local_polling" }, "entur_public_transport": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Entur", "integration_type": "hub", - "name": "Entur" + "config_flow": false, + "iot_class": "cloud_polling" }, "environment_canada": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Environment Canada", "integration_type": "hub", - "name": "Environment Canada" + "config_flow": true, + "iot_class": "cloud_polling" }, "envisalink": { - "config_flow": false, - "iot_class": "local_push", + "name": "Envisalink", "integration_type": "hub", - "name": "Envisalink" + "config_flow": false, + "iot_class": "local_push" }, "ephember": { - "config_flow": false, - "iot_class": "local_polling", + "name": "EPH Controls", "integration_type": "hub", - "name": "EPH Controls" + "config_flow": false, + "iot_class": "local_polling" }, "epson": { "name": "Epson", @@ -1354,82 +1422,82 @@ } }, "escea": { - "config_flow": true, - "iot_class": "local_push", + "name": "Escea", "integration_type": "hub", - "name": "Escea" + "config_flow": true, + "iot_class": "local_push" }, "esphome": { - "config_flow": true, - "iot_class": "local_push", + "name": "ESPHome", "integration_type": "device", - "name": "ESPHome" + "config_flow": true, + "iot_class": "local_push" }, "etherscan": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Etherscan", "integration_type": "hub", - "name": "Etherscan" + "config_flow": false, + "iot_class": "cloud_polling" }, "eufy": { - "config_flow": false, - "iot_class": "local_polling", + "name": "eufy", "integration_type": "hub", - "name": "eufy" + "config_flow": false, + "iot_class": "local_polling" }, "everlights": { - "config_flow": false, - "iot_class": "local_polling", + "name": "EverLights", "integration_type": "hub", - "name": "EverLights" + "config_flow": false, + "iot_class": "local_polling" }, "evil_genius_labs": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Evil Genius Labs", "integration_type": "hub", - "name": "Evil Genius Labs" + "config_flow": true, + "iot_class": "local_polling" }, "ezviz": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "EZVIZ", "integration_type": "hub", - "name": "EZVIZ" + "config_flow": true, + "iot_class": "cloud_polling" }, "faa_delays": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "FAA Delays", "integration_type": "hub", - "name": "FAA Delays" + "config_flow": true, + "iot_class": "cloud_polling" }, "facebook": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Facebook Messenger", "integration_type": "hub", - "name": "Facebook Messenger" + "config_flow": false, + "iot_class": "cloud_push" }, "facebox": { - "config_flow": false, - "iot_class": "local_push", + "name": "Facebox", "integration_type": "hub", - "name": "Facebox" + "config_flow": false, + "iot_class": "local_push" }, "fail2ban": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Fail2Ban", "integration_type": "hub", - "name": "Fail2Ban" + "config_flow": false, + "iot_class": "local_polling" }, "fastdotcom": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Fast.com", "integration_type": "hub", - "name": "Fast.com" + "config_flow": false, + "iot_class": "cloud_polling" }, "feedreader": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Feedreader", "integration_type": "hub", - "name": "Feedreader" + "config_flow": false, + "iot_class": "cloud_polling" }, "ffmpeg": { "name": "FFmpeg", @@ -1455,207 +1523,212 @@ } }, "fibaro": { - "config_flow": true, - "iot_class": "local_push", + "name": "Fibaro", "integration_type": "hub", - "name": "Fibaro" + "config_flow": true, + "iot_class": "local_push" }, "fido": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Fido", "integration_type": "hub", - "name": "Fido" + "config_flow": false, + "iot_class": "cloud_polling" }, "file": { - "config_flow": false, - "iot_class": "local_polling", + "name": "File", "integration_type": "hub", - "name": "File" + "config_flow": false, + "iot_class": "local_polling" }, "filesize": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_polling", - "integration_type": "hub" + "iot_class": "local_polling" }, "filter": { - "config_flow": false, - "iot_class": "local_push", + "name": "Filter", "integration_type": "hub", - "name": "Filter" + "config_flow": false, + "iot_class": "local_push" }, "fints": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "FinTS", "integration_type": "hub", - "name": "FinTS" + "config_flow": false, + "iot_class": "cloud_polling" }, "fireservicerota": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "FireServiceRota", "integration_type": "hub", - "name": "FireServiceRota" + "config_flow": true, + "iot_class": "cloud_polling" }, "firmata": { - "config_flow": false, - "iot_class": "local_push", + "name": "Firmata", "integration_type": "hub", - "name": "Firmata" + "config_flow": false, + "iot_class": "local_push" }, "fitbit": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Fitbit", "integration_type": "hub", - "name": "Fitbit" + "config_flow": false, + "iot_class": "cloud_polling" }, "fivem": { - "config_flow": true, - "iot_class": "local_polling", + "name": "FiveM", "integration_type": "hub", - "name": "FiveM" + "config_flow": true, + "iot_class": "local_polling" }, "fixer": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Fixer", "integration_type": "hub", - "name": "Fixer" + "config_flow": false, + "iot_class": "cloud_polling" }, "fjaraskupan": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Fj\u00e4r\u00e5skupan", "integration_type": "hub", - "name": "Fj\u00e4r\u00e5skupan" + "config_flow": true, + "iot_class": "local_polling" }, "fleetgo": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "FleetGO", "integration_type": "hub", - "name": "FleetGO" + "config_flow": false, + "iot_class": "cloud_polling" }, "flexit": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Flexit", "integration_type": "hub", - "name": "Flexit" + "config_flow": false, + "iot_class": "local_polling" + }, + "flexom": { + "name": "Bouygues Flexom", + "integration_type": "virtual", + "supported_by": "overkiz" }, "flic": { - "config_flow": false, - "iot_class": "local_push", + "name": "Flic", "integration_type": "hub", - "name": "Flic" + "config_flow": false, + "iot_class": "local_push" }, "flick_electric": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Flick Electric", "integration_type": "hub", - "name": "Flick Electric" + "config_flow": true, + "iot_class": "cloud_polling" }, "flipr": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Flipr", "integration_type": "hub", - "name": "Flipr" + "config_flow": true, + "iot_class": "cloud_polling" }, "flo": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Flo", "integration_type": "hub", - "name": "Flo" + "config_flow": true, + "iot_class": "cloud_polling" }, "flock": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Flock", "integration_type": "hub", - "name": "Flock" + "config_flow": false, + "iot_class": "cloud_push" }, "flume": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Flume", "integration_type": "hub", - "name": "Flume" + "config_flow": true, + "iot_class": "cloud_polling" }, "flux": { - "config_flow": false, - "iot_class": "calculated", + "name": "Flux", "integration_type": "hub", - "name": "Flux" + "config_flow": false, + "iot_class": "calculated" }, "flux_led": { - "config_flow": true, - "iot_class": "local_push", + "name": "Magic Home", "integration_type": "hub", - "name": "Magic Home" + "config_flow": true, + "iot_class": "local_push" }, "folder": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Folder", "integration_type": "hub", - "name": "Folder" + "config_flow": false, + "iot_class": "local_polling" }, "folder_watcher": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Folder Watcher", "integration_type": "hub", - "name": "Folder Watcher" + "config_flow": false, + "iot_class": "local_polling" }, "foobot": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Foobot", "integration_type": "hub", - "name": "Foobot" + "config_flow": false, + "iot_class": "cloud_polling" }, "forecast_solar": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Forecast.Solar", "integration_type": "hub", - "name": "Forecast.Solar" + "config_flow": true, + "iot_class": "cloud_polling" }, "forked_daapd": { - "config_flow": true, - "iot_class": "local_push", + "name": "Owntone", "integration_type": "hub", - "name": "Owntone" + "config_flow": true, + "iot_class": "local_push" }, "fortios": { - "config_flow": false, - "iot_class": "local_polling", + "name": "FortiOS", "integration_type": "hub", - "name": "FortiOS" + "config_flow": false, + "iot_class": "local_polling" }, "foscam": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Foscam", "integration_type": "hub", - "name": "Foscam" + "config_flow": true, + "iot_class": "local_polling" }, "foursquare": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Foursquare", "integration_type": "hub", - "name": "Foursquare" + "config_flow": false, + "iot_class": "cloud_push" }, "free_mobile": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Free Mobile", "integration_type": "hub", - "name": "Free Mobile" + "config_flow": false, + "iot_class": "cloud_push" }, "freebox": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Freebox", "integration_type": "hub", - "name": "Freebox" + "config_flow": true, + "iot_class": "local_polling" }, "freedns": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "FreeDNS", "integration_type": "hub", - "name": "FreeDNS" + "config_flow": false, + "iot_class": "cloud_push" }, "freedompro": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Freedompro", "integration_type": "hub", - "name": "Freedompro" + "config_flow": true, + "iot_class": "cloud_polling" }, "fritzbox": { "name": "FRITZ!Box", @@ -1681,93 +1754,98 @@ } }, "fronius": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Fronius", "integration_type": "hub", - "name": "Fronius" + "config_flow": true, + "iot_class": "local_polling" }, "frontier_silicon": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Frontier Silicon", "integration_type": "hub", - "name": "Frontier Silicon" + "config_flow": false, + "iot_class": "local_polling" }, "fully_kiosk": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Fully Kiosk Browser", "integration_type": "hub", - "name": "Fully Kiosk Browser" + "config_flow": true, + "iot_class": "local_polling" }, "futurenow": { - "config_flow": false, - "iot_class": "local_polling", + "name": "P5 FutureNow", "integration_type": "hub", - "name": "P5 FutureNow" + "config_flow": false, + "iot_class": "local_polling" }, "garadget": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Garadget", "integration_type": "hub", - "name": "Garadget" + "config_flow": false, + "iot_class": "cloud_polling" }, "garages_amsterdam": { + "integration_type": "hub", "config_flow": true, - "iot_class": "cloud_polling", - "integration_type": "hub" + "iot_class": "cloud_polling" + }, + "gaviota": { + "name": "Gaviota", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "gdacs": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Global Disaster Alert and Coordination System (GDACS)", "integration_type": "hub", - "name": "Global Disaster Alert and Coordination System (GDACS)" + "config_flow": true, + "iot_class": "cloud_polling" }, "generic": { - "config_flow": true, - "iot_class": "local_push", + "name": "Generic Camera", "integration_type": "hub", - "name": "Generic Camera" + "config_flow": true, + "iot_class": "local_push" }, "generic_hygrostat": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Generic hygrostat", "integration_type": "hub", - "name": "Generic hygrostat" + "config_flow": false, + "iot_class": "local_polling" }, "generic_thermostat": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Generic Thermostat", "integration_type": "hub", - "name": "Generic Thermostat" + "config_flow": false, + "iot_class": "local_polling" }, "geniushub": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Genius Hub", "integration_type": "hub", - "name": "Genius Hub" + "config_flow": false, + "iot_class": "local_polling" }, "geo_json_events": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "GeoJSON", "integration_type": "hub", - "name": "GeoJSON" + "config_flow": false, + "iot_class": "cloud_polling" }, "geo_rss_events": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "GeoRSS", "integration_type": "hub", - "name": "GeoRSS" + "config_flow": false, + "iot_class": "cloud_polling" }, "geocaching": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Geocaching", "integration_type": "hub", - "name": "Geocaching" + "config_flow": true, + "iot_class": "cloud_polling" }, "geofency": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Geofency", "integration_type": "hub", - "name": "Geofency" + "config_flow": true, + "iot_class": "cloud_push" }, "geonet": { "name": "GeoNet", @@ -1787,34 +1865,34 @@ } }, "gios": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "GIO\u015a", "integration_type": "hub", - "name": "GIO\u015a" + "config_flow": true, + "iot_class": "cloud_polling" }, "github": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "GitHub", "integration_type": "hub", - "name": "GitHub" + "config_flow": true, + "iot_class": "cloud_polling" }, "gitlab_ci": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "GitLab-CI", "integration_type": "hub", - "name": "GitLab-CI" + "config_flow": false, + "iot_class": "cloud_polling" }, "gitter": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Gitter", "integration_type": "hub", - "name": "Gitter" + "config_flow": false, + "iot_class": "cloud_polling" }, "glances": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Glances", "integration_type": "hub", - "name": "Glances" + "config_flow": true, + "iot_class": "local_polling" }, "globalcache": { "name": "Global Cach\u00e9", @@ -1834,28 +1912,28 @@ } }, "goalfeed": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Goalfeed", "integration_type": "hub", - "name": "Goalfeed" + "config_flow": false, + "iot_class": "cloud_push" }, "goalzero": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Goal Zero Yeti", "integration_type": "hub", - "name": "Goal Zero Yeti" + "config_flow": true, + "iot_class": "local_polling" }, "gogogate2": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Gogogate2 and ismartgate", "integration_type": "hub", - "name": "Gogogate2 and ismartgate" + "config_flow": true, + "iot_class": "local_polling" }, "goodwe": { - "config_flow": true, - "iot_class": "local_polling", + "name": "GoodWe Inverter", "integration_type": "hub", - "name": "GoodWe Inverter" + "config_flow": true, + "iot_class": "local_polling" }, "google": { "name": "Google", @@ -1946,123 +2024,137 @@ } }, "govee_ble": { - "config_flow": true, - "iot_class": "local_push", + "name": "Govee Bluetooth", "integration_type": "hub", - "name": "Govee Bluetooth" + "config_flow": true, + "iot_class": "local_push" }, "gpsd": { - "config_flow": false, - "iot_class": "local_polling", + "name": "GPSD", "integration_type": "hub", - "name": "GPSD" + "config_flow": false, + "iot_class": "local_polling" }, "gpslogger": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "GPSLogger", "integration_type": "hub", - "name": "GPSLogger" + "config_flow": true, + "iot_class": "cloud_push" }, "graphite": { - "config_flow": false, - "iot_class": "local_push", + "name": "Graphite", "integration_type": "hub", - "name": "Graphite" + "config_flow": false, + "iot_class": "local_push" }, "gree": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Gree Climate", "integration_type": "hub", - "name": "Gree Climate" + "config_flow": true, + "iot_class": "local_polling" }, "greeneye_monitor": { - "config_flow": false, - "iot_class": "local_push", + "name": "GreenEye Monitor (GEM)", "integration_type": "hub", - "name": "GreenEye Monitor (GEM)" + "config_flow": false, + "iot_class": "local_push" }, "greenwave": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Greenwave Reality", "integration_type": "hub", - "name": "Greenwave Reality" + "config_flow": false, + "iot_class": "local_polling" }, "growatt_server": { + "integration_type": "hub", "config_flow": true, - "iot_class": "cloud_polling", - "integration_type": "hub" + "iot_class": "cloud_polling" }, "gstreamer": { - "config_flow": false, - "iot_class": "local_push", + "name": "GStreamer", "integration_type": "hub", - "name": "GStreamer" + "config_flow": false, + "iot_class": "local_push" }, "gtfs": { - "config_flow": false, - "iot_class": "local_polling", + "name": "General Transit Feed Specification (GTFS)", "integration_type": "hub", - "name": "General Transit Feed Specification (GTFS)" + "config_flow": false, + "iot_class": "local_polling" }, "guardian": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Elexa Guardian", "integration_type": "hub", - "name": "Elexa Guardian" + "config_flow": true, + "iot_class": "local_polling" }, "habitica": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Habitica", "integration_type": "hub", - "name": "Habitica" + "config_flow": true, + "iot_class": "cloud_polling" }, "hardkernel": { - "config_flow": false, - "iot_class": null, + "name": "Hardkernel", "integration_type": "hardware", - "name": "Hardkernel" + "config_flow": false }, "harman_kardon_avr": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Harman Kardon AVR", "integration_type": "hub", - "name": "Harman Kardon AVR" + "config_flow": false, + "iot_class": "local_polling" }, "hassio": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Home Assistant Supervisor", "integration_type": "hub", - "name": "Home Assistant Supervisor" + "config_flow": false, + "iot_class": "local_polling" + }, + "havana_shade": { + "name": "Havana Shade", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "haveibeenpwned": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "HaveIBeenPwned", "integration_type": "hub", - "name": "HaveIBeenPwned" + "config_flow": false, + "iot_class": "cloud_polling" }, "hddtemp": { - "config_flow": false, - "iot_class": "local_polling", + "name": "hddtemp", "integration_type": "hub", - "name": "hddtemp" + "config_flow": false, + "iot_class": "local_polling" }, "hdmi_cec": { - "config_flow": false, - "iot_class": "local_push", + "name": "HDMI-CEC", "integration_type": "hub", - "name": "HDMI-CEC" + "config_flow": false, + "iot_class": "local_push" }, "heatmiser": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Heatmiser", "integration_type": "hub", - "name": "Heatmiser" + "config_flow": false, + "iot_class": "local_polling" + }, + "heiwa": { + "name": "Heiwa", + "integration_type": "virtual", + "supported_by": "gree" }, "here_travel_time": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "HERE Travel Time", "integration_type": "hub", - "name": "HERE Travel Time" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "hi_kumo": { + "name": "Hitachi Hi Kumo", + "integration_type": "virtual", + "supported_by": "overkiz" }, "hikvision": { "name": "Hikvision", @@ -2082,64 +2174,61 @@ } }, "hisense_aehw4a1": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Hisense AEH-W4A1", "integration_type": "hub", - "name": "Hisense AEH-W4A1" + "config_flow": true, + "iot_class": "local_polling" }, "history_stats": { - "config_flow": false, - "iot_class": "local_polling", + "name": "History Stats", "integration_type": "hub", - "name": "History Stats" + "config_flow": false, + "iot_class": "local_polling" }, "hitron_coda": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Rogers Hitron CODA", "integration_type": "hub", - "name": "Rogers Hitron CODA" + "config_flow": false, + "iot_class": "local_polling" }, "hive": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Hive", "integration_type": "hub", - "name": "Hive" + "config_flow": true, + "iot_class": "cloud_polling" }, "hlk_sw16": { - "config_flow": true, - "iot_class": "local_push", + "name": "Hi-Link HLK-SW16", "integration_type": "hub", - "name": "Hi-Link HLK-SW16" + "config_flow": true, + "iot_class": "local_push" }, "home_connect": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Home Connect", "integration_type": "hub", - "name": "Home Connect" + "config_flow": true, + "iot_class": "cloud_push" }, "home_plus_control": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Legrand Home+ Control", "integration_type": "hub", - "name": "Legrand Home+ Control" + "config_flow": true, + "iot_class": "cloud_polling" }, "homeassistant_alerts": { - "config_flow": false, - "iot_class": null, + "name": "Home Assistant Alerts", "integration_type": "hub", - "name": "Home Assistant Alerts" + "config_flow": false }, "homeassistant_sky_connect": { - "config_flow": false, - "iot_class": null, + "name": "Home Assistant Sky Connect", "integration_type": "hardware", - "name": "Home Assistant Sky Connect" + "config_flow": false }, "homeassistant_yellow": { - "config_flow": false, - "iot_class": null, + "name": "Home Assistant Yellow", "integration_type": "hardware", - "name": "Home Assistant Yellow" + "config_flow": false }, "homematic": { "name": "Homematic", @@ -2159,10 +2248,10 @@ } }, "homewizard": { - "config_flow": true, - "iot_class": "local_polling", + "name": "HomeWizard Energy", "integration_type": "hub", - "name": "HomeWizard Energy" + "config_flow": true, + "iot_class": "local_polling" }, "honeywell": { "name": "Honeywell", @@ -2188,76 +2277,81 @@ } }, "horizon": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Unitymedia Horizon HD Recorder", "integration_type": "hub", - "name": "Unitymedia Horizon HD Recorder" + "config_flow": false, + "iot_class": "local_polling" }, "hp_ilo": { - "config_flow": false, - "iot_class": "local_polling", + "name": "HP Integrated Lights-Out (ILO)", "integration_type": "hub", - "name": "HP Integrated Lights-Out (ILO)" + "config_flow": false, + "iot_class": "local_polling" }, "html5": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "HTML5 Push Notifications", "integration_type": "hub", - "name": "HTML5 Push Notifications" + "config_flow": false, + "iot_class": "cloud_push" }, "huawei_lte": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Huawei LTE", "integration_type": "hub", - "name": "Huawei LTE" + "config_flow": true, + "iot_class": "local_polling" }, "huisbaasje": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Huisbaasje", "integration_type": "hub", - "name": "Huisbaasje" + "config_flow": true, + "iot_class": "cloud_polling" }, "hunterdouglas_powerview": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Hunter Douglas PowerView", "integration_type": "hub", - "name": "Hunter Douglas PowerView" + "config_flow": true, + "iot_class": "local_polling" + }, + "hurrican_shutters_wholesale": { + "name": "Hurrican Shutters Wholesale", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "hvv_departures": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "HVV Departures", "integration_type": "hub", - "name": "HVV Departures" + "config_flow": true, + "iot_class": "cloud_polling" }, "hydrawise": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Hunter Hydrawise", "integration_type": "hub", - "name": "Hunter Hydrawise" + "config_flow": false, + "iot_class": "cloud_polling" }, "hyperion": { - "config_flow": true, - "iot_class": "local_push", + "name": "Hyperion", "integration_type": "hub", - "name": "Hyperion" + "config_flow": true, + "iot_class": "local_push" }, "ialarm": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Antifurto365 iAlarm", "integration_type": "hub", - "name": "Antifurto365 iAlarm" + "config_flow": true, + "iot_class": "local_polling" }, "iammeter": { - "config_flow": false, - "iot_class": "local_polling", + "name": "IamMeter", "integration_type": "hub", - "name": "IamMeter" + "config_flow": false, + "iot_class": "local_polling" }, "iaqualink": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Jandy iAqualink", "integration_type": "hub", - "name": "Jandy iAqualink" + "config_flow": true, + "iot_class": "cloud_polling" }, "ibm": { "name": "IBM", @@ -2277,64 +2371,64 @@ } }, "idteck_prox": { - "config_flow": false, - "iot_class": "local_push", + "name": "IDTECK Proximity Reader", "integration_type": "hub", - "name": "IDTECK Proximity Reader" + "config_flow": false, + "iot_class": "local_push" }, "ifttt": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "IFTTT", "integration_type": "hub", - "name": "IFTTT" + "config_flow": true, + "iot_class": "cloud_push" }, "iglo": { - "config_flow": false, - "iot_class": "local_polling", + "name": "iGlo", "integration_type": "hub", - "name": "iGlo" + "config_flow": false, + "iot_class": "local_polling" }, "ign_sismologia": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "IGN Sismolog\u00eda", "integration_type": "hub", - "name": "IGN Sismolog\u00eda" + "config_flow": false, + "iot_class": "cloud_polling" }, "ihc": { - "config_flow": false, - "iot_class": "local_push", + "name": "IHC Controller", "integration_type": "hub", - "name": "IHC Controller" + "config_flow": false, + "iot_class": "local_push" }, "imap": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "IMAP", "integration_type": "hub", - "name": "IMAP" + "config_flow": false, + "iot_class": "cloud_push" }, "imap_email_content": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "IMAP Email Content", "integration_type": "hub", - "name": "IMAP Email Content" + "config_flow": false, + "iot_class": "cloud_push" }, "incomfort": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Intergas InComfort/Intouch Lan2RF gateway", "integration_type": "hub", - "name": "Intergas InComfort/Intouch Lan2RF gateway" + "config_flow": false, + "iot_class": "local_polling" }, "influxdb": { - "config_flow": false, - "iot_class": "local_push", + "name": "InfluxDB", "integration_type": "hub", - "name": "InfluxDB" + "config_flow": false, + "iot_class": "local_push" }, "inkbird": { - "config_flow": true, - "iot_class": "local_push", + "name": "INKBIRD", "integration_type": "hub", - "name": "INKBIRD" + "config_flow": true, + "iot_class": "local_push" }, "inovelli": { "name": "Inovelli", @@ -2343,94 +2437,103 @@ "zwave" ] }, + "inspired_shades": { + "name": "Inspired Shades", + "integration_type": "virtual", + "supported_by": "motion_blinds" + }, "insteon": { - "config_flow": true, - "iot_class": "local_push", + "name": "Insteon", "integration_type": "hub", - "name": "Insteon" + "config_flow": true, + "iot_class": "local_push" }, "intellifire": { - "config_flow": true, - "iot_class": "local_polling", + "name": "IntelliFire", "integration_type": "hub", - "name": "IntelliFire" + "config_flow": true, + "iot_class": "local_polling" }, "intent_script": { - "config_flow": false, - "iot_class": null, + "name": "Intent Script", "integration_type": "hub", - "name": "Intent Script" + "config_flow": false }, "intesishome": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "IntesisHome", "integration_type": "hub", - "name": "IntesisHome" + "config_flow": false, + "iot_class": "cloud_push" }, "ios": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Home Assistant iOS", "integration_type": "hub", - "name": "Home Assistant iOS" + "config_flow": true, + "iot_class": "cloud_push" }, "iotawatt": { - "config_flow": true, - "iot_class": "local_polling", + "name": "IoTaWatt", "integration_type": "hub", - "name": "IoTaWatt" + "config_flow": true, + "iot_class": "local_polling" }, "iperf3": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Iperf3", "integration_type": "hub", - "name": "Iperf3" + "config_flow": false, + "iot_class": "local_polling" }, "ipma": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Instituto Portugu\u00eas do Mar e Atmosfera (IPMA)", "integration_type": "hub", - "name": "Instituto Portugu\u00eas do Mar e Atmosfera (IPMA)" + "config_flow": true, + "iot_class": "cloud_polling" }, "ipp": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Internet Printing Protocol (IPP)", "integration_type": "hub", - "name": "Internet Printing Protocol (IPP)" + "config_flow": true, + "iot_class": "local_polling" }, "iqvia": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "IQVIA", "integration_type": "hub", - "name": "IQVIA" + "config_flow": true, + "iot_class": "cloud_polling" }, "irish_rail_transport": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Irish Rail Transport", "integration_type": "hub", - "name": "Irish Rail Transport" + "config_flow": false, + "iot_class": "cloud_polling" }, "islamic_prayer_times": { + "integration_type": "hub", "config_flow": true, - "iot_class": "cloud_polling", - "integration_type": "hub" + "iot_class": "cloud_polling" + }, + "ismartwindow": { + "name": "iSmartWindow", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "iss": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "International Space Station (ISS)", "integration_type": "hub", - "name": "International Space Station (ISS)" + "config_flow": true, + "iot_class": "cloud_polling" }, "isy994": { - "config_flow": true, - "iot_class": "local_push", + "name": "Universal Devices ISY994", "integration_type": "hub", - "name": "Universal Devices ISY994" + "config_flow": true, + "iot_class": "local_push" }, "izone": { - "config_flow": true, - "iot_class": "local_polling", + "name": "iZone", "integration_type": "hub", - "name": "iZone" + "config_flow": true, + "iot_class": "local_polling" }, "jasco": { "name": "Jasco", @@ -2439,214 +2542,219 @@ ] }, "jellyfin": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Jellyfin", "integration_type": "hub", - "name": "Jellyfin" + "config_flow": true, + "iot_class": "local_polling" }, "jewish_calendar": { - "config_flow": false, - "iot_class": "calculated", + "name": "Jewish Calendar", "integration_type": "hub", - "name": "Jewish Calendar" + "config_flow": false, + "iot_class": "calculated" }, "joaoapps_join": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Joaoapps Join", "integration_type": "hub", - "name": "Joaoapps Join" + "config_flow": false, + "iot_class": "cloud_push" }, "juicenet": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "JuiceNet", "integration_type": "hub", - "name": "JuiceNet" + "config_flow": true, + "iot_class": "cloud_polling" }, "justnimbus": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "JustNimbus", "integration_type": "hub", - "name": "JustNimbus" + "config_flow": true, + "iot_class": "cloud_polling" }, "kaiterra": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Kaiterra", "integration_type": "hub", - "name": "Kaiterra" + "config_flow": false, + "iot_class": "cloud_polling" }, "kaleidescape": { - "config_flow": true, - "iot_class": "local_push", + "name": "Kaleidescape", "integration_type": "hub", - "name": "Kaleidescape" + "config_flow": true, + "iot_class": "local_push" }, "kankun": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Kankun", "integration_type": "hub", - "name": "Kankun" + "config_flow": false, + "iot_class": "local_polling" }, "keba": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Keba Charging Station", "integration_type": "hub", - "name": "Keba Charging Station" + "config_flow": false, + "iot_class": "local_polling" }, "keenetic_ndms2": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Keenetic NDMS2 Router", "integration_type": "hub", - "name": "Keenetic NDMS2 Router" + "config_flow": true, + "iot_class": "local_polling" }, "kef": { - "config_flow": false, - "iot_class": "local_polling", + "name": "KEF", "integration_type": "hub", - "name": "KEF" + "config_flow": false, + "iot_class": "local_polling" }, "kegtron": { - "config_flow": true, - "iot_class": "local_push", + "name": "Kegtron", "integration_type": "hub", - "name": "Kegtron" + "config_flow": true, + "iot_class": "local_push" }, "keyboard": { - "config_flow": false, - "iot_class": "local_push", + "name": "Keyboard", "integration_type": "hub", - "name": "Keyboard" + "config_flow": false, + "iot_class": "local_push" }, "keyboard_remote": { - "config_flow": false, - "iot_class": "local_push", + "name": "Keyboard Remote", "integration_type": "hub", - "name": "Keyboard Remote" + "config_flow": false, + "iot_class": "local_push" }, "keymitt_ble": { - "config_flow": true, - "iot_class": "assumed_state", + "name": "Keymitt MicroBot Push", "integration_type": "hub", - "name": "Keymitt MicroBot Push" + "config_flow": true, + "iot_class": "assumed_state" }, "kira": { - "config_flow": false, - "iot_class": "local_push", + "name": "Kira", "integration_type": "hub", - "name": "Kira" + "config_flow": false, + "iot_class": "local_push" }, "kiwi": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "KIWI", "integration_type": "hub", - "name": "KIWI" + "config_flow": false, + "iot_class": "cloud_polling" }, "kmtronic": { - "config_flow": true, - "iot_class": "local_push", + "name": "KMtronic", "integration_type": "hub", - "name": "KMtronic" + "config_flow": true, + "iot_class": "local_push" }, "knx": { - "config_flow": true, - "iot_class": "local_push", + "name": "KNX", "integration_type": "hub", - "name": "KNX" + "config_flow": true, + "iot_class": "local_push" }, "kodi": { - "config_flow": true, - "iot_class": "local_push", + "name": "Kodi", "integration_type": "hub", - "name": "Kodi" + "config_flow": true, + "iot_class": "local_push" }, "konnected": { - "config_flow": true, - "iot_class": "local_push", + "name": "Konnected.io", "integration_type": "hub", - "name": "Konnected.io" + "config_flow": true, + "iot_class": "local_push" }, "kostal_plenticore": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Kostal Plenticore Solar Inverter", "integration_type": "hub", - "name": "Kostal Plenticore Solar Inverter" + "config_flow": true, + "iot_class": "local_polling" }, "kraken": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Kraken", "integration_type": "hub", - "name": "Kraken" + "config_flow": true, + "iot_class": "cloud_polling" }, "kulersky": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Kuler Sky", "integration_type": "hub", - "name": "Kuler Sky" + "config_flow": true, + "iot_class": "local_polling" }, "kwb": { - "config_flow": false, - "iot_class": "local_polling", + "name": "KWB Easyfire", "integration_type": "hub", - "name": "KWB Easyfire" + "config_flow": false, + "iot_class": "local_polling" }, "lacrosse": { - "config_flow": false, - "iot_class": "local_polling", + "name": "LaCrosse", "integration_type": "hub", - "name": "LaCrosse" + "config_flow": false, + "iot_class": "local_polling" }, "lacrosse_view": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "LaCrosse View", "integration_type": "hub", - "name": "LaCrosse View" + "config_flow": true, + "iot_class": "cloud_polling" }, "lametric": { - "config_flow": true, - "iot_class": "local_polling", + "name": "LaMetric", "integration_type": "hub", - "name": "LaMetric" + "config_flow": true, + "iot_class": "local_polling" }, "landisgyr_heat_meter": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Landis+Gyr Heat Meter", "integration_type": "hub", - "name": "Landis+Gyr Heat Meter" + "config_flow": true, + "iot_class": "local_polling" }, "lannouncer": { - "config_flow": false, - "iot_class": "local_push", + "name": "LANnouncer", "integration_type": "hub", - "name": "LANnouncer" + "config_flow": false, + "iot_class": "local_push" }, "lastfm": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Last.fm", "integration_type": "hub", - "name": "Last.fm" + "config_flow": false, + "iot_class": "cloud_polling" }, "launch_library": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Launch Library", "integration_type": "hub", - "name": "Launch Library" + "config_flow": true, + "iot_class": "cloud_polling" }, "laundrify": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "laundrify", "integration_type": "hub", - "name": "laundrify" + "config_flow": true, + "iot_class": "cloud_polling" }, "lcn": { - "config_flow": false, - "iot_class": "local_push", + "name": "LCN", "integration_type": "hub", - "name": "LCN" + "config_flow": false, + "iot_class": "local_push" }, "led_ble": { - "config_flow": true, - "iot_class": "local_polling", + "name": "LED BLE", "integration_type": "hub", - "name": "LED BLE" + "config_flow": true, + "iot_class": "local_polling" + }, + "legrand": { + "name": "Legrand", + "integration_type": "virtual", + "supported_by": "netatmo" }, "leviton": { "name": "Leviton", @@ -2678,111 +2786,111 @@ } }, "lidarr": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Lidarr", "integration_type": "hub", - "name": "Lidarr" + "config_flow": true, + "iot_class": "local_polling" }, "life360": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Life360", "integration_type": "hub", - "name": "Life360" + "config_flow": true, + "iot_class": "cloud_polling" }, "lifx": { - "config_flow": true, - "iot_class": "local_polling", + "name": "LIFX", "integration_type": "hub", - "name": "LIFX" + "config_flow": true, + "iot_class": "local_polling" }, "lifx_cloud": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "LIFX Cloud", "integration_type": "hub", - "name": "LIFX Cloud" + "config_flow": false, + "iot_class": "cloud_push" }, "lightwave": { - "config_flow": false, - "iot_class": "assumed_state", + "name": "Lightwave", "integration_type": "hub", - "name": "Lightwave" + "config_flow": false, + "iot_class": "assumed_state" }, "limitlessled": { - "config_flow": false, - "iot_class": "assumed_state", + "name": "LimitlessLED", "integration_type": "hub", - "name": "LimitlessLED" + "config_flow": false, + "iot_class": "assumed_state" }, "linksys_smart": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Linksys Smart Wi-Fi", "integration_type": "hub", - "name": "Linksys Smart Wi-Fi" + "config_flow": false, + "iot_class": "local_polling" }, "linode": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Linode", "integration_type": "hub", - "name": "Linode" + "config_flow": false, + "iot_class": "cloud_polling" }, "linux_battery": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Linux Battery", "integration_type": "hub", - "name": "Linux Battery" + "config_flow": false, + "iot_class": "local_polling" }, "lirc": { - "config_flow": false, - "iot_class": "local_push", + "name": "LIRC", "integration_type": "hub", - "name": "LIRC" + "config_flow": false, + "iot_class": "local_push" }, "litejet": { - "config_flow": true, - "iot_class": "local_push", + "name": "LiteJet", "integration_type": "hub", - "name": "LiteJet" + "config_flow": true, + "iot_class": "local_push" }, "litterrobot": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Litter-Robot", "integration_type": "hub", - "name": "Litter-Robot" + "config_flow": true, + "iot_class": "cloud_push" }, "llamalab_automate": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "LlamaLab Automate", "integration_type": "hub", - "name": "LlamaLab Automate" + "config_flow": false, + "iot_class": "cloud_push" }, "local_file": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Local File", "integration_type": "hub", - "name": "Local File" + "config_flow": false, + "iot_class": "local_polling" }, "local_ip": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_polling", - "integration_type": "hub" + "iot_class": "local_polling" }, "locative": { - "config_flow": true, - "iot_class": "local_push", + "name": "Locative", "integration_type": "hub", - "name": "Locative" + "config_flow": true, + "iot_class": "local_push" }, "logentries": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Logentries", "integration_type": "hub", - "name": "Logentries" + "config_flow": false, + "iot_class": "cloud_push" }, "logi_circle": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Logi Circle", "integration_type": "hub", - "name": "Logi Circle" + "config_flow": true, + "iot_class": "cloud_polling" }, "logitech": { "name": "Logitech", @@ -2808,34 +2916,34 @@ } }, "london_air": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "London Air", "integration_type": "hub", - "name": "London Air" + "config_flow": false, + "iot_class": "cloud_polling" }, "london_underground": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "London Underground", "integration_type": "hub", - "name": "London Underground" + "config_flow": false, + "iot_class": "cloud_polling" }, "lookin": { - "config_flow": true, - "iot_class": "local_push", + "name": "LOOKin", "integration_type": "hub", - "name": "LOOKin" + "config_flow": true, + "iot_class": "local_push" }, "luftdaten": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Sensor.Community", "integration_type": "hub", - "name": "Sensor.Community" + "config_flow": true, + "iot_class": "cloud_polling" }, "lupusec": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Lupus Electronics LUPUSEC", "integration_type": "hub", - "name": "Lupus Electronics LUPUSEC" + "config_flow": false, + "iot_class": "local_polling" }, "lutron": { "name": "Lutron", @@ -2860,89 +2968,103 @@ } } }, + "luxaflex": { + "name": "Luxaflex", + "integration_type": "virtual", + "supported_by": "hunterdouglas_powerview" + }, "lw12wifi": { - "config_flow": false, - "iot_class": "local_polling", + "name": "LAGUTE LW-12", "integration_type": "hub", - "name": "LAGUTE LW-12" + "config_flow": false, + "iot_class": "local_polling" }, "magicseaweed": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Magicseaweed", "integration_type": "hub", - "name": "Magicseaweed" + "config_flow": false, + "iot_class": "cloud_polling" }, "mailgun": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Mailgun", "integration_type": "hub", - "name": "Mailgun" + "config_flow": true, + "iot_class": "cloud_push" }, "manual": { - "config_flow": false, - "iot_class": "calculated", + "name": "Manual Alarm Control Panel", "integration_type": "hub", - "name": "Manual Alarm Control Panel" + "config_flow": false, + "iot_class": "calculated" }, "map": { - "config_flow": false, - "iot_class": null, + "name": "Map", "integration_type": "hub", - "name": "Map" + "config_flow": false + }, + "marantz": { + "name": "Marantz", + "integration_type": "virtual", + "supported_by": "denonavr" + }, + "martec": { + "name": "Martec", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "marytts": { - "config_flow": false, - "iot_class": "local_push", + "name": "MaryTTS", "integration_type": "hub", - "name": "MaryTTS" + "config_flow": false, + "iot_class": "local_push" }, "mastodon": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Mastodon", "integration_type": "hub", - "name": "Mastodon" + "config_flow": false, + "iot_class": "cloud_push" }, "matrix": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Matrix", "integration_type": "hub", - "name": "Matrix" + "config_flow": false, + "iot_class": "cloud_push" }, "mazda": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Mazda Connected Services", "integration_type": "hub", - "name": "Mazda Connected Services" + "config_flow": true, + "iot_class": "cloud_polling" }, "meater": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Meater", "integration_type": "hub", - "name": "Meater" + "config_flow": true, + "iot_class": "cloud_polling" }, "media_extractor": { - "config_flow": false, - "iot_class": "calculated", + "name": "Media Extractor", "integration_type": "hub", - "name": "Media Extractor" + "config_flow": false, + "iot_class": "calculated" }, "mediaroom": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Mediaroom", "integration_type": "hub", - "name": "Mediaroom" + "config_flow": false, + "iot_class": "local_polling" }, "melcloud": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "MELCloud", "integration_type": "hub", - "name": "MELCloud" + "config_flow": true, + "iot_class": "cloud_polling" }, "melissa": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Melissa", "integration_type": "hub", - "name": "Melissa" + "config_flow": false, + "iot_class": "cloud_polling" }, "melnor": { "name": "Melnor", @@ -2962,58 +3084,58 @@ } }, "meraki": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Meraki", "integration_type": "hub", - "name": "Meraki" + "config_flow": false, + "iot_class": "cloud_polling" }, "message_bird": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "MessageBird", "integration_type": "hub", - "name": "MessageBird" + "config_flow": false, + "iot_class": "cloud_push" }, "met": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Meteorologisk institutt (Met.no)", "integration_type": "hub", - "name": "Meteorologisk institutt (Met.no)" + "config_flow": true, + "iot_class": "cloud_polling" }, "met_eireann": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Met \u00c9ireann", "integration_type": "hub", - "name": "Met \u00c9ireann" + "config_flow": true, + "iot_class": "cloud_polling" }, "meteo_france": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "M\u00e9t\u00e9o-France", "integration_type": "hub", - "name": "M\u00e9t\u00e9o-France" + "config_flow": true, + "iot_class": "cloud_polling" }, "meteoalarm": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "MeteoAlarm", "integration_type": "hub", - "name": "MeteoAlarm" + "config_flow": false, + "iot_class": "cloud_polling" }, "meteoclimatic": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Meteoclimatic", "integration_type": "hub", - "name": "Meteoclimatic" + "config_flow": true, + "iot_class": "cloud_polling" }, "metoffice": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Met Office", "integration_type": "hub", - "name": "Met Office" + "config_flow": true, + "iot_class": "cloud_polling" }, "mfi": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Ubiquiti mFi mPort", "integration_type": "hub", - "name": "Ubiquiti mFi mPort" + "config_flow": false, + "iot_class": "local_polling" }, "microsoft": { "name": "Microsoft", @@ -3081,121 +3203,121 @@ } }, "miflora": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Mi Flora", "integration_type": "hub", - "name": "Mi Flora" + "config_flow": false, + "iot_class": "local_polling" }, "mikrotik": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Mikrotik", "integration_type": "hub", - "name": "Mikrotik" + "config_flow": true, + "iot_class": "local_polling" }, "mill": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Mill", "integration_type": "hub", - "name": "Mill" + "config_flow": true, + "iot_class": "local_polling" }, "minecraft_server": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Minecraft Server", "integration_type": "hub", - "name": "Minecraft Server" + "config_flow": true, + "iot_class": "local_polling" }, "minio": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Minio", "integration_type": "hub", - "name": "Minio" + "config_flow": false, + "iot_class": "cloud_push" }, "mitemp_bt": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Xiaomi Mijia BLE Temperature and Humidity Sensor", "integration_type": "hub", - "name": "Xiaomi Mijia BLE Temperature and Humidity Sensor" + "config_flow": false, + "iot_class": "local_polling" }, "mjpeg": { - "config_flow": true, - "iot_class": "local_push", + "name": "MJPEG IP Camera", "integration_type": "hub", - "name": "MJPEG IP Camera" + "config_flow": true, + "iot_class": "local_push" }, "moat": { - "config_flow": true, - "iot_class": "local_push", + "name": "Moat", "integration_type": "hub", - "name": "Moat" + "config_flow": true, + "iot_class": "local_push" }, "mobile_app": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_push", - "integration_type": "hub" + "iot_class": "local_push" }, "mochad": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Mochad", "integration_type": "hub", - "name": "Mochad" + "config_flow": false, + "iot_class": "local_polling" }, "modbus": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Modbus", "integration_type": "hub", - "name": "Modbus" + "config_flow": false, + "iot_class": "local_polling" }, "modem_callerid": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Phone Modem", "integration_type": "hub", - "name": "Phone Modem" + "config_flow": true, + "iot_class": "local_polling" }, "modern_forms": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Modern Forms", "integration_type": "hub", - "name": "Modern Forms" + "config_flow": true, + "iot_class": "local_polling" }, "moehlenhoff_alpha2": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_push", - "integration_type": "hub" + "iot_class": "local_push" }, "mold_indicator": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Mold Indicator", "integration_type": "hub", - "name": "Mold Indicator" + "config_flow": false, + "iot_class": "local_polling" }, "monoprice": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Monoprice 6-Zone Amplifier", "integration_type": "hub", - "name": "Monoprice 6-Zone Amplifier" + "config_flow": true, + "iot_class": "local_polling" }, "moon": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_polling", - "integration_type": "hub" + "iot_class": "local_polling" }, "motion_blinds": { - "config_flow": true, - "iot_class": "local_push", + "name": "Motion Blinds", "integration_type": "hub", - "name": "Motion Blinds" + "config_flow": true, + "iot_class": "local_push" }, "motioneye": { - "config_flow": true, - "iot_class": "local_polling", + "name": "motionEye", "integration_type": "hub", - "name": "motionEye" + "config_flow": true, + "iot_class": "local_polling" }, "mpd": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Music Player Daemon (MPD)", "integration_type": "hub", - "name": "Music Player Daemon (MPD)" + "config_flow": false, + "iot_class": "local_polling" }, "mqtt": { "name": "MQTT", @@ -3239,106 +3361,106 @@ } }, "mullvad": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Mullvad VPN", "integration_type": "hub", - "name": "Mullvad VPN" + "config_flow": true, + "iot_class": "cloud_polling" }, "mutesync": { - "config_flow": true, - "iot_class": "local_polling", + "name": "mutesync", "integration_type": "hub", - "name": "mutesync" + "config_flow": true, + "iot_class": "local_polling" }, "mvglive": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "MVG", "integration_type": "hub", - "name": "MVG" + "config_flow": false, + "iot_class": "cloud_polling" }, "mycroft": { - "config_flow": false, - "iot_class": "local_push", + "name": "Mycroft", "integration_type": "hub", - "name": "Mycroft" + "config_flow": false, + "iot_class": "local_push" }, "myq": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "MyQ", "integration_type": "hub", - "name": "MyQ" + "config_flow": true, + "iot_class": "cloud_polling" }, "mysensors": { - "config_flow": true, - "iot_class": "local_push", + "name": "MySensors", "integration_type": "hub", - "name": "MySensors" + "config_flow": true, + "iot_class": "local_push" }, "mystrom": { - "config_flow": false, - "iot_class": "local_polling", + "name": "myStrom", "integration_type": "hub", - "name": "myStrom" + "config_flow": false, + "iot_class": "local_polling" }, "mythicbeastsdns": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Mythic Beasts DNS", "integration_type": "hub", - "name": "Mythic Beasts DNS" + "config_flow": false, + "iot_class": "cloud_push" }, "nad": { - "config_flow": false, - "iot_class": "local_polling", + "name": "NAD", "integration_type": "hub", - "name": "NAD" + "config_flow": false, + "iot_class": "local_polling" }, "nam": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Nettigo Air Monitor", "integration_type": "hub", - "name": "Nettigo Air Monitor" + "config_flow": true, + "iot_class": "local_polling" }, "namecheapdns": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Namecheap FreeDNS", "integration_type": "hub", - "name": "Namecheap FreeDNS" + "config_flow": false, + "iot_class": "cloud_push" }, "nanoleaf": { - "config_flow": true, - "iot_class": "local_push", + "name": "Nanoleaf", "integration_type": "hub", - "name": "Nanoleaf" + "config_flow": true, + "iot_class": "local_push" }, "neato": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Neato Botvac", "integration_type": "hub", - "name": "Neato Botvac" + "config_flow": true, + "iot_class": "cloud_polling" }, "nederlandse_spoorwegen": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Nederlandse Spoorwegen (NS)", "integration_type": "hub", - "name": "Nederlandse Spoorwegen (NS)" + "config_flow": false, + "iot_class": "cloud_polling" }, "ness_alarm": { - "config_flow": false, - "iot_class": "local_push", + "name": "Ness Alarm", "integration_type": "hub", - "name": "Ness Alarm" + "config_flow": false, + "iot_class": "local_push" }, "netatmo": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Netatmo", "integration_type": "hub", - "name": "Netatmo" + "config_flow": true, + "iot_class": "cloud_polling" }, "netdata": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Netdata", "integration_type": "hub", - "name": "Netdata" + "config_flow": false, + "iot_class": "local_polling" }, "netgear": { "name": "NETGEAR", @@ -3358,345 +3480,355 @@ } }, "netio": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Netio", "integration_type": "hub", - "name": "Netio" + "config_flow": false, + "iot_class": "local_polling" }, "neurio_energy": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Neurio energy", "integration_type": "hub", - "name": "Neurio energy" + "config_flow": false, + "iot_class": "cloud_polling" }, "nexia": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Nexia/American Standard/Trane", "integration_type": "hub", - "name": "Nexia/American Standard/Trane" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "nexity": { + "name": "Nexity Eug\u00e9nie", + "integration_type": "virtual", + "supported_by": "overkiz" }, "nextbus": { - "config_flow": false, - "iot_class": "local_polling", + "name": "NextBus", "integration_type": "hub", - "name": "NextBus" + "config_flow": false, + "iot_class": "local_polling" }, "nextcloud": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Nextcloud", "integration_type": "hub", - "name": "Nextcloud" + "config_flow": false, + "iot_class": "cloud_polling" }, "nextdns": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "NextDNS", "integration_type": "hub", - "name": "NextDNS" + "config_flow": true, + "iot_class": "cloud_polling" }, "nfandroidtv": { - "config_flow": true, - "iot_class": "local_push", + "name": "Notifications for Android TV / Fire TV", "integration_type": "hub", - "name": "Notifications for Android TV / Fire TV" + "config_flow": true, + "iot_class": "local_push" }, "nibe_heatpump": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Nibe Heat Pump", "integration_type": "hub", - "name": "Nibe Heat Pump" + "config_flow": true, + "iot_class": "local_polling" }, "nightscout": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Nightscout", "integration_type": "hub", - "name": "Nightscout" + "config_flow": true, + "iot_class": "cloud_polling" }, "niko_home_control": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Niko Home Control", "integration_type": "hub", - "name": "Niko Home Control" + "config_flow": false, + "iot_class": "local_polling" }, "nilu": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Norwegian Institute for Air Research (NILU)", "integration_type": "hub", - "name": "Norwegian Institute for Air Research (NILU)" + "config_flow": false, + "iot_class": "cloud_polling" }, "nina": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "NINA", "integration_type": "hub", - "name": "NINA" + "config_flow": true, + "iot_class": "cloud_polling" }, "nissan_leaf": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Nissan Leaf", "integration_type": "hub", - "name": "Nissan Leaf" + "config_flow": false, + "iot_class": "cloud_polling" }, "nmap_tracker": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_polling", - "integration_type": "hub" + "iot_class": "local_polling" }, "nmbs": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "NMBS", "integration_type": "hub", - "name": "NMBS" + "config_flow": false, + "iot_class": "cloud_polling" }, "no_ip": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "No-IP.com", "integration_type": "hub", - "name": "No-IP.com" + "config_flow": false, + "iot_class": "cloud_polling" }, "noaa_tides": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "NOAA Tides", "integration_type": "hub", - "name": "NOAA Tides" + "config_flow": false, + "iot_class": "cloud_polling" }, "nobo_hub": { - "config_flow": true, - "iot_class": "local_push", + "name": "Nob\u00f8 Ecohub", "integration_type": "hub", - "name": "Nob\u00f8 Ecohub" + "config_flow": true, + "iot_class": "local_push" }, "norway_air": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Om Luftkvalitet i Norge (Norway Air)", "integration_type": "hub", - "name": "Om Luftkvalitet i Norge (Norway Air)" + "config_flow": false, + "iot_class": "cloud_polling" }, "notify_events": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Notify.Events", "integration_type": "hub", - "name": "Notify.Events" + "config_flow": false, + "iot_class": "cloud_push" }, "notion": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Notion", "integration_type": "hub", - "name": "Notion" + "config_flow": true, + "iot_class": "cloud_polling" }, "nsw_fuel_station": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "NSW Fuel Station Price", "integration_type": "hub", - "name": "NSW Fuel Station Price" + "config_flow": false, + "iot_class": "cloud_polling" }, "nsw_rural_fire_service_feed": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "NSW Rural Fire Service Incidents", "integration_type": "hub", - "name": "NSW Rural Fire Service Incidents" + "config_flow": false, + "iot_class": "cloud_polling" }, "nuheat": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "NuHeat", "integration_type": "hub", - "name": "NuHeat" + "config_flow": true, + "iot_class": "cloud_polling" }, "nuki": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Nuki", "integration_type": "hub", - "name": "Nuki" + "config_flow": true, + "iot_class": "local_polling" }, "numato": { - "config_flow": false, - "iot_class": "local_push", + "name": "Numato USB GPIO Expander", "integration_type": "hub", - "name": "Numato USB GPIO Expander" + "config_flow": false, + "iot_class": "local_push" }, "nut": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Network UPS Tools (NUT)", "integration_type": "hub", - "name": "Network UPS Tools (NUT)" + "config_flow": true, + "iot_class": "local_polling" + }, + "nutrichef": { + "name": "Nutrichef", + "integration_type": "virtual", + "supported_by": "inkbird" }, "nws": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "National Weather Service (NWS)", "integration_type": "hub", - "name": "National Weather Service (NWS)" + "config_flow": true, + "iot_class": "cloud_polling" }, "nx584": { - "config_flow": false, - "iot_class": "local_push", + "name": "NX584", "integration_type": "hub", - "name": "NX584" + "config_flow": false, + "iot_class": "local_push" }, "nzbget": { - "config_flow": true, - "iot_class": "local_polling", + "name": "NZBGet", "integration_type": "hub", - "name": "NZBGet" + "config_flow": true, + "iot_class": "local_polling" }, "oasa_telematics": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "OASA Telematics", "integration_type": "hub", - "name": "OASA Telematics" + "config_flow": false, + "iot_class": "cloud_polling" }, "obihai": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Obihai", "integration_type": "hub", - "name": "Obihai" + "config_flow": false, + "iot_class": "local_polling" }, "octoprint": { - "config_flow": true, - "iot_class": "local_polling", + "name": "OctoPrint", "integration_type": "hub", - "name": "OctoPrint" + "config_flow": true, + "iot_class": "local_polling" }, "oem": { - "config_flow": false, - "iot_class": "local_polling", + "name": "OpenEnergyMonitor WiFi Thermostat", "integration_type": "hub", - "name": "OpenEnergyMonitor WiFi Thermostat" + "config_flow": false, + "iot_class": "local_polling" }, "ohmconnect": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "OhmConnect", "integration_type": "hub", - "name": "OhmConnect" + "config_flow": false, + "iot_class": "cloud_polling" }, "ombi": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Ombi", "integration_type": "hub", - "name": "Ombi" + "config_flow": false, + "iot_class": "local_polling" }, "omnilogic": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Hayward Omnilogic", "integration_type": "hub", - "name": "Hayward Omnilogic" + "config_flow": true, + "iot_class": "cloud_polling" }, "oncue": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Oncue by Kohler", "integration_type": "hub", - "name": "Oncue by Kohler" + "config_flow": true, + "iot_class": "cloud_polling" }, "ondilo_ico": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Ondilo ICO", "integration_type": "hub", - "name": "Ondilo ICO" + "config_flow": true, + "iot_class": "cloud_polling" }, "onewire": { - "config_flow": true, - "iot_class": "local_polling", + "name": "1-Wire", "integration_type": "hub", - "name": "1-Wire" + "config_flow": true, + "iot_class": "local_polling" }, "onkyo": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Onkyo", "integration_type": "hub", - "name": "Onkyo" + "config_flow": false, + "iot_class": "local_polling" }, "onvif": { - "config_flow": true, - "iot_class": "local_push", + "name": "ONVIF", "integration_type": "hub", - "name": "ONVIF" + "config_flow": true, + "iot_class": "local_push" }, "open_meteo": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Open-Meteo", "integration_type": "hub", - "name": "Open-Meteo" + "config_flow": true, + "iot_class": "cloud_polling" }, "openalpr_cloud": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "OpenALPR Cloud", "integration_type": "hub", - "name": "OpenALPR Cloud" + "config_flow": false, + "iot_class": "cloud_push" }, "openalpr_local": { - "config_flow": false, - "iot_class": "local_push", + "name": "OpenALPR Local", "integration_type": "hub", - "name": "OpenALPR Local" + "config_flow": false, + "iot_class": "local_push" }, "opencv": { - "config_flow": false, - "iot_class": "local_push", + "name": "OpenCV", "integration_type": "hub", - "name": "OpenCV" + "config_flow": false, + "iot_class": "local_push" }, "openerz": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Open ERZ", "integration_type": "hub", - "name": "Open ERZ" + "config_flow": false, + "iot_class": "cloud_polling" }, "openevse": { - "config_flow": false, - "iot_class": "local_polling", + "name": "OpenEVSE", "integration_type": "hub", - "name": "OpenEVSE" + "config_flow": false, + "iot_class": "local_polling" }, "openexchangerates": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Open Exchange Rates", "integration_type": "hub", - "name": "Open Exchange Rates" + "config_flow": true, + "iot_class": "cloud_polling" }, "opengarage": { - "config_flow": true, - "iot_class": "local_polling", + "name": "OpenGarage", "integration_type": "hub", - "name": "OpenGarage" + "config_flow": true, + "iot_class": "local_polling" }, "openhardwaremonitor": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Open Hardware Monitor", "integration_type": "hub", - "name": "Open Hardware Monitor" + "config_flow": false, + "iot_class": "local_polling" }, "openhome": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Linn / OpenHome", "integration_type": "hub", - "name": "Linn / OpenHome" + "config_flow": false, + "iot_class": "local_polling" }, "opensensemap": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "openSenseMap", "integration_type": "hub", - "name": "openSenseMap" + "config_flow": false, + "iot_class": "cloud_polling" }, "opensky": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "OpenSky Network", "integration_type": "hub", - "name": "OpenSky Network" + "config_flow": false, + "iot_class": "cloud_polling" }, "opentherm_gw": { - "config_flow": true, - "iot_class": "local_push", + "name": "OpenTherm Gateway", "integration_type": "hub", - "name": "OpenTherm Gateway" + "config_flow": true, + "iot_class": "local_push" }, "openuv": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "OpenUV", "integration_type": "hub", - "name": "OpenUV" + "config_flow": true, + "iot_class": "cloud_polling" }, "openweathermap": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "OpenWeatherMap", "integration_type": "hub", - "name": "OpenWeatherMap" + "config_flow": true, + "iot_class": "cloud_polling" }, "openwrt": { "name": "OpenWrt", @@ -3716,64 +3848,64 @@ } }, "opnsense": { - "config_flow": false, - "iot_class": "local_polling", + "name": "OPNSense", "integration_type": "hub", - "name": "OPNSense" + "config_flow": false, + "iot_class": "local_polling" }, "opple": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Opple", "integration_type": "hub", - "name": "Opple" + "config_flow": false, + "iot_class": "local_polling" }, "oru": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Orange and Rockland Utility (ORU)", "integration_type": "hub", - "name": "Orange and Rockland Utility (ORU)" + "config_flow": false, + "iot_class": "cloud_polling" }, "orvibo": { - "config_flow": false, - "iot_class": "local_push", + "name": "Orvibo", "integration_type": "hub", - "name": "Orvibo" + "config_flow": false, + "iot_class": "local_push" }, "osramlightify": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Osramlightify", "integration_type": "hub", - "name": "Osramlightify" + "config_flow": false, + "iot_class": "local_polling" }, "otp": { - "config_flow": false, - "iot_class": "local_polling", + "name": "One-Time Password (OTP)", "integration_type": "hub", - "name": "One-Time Password (OTP)" + "config_flow": false, + "iot_class": "local_polling" }, "overkiz": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Overkiz", "integration_type": "hub", - "name": "Overkiz" + "config_flow": true, + "iot_class": "cloud_polling" }, "ovo_energy": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "OVO Energy", "integration_type": "hub", - "name": "OVO Energy" + "config_flow": true, + "iot_class": "cloud_polling" }, "owntracks": { - "config_flow": true, - "iot_class": "local_push", + "name": "OwnTracks", "integration_type": "hub", - "name": "OwnTracks" + "config_flow": true, + "iot_class": "local_push" }, "p1_monitor": { - "config_flow": true, - "iot_class": "local_polling", + "name": "P1 Monitor", "integration_type": "hub", - "name": "P1 Monitor" + "config_flow": true, + "iot_class": "local_polling" }, "panasonic": { "name": "Panasonic", @@ -3793,40 +3925,43 @@ } }, "pandora": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Pandora", "integration_type": "hub", - "name": "Pandora" + "config_flow": false, + "iot_class": "local_polling" }, "panel_custom": { - "config_flow": false, - "iot_class": null, + "name": "Custom Panel", "integration_type": "hub", - "name": "Custom Panel" + "config_flow": false }, "panel_iframe": { - "config_flow": false, - "iot_class": null, + "name": "iframe Panel", "integration_type": "hub", - "name": "iframe Panel" + "config_flow": false + }, + "pcs_lighting": { + "name": "PCS Lighting", + "integration_type": "virtual", + "supported_by": "upb" }, "peco": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "PECO Outage Counter", "integration_type": "hub", - "name": "PECO Outage Counter" + "config_flow": true, + "iot_class": "cloud_polling" }, "pencom": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Pencom", "integration_type": "hub", - "name": "Pencom" + "config_flow": false, + "iot_class": "local_polling" }, "persistent_notification": { - "config_flow": false, - "iot_class": "local_push", + "name": "Persistent Notification", "integration_type": "hub", - "name": "Persistent Notification" + "config_flow": false, + "iot_class": "local_push" }, "philips": { "name": "Philips", @@ -3852,230 +3987,226 @@ } }, "pi_hole": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Pi-hole", "integration_type": "hub", - "name": "Pi-hole" + "config_flow": true, + "iot_class": "local_polling" }, "picnic": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Picnic", "integration_type": "hub", - "name": "Picnic" + "config_flow": true, + "iot_class": "cloud_polling" }, "picotts": { - "config_flow": false, - "iot_class": "local_push", + "name": "Pico TTS", "integration_type": "hub", - "name": "Pico TTS" + "config_flow": false, + "iot_class": "local_push" }, "pilight": { - "config_flow": false, - "iot_class": "local_push", + "name": "Pilight", "integration_type": "hub", - "name": "Pilight" + "config_flow": false, + "iot_class": "local_push" }, "ping": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Ping (ICMP)", "integration_type": "hub", - "name": "Ping (ICMP)" + "config_flow": false, + "iot_class": "local_polling" }, "pioneer": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Pioneer", "integration_type": "hub", - "name": "Pioneer" + "config_flow": false, + "iot_class": "local_polling" }, "pjlink": { - "config_flow": false, - "iot_class": "local_polling", + "name": "PJLink", "integration_type": "hub", - "name": "PJLink" + "config_flow": false, + "iot_class": "local_polling" }, "plaato": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Plaato", "integration_type": "hub", - "name": "Plaato" + "config_flow": true, + "iot_class": "cloud_push" }, "plant": { - "config_flow": false, - "iot_class": null, - "integration_type": "hub" + "integration_type": "hub", + "config_flow": false }, "plex": { - "config_flow": true, - "iot_class": "local_push", + "name": "Plex Media Server", "integration_type": "hub", - "name": "Plex Media Server" + "config_flow": true, + "iot_class": "local_push" }, "plugwise": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Plugwise", "integration_type": "hub", - "name": "Plugwise" + "config_flow": true, + "iot_class": "local_polling" }, "plum_lightpad": { - "config_flow": true, - "iot_class": "local_push", + "name": "Plum Lightpad", "integration_type": "hub", - "name": "Plum Lightpad" + "config_flow": true, + "iot_class": "local_push" }, "pocketcasts": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Pocket Casts", "integration_type": "hub", - "name": "Pocket Casts" + "config_flow": false, + "iot_class": "cloud_polling" }, "point": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Minut Point", "integration_type": "hub", - "name": "Minut Point" + "config_flow": true, + "iot_class": "cloud_polling" }, "poolsense": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "PoolSense", "integration_type": "hub", - "name": "PoolSense" + "config_flow": true, + "iot_class": "cloud_polling" }, "profiler": { - "config_flow": true, - "iot_class": null, + "name": "Profiler", "integration_type": "hub", - "name": "Profiler" + "config_flow": true }, "progettihwsw": { - "config_flow": true, - "iot_class": "local_polling", + "name": "ProgettiHWSW Automation", "integration_type": "hub", - "name": "ProgettiHWSW Automation" + "config_flow": true, + "iot_class": "local_polling" }, "proliphix": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Proliphix", "integration_type": "hub", - "name": "Proliphix" + "config_flow": false, + "iot_class": "local_polling" }, "prometheus": { - "config_flow": false, - "iot_class": "assumed_state", + "name": "Prometheus", "integration_type": "hub", - "name": "Prometheus" + "config_flow": false, + "iot_class": "assumed_state" }, "prosegur": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Prosegur Alarm", "integration_type": "hub", - "name": "Prosegur Alarm" + "config_flow": true, + "iot_class": "cloud_polling" }, "prowl": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Prowl", "integration_type": "hub", - "name": "Prowl" + "config_flow": false, + "iot_class": "cloud_push" }, "proximity": { + "integration_type": "hub", "config_flow": false, - "iot_class": "calculated", - "integration_type": "hub" + "iot_class": "calculated" }, "proxmoxve": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Proxmox VE", "integration_type": "hub", - "name": "Proxmox VE" + "config_flow": false, + "iot_class": "local_polling" }, "proxy": { - "config_flow": false, - "iot_class": null, + "name": "Camera Proxy", "integration_type": "hub", - "name": "Camera Proxy" + "config_flow": false }, "prusalink": { - "config_flow": true, - "iot_class": "local_polling", + "name": "PrusaLink", "integration_type": "hub", - "name": "PrusaLink" + "config_flow": true, + "iot_class": "local_polling" }, "pulseaudio_loopback": { - "config_flow": false, - "iot_class": "local_polling", + "name": "PulseAudio Loopback", "integration_type": "hub", - "name": "PulseAudio Loopback" + "config_flow": false, + "iot_class": "local_polling" }, "pure_energie": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Pure Energie", "integration_type": "hub", - "name": "Pure Energie" + "config_flow": true, + "iot_class": "local_polling" }, "push": { - "config_flow": false, - "iot_class": "local_push", + "name": "Push", "integration_type": "hub", - "name": "Push" + "config_flow": false, + "iot_class": "local_push" }, "pushbullet": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Pushbullet", "integration_type": "hub", - "name": "Pushbullet" + "config_flow": false, + "iot_class": "cloud_polling" }, "pushover": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Pushover", "integration_type": "hub", - "name": "Pushover" + "config_flow": true, + "iot_class": "cloud_push" }, "pushsafer": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Pushsafer", "integration_type": "hub", - "name": "Pushsafer" + "config_flow": false, + "iot_class": "cloud_push" }, "pvoutput": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "PVOutput", "integration_type": "hub", - "name": "PVOutput" + "config_flow": true, + "iot_class": "cloud_polling" }, "pvpc_hourly_pricing": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Spain electricity hourly pricing (PVPC)", "integration_type": "hub", - "name": "Spain electricity hourly pricing (PVPC)" + "config_flow": true, + "iot_class": "cloud_polling" }, "pyload": { - "config_flow": false, - "iot_class": "local_polling", + "name": "pyLoad", "integration_type": "hub", - "name": "pyLoad" + "config_flow": false, + "iot_class": "local_polling" }, "python_script": { - "config_flow": false, - "iot_class": null, + "name": "Python Scripts", "integration_type": "hub", - "name": "Python Scripts" + "config_flow": false }, "qbittorrent": { - "config_flow": false, - "iot_class": "local_polling", + "name": "qBittorrent", "integration_type": "hub", - "name": "qBittorrent" + "config_flow": false, + "iot_class": "local_polling" }, "qingping": { - "config_flow": true, - "iot_class": "local_push", + "name": "Qingping", "integration_type": "hub", - "name": "Qingping" + "config_flow": true, + "iot_class": "local_push" }, "qld_bushfire": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Queensland Bushfire Alert", "integration_type": "hub", - "name": "Queensland Bushfire Alert" + "config_flow": false, + "iot_class": "cloud_polling" }, "qnap": { "name": "QNAP", @@ -4095,76 +4226,76 @@ } }, "qrcode": { - "config_flow": false, - "iot_class": "calculated", + "name": "QR Code", "integration_type": "hub", - "name": "QR Code" + "config_flow": false, + "iot_class": "calculated" }, "quantum_gateway": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Quantum Gateway", "integration_type": "hub", - "name": "Quantum Gateway" + "config_flow": false, + "iot_class": "local_polling" }, "qvr_pro": { - "config_flow": false, - "iot_class": "local_polling", + "name": "QVR Pro", "integration_type": "hub", - "name": "QVR Pro" + "config_flow": false, + "iot_class": "local_polling" }, "qwikswitch": { - "config_flow": false, - "iot_class": "local_push", + "name": "QwikSwitch QSUSB", "integration_type": "hub", - "name": "QwikSwitch QSUSB" + "config_flow": false, + "iot_class": "local_push" }, "rachio": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Rachio", "integration_type": "hub", - "name": "Rachio" + "config_flow": true, + "iot_class": "cloud_push" }, "radarr": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Radarr", "integration_type": "hub", - "name": "Radarr" + "config_flow": true, + "iot_class": "local_polling" }, "radio_browser": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Radio Browser", "integration_type": "hub", - "name": "Radio Browser" + "config_flow": true, + "iot_class": "cloud_polling" }, "radiotherm": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Radio Thermostat", "integration_type": "hub", - "name": "Radio Thermostat" + "config_flow": true, + "iot_class": "local_polling" }, "rainbird": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Rain Bird", "integration_type": "hub", - "name": "Rain Bird" + "config_flow": false, + "iot_class": "local_polling" }, "rainforest_eagle": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Rainforest Eagle", "integration_type": "hub", - "name": "Rainforest Eagle" + "config_flow": true, + "iot_class": "local_polling" }, "rainmachine": { - "config_flow": true, - "iot_class": "local_polling", + "name": "RainMachine", "integration_type": "hub", - "name": "RainMachine" + "config_flow": true, + "iot_class": "local_polling" }, "random": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Random", "integration_type": "hub", - "name": "Random" + "config_flow": false, + "iot_class": "local_polling" }, "raspberry": { "name": "Raspberry Pi", @@ -4189,184 +4320,198 @@ } }, "raspberry_pi": { - "config_flow": false, - "iot_class": null, + "name": "Raspberry Pi", "integration_type": "hardware", - "name": "Raspberry Pi" + "config_flow": false }, "raspyrfm": { - "config_flow": false, - "iot_class": "assumed_state", + "name": "RaspyRFM", "integration_type": "hub", - "name": "RaspyRFM" + "config_flow": false, + "iot_class": "assumed_state" + }, + "raven_rock_mfg": { + "name": "Raven Rock MFG", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "rdw": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "RDW", "integration_type": "hub", - "name": "RDW" + "config_flow": true, + "iot_class": "cloud_polling" }, "recollect_waste": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "ReCollect Waste", "integration_type": "hub", - "name": "ReCollect Waste" + "config_flow": true, + "iot_class": "cloud_polling" }, "recswitch": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Ankuoo REC Switch", "integration_type": "hub", - "name": "Ankuoo REC Switch" + "config_flow": false, + "iot_class": "local_polling" }, "reddit": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Reddit", "integration_type": "hub", - "name": "Reddit" + "config_flow": false, + "iot_class": "cloud_polling" }, "rejseplanen": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Rejseplanen", "integration_type": "hub", - "name": "Rejseplanen" + "config_flow": false, + "iot_class": "cloud_polling" }, "remember_the_milk": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Remember The Milk", "integration_type": "hub", - "name": "Remember The Milk" + "config_flow": false, + "iot_class": "cloud_push" }, "renault": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Renault", "integration_type": "hub", - "name": "Renault" + "config_flow": true, + "iot_class": "cloud_polling" }, "repetier": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Repetier-Server", "integration_type": "hub", - "name": "Repetier-Server" + "config_flow": false, + "iot_class": "local_polling" }, "rest": { - "config_flow": false, - "iot_class": "local_polling", + "name": "RESTful", "integration_type": "hub", - "name": "RESTful" + "config_flow": false, + "iot_class": "local_polling" }, "rest_command": { - "config_flow": false, - "iot_class": "local_push", + "name": "RESTful Command", "integration_type": "hub", - "name": "RESTful Command" + "config_flow": false, + "iot_class": "local_push" + }, + "rexel": { + "name": "Rexel Energeasy Connect", + "integration_type": "virtual", + "supported_by": "overkiz" }, "rflink": { - "config_flow": false, - "iot_class": "assumed_state", + "name": "RFLink", "integration_type": "hub", - "name": "RFLink" + "config_flow": false, + "iot_class": "assumed_state" }, "rfxtrx": { - "config_flow": true, - "iot_class": "local_push", + "name": "RFXCOM RFXtrx", "integration_type": "hub", - "name": "RFXCOM RFXtrx" + "config_flow": true, + "iot_class": "local_push" }, "rhasspy": { - "config_flow": true, - "iot_class": "local_push", + "name": "Rhasspy", "integration_type": "hub", - "name": "Rhasspy" + "config_flow": true, + "iot_class": "local_push" }, "ridwell": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Ridwell", "integration_type": "hub", - "name": "Ridwell" + "config_flow": true, + "iot_class": "cloud_polling" }, "ring": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Ring", "integration_type": "hub", - "name": "Ring" + "config_flow": true, + "iot_class": "cloud_polling" }, "ripple": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Ripple", "integration_type": "hub", - "name": "Ripple" + "config_flow": false, + "iot_class": "cloud_polling" }, "risco": { - "config_flow": true, - "iot_class": "local_push", + "name": "Risco", "integration_type": "hub", - "name": "Risco" + "config_flow": true, + "iot_class": "local_push" }, "rituals_perfume_genie": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Rituals Perfume Genie", "integration_type": "hub", - "name": "Rituals Perfume Genie" + "config_flow": true, + "iot_class": "cloud_polling" }, "rmvtransport": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "RMV", "integration_type": "hub", - "name": "RMV" + "config_flow": false, + "iot_class": "cloud_polling" + }, + "roborock": { + "name": "Roborock", + "integration_type": "virtual", + "supported_by": "xiaomi_miio" }, "rocketchat": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Rocket.Chat", "integration_type": "hub", - "name": "Rocket.Chat" + "config_flow": false, + "iot_class": "cloud_push" }, "roku": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Roku", "integration_type": "hub", - "name": "Roku" + "config_flow": true, + "iot_class": "local_polling" }, "roomba": { - "config_flow": true, - "iot_class": "local_push", + "name": "iRobot Roomba and Braava", "integration_type": "hub", - "name": "iRobot Roomba and Braava" + "config_flow": true, + "iot_class": "local_push" }, "roon": { - "config_flow": true, - "iot_class": "local_push", + "name": "RoonLabs music player", "integration_type": "hub", - "name": "RoonLabs music player" + "config_flow": true, + "iot_class": "local_push" }, "rova": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "ROVA", "integration_type": "hub", - "name": "ROVA" + "config_flow": false, + "iot_class": "cloud_polling" }, "rss_feed_template": { - "config_flow": false, - "iot_class": "local_push", + "name": "RSS Feed Template", "integration_type": "hub", - "name": "RSS Feed Template" + "config_flow": false, + "iot_class": "local_push" }, "rtorrent": { - "config_flow": false, - "iot_class": "local_polling", + "name": "rTorrent", "integration_type": "hub", - "name": "rTorrent" + "config_flow": false, + "iot_class": "local_polling" }, "rtsp_to_webrtc": { - "config_flow": true, - "iot_class": "local_push", + "name": "RTSPtoWebRTC", "integration_type": "hub", - "name": "RTSPtoWebRTC" + "config_flow": true, + "iot_class": "local_push" }, "ruckus_unleashed": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Ruckus Unleashed", "integration_type": "hub", - "name": "Ruckus Unleashed" + "config_flow": true, + "iot_class": "local_polling" }, "russound": { "name": "Russound", @@ -4386,16 +4531,16 @@ } }, "sabnzbd": { - "config_flow": true, - "iot_class": "local_polling", + "name": "SABnzbd", "integration_type": "hub", - "name": "SABnzbd" + "config_flow": true, + "iot_class": "local_polling" }, "saj": { - "config_flow": false, - "iot_class": "local_polling", + "name": "SAJ Solar Inverter", "integration_type": "hub", - "name": "SAJ Solar Inverter" + "config_flow": false, + "iot_class": "local_polling" }, "samsung": { "name": "Samsung", @@ -4421,327 +4566,357 @@ } }, "satel_integra": { - "config_flow": false, - "iot_class": "local_push", + "name": "Satel Integra", "integration_type": "hub", - "name": "Satel Integra" + "config_flow": false, + "iot_class": "local_push" }, "schluter": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Schluter", "integration_type": "hub", - "name": "Schluter" + "config_flow": false, + "iot_class": "cloud_polling" }, "scrape": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Scrape", "integration_type": "hub", - "name": "Scrape" + "config_flow": false, + "iot_class": "cloud_polling" + }, + "screenaway": { + "name": "ScreenAway", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "screenlogic": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Pentair ScreenLogic", "integration_type": "hub", - "name": "Pentair ScreenLogic" + "config_flow": true, + "iot_class": "local_polling" }, "scsgate": { - "config_flow": false, - "iot_class": "local_polling", + "name": "SCSGate", "integration_type": "hub", - "name": "SCSGate" + "config_flow": false, + "iot_class": "local_polling" }, "season": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Season", "integration_type": "hub", - "name": "Season" + "config_flow": true, + "iot_class": "local_polling" }, "sendgrid": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "SendGrid", "integration_type": "hub", - "name": "SendGrid" + "config_flow": false, + "iot_class": "cloud_push" }, "sense": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Sense", "integration_type": "hub", - "name": "Sense" + "config_flow": true, + "iot_class": "cloud_polling" }, "senseme": { - "config_flow": true, - "iot_class": "local_push", + "name": "SenseME", "integration_type": "hub", - "name": "SenseME" + "config_flow": true, + "iot_class": "local_push" }, "sensibo": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Sensibo", "integration_type": "hub", - "name": "Sensibo" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "sensorblue": { + "name": "SensorBlue", + "integration_type": "virtual", + "supported_by": "thermobeacon" }, "sensorpro": { - "config_flow": true, - "iot_class": "local_push", + "name": "SensorPro", "integration_type": "hub", - "name": "SensorPro" + "config_flow": true, + "iot_class": "local_push" }, "sensorpush": { - "config_flow": true, - "iot_class": "local_push", + "name": "SensorPush", "integration_type": "hub", - "name": "SensorPush" + "config_flow": true, + "iot_class": "local_push" }, "sentry": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Sentry", "integration_type": "hub", - "name": "Sentry" + "config_flow": true, + "iot_class": "cloud_polling" }, "senz": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "nVent RAYCHEM SENZ", "integration_type": "hub", - "name": "nVent RAYCHEM SENZ" + "config_flow": true, + "iot_class": "cloud_polling" }, "serial": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Serial", "integration_type": "hub", - "name": "Serial" + "config_flow": false, + "iot_class": "local_polling" }, "serial_pm": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Serial Particulate Matter", "integration_type": "hub", - "name": "Serial Particulate Matter" + "config_flow": false, + "iot_class": "local_polling" }, "sesame": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Sesame Smart Lock", "integration_type": "hub", - "name": "Sesame Smart Lock" + "config_flow": false, + "iot_class": "cloud_polling" }, "seven_segments": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Seven Segments OCR", "integration_type": "hub", - "name": "Seven Segments OCR" + "config_flow": false, + "iot_class": "local_polling" }, "seventeentrack": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "17TRACK", "integration_type": "hub", - "name": "17TRACK" + "config_flow": false, + "iot_class": "cloud_polling" }, "sharkiq": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Shark IQ", "integration_type": "hub", - "name": "Shark IQ" + "config_flow": true, + "iot_class": "cloud_polling" }, "shell_command": { - "config_flow": false, - "iot_class": "local_push", + "name": "Shell Command", "integration_type": "hub", - "name": "Shell Command" + "config_flow": false, + "iot_class": "local_push" }, "shelly": { - "config_flow": true, - "iot_class": "local_push", + "name": "Shelly", "integration_type": "hub", - "name": "Shelly" + "config_flow": true, + "iot_class": "local_push" }, "shiftr": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "shiftr.io", "integration_type": "hub", - "name": "shiftr.io" + "config_flow": false, + "iot_class": "cloud_push" }, "shodan": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Shodan", "integration_type": "hub", - "name": "Shodan" + "config_flow": false, + "iot_class": "cloud_polling" }, "shopping_list": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_push", - "integration_type": "hub" + "iot_class": "local_push" }, "sia": { - "config_flow": true, - "iot_class": "local_push", + "name": "SIA Alarm Systems", "integration_type": "hub", - "name": "SIA Alarm Systems" + "config_flow": true, + "iot_class": "local_push" }, "sigfox": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Sigfox", "integration_type": "hub", - "name": "Sigfox" + "config_flow": false, + "iot_class": "cloud_polling" }, "sighthound": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Sighthound", "integration_type": "hub", - "name": "Sighthound" + "config_flow": false, + "iot_class": "cloud_polling" }, "signal_messenger": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Signal Messenger", "integration_type": "hub", - "name": "Signal Messenger" + "config_flow": false, + "iot_class": "cloud_push" }, "simplepush": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Simplepush", "integration_type": "hub", - "name": "Simplepush" + "config_flow": true, + "iot_class": "cloud_polling" }, "simplisafe": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "SimpliSafe", "integration_type": "hub", - "name": "SimpliSafe" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "simply_automated": { + "name": "Simply Automated", + "integration_type": "virtual", + "supported_by": "upb" }, "simulated": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Simulated", "integration_type": "hub", - "name": "Simulated" + "config_flow": false, + "iot_class": "local_polling" }, "sinch": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Sinch SMS", "integration_type": "hub", - "name": "Sinch SMS" + "config_flow": false, + "iot_class": "cloud_push" }, "sisyphus": { - "config_flow": false, - "iot_class": "local_push", + "name": "Sisyphus", "integration_type": "hub", - "name": "Sisyphus" + "config_flow": false, + "iot_class": "local_push" }, "sky_hub": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Sky Hub", "integration_type": "hub", - "name": "Sky Hub" + "config_flow": false, + "iot_class": "local_polling" }, "skybeacon": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Skybeacon", "integration_type": "hub", - "name": "Skybeacon" + "config_flow": false, + "iot_class": "local_polling" }, "skybell": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "SkyBell", "integration_type": "hub", - "name": "SkyBell" + "config_flow": true, + "iot_class": "cloud_polling" }, "slack": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Slack", "integration_type": "hub", - "name": "Slack" + "config_flow": true, + "iot_class": "cloud_push" }, "sleepiq": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "SleepIQ", "integration_type": "hub", - "name": "SleepIQ" + "config_flow": true, + "iot_class": "cloud_polling" }, "slide": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Slide", "integration_type": "hub", - "name": "Slide" + "config_flow": false, + "iot_class": "cloud_polling" }, "slimproto": { - "config_flow": true, - "iot_class": "local_push", + "name": "SlimProto (Squeezebox players)", "integration_type": "hub", - "name": "SlimProto (Squeezebox players)" + "config_flow": true, + "iot_class": "local_push" }, "sma": { - "config_flow": true, - "iot_class": "local_polling", + "name": "SMA Solar", "integration_type": "hub", - "name": "SMA Solar" + "config_flow": true, + "iot_class": "local_polling" }, "smappee": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Smappee", "integration_type": "hub", - "name": "Smappee" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "smart_blinds": { + "name": "Smart Blinds", + "integration_type": "virtual", + "supported_by": "motion_blinds" + }, + "smart_home": { + "name": "Smart Home", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "smart_meter_texas": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Smart Meter Texas", "integration_type": "hub", - "name": "Smart Meter Texas" + "config_flow": true, + "iot_class": "cloud_polling" + }, + "smarther": { + "name": "Smarther", + "integration_type": "virtual", + "supported_by": "netatmo" }, "smartthings": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "SmartThings", "integration_type": "hub", - "name": "SmartThings" + "config_flow": true, + "iot_class": "cloud_push" }, "smarttub": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "SmartTub", "integration_type": "hub", - "name": "SmartTub" + "config_flow": true, + "iot_class": "cloud_polling" }, "smarty": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Salda Smarty", "integration_type": "hub", - "name": "Salda Smarty" + "config_flow": false, + "iot_class": "local_polling" }, "smhi": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "SMHI", "integration_type": "hub", - "name": "SMHI" + "config_flow": true, + "iot_class": "cloud_polling" }, "sms": { - "config_flow": true, - "iot_class": "local_polling", + "name": "SMS notifications via GSM-modem", "integration_type": "hub", - "name": "SMS notifications via GSM-modem" + "config_flow": true, + "iot_class": "local_polling" }, "smtp": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "SMTP", "integration_type": "hub", - "name": "SMTP" + "config_flow": false, + "iot_class": "cloud_push" }, "snapcast": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Snapcast", "integration_type": "hub", - "name": "Snapcast" + "config_flow": false, + "iot_class": "local_polling" }, "snips": { - "config_flow": false, - "iot_class": "local_push", + "name": "Snips", "integration_type": "hub", - "name": "Snips" + "config_flow": false, + "iot_class": "local_push" }, "snmp": { - "config_flow": false, - "iot_class": "local_polling", + "name": "SNMP", "integration_type": "hub", - "name": "SNMP" + "config_flow": false, + "iot_class": "local_polling" }, "snooz": { - "config_flow": true, - "iot_class": "local_push", + "name": "Snooz", "integration_type": "hub", - "name": "Snooz" + "config_flow": true, + "iot_class": "local_push" }, "solaredge": { "name": "SolarEdge", @@ -4761,40 +4936,45 @@ } }, "solarlog": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Solar-Log", "integration_type": "hub", - "name": "Solar-Log" + "config_flow": true, + "iot_class": "local_polling" }, "solax": { - "config_flow": true, - "iot_class": "local_polling", + "name": "SolaX Power", "integration_type": "hub", - "name": "SolaX Power" + "config_flow": true, + "iot_class": "local_polling" }, "soma": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Soma Connect", "integration_type": "hub", - "name": "Soma Connect" + "config_flow": true, + "iot_class": "local_polling" + }, + "somfy": { + "name": "Somfy", + "integration_type": "virtual", + "supported_by": "overkiz" }, "somfy_mylink": { - "config_flow": true, - "iot_class": "assumed_state", + "name": "Somfy MyLink", "integration_type": "hub", - "name": "Somfy MyLink" + "config_flow": true, + "iot_class": "assumed_state" }, "sonarr": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Sonarr", "integration_type": "hub", - "name": "Sonarr" + "config_flow": true, + "iot_class": "local_polling" }, "sonos": { - "config_flow": true, - "iot_class": "local_push", + "name": "Sonos", "integration_type": "hub", - "name": "Sonos" + "config_flow": true, + "iot_class": "local_push" }, "sony": { "name": "Sony", @@ -4826,207 +5006,207 @@ } }, "soundtouch": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Bose SoundTouch", "integration_type": "hub", - "name": "Bose SoundTouch" + "config_flow": true, + "iot_class": "local_polling" }, "spaceapi": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Space API", "integration_type": "hub", - "name": "Space API" + "config_flow": false, + "iot_class": "cloud_polling" }, "spc": { - "config_flow": false, - "iot_class": "local_push", + "name": "Vanderbilt SPC", "integration_type": "hub", - "name": "Vanderbilt SPC" + "config_flow": false, + "iot_class": "local_push" }, "speedtestdotnet": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Speedtest.net", "integration_type": "hub", - "name": "Speedtest.net" + "config_flow": true, + "iot_class": "cloud_polling" }, "spider": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Itho Daalderop Spider", "integration_type": "hub", - "name": "Itho Daalderop Spider" + "config_flow": true, + "iot_class": "cloud_polling" }, "splunk": { - "config_flow": false, - "iot_class": "local_push", + "name": "Splunk", "integration_type": "hub", - "name": "Splunk" + "config_flow": false, + "iot_class": "local_push" }, "spotify": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Spotify", "integration_type": "hub", - "name": "Spotify" + "config_flow": true, + "iot_class": "cloud_polling" }, "sql": { - "config_flow": true, - "iot_class": "local_polling", + "name": "SQL", "integration_type": "hub", - "name": "SQL" + "config_flow": true, + "iot_class": "local_polling" }, "srp_energy": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "SRP Energy", "integration_type": "hub", - "name": "SRP Energy" + "config_flow": true, + "iot_class": "cloud_polling" }, "starline": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "StarLine", "integration_type": "hub", - "name": "StarLine" + "config_flow": true, + "iot_class": "cloud_polling" }, "starlingbank": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Starling Bank", "integration_type": "hub", - "name": "Starling Bank" + "config_flow": false, + "iot_class": "cloud_polling" }, "startca": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Start.ca", "integration_type": "hub", - "name": "Start.ca" + "config_flow": false, + "iot_class": "cloud_polling" }, "statistics": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Statistics", "integration_type": "hub", - "name": "Statistics" + "config_flow": false, + "iot_class": "local_polling" }, "statsd": { - "config_flow": false, - "iot_class": "local_push", + "name": "StatsD", "integration_type": "hub", - "name": "StatsD" + "config_flow": false, + "iot_class": "local_push" }, "steam_online": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Steam", "integration_type": "hub", - "name": "Steam" + "config_flow": true, + "iot_class": "cloud_polling" }, "steamist": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Steamist", "integration_type": "hub", - "name": "Steamist" + "config_flow": true, + "iot_class": "local_polling" }, "stiebel_eltron": { - "config_flow": false, - "iot_class": "local_polling", + "name": "STIEBEL ELTRON", "integration_type": "hub", - "name": "STIEBEL ELTRON" + "config_flow": false, + "iot_class": "local_polling" }, "stookalert": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "RIVM Stookalert", "integration_type": "hub", - "name": "RIVM Stookalert" + "config_flow": true, + "iot_class": "cloud_polling" }, "stream": { - "config_flow": false, - "iot_class": "local_push", + "name": "Stream", "integration_type": "hub", - "name": "Stream" + "config_flow": false, + "iot_class": "local_push" }, "streamlabswater": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "StreamLabs", "integration_type": "hub", - "name": "StreamLabs" + "config_flow": false, + "iot_class": "cloud_polling" }, "subaru": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Subaru", "integration_type": "hub", - "name": "Subaru" + "config_flow": true, + "iot_class": "cloud_polling" }, "suez_water": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Suez Water", "integration_type": "hub", - "name": "Suez Water" + "config_flow": false, + "iot_class": "cloud_polling" }, "sun": { + "integration_type": "hub", "config_flow": true, - "iot_class": "calculated", - "integration_type": "hub" + "iot_class": "calculated" }, "supervisord": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Supervisord", "integration_type": "hub", - "name": "Supervisord" + "config_flow": false, + "iot_class": "local_polling" }, "supla": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Supla", "integration_type": "hub", - "name": "Supla" + "config_flow": false, + "iot_class": "cloud_polling" }, "surepetcare": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Sure Petcare", "integration_type": "hub", - "name": "Sure Petcare" + "config_flow": true, + "iot_class": "cloud_polling" }, "swiss_hydrological_data": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Swiss Hydrological Data", "integration_type": "hub", - "name": "Swiss Hydrological Data" + "config_flow": false, + "iot_class": "cloud_polling" }, "swiss_public_transport": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Swiss public transport", "integration_type": "hub", - "name": "Swiss public transport" + "config_flow": false, + "iot_class": "cloud_polling" }, "swisscom": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Swisscom Internet-Box", "integration_type": "hub", - "name": "Swisscom Internet-Box" + "config_flow": false, + "iot_class": "local_polling" }, "switchbee": { - "config_flow": true, - "iot_class": "local_polling", + "name": "SwitchBee", "integration_type": "hub", - "name": "SwitchBee" + "config_flow": true, + "iot_class": "local_polling" }, "switchbot": { - "config_flow": true, - "iot_class": "local_push", + "name": "SwitchBot", "integration_type": "hub", - "name": "SwitchBot" + "config_flow": true, + "iot_class": "local_push" }, "switcher_kis": { - "config_flow": true, - "iot_class": "local_push", + "name": "Switcher", "integration_type": "hub", - "name": "Switcher" + "config_flow": true, + "iot_class": "local_push" }, "switchmate": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Switchmate SimplySmart Home", "integration_type": "hub", - "name": "Switchmate SimplySmart Home" + "config_flow": false, + "iot_class": "local_polling" }, "syncthing": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Syncthing", "integration_type": "hub", - "name": "Syncthing" + "config_flow": true, + "iot_class": "local_polling" }, "synology": { "name": "Synology", @@ -5052,87 +5232,85 @@ } }, "syslog": { - "config_flow": false, - "iot_class": "local_push", + "name": "Syslog", "integration_type": "hub", - "name": "Syslog" + "config_flow": false, + "iot_class": "local_push" }, "system_bridge": { - "config_flow": true, - "iot_class": "local_push", + "name": "System Bridge", "integration_type": "hub", - "name": "System Bridge" + "config_flow": true, + "iot_class": "local_push" }, "system_log": { - "config_flow": false, - "iot_class": null, + "name": "System Log", "integration_type": "hub", - "name": "System Log" + "config_flow": false }, "systemmonitor": { - "config_flow": false, - "iot_class": "local_push", + "name": "System Monitor", "integration_type": "hub", - "name": "System Monitor" + "config_flow": false, + "iot_class": "local_push" }, "tado": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Tado", "integration_type": "hub", - "name": "Tado" + "config_flow": true, + "iot_class": "cloud_polling" }, "tag": { - "config_flow": false, - "iot_class": null, - "integration_type": "hub" + "integration_type": "hub", + "config_flow": false }, "tailscale": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Tailscale", "integration_type": "hub", - "name": "Tailscale" + "config_flow": true, + "iot_class": "cloud_polling" }, "tank_utility": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Tank Utility", "integration_type": "hub", - "name": "Tank Utility" + "config_flow": false, + "iot_class": "cloud_polling" }, "tankerkoenig": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Tankerkoenig", "integration_type": "hub", - "name": "Tankerkoenig" + "config_flow": true, + "iot_class": "cloud_polling" }, "tapsaff": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Taps Aff", "integration_type": "hub", - "name": "Taps Aff" + "config_flow": false, + "iot_class": "local_polling" }, "tasmota": { - "config_flow": true, - "iot_class": "local_push", + "name": "Tasmota", "integration_type": "hub", - "name": "Tasmota" + "config_flow": true, + "iot_class": "local_push" }, "tautulli": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Tautulli", "integration_type": "hub", - "name": "Tautulli" + "config_flow": true, + "iot_class": "local_polling" }, "tcp": { - "config_flow": false, - "iot_class": "local_polling", + "name": "TCP", "integration_type": "hub", - "name": "TCP" + "config_flow": false, + "iot_class": "local_polling" }, "ted5000": { - "config_flow": false, - "iot_class": "local_polling", + "name": "The Energy Detective TED5000", "integration_type": "hub", - "name": "The Energy Detective TED5000" + "config_flow": false, + "iot_class": "local_polling" }, "telegram": { "name": "Telegram", @@ -5169,28 +5347,28 @@ } }, "telnet": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Telnet", "integration_type": "hub", - "name": "Telnet" + "config_flow": false, + "iot_class": "local_polling" }, "temper": { - "config_flow": false, - "iot_class": "local_polling", + "name": "TEMPer", "integration_type": "hub", - "name": "TEMPer" + "config_flow": false, + "iot_class": "local_polling" }, "template": { - "config_flow": false, - "iot_class": "local_push", + "name": "Template", "integration_type": "hub", - "name": "Template" + "config_flow": false, + "iot_class": "local_push" }, "tensorflow": { - "config_flow": false, - "iot_class": "local_polling", + "name": "TensorFlow", "integration_type": "hub", - "name": "TensorFlow" + "config_flow": false, + "iot_class": "local_polling" }, "tesla": { "name": "Tesla", @@ -5210,46 +5388,51 @@ } }, "tfiac": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Tfiac", "integration_type": "hub", - "name": "Tfiac" + "config_flow": false, + "iot_class": "local_polling" }, "thermobeacon": { - "config_flow": true, - "iot_class": "local_push", + "name": "ThermoBeacon", "integration_type": "hub", - "name": "ThermoBeacon" + "config_flow": true, + "iot_class": "local_push" + }, + "thermoplus": { + "name": "ThermoPlus", + "integration_type": "virtual", + "supported_by": "thermobeacon" }, "thermopro": { - "config_flow": true, - "iot_class": "local_push", + "name": "ThermoPro", "integration_type": "hub", - "name": "ThermoPro" + "config_flow": true, + "iot_class": "local_push" }, "thermoworks_smoke": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "ThermoWorks Smoke", "integration_type": "hub", - "name": "ThermoWorks Smoke" + "config_flow": false, + "iot_class": "cloud_polling" }, "thethingsnetwork": { - "config_flow": false, - "iot_class": "local_push", + "name": "The Things Network", "integration_type": "hub", - "name": "The Things Network" + "config_flow": false, + "iot_class": "local_push" }, "thingspeak": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "ThingSpeak", "integration_type": "hub", - "name": "ThingSpeak" + "config_flow": false, + "iot_class": "cloud_push" }, "thinkingcleaner": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Thinking Cleaner", "integration_type": "hub", - "name": "Thinking Cleaner" + "config_flow": false, + "iot_class": "local_polling" }, "third_reality": { "name": "Third Reality", @@ -5258,124 +5441,124 @@ ] }, "thomson": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Thomson", "integration_type": "hub", - "name": "Thomson" + "config_flow": false, + "iot_class": "local_polling" }, "tibber": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Tibber", "integration_type": "hub", - "name": "Tibber" + "config_flow": true, + "iot_class": "cloud_polling" }, "tikteck": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Tikteck", "integration_type": "hub", - "name": "Tikteck" + "config_flow": false, + "iot_class": "local_polling" }, "tile": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Tile", "integration_type": "hub", - "name": "Tile" + "config_flow": true, + "iot_class": "cloud_polling" }, "tilt_ble": { - "config_flow": true, - "iot_class": "local_push", + "name": "Tilt Hydrometer BLE", "integration_type": "hub", - "name": "Tilt Hydrometer BLE" + "config_flow": true, + "iot_class": "local_push" }, "time_date": { - "config_flow": false, - "iot_class": "local_push", + "name": "Time & Date", "integration_type": "hub", - "name": "Time & Date" + "config_flow": false, + "iot_class": "local_push" }, "tmb": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Transports Metropolitans de Barcelona", "integration_type": "hub", - "name": "Transports Metropolitans de Barcelona" + "config_flow": false, + "iot_class": "local_polling" }, "todoist": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Todoist", "integration_type": "hub", - "name": "Todoist" + "config_flow": false, + "iot_class": "cloud_polling" }, "tolo": { - "config_flow": true, - "iot_class": "local_polling", + "name": "TOLO Sauna", "integration_type": "hub", - "name": "TOLO Sauna" + "config_flow": true, + "iot_class": "local_polling" }, "tomato": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Tomato", "integration_type": "hub", - "name": "Tomato" + "config_flow": false, + "iot_class": "local_polling" }, "tomorrowio": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Tomorrow.io", "integration_type": "hub", - "name": "Tomorrow.io" + "config_flow": true, + "iot_class": "cloud_polling" }, "toon": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Toon", "integration_type": "hub", - "name": "Toon" + "config_flow": true, + "iot_class": "cloud_push" }, "torque": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Torque", "integration_type": "hub", - "name": "Torque" + "config_flow": false, + "iot_class": "cloud_polling" }, "totalconnect": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Total Connect", "integration_type": "hub", - "name": "Total Connect" + "config_flow": true, + "iot_class": "cloud_polling" }, "touchline": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Roth Touchline", "integration_type": "hub", - "name": "Roth Touchline" + "config_flow": false, + "iot_class": "local_polling" }, "tplink": { - "config_flow": true, - "iot_class": "local_polling", + "name": "TP-Link Kasa Smart", "integration_type": "hub", - "name": "TP-Link Kasa Smart" + "config_flow": true, + "iot_class": "local_polling" }, "tplink_lte": { - "config_flow": false, - "iot_class": "local_polling", + "name": "TP-Link LTE", "integration_type": "hub", - "name": "TP-Link LTE" + "config_flow": false, + "iot_class": "local_polling" }, "traccar": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Traccar", "integration_type": "hub", - "name": "Traccar" + "config_flow": true, + "iot_class": "local_polling" }, "tractive": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Tractive", "integration_type": "hub", - "name": "Tractive" + "config_flow": true, + "iot_class": "cloud_push" }, "tradfri": { - "config_flow": true, - "iot_class": "local_polling", + "name": "IKEA TR\u00c5DFRI", "integration_type": "hub", - "name": "IKEA TR\u00c5DFRI" + "config_flow": true, + "iot_class": "local_polling" }, "trafikverket": { "name": "Trafikverket", @@ -5401,40 +5584,40 @@ } }, "transmission": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Transmission", "integration_type": "hub", - "name": "Transmission" + "config_flow": true, + "iot_class": "local_polling" }, "transport_nsw": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Transport NSW", "integration_type": "hub", - "name": "Transport NSW" + "config_flow": false, + "iot_class": "cloud_polling" }, "travisci": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Travis-CI", "integration_type": "hub", - "name": "Travis-CI" + "config_flow": false, + "iot_class": "cloud_polling" }, "trend": { - "config_flow": false, - "iot_class": "local_push", + "name": "Trend", "integration_type": "hub", - "name": "Trend" + "config_flow": false, + "iot_class": "local_push" }, "tuya": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Tuya", "integration_type": "hub", - "name": "Tuya" + "config_flow": true, + "iot_class": "cloud_push" }, "twentemilieu": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Twente Milieu", "integration_type": "hub", - "name": "Twente Milieu" + "config_flow": true, + "iot_class": "cloud_polling" }, "twilio": { "name": "Twilio", @@ -5460,22 +5643,22 @@ } }, "twinkly": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Twinkly", "integration_type": "hub", - "name": "Twinkly" + "config_flow": true, + "iot_class": "local_polling" }, "twitch": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Twitch", "integration_type": "hub", - "name": "Twitch" + "config_flow": false, + "iot_class": "cloud_polling" }, "twitter": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Twitter", "integration_type": "hub", - "name": "Twitter" + "config_flow": false, + "iot_class": "cloud_push" }, "u_tec": { "name": "U-tec", @@ -5513,159 +5696,164 @@ } }, "uk_transport": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "UK Transport", "integration_type": "hub", - "name": "UK Transport" + "config_flow": false, + "iot_class": "cloud_polling" }, "ukraine_alarm": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Ukraine Alarm", "integration_type": "hub", - "name": "Ukraine Alarm" + "config_flow": true, + "iot_class": "cloud_polling" }, "universal": { - "config_flow": false, - "iot_class": "calculated", + "name": "Universal Media Player", "integration_type": "hub", - "name": "Universal Media Player" + "config_flow": false, + "iot_class": "calculated" }, "upb": { - "config_flow": true, - "iot_class": "local_push", + "name": "Universal Powerline Bus (UPB)", "integration_type": "hub", - "name": "Universal Powerline Bus (UPB)" + "config_flow": true, + "iot_class": "local_push" }, "upc_connect": { - "config_flow": false, - "iot_class": "local_polling", + "name": "UPC Connect Box", "integration_type": "hub", - "name": "UPC Connect Box" + "config_flow": false, + "iot_class": "local_polling" }, "upcloud": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "UpCloud", "integration_type": "hub", - "name": "UpCloud" + "config_flow": true, + "iot_class": "cloud_polling" }, "upnp": { - "config_flow": true, - "iot_class": "local_polling", + "name": "UPnP/IGD", "integration_type": "hub", - "name": "UPnP/IGD" + "config_flow": true, + "iot_class": "local_polling" + }, + "uprise_smart_shades": { + "name": "Uprise Smart Shades", + "integration_type": "virtual", + "supported_by": "motion_blinds" }, "uptime": { + "integration_type": "hub", "config_flow": true, - "iot_class": "local_push", - "integration_type": "hub" + "iot_class": "local_push" }, "uptimerobot": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "UptimeRobot", "integration_type": "hub", - "name": "UptimeRobot" + "config_flow": true, + "iot_class": "cloud_polling" }, "usgs_earthquakes_feed": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "U.S. Geological Survey Earthquake Hazards (USGS)", "integration_type": "hub", - "name": "U.S. Geological Survey Earthquake Hazards (USGS)" + "config_flow": false, + "iot_class": "cloud_polling" }, "uvc": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Ubiquiti UniFi Video", "integration_type": "hub", - "name": "Ubiquiti UniFi Video" + "config_flow": false, + "iot_class": "local_polling" }, "vallox": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Vallox", "integration_type": "hub", - "name": "Vallox" + "config_flow": true, + "iot_class": "local_polling" }, "vasttrafik": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "V\u00e4sttrafik", "integration_type": "hub", - "name": "V\u00e4sttrafik" + "config_flow": false, + "iot_class": "cloud_polling" }, "velbus": { - "config_flow": true, - "iot_class": "local_push", + "name": "Velbus", "integration_type": "hub", - "name": "Velbus" + "config_flow": true, + "iot_class": "local_push" }, "velux": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Velux", "integration_type": "hub", - "name": "Velux" + "config_flow": false, + "iot_class": "local_polling" }, "venstar": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Venstar", "integration_type": "hub", - "name": "Venstar" + "config_flow": true, + "iot_class": "local_polling" }, "vera": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Vera", "integration_type": "hub", - "name": "Vera" + "config_flow": true, + "iot_class": "local_polling" }, "verisure": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Verisure", "integration_type": "hub", - "name": "Verisure" + "config_flow": true, + "iot_class": "cloud_polling" }, "versasense": { - "config_flow": false, - "iot_class": "local_polling", + "name": "VersaSense", "integration_type": "hub", - "name": "VersaSense" + "config_flow": false, + "iot_class": "local_polling" }, "version": { - "config_flow": true, - "iot_class": "local_push", + "name": "Version", "integration_type": "hub", - "name": "Version" + "config_flow": true, + "iot_class": "local_push" }, "vesync": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "VeSync", "integration_type": "hub", - "name": "VeSync" + "config_flow": true, + "iot_class": "cloud_polling" }, "viaggiatreno": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Trenitalia ViaggiaTreno", "integration_type": "hub", - "name": "Trenitalia ViaggiaTreno" + "config_flow": false, + "iot_class": "cloud_polling" }, "vicare": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Viessmann ViCare", "integration_type": "hub", - "name": "Viessmann ViCare" + "config_flow": true, + "iot_class": "cloud_polling" }, "vilfo": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Vilfo Router", "integration_type": "hub", - "name": "Vilfo Router" + "config_flow": true, + "iot_class": "local_polling" }, "vivotek": { - "config_flow": false, - "iot_class": "local_polling", + "name": "VIVOTEK", "integration_type": "hub", - "name": "VIVOTEK" + "config_flow": false, + "iot_class": "local_polling" }, "vizio": { - "config_flow": true, - "iot_class": "local_polling", + "name": "VIZIO SmartCast", "integration_type": "hub", - "name": "VIZIO SmartCast" + "config_flow": true, + "iot_class": "local_polling" }, "vlc": { "name": "VideoLAN", @@ -5685,195 +5873,194 @@ } }, "voicerss": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "VoiceRSS", "integration_type": "hub", - "name": "VoiceRSS" + "config_flow": false, + "iot_class": "cloud_push" }, "volkszaehler": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Volkszaehler", "integration_type": "hub", - "name": "Volkszaehler" + "config_flow": false, + "iot_class": "local_polling" }, "volumio": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Volumio", "integration_type": "hub", - "name": "Volumio" + "config_flow": true, + "iot_class": "local_polling" }, "volvooncall": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Volvo On Call", "integration_type": "hub", - "name": "Volvo On Call" + "config_flow": true, + "iot_class": "cloud_polling" }, "vulcan": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Uonet+ Vulcan", "integration_type": "hub", - "name": "Uonet+ Vulcan" + "config_flow": true, + "iot_class": "cloud_polling" }, "vultr": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Vultr", "integration_type": "hub", - "name": "Vultr" + "config_flow": false, + "iot_class": "cloud_polling" }, "w800rf32": { - "config_flow": false, - "iot_class": "local_push", + "name": "WGL Designs W800RF32", "integration_type": "hub", - "name": "WGL Designs W800RF32" + "config_flow": false, + "iot_class": "local_push" }, "wake_on_lan": { - "config_flow": false, - "iot_class": "local_push", + "name": "Wake on LAN", "integration_type": "hub", - "name": "Wake on LAN" + "config_flow": false, + "iot_class": "local_push" }, "wallbox": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Wallbox", "integration_type": "hub", - "name": "Wallbox" + "config_flow": true, + "iot_class": "cloud_polling" }, "waqi": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "World Air Quality Index (WAQI)", "integration_type": "hub", - "name": "World Air Quality Index (WAQI)" + "config_flow": false, + "iot_class": "cloud_polling" }, "waterfurnace": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "WaterFurnace", "integration_type": "hub", - "name": "WaterFurnace" + "config_flow": false, + "iot_class": "cloud_polling" }, "watttime": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "WattTime", "integration_type": "hub", - "name": "WattTime" + "config_flow": true, + "iot_class": "cloud_polling" }, "waze_travel_time": { + "integration_type": "hub", "config_flow": true, - "iot_class": "cloud_polling", - "integration_type": "hub" + "iot_class": "cloud_polling" }, "webhook": { - "config_flow": false, - "iot_class": null, + "name": "Webhook", "integration_type": "hub", - "name": "Webhook" + "config_flow": false }, "wemo": { - "config_flow": true, - "iot_class": "local_push", + "name": "Belkin WeMo", "integration_type": "hub", - "name": "Belkin WeMo" + "config_flow": true, + "iot_class": "local_push" }, "whirlpool": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "Whirlpool Sixth Sense", "integration_type": "hub", - "name": "Whirlpool Sixth Sense" + "config_flow": true, + "iot_class": "cloud_push" }, "whois": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Whois", "integration_type": "hub", - "name": "Whois" + "config_flow": true, + "iot_class": "cloud_polling" }, "wiffi": { - "config_flow": true, - "iot_class": "local_push", + "name": "Wiffi", "integration_type": "hub", - "name": "Wiffi" + "config_flow": true, + "iot_class": "local_push" }, "wilight": { - "config_flow": true, - "iot_class": "local_polling", + "name": "WiLight", "integration_type": "hub", - "name": "WiLight" + "config_flow": true, + "iot_class": "local_polling" }, "wirelesstag": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Wireless Sensor Tags", "integration_type": "hub", - "name": "Wireless Sensor Tags" + "config_flow": false, + "iot_class": "cloud_push" }, "withings": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Withings", "integration_type": "hub", - "name": "Withings" + "config_flow": true, + "iot_class": "cloud_polling" }, "wiz": { - "config_flow": true, - "iot_class": "local_push", + "name": "WiZ", "integration_type": "hub", - "name": "WiZ" + "config_flow": true, + "iot_class": "local_push" }, "wled": { - "config_flow": true, - "iot_class": "local_push", + "name": "WLED", "integration_type": "hub", - "name": "WLED" + "config_flow": true, + "iot_class": "local_push" }, "wolflink": { - "config_flow": true, - "iot_class": "cloud_polling", + "name": "Wolf SmartSet Service", "integration_type": "hub", - "name": "Wolf SmartSet Service" + "config_flow": true, + "iot_class": "cloud_polling" }, "workday": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Workday", "integration_type": "hub", - "name": "Workday" + "config_flow": false, + "iot_class": "local_polling" }, "worldclock": { - "config_flow": false, - "iot_class": "local_push", + "name": "Worldclock", "integration_type": "hub", - "name": "Worldclock" + "config_flow": false, + "iot_class": "local_push" }, "worldtidesinfo": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "World Tides", "integration_type": "hub", - "name": "World Tides" + "config_flow": false, + "iot_class": "cloud_polling" }, "worxlandroid": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Worx Landroid", "integration_type": "hub", - "name": "Worx Landroid" + "config_flow": false, + "iot_class": "local_polling" }, "ws66i": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Soundavo WS66i 6-Zone Amplifier", "integration_type": "hub", - "name": "Soundavo WS66i 6-Zone Amplifier" + "config_flow": true, + "iot_class": "local_polling" }, "wsdot": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Washington State Department of Transportation (WSDOT)", "integration_type": "hub", - "name": "Washington State Department of Transportation (WSDOT)" + "config_flow": false, + "iot_class": "cloud_polling" }, "x10": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Heyu X10", "integration_type": "hub", - "name": "Heyu X10" + "config_flow": false, + "iot_class": "local_polling" }, "xeoma": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Xeoma", "integration_type": "hub", - "name": "Xeoma" + "config_flow": false, + "iot_class": "local_polling" }, "xiaomi": { "name": "Xiaomi", @@ -5911,16 +6098,16 @@ } }, "xmpp": { - "config_flow": false, - "iot_class": "cloud_push", + "name": "Jabber (XMPP)", "integration_type": "hub", - "name": "Jabber (XMPP)" + "config_flow": false, + "iot_class": "cloud_push" }, "xs1": { - "config_flow": false, - "iot_class": "local_polling", + "name": "EZcontrol XS1", "integration_type": "hub", - "name": "EZcontrol XS1" + "config_flow": false, + "iot_class": "local_polling" }, "yale": { "name": "Yale", @@ -5946,16 +6133,16 @@ } }, "yamaha": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Yamaha Network Receivers", "integration_type": "hub", - "name": "Yamaha Network Receivers" + "config_flow": false, + "iot_class": "local_polling" }, "yamaha_musiccast": { - "config_flow": true, - "iot_class": "local_push", + "name": "MusicCast", "integration_type": "hub", - "name": "MusicCast" + "config_flow": true, + "iot_class": "local_push" }, "yandex": { "name": "Yandex", @@ -5992,88 +6179,87 @@ } }, "yi": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Yi Home Cameras", "integration_type": "hub", - "name": "Yi Home Cameras" + "config_flow": false, + "iot_class": "local_polling" }, "yolink": { - "config_flow": true, - "iot_class": "cloud_push", + "name": "YoLink", "integration_type": "hub", - "name": "YoLink" + "config_flow": true, + "iot_class": "cloud_push" }, "youless": { - "config_flow": true, - "iot_class": "local_polling", + "name": "YouLess", "integration_type": "hub", - "name": "YouLess" + "config_flow": true, + "iot_class": "local_polling" }, "zabbix": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Zabbix", "integration_type": "hub", - "name": "Zabbix" + "config_flow": false, + "iot_class": "local_polling" }, "zamg": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Zentralanstalt f\u00fcr Meteorologie und Geodynamik (ZAMG)", "integration_type": "hub", - "name": "Zentralanstalt f\u00fcr Meteorologie und Geodynamik (ZAMG)" + "config_flow": false, + "iot_class": "cloud_polling" }, "zengge": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Zengge", "integration_type": "hub", - "name": "Zengge" + "config_flow": false, + "iot_class": "local_polling" }, "zerproc": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Zerproc", "integration_type": "hub", - "name": "Zerproc" + "config_flow": true, + "iot_class": "local_polling" }, "zestimate": { - "config_flow": false, - "iot_class": "cloud_polling", + "name": "Zestimate", "integration_type": "hub", - "name": "Zestimate" + "config_flow": false, + "iot_class": "cloud_polling" }, "zha": { - "config_flow": true, - "iot_class": "local_polling", + "name": "Zigbee Home Automation", "integration_type": "hub", - "name": "Zigbee Home Automation" + "config_flow": true, + "iot_class": "local_polling" }, "zhong_hong": { - "config_flow": false, - "iot_class": "local_push", + "name": "ZhongHong", "integration_type": "hub", - "name": "ZhongHong" + "config_flow": false, + "iot_class": "local_push" }, "ziggo_mediabox_xl": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Ziggo Mediabox XL", "integration_type": "hub", - "name": "Ziggo Mediabox XL" + "config_flow": false, + "iot_class": "local_polling" }, "zodiac": { - "config_flow": false, - "iot_class": "local_polling", + "name": "Zodiac", "integration_type": "hub", - "name": "Zodiac" + "config_flow": false, + "iot_class": "local_polling" }, "zone": { - "config_flow": false, - "iot_class": null, + "name": "Zone", "integration_type": "hub", - "name": "Zone" + "config_flow": false }, "zoneminder": { - "config_flow": false, - "iot_class": "local_polling", + "name": "ZoneMinder", "integration_type": "hub", - "name": "ZoneMinder" + "config_flow": false, + "iot_class": "local_polling" }, "zooz": { "name": "Zooz", @@ -6082,107 +6268,98 @@ ] }, "zwave_js": { - "config_flow": true, - "iot_class": "local_push", + "name": "Z-Wave", "integration_type": "hub", - "name": "Z-Wave" + "config_flow": true, + "iot_class": "local_push" }, "zwave_me": { - "config_flow": true, - "iot_class": "local_push", + "name": "Z-Wave.Me", "integration_type": "hub", - "name": "Z-Wave.Me" + "config_flow": true, + "iot_class": "local_push" } }, "hardware": {}, "helper": { "counter": { - "config_flow": false, - "iot_class": null, + "name": "Counter", "integration_type": "helper", - "name": "Counter" + "config_flow": false }, "derivative": { + "integration_type": "helper", "config_flow": true, - "iot_class": "calculated", - "integration_type": "helper" + "iot_class": "calculated" }, "group": { + "integration_type": "helper", "config_flow": true, - "iot_class": "calculated", - "integration_type": "helper" + "iot_class": "calculated" }, "input_boolean": { - "config_flow": false, - "iot_class": null, - "integration_type": "helper" + "integration_type": "helper", + "config_flow": false }, "input_button": { - "config_flow": false, - "iot_class": null, + "name": "Input Button", "integration_type": "helper", - "name": "Input Button" + "config_flow": false }, "input_datetime": { - "config_flow": false, - "iot_class": null, - "integration_type": "helper" + "integration_type": "helper", + "config_flow": false }, "input_number": { - "config_flow": false, - "iot_class": null, - "integration_type": "helper" + "integration_type": "helper", + "config_flow": false }, "input_select": { - "config_flow": false, - "iot_class": null, - "integration_type": "helper" + "integration_type": "helper", + "config_flow": false }, "input_text": { - "config_flow": false, - "iot_class": null, - "integration_type": "helper" + "integration_type": "helper", + "config_flow": false }, "integration": { + "integration_type": "helper", "config_flow": true, - "iot_class": "local_push", - "integration_type": "helper" + "iot_class": "local_push" }, "min_max": { + "integration_type": "helper", "config_flow": true, - "iot_class": "local_push", - "integration_type": "helper" + "iot_class": "local_push" }, "schedule": { - "config_flow": false, - "iot_class": null, - "integration_type": "helper" + "integration_type": "helper", + "config_flow": false }, "switch_as_x": { + "integration_type": "helper", "config_flow": true, - "iot_class": "calculated", - "integration_type": "helper" + "iot_class": "calculated" }, "threshold": { + "integration_type": "helper", "config_flow": true, - "iot_class": "local_polling", - "integration_type": "helper" + "iot_class": "local_polling" }, "timer": { - "config_flow": false, - "iot_class": null, + "name": "Timer", "integration_type": "helper", - "name": "Timer" + "config_flow": false }, "tod": { + "integration_type": "helper", "config_flow": true, - "iot_class": "local_push", - "integration_type": "helper" + "iot_class": "local_push" }, "utility_meter": { + "integration_type": "helper", "config_flow": true, - "iot_class": "local_push", - "integration_type": "helper" + "iot_class": "local_push" } }, "translated_name": [ diff --git a/homeassistant/generated/supported_brands.py b/homeassistant/generated/supported_brands.py deleted file mode 100644 index 30a0601861d..00000000000 --- a/homeassistant/generated/supported_brands.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Automatically generated by hassfest. - -To update, run python3 -m script.hassfest -""" - -HAS_SUPPORTED_BRANDS = [ - "denonavr", - "gree", - "hunterdouglas_powerview", - "inkbird", - "motion_blinds", - "netatmo", - "overkiz", - "renault", - "switchbee", - "thermobeacon", - "upb", - "wemo", - "xiaomi_miio", - "yalexs_ble", -] diff --git a/homeassistant/loader.py b/homeassistant/loader.py index 45028eef27f..a2fc2594b61 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -152,7 +152,6 @@ class Manifest(TypedDict, total=False): version: str codeowners: list[str] loggers: list[str] - supported_brands: dict[str, str] def manifest_from_legacy_module(domain: str, module: ModuleType) -> Manifest: diff --git a/script/hassfest/__main__.py b/script/hassfest/__main__.py index 7fb6ad2d8d0..27252969118 100644 --- a/script/hassfest/__main__.py +++ b/script/hassfest/__main__.py @@ -20,7 +20,6 @@ from . import ( requirements, services, ssdp, - supported_brands, translations, usb, zeroconf, @@ -39,7 +38,6 @@ INTEGRATION_PLUGINS = [ requirements, services, ssdp, - supported_brands, translations, usb, zeroconf, diff --git a/script/hassfest/codeowners.py b/script/hassfest/codeowners.py index 5511bc8a518..43695a39ad4 100644 --- a/script/hassfest/codeowners.py +++ b/script/hassfest/codeowners.py @@ -47,7 +47,10 @@ def generate_and_validate(integrations: dict[str, Integration], config: Config): for domain in sorted(integrations): integration = integrations[domain] - if not integration.manifest: + if ( + not integration.manifest + or integration.manifest.get("integration_type") == "virtual" + ): continue codeowners = integration.manifest["codeowners"] diff --git a/script/hassfest/config_flow.py b/script/hassfest/config_flow.py index 6905cd60d49..3fcf946bc32 100644 --- a/script/hassfest/config_flow.py +++ b/script/hassfest/config_flow.py @@ -171,14 +171,24 @@ def _generate_integrations( integration = integrations[domain] if integration.integration_type in ("entity", "system"): continue - metadata["config_flow"] = integration.config_flow - metadata["iot_class"] = integration.iot_class - metadata["integration_type"] = integration.integration_type + if integration.translated_name: result["translated_name"].add(domain) else: metadata["name"] = integration.name + metadata["integration_type"] = integration.integration_type + + if integration.integration_type == "virtual": + if integration.supported_by: + metadata["supported_by"] = integration.supported_by + if integration.iot_standard: + metadata["iot_standard"] = integration.iot_standard + else: + metadata["config_flow"] = integration.config_flow + if integration.iot_class: + metadata["iot_class"] = integration.iot_class + if integration.integration_type == "helper": result["helper"][domain] = metadata else: diff --git a/script/hassfest/manifest.py b/script/hassfest/manifest.py index 616faeb995e..1df017da22d 100644 --- a/script/hassfest/manifest.py +++ b/script/hassfest/manifest.py @@ -2,6 +2,7 @@ from __future__ import annotations from pathlib import Path +from typing import Any from urllib.parse import urlparse from awesomeversion import ( @@ -158,7 +159,7 @@ def verify_wildcard(value: str): return value -MANIFEST_SCHEMA = vol.Schema( +INTEGRATION_MANIFEST_SCHEMA = vol.Schema( { vol.Required("domain"): str, vol.Required("name"): str, @@ -254,14 +255,32 @@ MANIFEST_SCHEMA = vol.Schema( vol.Optional("loggers"): [str], vol.Optional("disabled"): str, vol.Optional("iot_class"): vol.In(SUPPORTED_IOT_CLASSES), - vol.Optional("supported_brands"): vol.Schema({str: str}), } ) -CUSTOM_INTEGRATION_MANIFEST_SCHEMA = MANIFEST_SCHEMA.extend( +VIRTUAL_INTEGRATION_MANIFEST_SCHEMA = vol.Schema( + { + vol.Required("domain"): str, + vol.Required("name"): str, + vol.Required("integration_type"): "virtual", + vol.Exclusive("iot_standard", "virtual_integration"): vol.Any( + "homekit", "zigbee", "zwave" + ), + vol.Exclusive("supported_by", "virtual_integration"): str, + } +) + + +def manifest_schema(value: dict[str, Any]) -> vol.Schema: + """Validate integration manifest.""" + if value.get("integration_type") == "virtual": + return VIRTUAL_INTEGRATION_MANIFEST_SCHEMA(value) + return INTEGRATION_MANIFEST_SCHEMA(value) + + +CUSTOM_INTEGRATION_MANIFEST_SCHEMA = INTEGRATION_MANIFEST_SCHEMA.extend( { vol.Optional("version"): vol.All(str, verify_version), - vol.Remove("supported_brands"): dict, } ) @@ -284,7 +303,7 @@ def validate_manifest(integration: Integration, core_components_dir: Path) -> No try: if integration.core: - MANIFEST_SCHEMA(integration.manifest) + manifest_schema(integration.manifest) else: CUSTOM_INTEGRATION_MANIFEST_SCHEMA(integration.manifest) except vol.Invalid as err: @@ -312,15 +331,19 @@ def validate_manifest(integration: Integration, core_components_dir: Path) -> No if ( integration.manifest["domain"] not in NO_IOT_CLASS and "iot_class" not in integration.manifest + and integration.manifest.get("integration_type") != "virtual" ): integration.add_error("manifest", "Domain is missing an IoT Class") - for domain, _name in integration.manifest.get("supported_brands", {}).items(): - if (core_components_dir / domain).exists(): - integration.add_warning( - "manifest", - f"Supported brand domain {domain} collides with built-in core integration", - ) + if ( + integration.manifest.get("integration_type") == "virtual" + and (supported_by := integration.manifest.get("supported_by")) + and not (core_components_dir / supported_by).exists() + ): + integration.add_error( + "manifest", + "Virtual integration points to non-existing supported_by integration", + ) if not integration.core: validate_version(integration) diff --git a/script/hassfest/model.py b/script/hassfest/model.py index b2459f931c6..61004bae006 100644 --- a/script/hassfest/model.py +++ b/script/hassfest/model.py @@ -109,11 +109,12 @@ class Integration: continue init = fil / "__init__.py" - if not init.exists(): + manifest = fil / "manifest.json" + if not init.exists() and not manifest.exists(): print( - f"Warning: {init} missing, skipping directory. " - "If this is your development environment, " - "you can safely delete this folder." + f"Warning: {init} and manifest.json missing, " + "skipping directory. If this is your development " + "environment, you can safely delete this folder." ) continue @@ -170,9 +171,9 @@ class Integration: return self.manifest.get("dependencies", []) @property - def supported_brands(self) -> dict[str]: - """Return dict of supported brands.""" - return self.manifest.get("supported_brands", {}) + def supported_by(self) -> str: + """Return the integration supported by this virtual integration.""" + return self.manifest.get("supported_by", {}) @property def integration_type(self) -> str: @@ -184,6 +185,11 @@ class Integration: """Return the integration IoT Class.""" return self.manifest.get("iot_class") + @property + def iot_standard(self) -> str: + """Return the IoT standard supported by this virtual integration.""" + return self.manifest.get("iot_standard", {}) + def add_error(self, *args: Any, **kwargs: Any) -> None: """Add an error.""" self.errors.append(Error(*args, **kwargs)) diff --git a/script/hassfest/supported_brands.py b/script/hassfest/supported_brands.py deleted file mode 100644 index 4ac2feb4032..00000000000 --- a/script/hassfest/supported_brands.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Generate supported_brands data.""" -from __future__ import annotations - -import black - -from .model import Config, Integration -from .serializer import to_string - -BASE = """ -\"\"\"Automatically generated by hassfest. - -To update, run python3 -m script.hassfest -\"\"\" - -HAS_SUPPORTED_BRANDS = {} -""".strip() - - -def generate_and_validate(integrations: dict[str, Integration], config: Config) -> str: - """Validate and generate supported_brands data.""" - - brands = [ - domain - for domain, integration in sorted(integrations.items()) - if integration.supported_brands - ] - - return black.format_str(BASE.format(to_string(brands)), mode=black.Mode()) - - -def validate(integrations: dict[str, Integration], config: Config) -> None: - """Validate supported_brands data.""" - supported_brands_path = config.root / "homeassistant/generated/supported_brands.py" - config.cache["supported_brands"] = content = generate_and_validate( - integrations, config - ) - - if config.specific_integrations: - return - - if supported_brands_path.read_text(encoding="utf-8") != content: - config.add_error( - "supported_brands", - "File supported_brands.py is not up to date. Run python3 -m script.hassfest", - fixable=True, - ) - - -def generate(integrations: dict[str, Integration], config: Config): - """Generate supported_brands data.""" - supported_brands_path = config.root / "homeassistant/generated/supported_brands.py" - supported_brands_path.write_text( - f"{config.cache['supported_brands']}", encoding="utf-8" - ) diff --git a/tests/components/websocket_api/test_commands.py b/tests/components/websocket_api/test_commands.py index 135882d9aed..a865776f74d 100644 --- a/tests/components/websocket_api/test_commands.py +++ b/tests/components/websocket_api/test_commands.py @@ -23,13 +23,7 @@ from homeassistant.helpers.json import json_loads from homeassistant.loader import async_get_integration from homeassistant.setup import DATA_SETUP_TIME, async_setup_component -from tests.common import ( - MockEntity, - MockEntityPlatform, - MockModule, - async_mock_service, - mock_integration, -) +from tests.common import MockEntity, MockEntityPlatform, async_mock_service STATE_KEY_SHORT_NAMES = { "entity_id": "e", @@ -1794,45 +1788,6 @@ async def test_validate_config_invalid(websocket_client, key, config, error): assert msg["result"] == {key: {"valid": False, "error": error}} -async def test_supported_brands(hass, websocket_client): - """Test supported brands.""" - # Custom components without supported brands that override a built-in component with - # supported brand will still be listed in HAS_SUPPORTED_BRANDS and should be ignored. - mock_integration( - hass, - MockModule("override_without_brands"), - ) - mock_integration( - hass, - MockModule("test", partial_manifest={"supported_brands": {"hello": "World"}}), - ) - mock_integration( - hass, - MockModule( - "abcd", partial_manifest={"supported_brands": {"something": "Something"}} - ), - ) - - with patch( - "homeassistant.generated.supported_brands.HAS_SUPPORTED_BRANDS", - ("abcd", "test", "override_without_brands"), - ): - await websocket_client.send_json({"id": 7, "type": "supported_brands"}) - msg = await websocket_client.receive_json() - - assert msg["id"] == 7 - assert msg["type"] == const.TYPE_RESULT - assert msg["success"] - assert msg["result"] == { - "abcd": { - "something": "Something", - }, - "test": { - "hello": "World", - }, - } - - async def test_message_coalescing(hass, websocket_client, hass_admin_user): """Test enabling message coalescing.""" await websocket_client.send_json(