Git Product home page Git Product logo

ha-tahoma's Introduction

Details page of an awning

GitHub release HA integration usage HA core integration usage Open in Visual Studio Code Discord

(deprecated) Overkiz (by Somfy) - Home Assistant

Since Home Assistant 2022.2 the Overkiz (by Somfy) integration is available in core and thus this custom component is deprecated. New functionality will only be added to the core integration. If you miss functionality in the core integration, please create an issue here.

Custom component for Home Assistant to interact with smart devices via the Overkiz platform.

Supported hubs

  • Atlantic Cozytouch
  • Hitachi Hi Kumo
  • Nexity Eugénie
  • Rexel Energeasy Connect
  • Somfy Connexoon IO
  • Somfy Connexoon RTS
  • Somfy TaHoma
  • Somfy TaHoma Switch (instructions)
  • Thermor Cozytouch

TaHoma Switch

Multiple users reported that the TaHoma Switch will work with this integration after you create a scene in the TaHoma app and wait for a few hours. See #507 for context.

Supported devices

Most of the devices supported by your hub should be supported. If it is not the case or working correctly, have a look here.

Installation

You can install this integration via HACS or manually.

HACS

This integration is included in HACS. Search for the Overkiz (by Somfy) integration and choose install. Reboot Home Assistant and configure the 'Overkiz (by Somfy)' integration via the integrations page or press the blue button below.

Open your Home Assistant instance and start setting up a new integration.

Manual

Copy the custom_components/tahoma to your custom_components folder. Reboot Home Assistant and configure the 'Overkiz (by Somfy)' integration via the integrations page or press the blue button below.

Open your Home Assistant instance and start setting up a new integration.

Advanced

Available services

After installation this integration adds new services to Home Assistant which can be used in automations. The new services are:

  • Overkiz (by Somfy): Set cover position with low speed (tahoma.set_cover_position_low_speed, only added if supported by the device)
  • Overkiz (by Somfy): My position (cover) (tahoma.set_cover_my_position)
  • Overkiz (by Somfy): Execute command (tahoma.execute_command)
  • Overkiz (by Somfy): Get execution history (tahoma.get_execution_history)

Events

This component listen for events returned by Overkiz. In case of command failure, the event will forwarded to Home Assistant.

You can subscribe to the overkiz.event event type in Developer Tools/Events in order to examine the event data JSON for the correct parameters to use in your automations. For example, overkiz.event returns event data JSON similar to the following when your cover is blocked.

{
    "event_type": "overkiz.event",
    "data": {
        "event_name": "ExecutionStateChangedEvent",
        "failure_type_code": 106,
        "failure_type": "CMDCANCELLED"
    },
    "origin": "LOCAL",
    "time_fired": "2021-09-28T20:03:57.102478+00:00",
    "context": {
        "id": "92a84240d914b43ceaf1aee3249568f6",
        "parent_id": null,
        "user_id": null
    }
}

You can find the list of available failure_type here.

Enable debug logging

The logger integration lets you define the level of logging activities in Home Assistant. Turning on debug mode will show more information about unsupported devices in your logbook.

logger:
  default: critical
  logs:
    custom_components.tahoma: debug

Device not supported

If your device is not visible in the device list of Home Assistant (/config/devices/dashboard), you need to turn on debug logging first. Copy your Home Assistant log (Configuration > Logs) and create a new issue.

Device not working correctly

If your device is listed in the device list, you need to turn on debug logging first. Copy your Home Assistant log (Configuration > Logs) and create a new issue.

In order to gather more information, you can use the tahoma.get_execution_history service which will print your execution history to the Home Assistant log. Run the commands via the official vendor app (e.g. TaHoma) and include your log in the issue.

Retrieve HomeKit code

If your hub (e.g. Somfy TaHoma) supports HomeKit natively, your setup code will be added as a sensor in Home Assistant. Look up your hub in Home Assistant and retrieve the value from the 'HomeKit Setup Code' sensor. You can now configure the HomeKit Controller integration in Home Assistant.

ha-tahoma's People

Contributors

azrael783 avatar colinrobbins avatar egguy avatar imicknl avatar jgarec avatar tetienne avatar vlebourl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ha-tahoma's Issues

Add support for UpDownHorizontalAwning (rts:HorizontalAwningRTSComponent)

Copied from vlebourl/tahoma_extended#8 by @gieljnssns

Device details

 {
         "creationTime":1541775044000,
         "lastUpdateTime":1541775044000,
         "label":"Zonnetent",
         "deviceURL":"rts://",
         "shortcut":false,
         "controllableName":"rts:HorizontalAwningRTSComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"deploy",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"rest",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"test",
                  "nparams":0
               },
               {
                  "commandName":"undeploy",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               }
            ],
            "states":[

            ],
            "dataProperties":[
               {
                  "value":"0",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"UpDownHorizontalAwning",
            "uiClass":"Awning",
            "qualifiedName":"rts:HorizontalAwningRTSComponent",
            "type":"ACTUATOR"
         },
         "attributes":[
            {
               "name":"rts:diy",
               "type":6,
               "value":true
            }
         ],
         "available":true,
         "enabled":true,
         "placeOID":"",
         "widget":"UpDownHorizontalAwning",
         "type":1,
         "oid":"",
         "uiClass":"Awning"
      }

Electricity Meter

Describe the bug:
Data isn't pulled from my meters

Expected behavior:
Nothing is reported. Only "unknown"

Environment:

  • Home Assistant version: 0.111
  • Platform: sensor

Device:

  • Model: 'io:TotalElectricalEnergyConsumptionIOSystemSensor'
  • Type: CumulativeElectricPowerConsumptionSensor

Covers move step by step and can't be stopped while moving

Describe the bug
I have two problems with version 1.4. At the moment I switched back to version 1.3.

  • The covers can't be stopped while they are moving. They move all the way down and don't respond to the stop button.
  • By activating a scene with several covers all covers move one by one. The first cover moves and when that one is finished the next cover moves. Until version 1.3 all covers moves all together.

To Reproduce
Steps to reproduce the behavior:

  1. Move a cover and click the stop button - the cover do not respond to that click

or

  1. Create a scene with several covers.
  2. Activate the scene

Expected behavior

  • The cover stops by clicking the stop button while moving
  • All covers should move together (and not one by one)

Screenshots
No screenshot

Environment (please complete the following information):

  • Home Assistant version: 0.111.4
  • Platform: cover

Device: (if your problem is related to a specific device)

  • Model: PositionableRollerShutter
  • Type: io:RollerShutterGenericIOComponent
  • Device details
    no further details

Additional context
No additional context necessary

Add support for Camera (jsw:CameraController)

{
        "creationTime":1544996340000,
        "lastUpdateTime":1544996340000,
        "label":"Living Room",
        "deviceURL":"####",
        "shortcut":false,
        "controllableName":"jsw:CameraController",
        "definition":{
           "commands":[
              {
                 "commandName":"downloadRecordedFile",
                 "nparams":1
              },
              {
                 "commandName":"listRecordedFiles",
                 "nparams":2
              },
              {
                 "commandName":"setPassword",
                 "nparams":2
              },
              {
                 "commandName":"connect",
                 "nparams":0
              },
              {
                 "commandName":"deleteRecordedFile",
                 "nparams":1
              },
              {
                 "commandName":"disconnect",
                 "nparams":1
              },
              {
                 "commandName":"getSessionStatus",
                 "nparams":1
              },
              {
                 "commandName":"playJSWRecordedFile",
                 "nparams":2
              },
              {
                 "commandName":"startJSWLiveVideo",
                 "nparams":1
              },
              {
                 "commandName":"startJSWRecording",
                 "nparams":0
              },
              {
                 "commandName":"stopJSWPlayRecordedFile",
                 "nparams":1
              },
              {
                 "commandName":"stopJSWLiveVideo",
                 "nparams":1
              }
           ],
           "states":[
              {
                 "type":"ContinuousState",
                 "qualifiedName":"core:FreeMemoryState"
              },
              {
                 "type":"ContinuousState",
                 "qualifiedName":"core:TotalMemoryState"
              }
           ],
           "dataProperties":[

           ],
           "widgetName":"JSWCamera",
           "uiClass":"Camera",
           "qualifiedName":"jsw:CameraController",
           "type":"ACTUATOR"
        },
        "states":[
           {
              "name":"core:TotalMemoryState",
              "type":1,
              "value":7580
           },
           {
              "name":"core:FreeMemoryState",
              "type":1,
              "value":7552
           }
        ],
        "attributes":[

        ],
        "available":true,
        "enabled":true,
        "placeOID":"####",
        "widget":"JSWCamera",
        "type":1,
        "oid":"####",
        "uiClass":"Camera"
     },

io:HorizontalAwningIOComponent reports 0 as the current_position when it's fully opened

Describe the bug
The current_position of the io:HorizontalAwningIOComponent is always 0 but the core:DeploymentState is 100 when:

  • Using the service cover.open_cover
  • Setting the 100 position using the service cover.set_cover_position

Using the service cover.set_cover_position to establish the 99 position reports:

current_position: 100
core:DeploymentState: 98

Using the service cover.set_cover_position to establish other positions, like 50 reports the correct current_position and the same core:DeploymentState.

Despite of having the custom_components.tahoma: debug configuration, no logs are registered during the reproduction of this bug.

To Reproduce

  1. Send this request:
service: cover.set_cover_position
data:
  entity_id: cover.myawning
  position: 100
  1. The current_position attribute of the cover.myawning entity reports the value 0
  2. The slider in the GUI is in the 0 position.
  3. The close button in the GUI is not enabled.

Expected behavior
The current_position attribute of the cover.myawning entity must report the value 100. and the same with the slider in the GUI and the close button must be enabled when the awning is at full opening position.

Environment

  • Home Assistant version: 0.112.2
  • Platform: Somfy TaHoma 1.5 (custom component)

