MadPatrick / somfy

Tahoma/Conexoon plugin for IO blinds, this plugin require internet connexion and a Somfy account
GNU General Public License v3.0
14 stars 3 forks source link

Create access to local API #15

Closed JanJaapKo closed 1 year ago

JanJaapKo commented 2 years ago

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

MadPatrick commented 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

JanJaapKo commented 1 year ago

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

ab10002 commented 1 year ago

1,4,5,20: Traceback (most recent call last): File "/home/pi/somfy/test_tahoma.py", line 70, in response = theBox.get_version() File "/home/pi/somfy/tahoma_local.py", line 148, in get_version raise exceptions.TahomaException("No token has been provided") exceptions.TahomaException: No token has been provided

MadPatrick commented 1 year ago

Yes. But since i’m on Centos the steps are a bit different.

JanJaapKo commented 1 year ago

@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

MadPatrick commented 1 year ago

If we at least turn it off for the development of the plugin we always see later

JanJaapKo commented 1 year ago

okidoki. Done

ab10002 commented 1 year ago

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 response = theBox.get_events() File "/home/pi/somfy/tahoma_local.py", line 201, in get_events raise exceptions.TahomaException("failed to get local API events") exceptions.TahomaException: failed to get local API events

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
MadPatrick commented 1 year ago

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',))
JanJaapKo commented 1 year ago

@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....

ab10002 commented 1 year ago

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 ===
ab10002 commented 1 year ago

And how to deal with all generated tokens? Manual deleting is no option every time..

ab10002 commented 1 year ago

@MadPatrick is python3.6 not to old??

JanJaapKo commented 1 year ago

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.

ab10002 commented 1 year ago

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..

JanJaapKo commented 1 year ago

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.

ab10002 commented 1 year ago

I think a good option.

JanJaapKo commented 1 year ago

OK, 2 additions:

Curious if this will work....

MadPatrick commented 1 year ago

5 Traceback (most recent call last): File "test_tahoma.py", line 59, in response = tahoma.activate_token(p_pin) TypeError: activate_token() missing 1 required positional argument: 'token'


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
JanJaapKo commented 1 year ago

oops, that one I forgot.... Should be fixed

MadPatrick commented 1 year ago

5 Traceback (most recent call last): File "test_tahoma.py", line 60, in theBox.token(tahoma.token) TypeError: 'str' object is not callable

JanJaapKo commented 1 year ago

OK, fixed. Can you retry?

MadPatrick commented 1 year ago

5 has been fixed

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',))
ab10002 commented 1 year ago

20 { "protocolVersion": "2022.4.4-10" }

21 Traceback (most recent call last): File "/home/pi/somfy/test_tahoma.py", line 82, in response = theBox.get_gateways() File "/home/pi/somfy/tahoma_local.py", line 171, in get_gateways raise exceptions.TahomaException("failed to get local API gateways") exceptions.TahomaException: failed to get local API gateways

MadPatrick commented 1 year ago

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 ?

ab10002 commented 1 year ago

Ipaddress box in /etc/host file? 192..... xxxx-xxxx-xxx.local

MadPatrick commented 1 year ago

Ipaddress box in /etc/host file? 192..... xxxx-xxxx-xxx.local

yes

ab10002 commented 1 year ago

try this: curl -v 'https://0000-0000-0000.local:8443/enduser-mobile-web/1/enduserAPI/apiVersion' -H 'accept: application/json'

MadPatrick commented 1 year ago

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
MadPatrick commented 1 year ago

Ok. #20, 21 and 22 are working now

21

[
    {
        "connectivity": {
            "protocolVersion": "2022.4.4-10",
            "status": "OK"
        },
        "gatewayId": "xxxx-xxxx-xxxx"
    }
]

22


            "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
    }
]
ab10002 commented 1 year ago

👍

ab10002 commented 1 year ago

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

ab10002 commented 1 year ago

What is shutter.zip ?

ab10002 commented 1 year ago

25 with the id add manual, i'll get this:

            #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'
JanJaapKo commented 1 year ago

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.

JanJaapKo commented 1 year ago

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...

ab10002 commented 1 year ago

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
JanJaapKo commented 1 year ago

Do not forget to add the io://

I added a check to it now. should then throw an error

ab10002 commented 1 year ago

Traceback (most recent call last): File "/home/pi/somfy/test_tahoma.py", line 95, in 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

JanJaapKo commented 1 year ago

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.

ab10002 commented 1 year ago

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 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

ab10002 commented 1 year ago
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'}'
ab10002 commented 1 year ago

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
JanJaapKo commented 1 year ago

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....

ab10002 commented 1 year ago

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
ab10002 commented 1 year ago

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
JanJaapKo commented 1 year ago

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?

ab10002 commented 1 year ago

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 response = theBox.send_command(commando) File "/home/pi/somfy/tahoma_local.py", line 242, in send_command raise exceptions.TahomaException("failed to post command, response: " + str(response.status_code)) exceptions.TahomaException: failed to post command, response: 400

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
ab10002 commented 1 year ago

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
                    ]
                }
            ]
        }
    ]
}
JanJaapKo commented 1 year ago

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