Closed JanJaapKo closed 1 year ago
Is there a way to bypass the ssl certificate? I’m completely stuck on this and have tried everything. also i think it will be for more users an issue
Well I do not think so, that is the point of security......
Did you do the steps @ab10002 described earlier:
Import certificate:
sudo mkdir /usr/share/ca-certificates/local
cd /usr/share/ca-certificates/local
sudo wget https://ca.overkiz.com/overkiz-root-ca-2048.crt
sudo dpkg-reconfigure ca-certificates
select yes, local/overkiz-root-ca-2048.crt and yes
1,4,5,20:
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 70, in
Yes. But since i’m on Centos the steps are a bit different.
@ab10002 that is odd, the handing over of the token got lost apparently.... Should be fixed now.
@MadPatrick that is unfortunate. There are ways to turn off the verification. But as said, it is there for a reason. On the other hand, the certificates have been self-signed if I read correctly so it is a bit dodgy form the start....
I'll switch of verification
If we at least turn it off for the development of the plugin we always see later
okidoki. Done
21
[
{
"connectivity": {
"protocolVersion": "2022.4.4-10",
"status": "OK"
},
"gatewayId": "0000-0000-0000"
}
]
Press Enter to continue...
22 Getting devices :-)
23 getting ID
24:
24
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 83, in
2022-09-26 22:02:24,668 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "GET /enduser-mobile-web/1/enduserAPI/events/95a34e74-074d-46fc-a300-811b396340d0/fetch HTTP/1.1" 400 59
2022-09-26 22:02:24,669 - DEBUG - tahoma_local.py - <Response [400]>
2022-09-26 22:02:24,669 - ERROR - tahoma_local.py - failed to get local API events
I'm getting this error with 20 and 21
Please Select:20
20
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 672, in u rlopen
chunked=chunked,
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 421, in _ make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 416, in _ make_request
httplib_response = conn.getresponse()
File "/usr/lib64/python3.6/http/client.py", line 1346, in getresponse
response.begin()
File "/usr/lib64/python3.6/http/client.py", line 307, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python3.6/http/client.py", line 276, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/requests/adapters.py", line 438, in send
timeout=timeout
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 720, in u rlopen
method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/util/retry.py", line 400, in incre ment
raise six.reraise(type(error), error, _stacktrace)
File "/usr/lib/python3.6/site-packages/six.py", line 702, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 672, in u rlopen
chunked=chunked,
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 421, in _ make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 416, in _ make_request
httplib_response = conn.getresponse()
File "/usr/lib64/python3.6/http/client.py", line 1346, in getresponse
response.begin()
File "/usr/lib64/python3.6/http/client.py", line 307, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python3.6/http/client.py", line 276, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
requests.packages.urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remot e end closed connection without response',))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test_tahoma.py", line 71, in <module>
response = theBox.get_version()
File "/var/domoticz/plugins/somfy/tahoma_local.py", line 148, in get_version
response = requests.get(self.base_url + "/apiVersion", headers=self.headers_json, verify=False)
File "/usr/lib/python3.6/site-packages/requests/api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/sessions.py", line 530, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3.6/site-packages/requests/sessions.py", line 651, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/adapters.py", line 488, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed co nnection without response',))
@ab10002 my mistake, should have used post iso get, is fixed now. @MadPatrick no clue. The somfy box closed the connection. This can mean that the network did not work anymore? Can also be that the listenerId timed out (they are only valid for 10 minutes then you need to register a new one). I'll create something that checks that automatically later....
Tested: 0 ok 1 ok 2 x 3 ok 4 ok 5 ok 6 ok 7 ok 10 - 11 - 12 - 20 ok 21 ok 22 ok 23 ok 24 [] ?? log:
2022-09-27 11:49:15,210 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "POST /enduser-mobile-web/1/enduserAPI/events/a40e0bc2-f513-474e-aca5-64ec03a4ffa6/fetch HTTP/1.1" 200 2
2022-09-27 11:49:15,211 - DEBUG - tahoma_local.py - <Response [200]>
2022-09-27 11:49:15,211 - DEBUG - tahoma_local.py - succeeded to get local API events: []
2022-09-27 11:49:47,447 - INFO - test_tahoma.py - == end test run ===
And how to deal with all generated tokens? Manual deleting is no option every time..
@MadPatrick is python3.6 not to old??
Well 3.6 went end of life january 2022 so it is better to update to 3.7 if you can. But 3.6 should not be causing too many issues.....
The token that is generated in menu option 4, is that in the format of a uuid? I'm using that one now in step 5 to activate. As option 6 lists all tokens with a UUID to identify them, step 5 takes the token as input but I am not sure if this is the same as the uuid.... Can you confirm this? If so I can make something to keep using the same token (perhaps add to params.py).
On the other hand: what is the problem with all those tokens? There seems to be no limit?
And then step 24: interesting that it returns an empty list, perhaps it is only populated when a device changes its state. There are also options to retreive device states, I'll have that implemented later this evening.
The token that is generated in menu option 4, is that in the format of a uuid? I'm using that one now in step 5 to activate. As option 6 lists all tokens with a UUID to identify them, step 5 takes the token as input but I am not sure if this is the same as the uuid.... Can you confirm this? If so I can make something to keep using the same token (perhaps add to params.py).
4 and 5 using 20char token for delete tokens i have to use the long uuid, a bit confusing...
On the other hand: what is the problem with all those tokens? There seems to be no limit?
I don't know..
I've been reading some other issues on the Somfy git. We have to store the token. Deleting them is only required when your security is breached. I will modify the test to read it from params.py. It was always already my intention to store the token in Domoticz for later use but just did not implement it yet. Will do that this evening.
I think a good option.
OK, 2 additions:
Curious if this will work....
5
Traceback (most recent call last):
File "test_tahoma.py", line 59, in
2022-09-27 21:56:42,770 - INFO - test_tahoma.py - === starting test run ===
2022-09-27 21:56:44,919 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): ha101-1.overkiz.com:443
2022-09-27 21:56:45,512 - DEBUG - connectionpool.py - https://ha101-1.overkiz.com:443 "POST /enduser-mobile-web/enduserAPI/login HTTP/1.1" 200 None
2022-09-27 21:56:45,517 - DEBUG - tahoma_local.py - Login respone: status_code: '200' reponse body: '{'success': True, 'roles': [{'name': 'ENDUSER'}]}'
2022-09-27 21:56:45,517 - INFO - tahoma_local.py - Tahoma authentication succeeded, login valid until 2022-10-03 21:56:45
2022-09-27 21:56:45,517 - DEBUG - tahoma_local.py - login: cookies: '<RequestsCookieJar[<Cookie JSESSIONID=0321C655DB221567F10B49325CC79BA8 for ha101-1.overkiz.com/enduser-mobile-web>]>', headers: '{'Date': 'Tue, 27 Sep 2022 19:56:45 GMT', 'Server': 'overkiz', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains, max-age=31536000 ; includeSubDomains', 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'X-XSS-Protection': '1; mode=block', 'X-Frame-Options': 'DENY', 'X-Content-Type-Options': 'nosniff', 'Content-Type': 'application/json;charset=UTF-8', 'Set-Cookie': 'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Path=/enduser-mobile-web; Secure; HttpOnly; SameSite=None', 'Keep-Alive': 'timeout=5, max=50', 'Connection': 'Keep-Alive', 'Transfer-Encoding': 'chunked'}'
2022-09-27 21:56:49,549 - DEBUG - tahoma_local.py - checking logged in status: self.__logged_in = True and self.__expiry_date >= datetime.datetime.now() = True
2022-09-27 21:56:54,659 - DEBUG - tahoma_local.py - generate token: url_gen = '/enduser-mobile-web/enduserAPI/config/1237-2024-7920/local/tokens/generate'
2022-09-27 21:56:54,660 - DEBUG - tahoma_local.py - generate token: cookie = '<RequestsCookieJar[<Cookie JSESSIONID=0321C655DB221567F10B49325CC79BA8 for ha101-1.overkiz.com/enduser-mobile-web>]>'
2022-09-27 21:56:54,664 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): ha101-1.overkiz.com:443
2022-09-27 21:56:54,763 - DEBUG - connectionpool.py - https://ha101-1.overkiz.com:443 "GET /enduser-mobile-web/enduserAPI/config/1237-2024-7920/local/tokens/generate HTTP/1.1" 200 None
2022-09-27 21:56:54,766 - DEBUG - tahoma_local.py - succeeded to activate token: xxxxxxxxxxxxxxxxxxxxxxxxxxx
oops, that one I forgot.... Should be fixed
5
Traceback (most recent call last):
File "test_tahoma.py", line 60, in
OK, fixed. Can you retry?
20
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpoo l.py", line 672, in urlopen
chunked=chunked,
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpoo l.py", line 421, in _make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpoo l.py", line 416, in _make_request
httplib_response = conn.getresponse()
File "/usr/lib64/python3.6/http/client.py", line 1346, in getresponse
response.begin()
File "/usr/lib64/python3.6/http/client.py", line 307, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python3.6/http/client.py", line 276, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/requests/adapters.py", line 438, in sen d
timeout=timeout
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpoo l.py", line 720, in urlopen
method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/util/retry.py ", line 400, in increment
raise six.reraise(type(error), error, _stacktrace)
File "/usr/lib/python3.6/site-packages/six.py", line 702, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpoo l.py", line 672, in urlopen
chunked=chunked,
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpoo l.py", line 421, in _make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpoo l.py", line 416, in _make_request
httplib_response = conn.getresponse()
File "/usr/lib64/python3.6/http/client.py", line 1346, in getresponse
response.begin()
File "/usr/lib64/python3.6/http/client.py", line 307, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python3.6/http/client.py", line 276, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
requests.packages.urllib3.exceptions.ProtocolError: ('Connection aborted.', Remo teDisconnected('Remote end closed connection without response',))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test_tahoma.py", line 79, in <module>
response = theBox.get_version()
File "/tmp/somfy/tahoma_local.py", line 153, in get_version
response = requests.get(self.base_url + "/apiVersion", headers=self.headers_ json, verify=False)
File "/usr/lib/python3.6/site-packages/requests/api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/sessions.py", line 530, in req uest
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3.6/site-packages/requests/sessions.py", line 651, in sen d
r = adapter.send(request, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/adapters.py", line 488, in sen d
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected( 'Remote end closed connection without response',))
20 { "protocolVersion": "2022.4.4-10" }
21
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 82, in
Maybe found my problem When i do :
curl GET 'https://xxxx-xxxx-xxx.local:8443/enduser-mobile-web/1/enduserAPI/setup' -H 'accept: application/json' -H 'Authorization: Bearer xxxxxxxxxxxxxxx' It is going to my webserver homepage
How can i go to the somybox instead ?
Ipaddress box in /etc/host file? 192..... xxxx-xxxx-xxx.local
Ipaddress box in /etc/host file? 192..... xxxx-xxxx-xxx.local
yes
try this: curl -v 'https://0000-0000-0000.local:8443/enduser-mobile-web/1/enduserAPI/apiVersion' -H 'accept: application/json'
That is working better
curl -v 'https://xxxx-xxxx-xxxx.local:8443/enduser-mobile-web/1/enduserAPI/apiVersion' -H 'accept: application/json'
* About to connect() to xxxx-xxxx-xxxx.local port 8443 (#0)
* Trying 192.168.1.103...
* Connected to xxxx-xxxx-xxxx.local (192.168.1.103) port 8443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* Server certificate:
* subject: CN=xxxx-xxxx-xxxx.local,OU=Overkiz Device Server,O=Overkiz
* start date: Dec 11 12:27:49 2020 GMT
* expire date: Dec 09 12:27:49 2030 GMT
* common name: xxxx-xxxx-xxxx.local
* issuer: CN=Overkiz Device Server CA,OU=Overkiz Device Server CA,O=Overkiz,C=FR
* NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)
* Peer's Certificate issuer is not recognized.
* Closing connection 0
Ok. #20, 21 and 22 are working now
[
{
"connectivity": {
"protocolVersion": "2022.4.4-10",
"status": "OK"
},
"gatewayId": "xxxx-xxxx-xxxx"
}
]
"type": "ACTUATOR",
"uiClass": "ExteriorScreen",
"widgetName": "PositionableScreen"
},
"deviceURL": "io://xxxx-xxxx-xxxx/3424709",
"enabled": true,
"label": "Slaapkamer",
"states": [
{
"name": "core:MovingState",
"type": 6,
"value": false
},
{
"name": "core:DiscreteRSSILevelState",
"type": 3,
"value": "normal"
},
{
"name": "core:RSSILevelState",
"type": 1,
"value": 58
},
{
"name": "core:StatusState",
"type": 3,
"value": "available"
},
{
"name": "core:ManufacturerSettingsState",
"type": 11,
"value": {
"current_position": 0
}
},
{
"name": "core:ClosureState",
"type": 1,
"value": 0
},
{
"name": "core:OpenClosedState",
"type": 3,
"value": "open"
},
{
"name": "core:TargetClosureState",
"type": 1,
"value": 0
},
{
"name": "core:DeploymentState",
"type": 1,
"value": 0
},
{
"name": "core:Memorized1PositionState",
"type": 1,
"value": 88
},
{
"name": "core:NameState",
"type": 3,
"value": "Slaapkamer"
}
],
"subsystemId": 0,
"synced": true,
"type": 1
}
]
👍
With .local😎 Add your Somfy box Pin number to the IP in your local network in etc/hosts
192.168.1.1 1234-1234-1234.local
What is shutter.zip ?
#response = requests.post(self.base_url + "/events/"+self.listenerId+"/fetch", headers=self.headers_json, verify=False)
response = requests.post(self.base_url + "/events/72131251-ef45-4c9f-9b18-e07054d24537/fetch", headers=self.headers_json, verify=False)
25 get local device state
Please Select:0000-0000-0000/10769361
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 39, in <module>
x = int(input("Please Select:"))
ValueError: invalid literal for int() with base 10: '0000-0000-0000/10769361'
What is shutter.zip ?
It was an attempt to get a nicer icon for tilting the blinds. But it was not accepted (you can't change the icon on this switch type) so no it looks the same for up/down and tilt.
25 with the id add manual, i'll get this:
you need to enter 25 first, then the device URL....... The device URL is nicely handled as a string. Do not forget to add the io//
part as well, btw...
cope/paste lol
Please Select:25
25
enter deviceurl to get state: 0000-0000-0000/10769361
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 95, in <module>
response = theBox.get_device_state(device)
File "/home/pi/somfy/tahoma_local.py", line 195, in get_device_state
raise exceptions.TahomaException("failed to get local API device states")
exceptions.TahomaException: failed to get local API device states
Do not forget to add the io://
I added a check to it now. should then throw an error
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 95, in
what other logging was added? need the response....
Btw can you paste a command sent to the old version from domoticz as example, because the documentation for sending a command is not so clear. Need the body of the command.
nope:
25
enter deviceurl to get state: io://000-0000-0000/10769361
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 95, in
2022-09-28 19:49:12,516 - DEBUG - plugin.py - onCommand: DeviceId: 'io://0000-0000-0000/14287010' Unit: '1', Command: 'On', Level: '88', Hue: ''
2022-09-28 19:49:12,516 - DEBUG - plugin.py - preparing command: # commands: 1
2022-09-28 19:49:12,516 - DEBUG - plugin.py - preparing command: # actions_serialized: 1
2022-09-28 19:49:12,517 - DEBUG - plugin.py - preparing command: json data: {"actions": [{"commands": [{"name": "close"}], "deviceURL": "io://0000-0000-0000/14287010"}], "label": "Domoticz - Shutter05 - close"}
2022-09-28 19:49:12,517 - DEBUG - tahoma.py - checking logged in status: self.__logged_in = True and self.__expiry_date >= datetime.datetime.now() = True
2022-09-28 19:49:12,517 - DEBUG - tahoma.py - start command
2022-09-28 19:49:12,517 - DEBUG - tahoma.py - onCommand: headers: '{'Host': 'tahomalink.com', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=F448266967A8AAE4A7E2FA858BB40AE9; Path=/enduser-mobile-web; Secure; HttpOnly; SameSite=None'}', data '{"actions": [{"commands": [{"name": "close"}], "deviceURL": "io://0000-0000-0000/14287010"}], "label": "Domoticz - Shutter05 - close"}'
2022-09-28 19:49:12,517 - INFO - tahoma.py - Sending command to tahoma api
2022-09-28 19:49:12,518 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): tahomalink.com:443
2022-09-28 19:49:12,567 - DEBUG - connectionpool.py - https://tahomalink.com:443 "POST /enduser-mobile-web/enduserAPI/exec/apply HTTP/1.1" 200 None
2022-09-28 19:49:12,568 - DEBUG - tahoma.py - command response: status '200' response body: '{'execId': '853787ed-ac10-3e01-6399-5f11d3ce4215'}'
what other logging was added? need the response....
2022-09-28 19:41:16,839 - DEBUG - tahoma_local.py - succeeded to get local listener ID: {'id': '6e6b4f3d-c7ef-45cd-9acd-61f0a161e87b'} 2022-09-28 19:41:24,299 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): 0000-0000-0000.local:8443 2022-09-28 19:41:24,502 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "GET /enduser-mobile-web/1/enduserAPI/setup/devices HTTP/1.1" 200 40647 2022-09-28 19:41:24,506 - DEBUG - tahoma_local.py - <Response [200]> 2022-09-28 19:41:24,507 - DEBUG - tahoma_local.py - succeeded to get local API devices: [{'deviceURL': 'internal://0000-0000-0000/pod/0', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:CountryCodeState', 'value': 'NL'}, {'type': 2, 'name': 'internal:LightingLedPodModeState', 'value': 0.05}, {'type': 3, 'name': 'core:NameState', 'value': 'Box'}, {'type': 3, 'name': 'internal:BatteryStatusState', 'value': 'no'}, {'type': 3, 'name': 'core:LocalIPv4AddressState', 'value': '192.168.60.216'}, {'type': 3, 'name': 'core:ConnectivityState', 'value': 'online'}], 'label': 'Aanraakgevoelige knop', 'subsystemId': 0, 'attributes': [], 'enabled': True, 'controllableName': 'internal:PodV2Component', 'definition': {'states': [{'name': 'core:ConnectivityState'}, {'name': 'core:LocalIPv4AddressState'}, {'name': 'core:CountryCodeState'}, {'name': 'internal:LightingLedPodModeState'}, {'name': 'core:CyclicButtonState'}, {'name': 'core:NameState'}, {'name': 'internal:BatteryStatusState'}], 'widgetName': 'Pod', 'attributes': [], 'uiClass': 'Pod', 'commands': [{'commandName': 'deactivateCalendar', 'nparams': 0}, {'commandName': 'refreshPodMode', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}, {'commandName': 'setPodLedOff', 'nparams': 0}, {'nparams': 1, 'commandName': 'setCalendar', 'paramsSig': 'p1'}, {'commandName': 'update', 'nparams': 0}, {'commandName': 'setPodLedOn', 'nparams': 0}, {'commandName': 'refreshBatteryStatus', 'nparams': 0}, {'nparams': 1, 'commandName': 'setLightingLedPodMode', 'paramsSig': 'p1'}, {'commandName': 'activateCalendar', 'nparams': 0}, {'commandName': 'refreshUpdateStatus', 'nparams': 0}, {'nparams': 1, 'commandName': 'setCountryCode', 'paramsSig': 'p1'}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/1541661', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'good'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 100}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter01'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 86}], 'label': 'Shutter01', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5100394X23'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:Memorized1PositionState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/14287010', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 54}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter05'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 86}], 'label': 'Shutter05', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5100394X23'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:Memorized1PositionState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/14430251', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 76}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter03'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 85}], 'label': 'Shutter03', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5117737A06'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:Memorized1PositionState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/2711689', 'available': True, 'synced': True, 'type': 2, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 42}, {'type': 1, 'name': 'core:LuminanceState', 'value': 50}], 'label': 'Sunis1', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:PowerSourceType', 'value': 'battery'}, {'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}], 'enabled': True, 'controllableName': 'io:LightIOSystemSensor', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:LuminanceState'}, {'name': 'core:SensorDefectState'}], 'widgetName': 'LuminanceSensor', 'attributes': [{'name': 'core:MaxSensedValue'}, {'name': 'core:PowerSourceType'}, {'name': 'core:MinSensedValue'}, {'name': 'core:MeasuredValueType'}, {'name': 'core:FirmwareRevision'}, {'name': 'core:Manufacturer'}], 'uiClass': 'LightSensor', 'commands': [{'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1'}], 'type': 'SENSOR'}}, {'deviceURL': 'io://0000-0000-0000/16608528', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 64}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter04'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 85}], 'label': 'Shutter04', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5117737A06'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:Memorized1PositionState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/10013480', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 50}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter23'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 85}], 'label': 'Shutter23', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5117737A06'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:Memorized1PositionState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/11842901', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 62}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter02'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 85}], 'label': 'Shutter02', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5117737A06'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:Memorized1PositionState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'internal://0000-0000-0000/alarm/0', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'internal:IntrusionDetectedState', 'value': 'notDetected'}, {'type': 3, 'name': 'core:NameState', 'value': 'alarm name'}, {'type': 3, 'name': 'internal:CurrentAlarmModeState', 'value': 'off'}, {'type': 3, 'name': 'internal:TargetAlarmModeState', 'value': 'off'}, {'type': 1, 'name': 'internal:AlarmDelayState', 'value': 30}], 'label': 'Alarm', 'subsystemId': 0, 'attributes': [], 'enabled': True, 'controllableName': 'internal:TSKAlarmComponent', 'definition': {'states': [{'name': 'internal:TargetAlarmModeState'}, {'name': 'internal:AlarmDelayState'}, {'name': 'core:NameState'}, {'name': 'internal:IntrusionDetectedState'}, {'name': 'internal:CurrentAlarmModeState'}], 'widgetName': 'TSKAlarmController', 'attributes': [], 'uiClass': 'Alarm', 'commands': [{'commandName': 'arm', 'nparams': 0}, {'commandName': 'alarmOn', 'nparams': 0}, {'commandName': 'disarm', 'nparams': 0}, {'nparams': 1, 'commandName': 'setTargetAlarmMode', 'paramsSig': 'p1'}, {'commandName': 'on', 'nparams': 0}, {'commandName': 'refreshAlarmDelay', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}, {'commandName': 'off', 'nparams': 0}, {'commandName': 'alarmPartial2', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'alarmOff', 'nparams': 0}, {'commandName': 'alarmPartial1', 'nparams': 0}, {'nparams': 1, 'commandName': 'setIntrusionDetected', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'setAlarmDelay', 'paramsSig': 'p1'}, {'commandName': 'refreshCurrentAlarmMode', 'nparams': 0}, {'commandName': 'refreshIntrusionDetected', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/11521034', 'available': True, 'synced': True, 'type': 2, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 58}, {'type': 1, 'name': 'core:LuminanceState', 'value': 51}], 'label': 'Sunis2', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:PowerSourceType', 'value': 'battery'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5126936A15'}, {'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}], 'enabled': True, 'controllableName': 'io:LightIOSystemSensor', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:LuminanceState'}, {'name': 'core:SensorDefectState'}], 'widgetName': 'LuminanceSensor', 'attributes': [{'name': 'core:MaxSensedValue'}, {'name': 'core:PowerSourceType'}, {'name': 'core:MinSensedValue'}, {'name': 'core:MeasuredValueType'}, {'name': 'core:FirmwareRevision'}, {'name': 'core:Manufacturer'}], 'uiClass': 'LightSensor', 'commands': [{'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1'}], 'type': 'SENSOR'}}, {'deviceURL': 'io://0000-0000-0000/14725444', 'available': True, 'synced': True, 'type': 5, 'states': [], 'label': 'IO (14725444)', 'subsystemId': 0, 'attributes': [], 'enabled': True, 'controllableName': 'io:StackComponent', 'definition': {'states': [], 'widgetName': 'IOStack', 'attributes': [], 'uiClass': 'ProtocolGateway', 'commands': [{'nparams': 1, 'commandName': 'discoverActuators', 'paramsSig': 'p1'}, {'commandName': 'joinNetwork', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedSomfyDiscover', 'paramsSig': 'p1'}, {'commandName': 'resetNetworkSecurity', 'nparams': 0}, {'commandName': 'shareNetwork', 'nparams': 0}, {'nparams': 0, 'commandName': 'discover1WayController', 'paramsSig': '*p1,*p2'}, {'nparams': 1, 'commandName': 'discoverSensors', 'paramsSig': 'p1'}, {'commandName': 'discoverSomfyUnsetActuators', 'nparams': 0}], 'type': 'PROTOCOL_GATEWAY'}}, {'deviceURL': 'io://0000-0000-0000/6252441', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'good'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 88}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter21'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 86}], 'label': 'Shutter21', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5100394X23'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:Memorized1PositionState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/16144514', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 66}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter24'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 86}], 'label': 'Shutter24', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5100394X23'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:Memorized1PositionState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/14989345', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'good'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 84}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter22'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 85}], 'label': 'Shutter22', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5117737A06'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:Memorized1PositionState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/10769361', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 52}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter06'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 86}], 'label': 'Shutter06', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5100394X23'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:Memorized1PositionState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}, {'deviceURL': 'io://0000-0000-0000/7258281', 'available': True, 'synced': True, 'type': 1, 'states': [{'type': 3, 'name': 'core:StatusState', 'value': 'available'}, {'type': 3, 'name': 'core:DiscreteRSSILevelState', 'value': 'normal'}, {'type': 1, 'name': 'core:RSSILevelState', 'value': 54}, {'type': 11, 'name': 'core:ManufacturerSettingsState', 'value': {'current_position': 51200}}, {'type': 1, 'name': 'core:ClosureState', 'value': 100}, {'type': 3, 'name': 'core:OpenClosedState', 'value': 'closed'}, {'type': 1, 'name': 'core:TargetClosureState', 'value': 100}, {'type': 6, 'name': 'core:MovingState', 'value': False}, {'type': 3, 'name': 'core:NameState', 'value': 'Shutter25'}, {'type': 1, 'name': 'core:Memorized1PositionState', 'value': 86}], 'label': 'Shutter25', 'subsystemId': 0, 'attributes': [{'type': 3, 'name': 'core:Manufacturer', 'value': 'Somfy'}, {'type': 3, 'name': 'core:FirmwareRevision', 'value': '5100394X23'}], 'enabled': True, 'controllableName': 'io:RollerShutterGenericIOComponent', 'definition': {'states': [{'name': 'core:StatusState'}, {'name': 'core:NameState'}, {'name': 'core:AdditionalStatusState'}, {'name': 'core:TargetClosureState'}, {'name': 'core:SecuredPositionState'}, {'name': 'core:ManufacturerSettingsState'}, {'name': 'core:ClosureState'}, {'name': 'core:OpenClosedState'}, {'name': 'core:MovingState'}, {'name': 'core:ManufacturerDiagnosticsState'}, {'name': 'core:DiscreteRSSILevelState'}, {'name': 'core:RSSILevelState'}, {'name': 'core:Memorized1PositionState'}], 'widgetName': 'PositionableRollerShutter', 'attributes': [{'name': 'core:SupportedManufacturerSettingsCommands'}, {'name': 'core:Manufacturer'}, {'name': 'core:FirmwareRevision'}], 'uiClass': 'RollerShutter', 'commands': [{'commandName': 'stop', 'nparams': 0}, {'nparams': 1, 'commandName': 'setDeployment', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'delayedStopIdentify', 'paramsSig': 'p1'}, {'nparams': 2, 'commandName': 'runManufacturerSettingsCommand', 'paramsSig': 'p1,p2'}, {'commandName': 'down', 'nparams': 0}, {'nparams': 1, 'commandName': 'setClosure', 'paramsSig': 'p1'}, {'commandName': 'unpairAllOneWayControllers', 'nparams': 0}, {'nparams': 1, 'commandName': 'setConfigState', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'pairOneWayController', 'paramsSig': 'p1,*p2'}, {'commandName': 'unpairAllOneWayControllersAndDeleteNode', 'nparams': 0}, {'nparams': 1, 'commandName': 'advancedRefresh', 'paramsSig': 'p1,*p2'}, {'commandName': 'refreshMemorized1Position', 'nparams': 0}, {'commandName': 'startIdentify', 'nparams': 0}, {'commandName': 'stopIdentify', 'nparams': 0}, {'commandName': 'up', 'nparams': 0}, {'commandName': 'open', 'nparams': 0}, {'commandName': 'keepOneWayControllersAndDeleteNode', 'nparams': 0}, {'commandName': 'sendIOKey', 'nparams': 0}, {'nparams': 1, 'commandName': 'setMemorized1Position', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'wink', 'paramsSig': 'p1'}, {'commandName': 'close', 'nparams': 0}, {'nparams': 1, 'commandName': 'setName', 'paramsSig': 'p1'}, {'commandName': 'identify', 'nparams': 0}, {'nparams': 1, 'commandName': 'setPosition', 'paramsSig': 'p1'}, {'nparams': 1, 'commandName': 'unpairOneWayController', 'paramsSig': 'p1,*p2'}, {'nparams': 1, 'commandName': 'setSecuredPosition', 'paramsSig': 'p1'}, {'commandName': 'my', 'nparams': 0}, {'commandName': 'getName', 'nparams': 0}], 'type': 'ACTUATOR'}}] 2022-09-28 19:41:40,643 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): 0000-0000-0000.local:8443 2022-09-28 19:41:40,763 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "GET /enduser-mobile-web/1/enduserAPI/setup/devices/io://0000-0000-0000/10769361/states HTTP/1.1" 400 65 2022-09-28 19:41:40,763 - DEBUG - tahoma_local.py - <Response [400]> 2022-09-28 19:41:40,763 - ERROR - tahoma_local.py - failed to get local API device states
OK so a 400 response, means the request was not made correct. I've removed the check for the io part. Can you give it another try with and without the io;// part? The documentation just says to copy the device url, but it looks a bit odd....
25
enter deviceurl to get state: 0000-0000-0000/10769361
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 95, in <module>
response = theBox.get_device_state(device)
File "/home/pi/somfy/tahoma_local.py", line 197, in get_device_state
raise exceptions.TahomaException("failed to get local API device state, response: " + str(response.status_code))
exceptions.TahomaException: failed to get local API device state, response: 400
And the log. I think the listenerid is missing in the url?
2022-09-28 20:45:45,809 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "POST /enduser-mobile-web/1/enduserAPI/events/register HTTP/1.1" 200 45
2022-09-28 20:45:45,809 - DEBUG - tahoma_local.py - <Response [200]>
2022-09-28 20:45:45,809 - DEBUG - tahoma_local.py - succeeded to get local listener ID: {'id': '075dccb1-e1e4-4684-a14c-bfe1b3f8fd98'}
2022-09-28 20:46:18,823 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): 0000-0000-0000.local:8443
2022-09-28 20:46:18,943 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "GET /enduser-mobile-web/1/enduserAPI/setup/devices/:0000-0000-0000/10769361/states HTTP/1.1" 400 77
2022-09-28 20:46:18,943 - DEBUG - tahoma_local.py - <Response [400]>
2022-09-28 20:46:18,943 - ERROR - tahoma_local.py - failed to get local API device states
The documentation does not specify using the listenerid, it needs the device URL. But I think the formtting is a bit of an issue. Will dig a bit deeper. In the mean time, I created sending the command. Can you give it a try?
26
enter deviceURL to command: 0000-0000-0000/14287010
enter command <open|close>: open
Traceback (most recent call last):
File "/home/pi/somfy/test_tahoma.py", line 101, in
2022-09-28 21:01:31,065 - INFO - test_tahoma.py - === starting test run ===
2022-09-28 21:01:37,102 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): 0000-0000-0000.local:8443
2022-09-28 21:01:37,230 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "POST /enduser-mobile-web/1/enduserAPI/events/register HTTP/1.1" 200 45
2022-09-28 21:01:37,231 - DEBUG - tahoma_local.py - <Response [200]>
2022-09-28 21:01:37,231 - DEBUG - tahoma_local.py - succeeded to get local listener ID: {'id': '8fc00176-0c0d-4b6d-9814-b4b4b87e0427'}
2022-09-28 21:02:46,307 - DEBUG - tahoma_local.py - {"label": "test command", "action": [{"deviceURL": "0000-0000-0000/14287010", "commands": [{"name": "open"}]}]}
2022-09-28 21:02:46,308 - DEBUG - connectionpool.py - Starting new HTTPS connection (1): 0000-0000-0000.local:8443
2022-09-28 21:02:46,431 - DEBUG - connectionpool.py - https://0000-0000-0000.local:8443 "POST /enduser-mobile-web/1/enduserAPI/exec/apply HTTP/1.1" 400 88
2022-09-28 21:02:46,431 - DEBUG - tahoma_local.py - <Response [400]>
2022-09-28 21:02:46,431 - ERROR - tahoma_local.py - failed to post command
Found this in somfy's git:
curl --location --request POST 'https://gateway-1224-5722-0308.local:8443/enduser-mobile-web/1/enduserAPI/exec/apply' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer 626bd68b7cd25dccabfe' \
--data-raw '{
"label": "OXIMO io - Set to 35% - TaHoma PC",
"actions": [
{
"deviceURL": "io://1224-5722-0308/4792196",
"commands": [
{
"name": "setClosure",
"parameters": [
35
]
}
]
}
]
}
right. That is the same as in the old way but different than in documentation. I've adjusted the command.... I do think you need the full device url, so including io:// as in the above example
The Somfy box offers also a local API, which will replace at some point the web based API. With this improvement we will add support from the plugin to the local API.
API description: https://github.com/Somfy-Developer/Somfy-TaHoma-Developer-Mode