Device:

  • Model: PositionableHorizontalAwning by Somfy
  • Type: io:HorizontalAwningIOComponent
  • Device details: sorry, I can't access the https://www.tahomalink.com/enduser-mobile-web/steer-html5-client/tahoma/ to get the details of the device. I'm using the same credentials that I use in this platform, but the web reports an error (maybe because I own a Connexoon and not a Tahoma).

Additional context
The problems with this awning started after a Connexoon firmware update originally reported in the home-assistant/core issue #37291. I haven't managed to retrieve the firmware version in the Connexoon Terrace Android app.

Hcs PROBLEM

Describe the bug
I've just added https://github.com/imicknl/ha-tahoma to my hassio HACCS but in the logs I get:
-07-08 06:25:02 INFO (MainThread) [supervisor.store] Load add-ons from store: 65 all - 0 new - 0 remove
20-07-08 06:31:33 INFO (MainThread) [supervisor.store.git] Clone add-on https://github.com/imicknl/ha-tahoma repository
20-07-08 06:31:36 ERROR (MainThread) [supervisor.utils.json] Can't read json from /data/addons/git/93152bd9/repository.json: [Errno 2] No such file or directory: '/data/addons/git/93152bd9/repository.json'
20-07-08 06:31:36 WARNING (MainThread) [supervisor.store.data] Can't read repository information from /data/addons/git/93152bd9/repository.json
20-07-08 06:31:36 INFO (MainThread) [supervisor.store] Load add-ons from store: 65 all - 0 new - 0 remove

Maybe somthings wrong in github repo configurations?

To Reproduce
Steps to reproduce the behavior:

  1. add https://github.com/imicknl/ha-tahoma to HACS config
  2. check the logs

Retrieve core:MeasuredValueType to understand if it is Celsius or Kelvin

Is your feature request related to a problem? Please describe.
Currently we only support temperature sensors in Celsius.

Describe the solution you'd like
Would be good to retrieve the core:MeasuredValueType to understand if a TemperatureSensor is using Kelvin or Celsius. In other integrations I have seen that this is calculated based on the figure, which is more error prone and less nice.

if CORE_TEMPERATURE_STATE in states:
# TODO Retrieve core:MeasuredValueType to understand if it is Celsius or Kelvin
return TEMP_CELSIUS

`TahomaLight` object has no attribute `_brightness`

Traceback (most recent call last):
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/components/websocket_api/commands.py", line 125, in handle_call_service
    await hass.services.async_call(
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/core.py", line 1259, in async_call
    task.result()
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/core.py", line 1294, in _execute_service
    await handler.func(service_call)
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await self.hass.helpers.service.entity_service_call(
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/helpers/service.py", line 454, in entity_service_call
    future.result()  # pop exception if have
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 597, in async_request_call
    await coro
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/helpers/service.py", line 485, in _handle_entity_call
    await result
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/components/light/__init__.py", line 242, in async_handle_light_on_service
    await light.async_turn_on(**params)
  File "/home/vlb/homeassistant/custom_components/tahoma/light.py", line 78, in async_turn_on
    _LOGGER.debug("[THM] Called to turn on (%s, %s)", kwargs, self._brightness)
AttributeError: 'TahomaLight' object has no attribute '_brightness'

Create registry with devices definition

Hi,

I can see in this component a lot of conditions about the states, the device type etc. Having worked on the SomfyAPI, I think Somfy has applied the same logic to its unofficial API. To be sure we need a full picture of the supported devices by the Tahoma (or Connexoon, or whatever).

Do you have stored somewhere the output of the devices returned by the Tahoma website?
If not, are you ok to create here or on https://github.com/philklei/tahoma-api/ a folder listing the device output (like this one #80 (comment))? It will really help us to have a nice view on what we are working on.

Add support for ExteriorScreen (rts:ExteriorBlindRTSComponent)

Copied from vlebourl/tahoma_extended#8 by @gieljnssns

Device details

  {
         "creationTime":1541775139000,
         "lastUpdateTime":1541775139000,
         "label":"Living",
         "deviceURL":"rts://",
         "shortcut":false,
         "controllableName":"rts:ExteriorBlindRTSComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"rest",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"test",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               }
            ],
            "states":[

            ],
            "dataProperties":[
               {
                  "value":"0",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"UpDownExteriorScreen",
            "uiClass":"ExteriorScreen",
            "qualifiedName":"rts:ExteriorBlindRTSComponent",
            "type":"ACTUATOR"
         },
         "attributes":[
            {
               "name":"rts:diy",
               "type":6,
               "value":true
            }
         ],
         "available":true,
         "enabled":true,
         "placeOID":"",
         "widget":"UpDownExteriorScreen",
         "type":1,
         "oid":"",
         "uiClass":"ExteriorScreen"
      },```

State not updated for Gate (io:DiscreteGateOpenerIOComponent)

Describe the bug
Not sure if bug in HA or in Tahoma, but when I open the gate from HA the status of cover correctly reflects the change. WHen the gate closes automatically after two minutes or when the gate is activated through the remote control however, the status change is not passed on to HA.

To Reproduce
Steps to reproduce the behaviour:

  1. change state of gate through cover.open_cover
  2. close gate using remote
  3. check status: still set to 'open'

Expected behavior
Status in HA should reflect physical status regardless of origin of command to open or close or stop the gate.

Environment (please complete the following information):

  • Home Assistant version: 0.110.4
  • Platform: cover

Device: io:DiscreteGateOpenerIOComponent

  • Model: [e.g. PositionableScreen, can be gathered from device list in HA]
  • Type: io:DiscreteGateOpenerIOComponent
{
	"creationTime": 1577640280000,
	"lastUpdateTime": 1577640280000,
	"label": "Gate",
	"deviceURL": "####",
	"shortcut": false,
	"controllableName": "io:DiscreteGateOpenerIOComponent",
	"definition": {
		"commands": [{
				"commandName": "close",
				"nparams": 0
			},
			{
				"commandName": "delayedStopIdentify",
				"nparams": 1
			},
			{
				"commandName": "getName",
				"nparams": 0
			},
			{
				"commandName": "identify",
				"nparams": 0
			},
			{
				"commandName": "open",
				"nparams": 0
			},
			{
				"commandName": "refreshPedestrianPosition",
				"nparams": 0
			},
			{
				"commandName": "setName",
				"nparams": 1
			},
			{
				"commandName": "setPedestrianPosition",
				"nparams": 0
			},
			{
				"commandName": "startIdentify",
				"nparams": 0
			},
			{
				"commandName": "stop",
				"nparams": 0
			},
			{
				"commandName": "stopIdentify",
				"nparams": 0
			},
			{
				"commandName": "wink",
				"nparams": 1
			}
		],
		"states": [{
				"type": "DataState",
				"qualifiedName": "core:NameState"
			},
			{
				"values": [
					"closed",
					"open",
					"pedestrian",
					"unknown"
				],
				"type": "DiscreteState",
				"qualifiedName": "core:OpenClosedPedestrianState"
			},
			{
				"type": "ContinuousState",
				"qualifiedName": "core:PedestrianPositionState"
			},
			{
				"type": "ContinuousState",
				"qualifiedName": "core:PriorityLockTimerState"
			},
			{
				"type": "ContinuousState",
				"qualifiedName": "core:RSSILevelState"
			},
			{
				"values": [
					"available",
					"unavailable"
				],
				"type": "DiscreteState",
				"qualifiedName": "core:StatusState"
			},
			{
				"values": [
					"comfortLevel1",
					"comfortLevel2",
					"comfortLevel3",
					"comfortLevel4",
					"environmentProtection",
					"humanProtection",
					"userLevel1",
					"userLevel2"
				],
				"type": "DiscreteState",
				"qualifiedName": "io:PriorityLockLevelState"
			},
			{
				"values": [
					"LSC",
					"SAAC",
					"SFC",
					"UPS",
					"externalGateway",
					"localUser",
					"myself",
					"rain",
					"security",
					"temperature",
					"timer",
					"user",
					"wind"
				],
				"type": "DiscreteState",
				"qualifiedName": "io:PriorityLockOriginatorState"
			}
		],
		"dataProperties": [{
			"value": "500",
			"qualifiedName": "core:identifyInterval"
		}],
		"widgetName": "DiscreteGateWithPedestrianPosition",
		"uiClass": "Gate",
		"qualifiedName": "io:DiscreteGateOpenerIOComponent",
		"type": "ACTUATOR"
	},
	"states": [{
			"name": "core:NameState",
			"type": 3,
			"value": "Gate"
		},
		{
			"name": "core:PriorityLockTimerState",
			"type": 1,
			"value": 0
		},
		{
			"name": "core:OpenClosedPedestrianState",
			"type": 3,
			"value": "closed"
		},
		{
			"name": "core:StatusState",
			"type": 3,
			"value": "available"
		},
		{
			"name": "core:RSSILevelState",
			"type": 2,
			"value": 50.0
		},
		{
			"name": "core:PedestrianPositionState",
			"type": 1,
			"value": 50
		}
	],
	"attributes": [

	],
	"available": true,
	"enabled": true,
	"placeOID": "####",
	"widget": "DiscreteGateWithPedestrianPosition",
	"type": 1,
	"oid": "####",
	"uiClass": "Gate"
},

Update for light component (rgb) fails - error in logs

Describe the bug
RGB light is working correct, but I still have some errors in the loggings.

Errors:

Logboekdetails (ERROR)
Logger: homeassistant.helpers.entity
Source: custom_components/tahoma/light.py:160
First occurred: 8:06:58 (327 occurrences)
Last logged: 10:58:22

Update for light.light_terras_rgb fails
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 272, in async_update_ha_state
await self.async_device_update()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 466, in async_device_update
self.update # type: ignore
File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/tahoma/light.py", line 160, in update
CORE_BLUE_COLOR_INTENSITY_STATE
TypeError: color_RGB_to_hs() missing 2 required positional arguments: 'iG' and 'iB'

Environment (please complete the following information):

  • Home Assistant version: 0.112.0

Device: (if your problem is related to a specific device)

  • Type: io:DimmableRGBLightIOCompo

Remove (or document) offset for covers

Is your feature request related to a problem? Please describe.
There is an open TODO in cover.py related to an offset that will be added to the position. This is coming from the original component and we are not sure why.

# TODO Check if this offset is really necessary
if self._position <= 5:
self._position = 0
if self._position >= 95:
self._position = 100

Describe the solution you'd like
This should be removed or properly documented.

Unable to change tilt position on io:BioclimaticPergolaIOComponent

The device io:BioclimaticPergolaIOComponent is visible in HA, but I can't change position.
Buttons and slider aren't responding.

Expected behavior
io:BioclimaticPergolaIOComponent is responding to bottons and slider

Environment (please complete the following information):

  • Home Assistant version: 0.111.4
  • Using latest beta version for Somfy Tahoma integration

Device: (if your problem is related to a specific device)

  • Model: Pergola
  • Type: io:BioclimaticPergolaIOComponent

Add support for Tahoma Scenes

Scenes as defined in the Somfy Tahoma Box are not available with TaHoma integration. Tahoma integration by configuration.yaml supports the scenes defined in Tahoma box.

Device information
Home Assistant 0.110.6
HassOS 4.10
TaHoma integration: https://github.com/iMicknl/ha-tahoma/tree/fix_44

Device details for scenes are not visible by following the instruction

Position is not updated - PositionableHorizontalAwning - io:HorizontalAwningIOComponent

Describe the bug
When I control my horizontal awning (Uitvalscherm), the awning does what I ask but the position is not updated.

The HA log is spammed with the following error:

Jun 05 19:36:59 meterkastpi hass[24450]:     await self.hass.async_add_executor_job(self.update)
Jun 05 19:36:59 meterkastpi hass[24450]:   File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
Jun 05 19:36:59 meterkastpi hass[24450]:     result = self.fn(*self.args, **self.kwargs)
Jun 05 19:36:59 meterkastpi hass[24450]:   File "/home/homeassistant/.homeassistant/custom_components/tahoma/cover.py", line 112, in update
Jun 05 19:36:59 meterkastpi hass[24450]:     CORE_CLOSURE_STATE)
Jun 05 19:36:59 meterkastpi hass[24450]: TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'
Jun 05 19:37:15 meterkastpi hass[24450]: 2020-06-05 19:37:15 ERROR (MainThread) [homeassistant.helpers.entity] Update for cover.zonwering fails
Jun 05 19:37:15 meterkastpi hass[24450]: Traceback (most recent call last):
Jun 05 19:37:15 meterkastpi hass[24450]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/helpers/entity.py", line 279, in async_update_ha_state
Jun 05 19:37:15 meterkastpi hass[24450]:     await self.async_device_update()
Jun 05 19:37:15 meterkastpi hass[24450]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/helpers/entity.py", line 472, in async_device_update
Jun 05 19:37:15 meterkastpi hass[24450]:     await self.hass.async_add_executor_job(self.update)
Jun 05 19:37:15 meterkastpi hass[24450]:   File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
Jun 05 19:37:15 meterkastpi hass[24450]:     result = self.fn(*self.args, **self.kwargs)
Jun 05 19:37:15 meterkastpi hass[24450]:   File "/home/homeassistant/.homeassistant/custom_components/tahoma/cover.py", line 112, in update
Jun 05 19:37:15 meterkastpi hass[24450]:     CORE_CLOSURE_STATE)

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'cover.zonwering' (in my case)
  2. Click on 'open' or 'close'
  3. See the awning physically do what I ask, but the position slider not changing

Expected behavior
The position slider to change

Environment (please complete the following information):

  • Home Assistant version: 0.110.4
  • Platform: cover

Device: (if your problem is related to a specific device)

  • Model: PositionableHorizontalAwning
    by Somfy
  • Type: io:HorizontalAwningIOComponent

Refactor constants and strings

  • Move constants from consts.py to the platform files if they are only used there
  • Add constants for all strings, especially in binary_sensor, cover and switch
  • Utilise f strings instead of .format() (core comment)
  • Add helper functions for retrieving state and calling commands, eliminating all the if statements

Change Unsupported Tahoma device logging from `warning` to `debug`

Is your feature request related to a problem? Please describe.
Currently the log is spammed with warnings for devices that are currently not supported. In the past you could exclude them via the exclude function, but since we moved to the Entity Registry for disabling entities, the exclude functionality is deprecated.

_LOGGER.warning(
    "Unsupported Tahoma device (%s - %s - %s)",
    _device.type,
    _device.uiclass,
    _device.widget,
)

Describe the solution you'd like
Change the log level to debug and add instructions on how to turn on debug mode for this component.

Add support for ogp:Bridge

Device information
I don't know which device is. Doesn't having this device doesn't seems to affect my awning or solar sensor.

Device details
Sorry, I can't access the https://www.tahomalink.com/enduser-mobile-web/steer-html5-client/tahoma/ to get the details of the device. I'm using the same credentials that I use in this platform, but the web reports an error (maybe because I own a Connexoon and not a Tahoma).

Debug log registered in Home Assistant logs

2020-07-05 10: 50: 01 DEBUG (MainThread) [custom_components.tahoma] Unsupported Tahoma device (ogp:Bridge). Create an issue on Github with the following information. 
 ogp:Bridge - ProtocolGateway - DynamicBridge 
 [
    {
        "commandName": "sendPrivate",
        "nparams": 1
    }
],
[
    {
        "type": "DataState",
        "qualifiedName": "core:Private10State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private1State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private2State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private3State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private4State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private5State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private6State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private7State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private8State"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:Private9State"
    }
]
2020-07-05 10: 50: 01 DEBUG (MainThread) [custom_components.tahoma] Unsupported Tahoma device (ogp:Bridge). Create an issue on Github with the following information. 
 ogp:Bridge - ProtocolGateway - DynamicBridge 
 [
    {
        "commandName": "discover",
        "nparams": 0
    },
    {
        "commandName": "identify",
        "nparams": 0
    },
    {
        "commandName": "setName",
        "nparams": 1
    }
],
[
    {
        "values": [
            "available",
            "unavailable"
        ],
        "type": "DiscreteState",
        "qualifiedName": "core:AvailabilityState"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:NameState"
    }
]
2020-07-05 10: 50: 01 DEBUG (MainThread) [custom_components.tahoma] Unsupported Tahoma device (ogp:Bridge). Create an issue on Github with the following information. 
 ogp:Bridge - ProtocolGateway - DynamicBridge 
 [
    {
        "commandName": "discover",
        "nparams": 0
    },
    {
        "commandName": "identify",
        "nparams": 0
    },
    {
        "commandName": "setName",
        "nparams": 1
    }
],
[
    {
        "values": [
            "available",
            "unavailable"
        ],
        "type": "DiscreteState",
        "qualifiedName": "core:AvailabilityState"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:NameState"
    }
]

Environment

  • Home Assistant version: 0.112.2
  • Platform: Somfy TaHoma 1.5 (custom component)

custom_components.tahoma.config_flow - Unexpected exception - ValueError: No ui Class

Describe the bug

Found this custom integration while searching for issues related to home-assistant/core#37291.
Anyways, haven't used it before and running into a config_flow issue after submitting my credentials:

[%key:common::config_flow::error::unknown%]

To Reproduce
Steps to reproduce the behavior:

  1. Go to Integrations and add the integration
  2. Click on submit after inserting credentials
  3. See error

Expected behavior

With this error I'm unable to activate/configure the component.

Screenshots

grafik

Environment (please complete the following information):

  • Home Assistant version: 0.112.0
  • Platform: -

Device: -

("No ui Class: " + debug_output)
ValueError: No ui Class: {
"creationTime": 1472213846000, 
"lastUpdateTime": 1472213846000, 
"label": "ZWAVE (2#1)", 
"deviceURL": "zwave://xxxx-xxxx-xxxx/2#1", 
"shortcut": false, 
"controllableName": "zwave:ZWaveOccupancySensor", 
"definition": {"commands": [], "states": [], "dataProperties": [], "qualifiedName": "zwave:ZWaveOccupancySensor", "type": "UNKNOWN"},
"available": false, "enabled": true, "placeOID": "xxx", "type": 0, "oid": "xxx-xxx-xxx-xxx-xxx"}

Additional context

Exception:

Traceback (most recent call last):
  File "/config/custom_components/tahoma/config_flow.py", line 92, in async_step_user
    info = await validate_input(self.hass, user_input)
  File "/config/custom_components/tahoma/config_flow.py", line 48, in validate_input
    await hass.async_add_executor_job(controller.get_setup)
  File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/tahoma/tahoma_api.py", line 238, in get_setup
    self._get_setup(result)
  File "/config/custom_components/tahoma/tahoma_api.py", line 248, in _get_setup
    device = Device(self, device_data)
  File "/config/custom_components/tahoma/tahoma_api.py", line 615, in __init__
    raise ValueError("No ui Class: " + debug_output)
ValueError: No ui Class: {
"creationTime": 1472213846000, 
"lastUpdateTime": 1472213846000, 
"label": "ZWAVE (2#1)", 
"deviceURL": "zwave://xxxx-xxxx-xxxx/2#1", 
"shortcut": false, 
"controllableName": "zwave:ZWaveOccupancySensor", 
"definition": {"commands": [], "states": [], "dataProperties": [], "qualifiedName": "zwave:ZWaveOccupancySensor", "type": "UNKNOWN"},
"available": false, "enabled": true, "placeOID": "xxx", "type": 0, "oid": "xxx-xxx-xxx-xxx-xxx"}```

Not authenticated error.

Describe the bug
For some unknown reason, we get kicked out of the api, causing the following error message:
{"errorCode":"RESOURCE_ACCESS_DENIED","error":"Not authenticated"}

To Reproduce
Don't know yet...

io:VerticalExteriorAwningIOComponent shown as io:HorizontalAwningIOComponent

Describe the bug
My two exterior and vertical awnings are recognize as an horizontal awining. Therefore the current position is always reversed. Also the Lovelace widget shows curtains icons instead of up/down arrows.

Expected behavior

  • State open = Position 100
  • State closed = Position 0
  • Widget icons = up/down arrows

Environment (please complete the following information):

  • Home Assistant version: 0.112.1
  • Platform: cover

Device: (if your problem is related to a specific device)

  • Model: Potisionable Awning
  • Type: io:VerticalExteriorAwningIOComponent

Additional context
current_position: 0
uiclass: Awning
widget: PositionableHorizontalAwning
type: io:HorizontalAwningIOComponent
rssi_level: 50
core:NameState: Toldo Terraza
core:PriorityLockTimerState: 0
core:StatusState: available
core:DiscreteRSSILevelState: normal
core:RSSILevelState: 50
core:DeploymentState: 100
core:OpenClosedState: open
friendly_name: Toldo Terraza
supported_features: 15
device_class: awning

Thank you

Add support for Siren (io:SomfyIndoorSimpleSirenIOComponent)

Somfy Tahomo Box 2020.1.4-2 version

Device information
Somfy Rollershutter RTS
Somfy Contact Sensor IO
Somfy Motion Sensor IO
Somfy Temperature Sensor IO
Somfy Lightsensor IO
Somfy Blind IO (got error for this one)
and a lot more see json output

Device details

   "devices":[
      {
         "creationTime":1569661831000,
         "lastUpdateTime":1569661831000,
         "label":"Alarm",
         "shortcut":false,
         "controllableName":"internal:TSKAlarmComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"alarmOff",
                  "nparams":0
               },
               {
                  "commandName":"alarmOn",
                  "nparams":0
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"on",
                  "nparams":0
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"refreshAlarmDelay",
                  "nparams":0
               },
               {
                  "commandName":"refreshCurrentAlarmMode",
                  "nparams":0
               },
               {
                  "commandName":"refreshIntrusionDetected",
                  "nparams":0
               },
               {
                  "commandName":"setAlarmDelay",
                  "nparams":1
               },
               {
                  "commandName":"alarmPartial1",
                  "nparams":0
               },
               {
                  "commandName":"alarmPartial2",
                  "nparams":0
               },
               {
                  "commandName":"setIntrusionDetected",
                  "nparams":1
               },
               {
                  "commandName":"setTargetAlarmMode",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"internal:AlarmDelayState"
               },
               {
                  "values":[
                     "off",
                     "partial1",
                     "partial2",
                     "total"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"internal:CurrentAlarmModeState"
               },
               {
                  "values":[
                     "detected",
                     "notDetected",
                     "pending",
                     "sos"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"internal:IntrusionDetectedState"
               },
               {
                  "values":[
                     "off",
                     "partial1",
                     "partial2",
                     "sos",
                     "total"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"internal:TargetAlarmModeState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"TSKAlarmController",
            "uiClass":"Alarm",
            "qualifiedName":"internal:TSKAlarmComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"alarm name"
            },
            {
               "name":"internal:CurrentAlarmModeState",
               "type":3,
               "value":"off"
            },
            {
               "name":"internal:AlarmDelayState",
               "type":1,
               "value":30
            },
            {
               "name":"internal:TargetAlarmModeState",
               "type":3,
               "value":"off"
            },
            {
               "name":"internal:IntrusionDetectedState",
               "type":3,
               "value":"notDetected"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"TSKAlarmController",
         "type":1,
         "uiClass":"Alarm"
      },
      {
         "creationTime":1569661581000,
         "lastUpdateTime":1569661581000,
         "label":"Algemeen",
         "shortcut":false,
         "controllableName":"internal:PodV2Component",
         "metadata":"{\"tahoma\":{\"touchButtonFlag\":true}}",
         "definition":{
            "commands":[
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"update",
                  "nparams":0
               },
               {
                  "commandName":"setCountryCode",
                  "nparams":1
               },
               {
                  "commandName":"activateCalendar",
                  "nparams":0
               },
               {
                  "commandName":"deactivateCalendar",
                  "nparams":0
               },
               {
                  "commandName":"refreshBatteryStatus",
                  "nparams":0
               },
               {
                  "commandName":"refreshPodMode",
                  "nparams":0
               },
               {
                  "commandName":"refreshUpdateStatus",
                  "nparams":0
               },
               {
                  "commandName":"setCalendar",
                  "nparams":1
               },
               {
                  "commandName":"setLightingLedPodMode",
                  "nparams":1
               },
               {
                  "commandName":"setPodLedOff",
                  "nparams":0
               },
               {
                  "commandName":"setPodLedOn",
                  "nparams":0
               }
            ],
            "states":[
               {
                  "values":[
                     "offline",
                     "online"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:ConnectivityState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:CountryCodeState"
               },
               {
                  "values":[
                     "pressed",
                     "stop"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:CyclicButtonState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"internal:BatteryStatusState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"internal:LightingLedPodModeState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"Pod",
            "uiClass":"Pod",
            "qualifiedName":"internal:PodV2Component",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Box"
            },
            {
               "name":"internal:BatteryStatusState",
               "type":3,
               "value":"no"
            },
            {
               "name":"internal:LightingLedPodModeState",
               "type":2,
               "value":0.0
            },
            {
               "name":"core:CountryCodeState",
               "type":3,
               "value":"BE"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"Pod",
         "type":1,
         "uiClass":"Pod"
      },
      {
         "creationTime":1569663971000,
         "lastUpdateTime":1569663971000,
         "label":"Telenet TV",
         "shortcut":false,
         "controllableName":"io:OnOffIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"on",
                  "nparams":0
               },
               {
                  "commandName":"onWithTimer",
                  "nparams":1
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"setOnOff",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "off",
                     "on"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OnOffState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"StatefulOnOff",
            "uiClass":"OnOff",
            "qualifiedName":"io:OnOffIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Telenet TV"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":100.0
            },
            {
               "name":"core:OnOffState",
               "type":3,
               "value":"on"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"StatefulOnOff",
         "type":1,
         "uiClass":"OnOff"
      },
      {
         "creationTime":1590647429000,
         "lastUpdateTime":1590647429000,
         "label":"Siren io",
         "shortcut":false,
         "controllableName":"io:SomfyIndoorSimpleSirenIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               },
               {
                  "commandName":"ringWithDoubleSimpleSequence",
                  "nparams":8
               },
               {
                  "commandName":"ringWithSingleSimpleSequence",
                  "nparams":4
               },
               {
                  "commandName":"ringWithThreeSimpleSequence",
                  "nparams":12
               },
               {
                  "commandName":"setMemorizedSimpleVolume",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "values":[
                     "full",
                     "low",
                     "normal",
                     "verylow"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:BatteryState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "off",
                     "on"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OnOffState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "highest",
                     "standard"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:MemorizedSimpleVolumeState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"IOSiren",
            "uiClass":"Siren",
            "qualifiedName":"io:SomfyIndoorSimpleSirenIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Siren io"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":100.0
            },
            {
               "name":"core:BatteryState",
               "type":3,
               "value":"normal"
            },
            {
               "name":"core:OnOffState",
               "type":3,
               "value":"off"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"IOSiren",
         "type":1,
         "uiClass":"Siren"
      },
      {
         "creationTime":1569664702000,
         "lastUpdateTime":1569664702000,
         "label":"Berging",
         "shortcut":false,
         "controllableName":"io:SomfyOccupancyIOSystemSensor",
         "definition":{
            "commands":[

            ],
            "states":[
               {
                  "eventBased":true,
                  "values":[
                     "noPersonInside",
                     "personInside"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OccupancyState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "dead",
                     "lowBattery",
                     "maintenanceRequired",
                     "noDefect"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:SensorDefectState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"OccupancySensor",
            "uiClass":"OccupancySensor",
            "qualifiedName":"io:SomfyOccupancyIOSystemSensor",
            "type":"SENSOR"
         },
         "states":[
            {
               "name":"core:OccupancyState",
               "type":3,
               "value":"noPersonInside"
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":98.0
            }
         ],
         "attributes":[
            {
               "name":"core:PowerSourceType",
               "type":3,
               "value":"battery"
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"OccupancySensor",
         "type":2,
         "uiClass":"OccupancySensor"
      },
      {
         "creationTime":1582270508000,
         "lastUpdateTime":1582270508000,
         "label":"Licht terras",
         "shortcut":false,
         "controllableName":"io:DimmableLightIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"on",
                  "nparams":0
               },
               {
                  "commandName":"onWithTimer",
                  "nparams":1
               },
               {
                  "commandName":"refreshMemorized1Position",
                  "nparams":0
               },
               {
                  "commandName":"setIntensity",
                  "nparams":1
               },
               {
                  "commandName":"setIntensityWithTimer",
                  "nparams":3
               },
               {
                  "commandName":"setMemorized1Position",
                  "nparams":1
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"setOnOff",
                  "nparams":1
               },
               {
                  "commandName":"setPosition",
                  "nparams":1
               },
               {
                  "commandName":"setSecuredPosition",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:LightIntensityState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:Memorized1PositionState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "off",
                     "on"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OnOffState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:SecuredPositionState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"DimmerLight",
            "uiClass":"Light",
            "qualifiedName":"io:DimmableLightIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Licht terras"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":82.0
            },
            {
               "name":"core:LightIntensityState",
               "type":1,
               "value":0
            },
            {
               "name":"core:OnOffState",
               "type":3,
               "value":"off"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"DimmerLight",
         "type":1,
         "uiClass":"Light"
      },
      {
         "creationTime":1569671882000,
         "lastUpdateTime":1569671882000,
         "label":"Lichtsensor",
         "shortcut":false,
         "controllableName":"io:LightIOSystemSensor",
         "definition":{
            "commands":[

            ],
            "states":[
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:LuminanceState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "dead",
                     "lowBattery",
                     "maintenanceRequired",
                     "noDefect"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:SensorDefectState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               }
            ],
            "dataProperties":[
               {
                  "value":{
                     "activationDelayMap":{
                        "middle":0,
                        "lower":1200,
                        "upper":300
                     },
                     "referenceStates":[
                        "middle",
                        "lower",
                        "upper"
                     ],
                     "qualifiedName":"io:SunSensorHysteresisBehavior"
                  },
                  "qualifiedName":"core:timeBasedHysteresisBehavior"
               }
            ],
            "widgetName":"LuminanceSensor",
            "uiClass":"LightSensor",
            "qualifiedName":"io:LightIOSystemSensor",
            "type":"SENSOR"
         },
         "states":[
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":72.0
            },
            {
               "name":"core:LuminanceState",
               "type":2,
               "value":1176.0
            }
         ],
         "attributes":[
            {
               "name":"core:MinSensedValue",
               "type":1,
               "value":50
            },
            {
               "name":"core:MaxSensedValue",
               "type":1,
               "value":100000
            },
            {
               "name":"core:MeasuredValueType",
               "type":3,
               "value":"core:LuminanceInLux"
            },
            {
               "name":"core:PowerSourceType",
               "type":3,
               "value":"battery"
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"LuminanceSensor",
         "type":2,
         "uiClass":"LightSensor"
      },
      {
         "creationTime":1590602842000,
         "lastUpdateTime":1590602842000,
         "label":"Temperatuur terras",
         "shortcut":false,
         "controllableName":"io:TemperatureIOSystemSensor",
         "definition":{
            "commands":[

            ],
            "states":[
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "dead",
                     "lowBattery",
                     "maintenanceRequired",
                     "noDefect"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:SensorDefectState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:TemperatureState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"TemperatureSensor",
            "uiClass":"TemperatureSensor",
            "qualifiedName":"io:TemperatureIOSystemSensor",
            "type":"SENSOR"
         },
         "states":[
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":72.0
            },
            {
               "name":"core:TemperatureState",
               "type":2,
               "value":21.400000000000034
            }
         ],
         "attributes":[
            {
               "name":"core:MinSensedValue",
               "type":1,
               "value":-20
            },
            {
               "name":"core:MaxSensedValue",
               "type":1,
               "value":60
            },
            {
               "name":"core:MeasuredValueType",
               "type":3,
               "value":"core:TemperatureInCelcius"
            },
            {
               "name":"core:PowerSourceType",
               "type":3,
               "value":"battery"
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"TemperatureSensor",
         "type":2,
         "uiClass":"TemperatureSensor"
      },
      {
         "creationTime":1569665062000,
         "lastUpdateTime":1569665062000,
         "label":"Inkomhal",
         "shortcut":false,
         "controllableName":"io:SomfyOccupancyIOSystemSensor",
         "definition":{
            "commands":[

            ],
            "states":[
               {
                  "eventBased":true,
                  "values":[
                     "noPersonInside",
                     "personInside"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OccupancyState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "dead",
                     "lowBattery",
                     "maintenanceRequired",
                     "noDefect"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:SensorDefectState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"OccupancySensor",
            "uiClass":"OccupancySensor",
            "qualifiedName":"io:SomfyOccupancyIOSystemSensor",
            "type":"SENSOR"
         },
         "states":[
            {
               "name":"core:OccupancyState",
               "type":3,
               "value":"noPersonInside"
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":98.0
            }
         ],
         "attributes":[
            {
               "name":"core:PowerSourceType",
               "type":3,
               "value":"battery"
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"OccupancySensor",
         "type":2,
         "uiClass":"OccupancySensor"
      },
      {
         "creationTime":1576071099000,
         "lastUpdateTime":1576071099000,
         "label":"Leeslamp",
         "shortcut":false,
         "controllableName":"io:OnOffIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"on",
                  "nparams":0
               },
               {
                  "commandName":"onWithTimer",
                  "nparams":1
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"setOnOff",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "off",
                     "on"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OnOffState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"StatefulOnOff",
            "uiClass":"OnOff",
            "qualifiedName":"io:OnOffIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Leeslamp"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":98.0
            },
            {
               "name":"core:OnOffState",
               "type":3,
               "value":"off"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"StatefulOnOff",
         "type":1,
         "uiClass":"OnOff"
      },
      {
         "creationTime":1569663828000,
         "lastUpdateTime":1569663828000,
         "label":"TV aan/uit",
         "shortcut":false,
         "controllableName":"io:OnOffIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"on",
                  "nparams":0
               },
               {
                  "commandName":"onWithTimer",
                  "nparams":1
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"setOnOff",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "off",
                     "on"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OnOffState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"StatefulOnOff",
            "uiClass":"OnOff",
            "qualifiedName":"io:OnOffIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"TV aan/uit"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":100.0
            },
            {
               "name":"core:OnOffState",
               "type":3,
               "value":"on"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"StatefulOnOff",
         "type":1,
         "uiClass":"OnOff"
      },
      {
         "creationTime":1582270976000,
         "lastUpdateTime":1582270976000,
         "label":"Zonwering",
         "shortcut":false,
         "controllableName":"io:HorizontalAwningIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"deploy",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"refreshMemorized1Position",
                  "nparams":0
               },
               {
                  "commandName":"setClosure",
                  "nparams":1
               },
               {
                  "commandName":"setDeployment",
                  "nparams":1
               },
               {
                  "commandName":"setMemorized1Position",
                  "nparams":1
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"setPosition",
                  "nparams":1
               },
               {
                  "commandName":"setSecuredPosition",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"undeploy",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:DeploymentState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:Memorized1PositionState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "closed",
                     "open"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OpenClosedState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:SecuredPositionState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"PositionableHorizontalAwning",
            "uiClass":"Awning",
            "qualifiedName":"io:HorizontalAwningIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Zonwering"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":86.0
            },
            {
               "name":"core:DeploymentState",
               "type":1,
               "value":100
            },
            {
               "name":"core:OpenClosedState",
               "type":3,
               "value":"open"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"PositionableHorizontalAwning",
         "type":1,
         "uiClass":"Awning"
      },
      {
         "creationTime":1569667021000,
         "lastUpdateTime":1569667021000,
         "label":"Schuifraam",
         "shortcut":false,
         "controllableName":"rtds:RTDSContactSensor",
         "definition":{
            "commands":[

            ],
            "states":[
               {
                  "values":[
                     "closed",
                     "open"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:ContactState"
               },
               {
                  "values":[
                     "dead",
                     "lowBattery",
                     "maintenanceRequired",
                     "noDefect"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:SensorDefectState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"ContactSensor",
            "uiClass":"ContactSensor",
            "qualifiedName":"rtds:RTDSContactSensor",
            "type":"SENSOR"
         },
         "states":[
            {
               "name":"core:ContactState",
               "type":3,
               "value":"closed"
            }
         ],
         "attributes":[
            {
               "name":"core:PowerSourceType",
               "type":3,
               "value":"battery"
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"ContactSensor",
         "type":2,
         "uiClass":"ContactSensor"
      },
      {
         "creationTime":1569663095000,
         "lastUpdateTime":1569663095000,
         "label":"Slaapkamer 3.2",
         "shortcut":false,
         "controllableName":"rts:RollerShutterRTSComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"rest",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"test",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               }
            ],
            "states":[

            ],
            "dataProperties":[
               {
                  "value":"0",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"UpDownRollerShutter",
            "uiClass":"RollerShutter",
            "qualifiedName":"rts:RollerShutterRTSComponent",
            "type":"ACTUATOR"
         },
         "attributes":[
            {
               "name":"rts:diy",
               "type":6,
               "value":true
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"UpDownRollerShutter",
         "type":1,
         "uiClass":"RollerShutter"
      },
      {
         "creationTime":1569662970000,
         "lastUpdateTime":1569662970000,
         "label":"Slaapkamer 3.1",
         "shortcut":false,
         "controllableName":"rts:RollerShutterRTSComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"rest",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"test",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               }
            ],
            "states":[

            ],
            "dataProperties":[
               {
                  "value":"0",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"UpDownRollerShutter",
            "uiClass":"RollerShutter",
            "qualifiedName":"rts:RollerShutterRTSComponent",
            "type":"ACTUATOR"
         },
         "attributes":[
            {
               "name":"rts:diy",
               "type":6,
               "value":true
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"UpDownRollerShutter",
         "type":1,
         "uiClass":"RollerShutter"
      },
      {
         "creationTime":1569662876000,
         "lastUpdateTime":1569662876000,
         "label":"Slaapkamer 2",
         "shortcut":false,
         "controllableName":"rts:RollerShutterRTSComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"rest",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"test",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               }
            ],
            "states":[

            ],
            "dataProperties":[
               {
                  "value":"0",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"UpDownRollerShutter",
            "uiClass":"RollerShutter",
            "qualifiedName":"rts:RollerShutterRTSComponent",
            "type":"ACTUATOR"
         },
         "attributes":[
            {
               "name":"rts:diy",
               "type":6,
               "value":true
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"UpDownRollerShutter",
         "type":1,
         "uiClass":"RollerShutter"
      },
      {
         "creationTime":1569662813000,
         "lastUpdateTime":1569662813000,
         "label":"Slaapkamer 1",
         "shortcut":false,
         "controllableName":"rts:RollerShutterRTSComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"rest",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"test",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               }
            ],
            "states":[

            ],
            "dataProperties":[
               {
                  "value":"0",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"UpDownRollerShutter",
            "uiClass":"RollerShutter",
            "qualifiedName":"rts:RollerShutterRTSComponent",
            "type":"ACTUATOR"
         },
         "attributes":[
            {
               "name":"rts:diy",
               "type":6,
               "value":true
            }
         ],
         "available":true,
         "enabled":true,
         "widget":"UpDownRollerShutter",
         "type":1,
         "uiClass":"RollerShutter"
      }
   ]

Add support for IO RGB Light (io:DimmableRGBLightIOComponent)

IO RGB Light.
ON/Off and dimming is working at this moment, but I can't change the colors

Device details

{
         "creationTime":1590511973000,
         "lastUpdateTime":1590511973000,
         "label":"Light Terras RGB",
         "deviceURL":"io://xxxxxxx",
         "shortcut":false,
         "controllableName":"io:DimmableRGBLightIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"on",
                  "nparams":0
               },
               {
                  "commandName":"onWithTimer",
                  "nparams":1
               },
               {
                  "commandName":"refreshMemorized1Position",
                  "nparams":0
               },
               {
                  "commandName":"setIntensity",
                  "nparams":1
               },
               {
                  "commandName":"setIntensityWithTimer",
                  "nparams":3
               },
               {
                  "commandName":"setMemorized1Position",
                  "nparams":1
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"setOnOff",
                  "nparams":1
               },
               {
                  "commandName":"setPosition",
                  "nparams":1
               },
               {
                  "commandName":"setRGB",
                  "nparams":3
               },
               {
                  "commandName":"setRGBWithTimer",
                  "nparams":4
               },
               {
                  "commandName":"setSecuredPosition",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:BlueColorIntensityState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:GreenColorIntensityState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:LightIntensityState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:Memorized1PositionState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "off",
                     "on"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OnOffState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RedColorIntensityState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:SecuredPositionState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"DimmerRGBColouredLight",
            "uiClass":"Light",
            "qualifiedName":"io:DimmableRGBLightIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Light Terras RGB"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":28.0
            },
            {
               "name":"core:OnOffState",
               "type":3,
               "value":"off"
            },
            {
               "name":"core:LightIntensityState",
               "type":1,
               "value":0
            },
            {
               "name":"core:RedColorIntensityState",
               "type":1,
               "value":0
            },
            {
               "name":"core:GreenColorIntensityState",
               "type":1,
               "value":0
            },
            {
               "name":"core:BlueColorIntensityState",
               "type":1,
               "value":0
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "placeOID":"xxxxxx",
         "widget":"DimmerRGBColouredLight",
         "type":1,
         "oid":"xxx",
         "uiClass":"Light"
      }

Actions are applied sequentialy

Describe the bug
When triggering multiple actions in a short time period, actions are executed sequentially by the box instead of concurrently.

Expected behavior
Action should be able to execute at once on independent devices.

Additional context
This probably relates to the introduction of this part in apply_action:

        while exec_id in self.controller.get_current_executions():
            continue

This relates to #90 (2)

Add support for Gate - DiscreteGateWithPedestrianPosition (io:DiscreteGateOpenerIOComponent)

Following from this thread:

{
"creationTime":1577640280000,
"lastUpdateTime":1577640280000,
"label":"Gate",
"deviceURL":"####",
"shortcut":false,
"controllableName":"io:DiscreteGateOpenerIOComponent",
"definition":{
"commands":[
{
"commandName":"close",
"nparams":0
},
{
"commandName":"delayedStopIdentify",
"nparams":1
},
{
"commandName":"getName",
"nparams":0
},
{
"commandName":"identify",
"nparams":0
},
{
"commandName":"open",
"nparams":0
},
{
"commandName":"refreshPedestrianPosition",
"nparams":0
},
{
"commandName":"setName",
"nparams":1
},
{
"commandName":"setPedestrianPosition",
"nparams":0
},
{
"commandName":"startIdentify",
"nparams":0
},
{
"commandName":"stop",
"nparams":0
},
{
"commandName":"stopIdentify",
"nparams":0
},
{
"commandName":"wink",
"nparams":1
}
],
"states":[
{
"type":"DataState",
"qualifiedName":"core:NameState"
},
{
"values":[
"closed",
"open",
"pedestrian",
"unknown"
],
"type":"DiscreteState",
"qualifiedName":"core:OpenClosedPedestrianState"
},
{
"type":"ContinuousState",
"qualifiedName":"core:PedestrianPositionState"
},
{
"type":"ContinuousState",
"qualifiedName":"core:PriorityLockTimerState"
},
{
"type":"ContinuousState",
"qualifiedName":"core:RSSILevelState"
},
{
"values":[
"available",
"unavailable"
],
"type":"DiscreteState",
"qualifiedName":"core:StatusState"
},
{
"values":[
"comfortLevel1",
"comfortLevel2",
"comfortLevel3",
"comfortLevel4",
"environmentProtection",
"humanProtection",
"userLevel1",
"userLevel2"
],
"type":"DiscreteState",
"qualifiedName":"io:PriorityLockLevelState"
},
{
"values":[
"LSC",
"SAAC",
"SFC",
"UPS",
"externalGateway",
"localUser",
"myself",
"rain",
"security",
"temperature",
"timer",
"user",
"wind"
],
"type":"DiscreteState",
"qualifiedName":"io:PriorityLockOriginatorState"
}
],
"dataProperties":[
{
"value":"500",
"qualifiedName":"core:identifyInterval"
}
],
"widgetName":"DiscreteGateWithPedestrianPosition",
"uiClass":"Gate",
"qualifiedName":"io:DiscreteGateOpenerIOComponent",
"type":"ACTUATOR"
},
"states":[
{
"name":"core:NameState",
"type":3,
"value":"Gate"
},
{
"name":"core:PriorityLockTimerState",
"type":1,
"value":0
},
{
"name":"core:OpenClosedPedestrianState",
"type":3,
"value":"closed"
},
{
"name":"core:StatusState",
"type":3,
"value":"available"
},
{
"name":"core:RSSILevelState",
"type":2,
"value":50.0
},
{
"name":"core:PedestrianPositionState",
"type":1,
"value":50
}
],
"attributes":[

     ],
     "available":true,
     "enabled":true,
     "placeOID":"####",
     "widget":"DiscreteGateWithPedestrianPosition",
     "type":1,
     "oid":"####",
     "uiClass":"Gate"
  },

Remove YAML config schema

Is your feature request related to a problem? Please describe.

# TODO Deprecate EXCLUDE for the native method of disabling entities
CONFIG_SCHEMA = vol.Schema(
{
DOMAIN: vol.Schema(
{
vol.Required(CONF_USERNAME): cv.string,
vol.Required(CONF_PASSWORD): cv.string,
vol.Optional(CONF_EXCLUDE, default=[]): vol.All(
cv.ensure_list, [cv.string]
),
}
)
},
extra=vol.ALLOW_EXTRA,
)

Integration still has some legacy YAML schema, which is not used anymore.

Describe the solution you'd like
Should be removed. (or support for YAML could be added, for backwards compatibility)

Add support for AwningComponent (io:HorizontalAwningIOComponent)

This devise is an sort of horizontal rollershutter against the sun on my terrace.
The tahoma integrations finds my io rollershutter but does nog reacts on commands.

Device details

{
         "creationTime":1582270976000,
         "lastUpdateTime":1582270976000,
         "label":"Zonwering",
         "shortcut":false,
         "controllableName":"io:HorizontalAwningIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"close",
                  "nparams":0
               },
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"deploy",
                  "nparams":0
               },
               {
                  "commandName":"down",
                  "nparams":0
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"my",
                  "nparams":0
               },
               {
                  "commandName":"open",
                  "nparams":0
               },
               {
                  "commandName":"refreshMemorized1Position",
                  "nparams":0
               },
               {
                  "commandName":"setClosure",
                  "nparams":1
               },
               {
                  "commandName":"setDeployment",
                  "nparams":1
               },
               {
                  "commandName":"setMemorized1Position",
                  "nparams":1
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"setPosition",
                  "nparams":1
               },
               {
                  "commandName":"setSecuredPosition",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stop",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"undeploy",
                  "nparams":0
               },
               {
                  "commandName":"up",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:DeploymentState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:Memorized1PositionState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "closed",
                     "open"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OpenClosedState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:SecuredPositionState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"PositionableHorizontalAwning",
            "uiClass":"Awning",
            "qualifiedName":"io:HorizontalAwningIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Zonwering"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":86.0
            },
            {
               "name":"core:DeploymentState",
               "type":1,
               "value":100
            },
            {
               "name":"core:OpenClosedState",
               "type":3,
               "value":"open"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "widget":"PositionableHorizontalAwning",
         "type":1,
         "uiClass":"Awning"
      }

Add support for RainSensor (io:SomfyRainIOSystemSensor)

Device information
Rain sensor with detected, notDetected states which is used to control covers.

Device details

 {
         "creationTime":1579704509000,
         "lastUpdateTime":1579704509000,
         "label":"dest",
         "shortcut":false,
         "controllableName":"io:SomfyRainIOSystemSensor",
         "definition":{
            "commands":[

            ],
            "states":[
               {
                  "values":[
                     "good",
                     "low",
                     "normal",
                     "verylow"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:DiscreteRSSILevelState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "detected",
                     "notDetected"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:RainState"
               },
               {
                  "values":[
                     "dead",
                     "lowBattery",
                     "maintenanceRequired",
                     "noDefect"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:SensorDefectState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"RainSensor",
            "uiClass":"RainSensor",
            "qualifiedName":"io:SomfyRainIOSystemSensor",
            "type":"SENSOR"
         },
         "states":[
            {
               "name":"core:RainState",
               "type":3,
               "value":"notDetected"
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:DiscreteRSSILevelState",
               "type":3,
               "value":"good"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":88.0
            }
         ],
         "available":true,
         "enabled":true,
         "placeOID":"---",
         "widget":"RainSensor",
         "type":2,
         "oid":"--",
         "uiClass":"RainSensor"
      }

Request support for Outdoor Siren (rtd:OutdoorSirenRTDComponent)

{
         "creationTime":1558256403000,
         "lastUpdateTime":1558256403000,
         "label":"External Siren",
         "deviceURL":"####",
         "shortcut":false,
         "controllableName":"rtd:OutdoorSirenRTDComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"bip",
                  "nparams":0
               },
               {
                  "commandName":"flash",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"on",
                  "nparams":0
               },
               {
                  "commandName":"pair",
                  "nparams":0
               },
               {
                  "commandName":"ring",
                  "nparams":0
               },
               {
                  "commandName":"setVolume",
                  "nparams":1
               },
               {
                  "commandName":"fastBipSequence",
                  "nparams":0
               }
            ],
            "states":[

            ],
            "dataProperties":[

            ],
            "widgetName":"RTDOutdoorSiren",
            "uiClass":"Siren",
            "qualifiedName":"rtd:OutdoorSirenRTDComponent",
            "type":"ACTUATOR"
         },
         "attributes":[
            {
               "name":"core:GroupId",
               "type":3,
               "value":"####"
            }
         ],
         "available":true,
         "enabled":true,
         "placeOID":"####",
         "widget":"RTDOutdoorSiren",
         "type":1,
         "oid":"####",
         "uiClass":"Siren"
      },
    

Add support for Indoor Siren (io:SomfyIndoorSimpleSirenIOComponent)

 {
         "creationTime":1545422932000,
         "lastUpdateTime":1545422932000,
         "label":"Siren io Indoor",
         "deviceURL":"###",
         "shortcut":false,
         "controllableName":"io:SomfyIndoorSimpleSirenIOComponent",
         "definition":{
            "commands":[
               {
                  "commandName":"delayedStopIdentify",
                  "nparams":1
               },
               {
                  "commandName":"getName",
                  "nparams":0
               },
               {
                  "commandName":"identify",
                  "nparams":0
               },
               {
                  "commandName":"off",
                  "nparams":0
               },
               {
                  "commandName":"setName",
                  "nparams":1
               },
               {
                  "commandName":"startIdentify",
                  "nparams":0
               },
               {
                  "commandName":"stopIdentify",
                  "nparams":0
               },
               {
                  "commandName":"wink",
                  "nparams":1
               },
               {
                  "commandName":"ringWithDoubleSimpleSequence",
                  "nparams":8
               },
               {
                  "commandName":"ringWithSingleSimpleSequence",
                  "nparams":4
               },
               {
                  "commandName":"ringWithThreeSimpleSequence",
                  "nparams":12
               },
               {
                  "commandName":"setMemorizedSimpleVolume",
                  "nparams":1
               }
            ],
            "states":[
               {
                  "values":[
                     "full",
                     "low",
                     "normal",
                     "verylow"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:BatteryState"
               },
               {
                  "type":"DataState",
                  "qualifiedName":"core:NameState"
               },
               {
                  "values":[
                     "off",
                     "on"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:OnOffState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:PriorityLockTimerState"
               },
               {
                  "type":"ContinuousState",
                  "qualifiedName":"core:RSSILevelState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:StatusState"
               },
               {
                  "values":[
                     "highest",
                     "standard"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:MemorizedSimpleVolumeState"
               },
               {
                  "values":[
                     "comfortLevel1",
                     "comfortLevel2",
                     "comfortLevel3",
                     "comfortLevel4",
                     "environmentProtection",
                     "humanProtection",
                     "userLevel1",
                     "userLevel2"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockLevelState"
               },
               {
                  "values":[
                     "LSC",
                     "SAAC",
                     "SFC",
                     "UPS",
                     "externalGateway",
                     "localUser",
                     "myself",
                     "rain",
                     "security",
                     "temperature",
                     "timer",
                     "user",
                     "wind"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"io:PriorityLockOriginatorState"
               }
            ],
            "dataProperties":[
               {
                  "value":"500",
                  "qualifiedName":"core:identifyInterval"
               }
            ],
            "widgetName":"IOSiren",
            "uiClass":"Siren",
            "qualifiedName":"io:SomfyIndoorSimpleSirenIOComponent",
            "type":"ACTUATOR"
         },
         "states":[
            {
               "name":"core:NameState",
               "type":3,
               "value":"Siren io Indoor"
            },
            {
               "name":"core:PriorityLockTimerState",
               "type":1,
               "value":0
            },
            {
               "name":"core:StatusState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:RSSILevelState",
               "type":2,
               "value":100.0
            },
            {
               "name":"core:BatteryState",
               "type":3,
               "value":"normal"
            },
            {
               "name":"core:OnOffState",
               "type":3,
               "value":"off"
            },
            {
               "name":"io:MemorizedSimpleVolumeState",
               "type":3,
               "value":"highest"
            }
         ],
         "attributes":[

         ],
         "available":true,
         "enabled":true,
         "placeOID":"####",
         "widget":"IOSiren",
         "type":1,
         "oid":"###",
         "uiClass":"Siren"
      },

ValueError: Config entry has already been setup!

Some entries are added several time. For instance, covers:

2020-06-04 21:17:42 INFO (MainThread) [homeassistant.components.cover] Setting up cover.tahoma
2020-06-04 21:17:42 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry [email protected] for cover
Traceback (most recent call last):
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/config_entries.py", line 216, in async_setup
    result = await component.async_setup_entry(  # type: ignore
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/components/cover/__init__.py", line 159, in async_setup_entry
    return await hass.data[DOMAIN].async_setup_entry(entry)
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/helpers/entity_component.py", line 159, in async_setup_entry
    raise ValueError("Config entry has already been setup!")
ValueError: Config entry has already been setup!
2020-06-04 21:17:42 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry [email protected] for cover
Traceback (most recent call last):
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/config_entries.py", line 216, in async_setup
    result = await component.async_setup_entry(  # type: ignore
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/components/cover/__init__.py", line 159, in async_setup_entry
    return await hass.data[DOMAIN].async_setup_entry(entry)
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/helpers/entity_component.py", line 159, in async_setup_entry
    raise ValueError("Config entry has already been setup!")
ValueError: Config entry has already been setup!
2020-06-04 21:17:42 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry [email protected] for cover
Traceback (most recent call last):
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/config_entries.py", line 216, in async_setup
    result = await component.async_setup_entry(  # type: ignore
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/components/cover/__init__.py", line 159, in async_setup_entry
    return await hass.data[DOMAIN].async_setup_entry(entry)
  File "/home/vlb/.local/lib/python3.8/site-packages/homeassistant/helpers/entity_component.py", line 159, in async_setup_entry
    raise ValueError("Config entry has already been setup!")
ValueError: Config entry has already been setup!

Make assumed_state for RTS configurable via option flow

Current behaviour is that assumed_state is True for all rts devices, since RTS doesn't have a feedback function.

However, when you are only controlling your RTS devices via Home Assistant, some people don't want to have this optimistic mode.

Add support for OccupancySensor (io:SomfyOccupancyIOSystemSensor)

these sensors are ideal to trigger actions (presence/movement sensor):

{
"creationTime":1544905637000,
"lastUpdateTime":1544905637000,
"label":"Movement Kitchen",
"deviceURL":"io://###",
"shortcut":false,
"controllableName":"io:SomfyOccupancyIOSystemSensor",
"definition":{
"commands":[
],
"states":[
{
"eventBased":true,
"values":[
"noPersonInside",
"personInside"
],
"type":"DiscreteState",
"qualifiedName":"core:OccupancyState"
},
{
"type":"ContinuousState",
"qualifiedName":"core:RSSILevelState"
},
{
"values":[
"dead",
"lowBattery",
"maintenanceRequired",
"noDefect"
],
"type":"DiscreteState",
"qualifiedName":"core:SensorDefectState"
},
{
"values":[
"available",
"unavailable"
],
"type":"DiscreteState",
"qualifiedName":"core:StatusState"
}
],
"dataProperties":[

        ],
        "widgetName":"OccupancySensor",
        "uiClass":"OccupancySensor",
        "qualifiedName":"io:SomfyOccupancyIOSystemSensor",
        "type":"SENSOR"
     },
     "states":[
        {
           "name":"core:OccupancyState",
           "type":3,
           "value":"noPersonInside"
        },
        {
           "name":"core:StatusState",
           "type":3,
           "value":"available"
        },
        {
           "name":"core:RSSILevelState",
           "type":2,
           "value":78.0
        }
     ],
     "attributes":[
        {
           "name":"core:PowerSourceType",
           "type":3,
           "value":"battery"
        }
     ],
     "available":true,
     "enabled":true,
     "placeOID":"####",
     "widget":"OccupancySensor",
     "type":2,
     "oid":"#####",
     "uiClass":"OccupancySensor"
  }

Add support for Siren Status (rtds:SirenStatusRTDSComponent)

  {
         "creationTime":1558256410000,
         "lastUpdateTime":1558256410000,
         "label":"RTDS (498518)",
         "deviceURL":"####",
         "shortcut":false,
         "controllableName":"rtds:SirenStatusRTDSComponent",
         "definition":{
            "commands":[

            ],
            "states":[
               {
                  "values":[
                     "closed",
                     "open"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:AssemblyState"
               },
               {
                  "values":[
                     "available",
                     "unavailable"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:AvailabilityState"
               },
               {
                  "values":[
                     "full",
                     "low",
                     "normal",
                     "verylow"
                  ],
                  "type":"DiscreteState",
                  "qualifiedName":"core:BatteryState"
               }
            ],
            "dataProperties":[

            ],
            "widgetName":"SirenStatus",
            "uiClass":"Siren",
            "qualifiedName":"rtds:SirenStatusRTDSComponent",
            "type":"SENSOR"
         },
         "states":[
            {
               "name":"core:AvailabilityState",
               "type":3,
               "value":"available"
            },
            {
               "name":"core:BatteryState",
               "type":3,
               "value":"normal"
            },
            {
               "name":"core:AssemblyState",
               "type":3,
               "value":"closed"
            }
         ],
         "attributes":[
            {
               "name":"core:GroupId",
               "type":3,
               "value":"####"
            }
         ],
         "available":true,
         "enabled":true,
         "placeOID":"####",
         "widget":"SirenStatus",
         "type":2,
         "oid":"####",
         "uiClass":"Siren"
      },

Support disabling of entities, for use with Somfy integration

Since there is an overlap with the Somfy integration and the Tahoma component, it would be good to make sure there is a way to disable entities from the Tahoma component.

In the past there was an exclude list in the config, however Home Assistant has a disable entity option by default now. Would be good to deprecate the exclude list and support disabling entities via the entity registry.

Error unloading entry xxxxxx for tahoma

Describe the bug
When removing the integration, you will receive an error.

2020-06-16 13:22:01 ERROR (MainThread) [homeassistant.config_entries] Error unloading entry xxxxxx for tahoma
Traceback (most recent call last):
  File "/Users/mick/Projects/personal-projects/home-assistant-core/homeassistant/config_entries.py", line 304, in async_unload
    hass, self
  File "/Users/mick/.homeassistant/custom_components/tahoma/__init__.py", line 120, in async_unload_entry
    hass.data[DOMAIN][entry.entry_id].pop(entry.entry_id)
KeyError: '4fd1ccd7a750457aa8bbe8260a60bc5f'

To Reproduce
Steps to reproduce the behavior:

  1. Go to integrations.
  2. Click on '...' -> Delete
  3. See error

Expected behavior
Removed without any error

Add support for internal:PodMiniComponent

Device information
Doesn't having this device doesn't seems to affect my awning or solar sensor. The other device I have is a wind sensor which closes the awning if it detects vibration, but I'm not able to control this device using the Connexoon Terrace Android app, I don't know if it is connected to the Connexoon gateway.

In order to avoid error logs I have this device excluded from the core integration as I stated in this comment.

Device details
Sorry, I can't access the https://www.tahomalink.com/enduser-mobile-web/steer-html5-client/tahoma/ to get the details of the device. I'm using the same credentials that I use in this platform, but the web reports an error (maybe because I own a Connexoon and not a Tahoma).

Debug log registered in Home Assistant logs

2020-07-05 10: 50: 01 DEBUG (MainThread) [custom_components.tahoma] Unsupported Tahoma device (internal:PodMiniComponent). Create an issue on Github with the following information. 
internal:PodMiniComponent - Pod - Pod 
[
    {
        "commandName": "getName",
        "nparams": 0
    },
    {
        "commandName": "update",
        "nparams": 0
    },
    {
        "commandName": "setCountryCode",
        "nparams": 1
    },
    {
        "commandName": "activateCalendar",
        "nparams": 0
    },
    {
        "commandName": "deactivateCalendar",
        "nparams": 0
    },
    {
        "commandName": "refreshPodMode",
        "nparams": 0
    },
    {
        "commandName": "refreshUpdateStatus",
        "nparams": 0
    },
    {
        "commandName": "setCalendar",
        "nparams": 1
    },
    {
        "commandName": "setLightingLedPodMode",
        "nparams": 1
    },
    {
        "commandName": "setPodLedOff",
        "nparams": 0
    },
    {
        "commandName": "setPodLedOn",
        "nparams": 0
    }
],
[
    {
        "values": [
            "offline",
            "online"
        ],
        "type": "DiscreteState",
        "qualifiedName": "core:ConnectivityState"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:CountryCodeState"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:LocalIPv4AddressState"
    },
    {
        "type": "DataState",
        "qualifiedName": "core:NameState"
    },
    {
        "values": [
            "doublePress",
            "longPress",
            "simplePress",
            "triplePress",
            "veryLongPress"
        ],
        "type": "DiscreteState",
        "qualifiedName": "internal:LastActionConfigButtonState"
    },
    {
        "type": "ContinuousState",
        "qualifiedName": "internal:LightingLedPodModeState"
    }
]

Environment

  • Home Assistant version: 0.112.2
  • Platform: Somfy TaHoma 1.5 (custom component)

Unable to change (tilt)position via automations

Describe the bug
When you use a cover device in your automation, you are not able to set the tilt_position or position as a trigger or action.

To Reproduce
Steps to reproduce the behavior:

  1. Go to new automation
  2. Create a new action of type 'device' and choose your cover device.
  3. Action: Set xxxx tilt position
  4. Position is a greyed out field.

Expected behavior
A way to set the tilt_position or position via automations.

Screenshots
Screenshot 2020-06-07 at 15 27 07

Environment (please complete the following information):

  • Home Assistant version: 0.111.0.dev0
  • Platform: cover

State not updated for Awning (io:AwningReceiverUnoIOComponent)

Device information
I was able to copy manually all files into my Home Assistant custom components and integrate TaHoma. Now I can see all awnings but the symbols of integrated io:AwningReceiverUnoIOComponent are not updated, independent of current position.
All symbols appear permanently in bold. See attached screenshot.

Home Assistant 0.110.5
HassOS 4.10

Device details

     {
   	"creationTime": 1584186681000,
   	"lastUpdateTime": 1584186681000,
   	"label": "Living 3",
   	"deviceURL": "io://",
   	"shortcut": false,
   	"controllableName": "io:AwningReceiverUnoIOComponent",
   	"definition": {
   		"commands": [{
   				"commandName": "close",
   				"nparams": 0

   			},
   			{
   				"commandName": "delayedStopIdentify",
   				"nparams": 1

   			},
   			{
   				"commandName": "deploy",
   				"nparams": 0

   			},
   			{
   				"commandName": "down",
   				"nparams": 0

   			},
   			{
   				"commandName": "getName",
   				"nparams": 0

   			},
   			{
   				"commandName": "identify",
   				"nparams": 0

   			},
   			{
   				"commandName": "my",
   				"nparams": 0

   			},
   			{
   				"commandName": "open",
   				"nparams": 0

   			},
   			{
   				"commandName": "refreshMemorized1Position",
   				"nparams": 0

   			},
   			{
   				"commandName": "setClosure",
   				"nparams": 1

   			},
   			{
   				"commandName": "setDeployment",
   				"nparams": 1

   			},
   			{
   				"commandName": "setMemorized1Position",
   				"nparams": 1

   			},
   			{
   				"commandName": "setName",
   				"nparams": 1

   			},
   			{
   				"commandName": "setPosition",
   				"nparams": 1

   			},
   			{
   				"commandName": "setSecuredPosition",
   				"nparams": 1

   			},
   			{
   				"commandName": "startIdentify",
   				"nparams": 0

   			},
   			{
   				"commandName": "stop",
   				"nparams": 0

   			},
   			{
   				"commandName": "stopIdentify",
   				"nparams": 0

   			},
   			{
   				"commandName": "undeploy",
   				"nparams": 0

   			},
   			{
   				"commandName": "up",
   				"nparams": 0

   			},
   			{
   				"commandName": "wink",
   				"nparams": 1

   			}

   		],
   		"states": [{
   				"type": "ContinuousState",
   				"qualifiedName": "core:Memorized1PositionState"

   			},
   			{
   				"type": "DataState",
   				"qualifiedName": "core:NameState"

   			},
   			{
   				"type": "ContinuousState",
   				"qualifiedName": "core:PriorityLockTimerState"

   			},
   			{
   				"type": "ContinuousState",
   				"qualifiedName": "core:RSSILevelState"

   			},
   			{
   				"type": "ContinuousState",
   				"qualifiedName": "core:SecuredPositionState"

   			},
   			{
   				"values": [
   					"available",
   					"unavailable"

   				],
   				"type": "DiscreteState",
   				"qualifiedName": "core:StatusState"

   			},
   			{
   				"type": "ContinuousState",
   				"qualifiedName": "core:TargetClosureState"

   			},
   			{
   				"values": [
   					"comfortLevel1",
   					"comfortLevel2",
   					"comfortLevel3",
   					"comfortLevel4",
   					"environmentProtection",
   					"humanProtection",
   					"userLevel1",
   					"userLevel2"

   				],
   				"type": "DiscreteState",
   				"qualifiedName": "io:PriorityLockLevelState"

   			},
   			{
   				"values": [
   					"LSC",
   					"SAAC",
   					"SFC",
   					"UPS",
   					"externalGateway",
   					"localUser",
   					"myself",
   					"rain",
   					"security",
   					"temperature",
   					"timer",
   					"user",
   					"wind"

   				],
   				"type": "DiscreteState",
   				"qualifiedName": "io:PriorityLockOriginatorState"

   			}

   		],
   		"dataProperties": [{
   				"value": "500",
   				"qualifiedName": "core:identifyInterval"

   			}

   		],
   		"widgetName": "PositionableHorizontalAwningUno",
   		"uiClass": "Awning",
   		"qualifiedName": "io:AwningReceiverUnoIOComponent",
   		"type": "ACTUATOR"

   	},
   	"states": [{
   			"name": "core:NameState",
   			"type": 3,
   			"value": "Living 3"

   		},
   		{
   			"name": "core:PriorityLockTimerState",
   			"type": 1,
   			"value": 0

   		},
   		{
   			"name": "core:TargetClosureState",
   			"type": 1,
   			"value": 0

   		},
   		{
   			"name": "core:StatusState",
   			"type": 3,
   			"value": "available"

   		},
   		{
   			"name": "core:RSSILevelState",
   			"type": 2,
   			"value": 50.0

   		}

   	],
   	"attributes": [


   	],
   	"available": true,
   	"enabled": true,
   	"placeOID": "",
   	"widget": "PositionableHorizontalAwningUno",
   	"type": 1,
   	"oid": "",
   	"uiClass": "Awning"

   }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.