ofalvai / home-assistant-candy

Unofficial Candy/Haier appliance integration for Home Assistant
129 stars 29 forks source link

Failed to detect encryption #61

Open Eikkargh opened 2 years ago

Eikkargh commented 2 years ago

Getting Failed to detect encryption after entering IP in config flow.

Traceback (most recent call last):
  File "/config/custom_components/candy/client/__init__.py", line 62, in detect_encryption
    assert resp_json.get("response") != "BAD REQUEST"
AssertionError

I have obtained the key and can manually get JSON data in HASS terminal with:

curl -s http://192.168.1.24/http-read.json?encrypted=1 | xxd -r -p > ./coded.txt
./xorknown.py ./coded.txt --key=naedcjmhjdbgcejk > ./decoded.txt
tail -c +59 ./decoded.txt > ./candy.json

JSON values are:

{
        "statusLavatrice":{
                "WiFiStatus":"0",
                "Err":"255",
                "MachMd":"1",
                "Pr":"4",
                "PrPh":"0",
                "SLevel":"255",
                "Temp":"60",
                "SpinSp":"10",
                "Opt1":"0",
                "Opt2":"0",
                "Opt3":"0",
                "Opt4":"0",
                "Opt5":"0",
                "Opt6":"0",
                "Opt7":"0",
                "Opt8":"0",
                "Steam":"0",
                "DryT":"0",
                "DelVal":"255",
                "RemTime":"59",
                "RecipeId":"0",
                "CheckUpState":"0"
        }
}

Apologies if I have missed something obvious. Im pretty new to all this.

ofalvai commented 2 years ago

I'm not sure what is going on here, the error means that the device responded with a simple BAD REQUEST message for some reason.

We are investigating something similar in #53, and one idea is that we need to add an artificial sleep between the API calls. If you have some spare time, you can try running the code in this PR that adds an extra delay. Maybe this solves your problem too.

gee-jay-bee commented 2 years ago

I am seeing similar symptoms but maybe not the same cause.

Not long after getting the new washing machine (last week), I tried using the CandySimplyFi-tool to successfully get the key and was able to use that key to read the json payload (properly). It worked for days.

At the weekend, I tried to set up this integration but it failed with similar symptoms to this issue. Then, when I tried the tool again, it also failed.

Tonight, I tried using curl directly and found that calling:

curl -s http://<ip>/http-read.json?encrypted=0 always returns {"response":"BAD REQUEST"}.

However, calling:

curl -s http://<ip>/http-read.json?encrypted=1 | xxd -r -p

returns

{
        "statusLavatrice":{
                "WiFiStatus":"0",
                "Err":"255",
                "MachMd":"2",
                "Pr":"13",
                "PrPh":"5",
                "SLevel":"255",
                "Temp":"0",
                "SpinSp":"0",
                "Opt1":"0",
                "Opt2":"0",
                "Opt3":"0",
                "Opt4":"0",
                "Opt5":"0",
                "Opt6":"0",
                "Opt7":"0",
                "Opt8":"0",
                "Steam":"0",
                "DryT":"0",
                "DelVal":"255",
                "RemTime":"10",
                "RecipeId":"0",
                "CheckUpState":"0"
        }

Thus, asking for encrypted doesn't return encrypted but asking for no encryption returns an error!

I guess that some kind of firmware update happened after it had been connected to the WIFI for a little while and the behaviour changed as a result?

gee-jay-bee commented 2 years ago

Ah, I see that the code already tries to handle this encrypted / not encrypted scenario. I tried commenting out everything in the first try block to make it skip the encrypted=0 case and I was able to add the integration but the sensor doesn't work. I then used the 5s sleep from the PR you linked (restoring the first try block) and it resulted in the same thing (integration was added, sensor fails to update). The logs in both cases are the same:

2022-02-16 20:16:09 INFO (MainThread) [custom_components.candy.client] Backing off status_with_retry(...) for 0.1s (aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected)
2022-02-16 20:16:11 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 21.611 seconds (success: False)
2022-02-16 20:16:19 INFO (MainThread) [custom_components.candy.client] Backing off status_with_retry(...) for 0.7s (aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 192.168.18.154:80 ssl:default [Connect call failed ('192.168.18.154', 80)])
2022-02-16 20:16:27 INFO (MainThread) [custom_components.candy.client] Backing off status_with_retry(...) for 0.3s (aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected)
2022-02-16 20:16:29 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 13.145 seconds (success: False)
2022-02-16 20:16:41 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.615 seconds (success: False)
2022-02-16 20:17:02 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.547 seconds (success: False)
2022-02-16 20:17:44 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.552 seconds (success: False)
2022-02-16 20:19:05 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.546 seconds (success: False)
2022-02-16 20:20:27 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.705 seconds (success: False)
2022-02-16 20:21:49 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.560 seconds (success: False)
2022-02-16 20:23:10 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.545 seconds (success: False)
2022-02-16 20:24:32 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.549 seconds (success: False)
2022-02-16 20:25:53 DEBUG (MainThread) [custom_components.candy] Finished fetching candy data in 1.581 seconds (success: False)

FWIW, I can rapidly and repeatedly curl the JSON status and there is no error.

Eikkargh commented 2 years ago

I am not sure how you go about testing a PR in HASS. Tried dumping the changed init.py into custom components but doesnt seem to like changes like that. The delay issue is something I came across this morning when i threw together a python script to dump the data into a json file. A few runs in I got a BAD REQUEST response. Except requests.exceptions.RequestException reported too many API requests. Sticking a delay in seemed to resolve this.

gee-jay-bee commented 2 years ago

I think I fixed the problem with handling encrypted=1 but no key. The status() method assumed that key="" means not encrypted so I changed it to match the detect_encryption() logic where there is slightly different processing for encrypted with and without key as follows:


    async def status(self) -> Union[WashingMachineStatus, TumbleDryerStatus, DishwasherStatus, OvenStatus]:
        url = _status_url(self.device_ip, self.use_encryption)
        async with self.session.get(url) as resp:
            if self.use_encryption:
                resp_hex = await resp.text()  # Response is hex encoded encrypted data
                if self.encryption_key != "":
                    decrypted_text = decrypt(self.encryption_key.encode(), bytes.fromhex(resp_hex))
                else:
                    decrypted_text = bytes.fromhex(resp_hex)
                resp_json = json.loads(decrypted_text)
            else:
                resp_json = await resp.json(content_type="text/html")

            _LOGGER.debug(resp_json)

            if "statusTD" in resp_json:
                status = TumbleDryerStatus.from_json(resp_json["statusTD"])
            elif "statusLavatrice" in resp_json:
                status = WashingMachineStatus.from_json(resp_json["statusLavatrice"])
            elif "statusForno" in resp_json:
                status = OvenStatus.from_json(resp_json["statusForno"])
            elif "statusDWash" in resp_json:
                status = DishwasherStatus.from_json(resp_json["statusDWash"])
            else:
                raise Exception("Unable to detect machine type from API response", resp_json)

            return status

I now have the sensors working in HA (though I note that the time remaining sensor is converting the input in minutes to hours but reporting it as minutes).

FWIW, I wonder whether there should be an explicit call to resp.close() before the assert for BAD_REQUEST in detect_encryption(). I hacked together some python that repeatedly called the API in a loop and it worked without issue so it doesn't seem like timing ought to make a difference (though it does!). As the context manager is only releasing the connection, I just wondered whether release is not enough here (given that the washing machine itself always wants the connection closed after every request, the session is not really adding much value?).

ofalvai commented 2 years ago

Thank you @gee-jay-bee for the very detailed investigation, that was indeed a bug in the status() call. I fixed it and merged into main, can you guys give it a try? You can install the main branch in HACS by selecting Redownload in the HACS menu, then selecting main in the version dropdown.

image

The main branch doesn't have any sleep commands between the API calls yet, I'm hoping that this other fix is going to solve at least some of the problems.

Eikkargh commented 2 years ago

This did not resolve my issue. Updated HACS, HASS and Redownloaded your Candy integration, then a restart. After entering IP address in flow im still getting "Failed to detect encryption, check logs"

Logger: custom_components.candy.config_flow
Source: custom_components/candy/client/__init__.py:69
Integration: Candy ([documentation](https://github.com/ofalvai/home-assistant-candy), [issues](https://github.com/ofalvai/home-assistant-candy/issues))
First occurred: 19:45:50 (2 occurrences)
Last logged: 19:46:20

Server disconnected
Traceback (most recent call last):
  File "/config/custom_components/candy/client/__init__.py", line 62, in detect_encryption
    assert resp_json.get("response") != "BAD REQUEST"
AssertionError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/config/custom_components/candy/config_flow.py", line 45, in async_step_user
    encryption_type, key = await detect_encryption(
  File "/config/custom_components/candy/client/__init__.py", line 69, in detect_encryption
    async with session.get(url) as resp:
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 559, in _request
    await resp.start(conn)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client_reqrep.py", line 898, in start
    message, payload = await protocol.read()  # type: ignore[union-attr]
  File "/usr/local/lib/python3.9/site-packages/aiohttp/streams.py", line 616, in read
    await self._waiter
aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected

I can get the same output that curl | xxd gives before running it through xorknown.py in python using:

candyhex = requests.get(http://192.168.1.24/http-read.json?encrypted=1, timeout=10).text
bytes_object = bytes.fromhex(candyhex)
coded = bytes_object.decode("ASCII")

If I am reading your code correctly at this point in detect_encryption it tries connection without encryption and gets a bad response (line 62) but then fails the next get request with encryption after the except (line 69). I am very much a beginner and why this is happening I do not know.

edwardd06 commented 2 years ago

I have had to downgrade to Version 0.6.2 to enter the Encryption key to get this to work, the latest version gives an error message before asking so will wait for this to be fixed in V 0.8 or so.

The only issue is that it thinks that there is 10 minutes remaining when washing has finished so should show 0,

had to take the /60 (divide 60) out of the /config/custom_components/candy/client/model.py to stop it measuring in hours not minutes. image

image

Gferretta commented 2 years ago

Hi everyone

I have a Candy clothes washer model GVFWFL4139WHR-12.

I have downloaded the Candy SimplyFi addon from HACS, but when I want to add the integration, I receive the following error: "Failed to detect encryption". Candy 1

I have the correct IP, it responds well to the sentence: http://IP/http-read.json?encrypted=1 candy 4

With encrypted=0 I receive as response {"response":"BAD REQUEST"}

Trying to decode the response received with "encryption=1" on the website https://www.online-python.com/pm93n5Sqg4 I get no response. Candy 2

The integration never asks me for the KEY in v0.7.0 Using v0.6.2 ask me for KEY but also with error message.

Now I do in master version also with error. Thank you very much

http://192.x.y.z/http-read.json?encrypted=1

116F626D4E18190A101412290D100F11180B0B014E5116666E6868473B0F280C3916091019184F5146504349616C676C48271A164E514F5951544349616C676C482F0907042609495E435347406B646C634038164E514F5A56434D68666F67473A10380C4E514F5D464D6C6F656F4C3626071E010049574956545447406B646C63403C01011B4F51465354504E4A636F636B4A371C02033814435B475E535B47466F626D6549221B1050435F4E564C496768616D4E241D1F56435B475C444268606B6146231B1958465B43554E4A636F636B4A2B1C1F59495E435147406B646C63402714185E4F5146514349616C676C482D18105A49574954434D68666F674725121C534E514F5B464D6C6F656F4C2A1A16504656495D49486C6B6C65443D110F03054656495D49486C6B6C65442A1713364A5E4E5F4F47696B686C4E220B093C03044656495F5E51434D68666F674738070530050608495E435047406B646C63403A010F021D0E2D05435F4E564C496768616D4E28050E070A34153F120F110F4052465C4960616D1C6C6F11

asiersan commented 2 years ago

Same problem here , i tried with 0.7,main and 0.62 and same problem:

`Logger: custom_components.candy.config_flow Source: custom_components/candy/client/init.py:69 Integration: candy (documentation, issues) First occurred: 23:10:56 (2 occurrences) Last logged: 23:11:33

Server disconnected Traceback (most recent call last): File "/config/custom_components/candy/client/init.py", line 62, in detect_encryption assert resp_json.get("response") != "BAD REQUEST" AssertionError

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/config/custom_components/candy/config_flow.py", line 45, in async_step_user encryption_type, key = await detect_encryption( File "/config/custom_components/candy/client/init.py", line 69, in detect_encryption async with session.get(url) as resp: File "/usr/local/lib/python3.10/site-packages/aiohttp/client.py", line 559, in _request await resp.start(conn) File "/usr/local/lib/python3.10/site-packages/aiohttp/client_reqrep.py", line 898, in start message, payload = await protocol.read() # type: ignore[union-attr] File "/usr/local/lib/python3.10/site-packages/aiohttp/streams.py", line 616, in read await self._waiter aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected ` And read json encrypted is responding:

115A7D6C64250C12163F182A56343545183E1400646C037E68436244602B12583923161133255A49407B494A3A485D3848120517646C5A41577F494A3A485D38481A16062E1B1C5158685A441B4F5E3863752717646C5A425768476B3D4B5D133A25270D646C5A434066666C3E4B7662263201002A7442515068476B3D4B5D133E321A15646C5A4A5268476B3D4B5D1339271E0B15265A49407E494A3A485D3848180711777442515268476B3D4B5D1325270357646C5A434066666C3E4B767E1A2344477C7448514E47616F3E601B411E63555F64665A5F6F40626F150D24455F754D477674547E6843624478322007486D5555647A75796B43492947366313507547476A5B727A6B682416437A760B486755494B5C717A40191F03562F760B486755494B5C717A400E191F63606E135A755B684C5F7151262F0730562E760B48654250647A75796B434934522F00580732555F64674B424066666C3E4B76630F341E15231F1C5158685B441B4F5E386375340D2335132612191F074327760B486755684C5F057E6837

asiersan commented 2 years ago

Same problem here , i tried with 0.7,main and 0.62 and same problem:

`Logger: custom_components.candy.config_flow Source: custom_components/candy/client/init.py:69 Integration: candy (documentation, issues) First occurred: 23:10:56 (2 occurrences) Last logged: 23:11:33

Server disconnected Traceback (most recent call last): File "/config/custom_components/candy/client/init.py", line 62, in detect_encryption assert resp_json.get("response") != "BAD REQUEST" AssertionError

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/config/custom_components/candy/config_flow.py", line 45, in async_step_user encryption_type, key = await detect_encryption( File "/config/custom_components/candy/client/init.py", line 69, in detect_encryption async with session.get(url) as resp: File "/usr/local/lib/python3.10/site-packages/aiohttp/client.py", line 559, in _request await resp.start(conn) File "/usr/local/lib/python3.10/site-packages/aiohttp/client_reqrep.py", line 898, in start message, payload = await protocol.read() # type: ignore[union-attr] File "/usr/local/lib/python3.10/site-packages/aiohttp/streams.py", line 616, in read await self._waiter aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected ` And read json encrypted is responding:

115A7D6C64250C12163F182A56343545183E1400646C037E68436244602B12583923161133255A49407B494A3A485D3848120517646C5A41577F494A3A485D38481A16062E1B1C5158685A441B4F5E3863752717646C5A425768476B3D4B5D133A25270D646C5A434066666C3E4B7662263201002A7442515068476B3D4B5D133E321A15646C5A4A5268476B3D4B5D1339271E0B15265A49407E494A3A485D3848180711777442515268476B3D4B5D1325270357646C5A434066666C3E4B767E1A2344477C7448514E47616F3E601B411E63555F64665A5F6F40626F150D24455F754D477674547E6843624478322007486D5555647A75796B43492947366313507547476A5B727A6B682416437A760B486755494B5C717A40191F03562F760B486755494B5C717A400E191F63606E135A755B684C5F7151262F0730562E760B48654250647A75796B434934522F00580732555F64674B424066666C3E4B76630F341E15231F1C5158685B441B4F5E386375340D2335132612191F074327760B486755684C5F057E6837

Solved with #54

Gferretta commented 2 years ago

Hi everyone

I have a Candy clothes washer model GVFWFL4139WHR-12.

I have downloaded the Candy SimplyFi addon from HACS, but when I want to add the integration, I receive the following error: "Failed to detect encryption". Candy 1

I have the correct IP, it responds well to the sentence: http://IP/http-read.json?encrypted=1 candy 4

With encrypted=0 I receive as response {"response":"BAD REQUEST"}

Trying to decode the response received with "encryption=1" on the website https://www.online-python.com/pm93n5Sqg4 I get no response. Candy 2

The integration never asks me for the KEY in v0.7.0 Using v0.6.2 ask me for KEY but also with error message.

Now I do in master version also with error. Thank you very much

http://192.x.y.z/http-read.json?encrypted=1

116F626D4E18190A101412290D100F11180B0B014E5116666E6868473B0F280C3916091019184F5146504349616C676C48271A164E514F5951544349616C676C482F0907042609495E435347406B646C634038164E514F5A56434D68666F67473A10380C4E514F5D464D6C6F656F4C3626071E010049574956545447406B646C63403C01011B4F51465354504E4A636F636B4A371C02033814435B475E535B47466F626D6549221B1050435F4E564C496768616D4E241D1F56435B475C444268606B6146231B1958465B43554E4A636F636B4A2B1C1F59495E435147406B646C63402714185E4F5146514349616C676C482D18105A49574954434D68666F674725121C534E514F5B464D6C6F656F4C2A1A16504656495D49486C6B6C65443D110F03054656495D49486C6B6C65442A1713364A5E4E5F4F47696B686C4E220B093C03044656495F5E51434D68666F674738070530050608495E435047406B646C63403A010F021D0E2D05435F4E564C496768616D4E28050E070A34153F120F110F4052465C4960616D1C6C6F11

Hi I dont resolve this issue

What I see is that every time I run the code http://IP/http-read.json?encrypted=1 the response changes. I don't know if it depends on the program that the washing machine is running.

I couldn't get the CandySimplyFi-tool to work either the python site to obtain the key.

Candy Response 2

Tassel8062 commented 2 years ago

Try with the latest update, it fixed a similar issue for me

Gferretta commented 2 years ago

Try with the latest update, it fixed a similar issue for me

Hi

With last version I' had the same error that in https://github.com/ofalvai/home-assistant-candy/issues/61#issuecomment-1257195355

asiersan commented 2 years ago

Same here, with previo ya versión, chamging manifest.json line 8, the problem was solved. Now i updated yo this versión and problem returns. With:

Reintentando la configuración: Error communicating with API: TimeoutError()

ofalvai commented 2 years ago

Hello everyone 👋

I released version 0.8.0 that contains API rate-limiting, which is the long-term fix for those who had to add the sleep(5) calls and it solved their connection issues. Rate limiting won't solve everyone's connection problems, but give the latest version a try if you are using a modified version of the integration with extra sleep() commands.

The rate limiter is set up to only allow 1 request every 3 seconds, I think this will be a good start. If you want to tweak the value, you can find it here: https://github.com/ofalvai/home-assistant-candy/blob/bc1c21ee8b6df78ca01ce801bd12e77687be7635/custom_components/candy/client/__init__.py#L21

dennisnn87 commented 1 year ago

Hi I just bought a Hoover HWP610AMBC1-S but running ./simplyfi 192.168.1.30 getkey just returns:

Candy Simply-Fi tool by Melvin Groenendaal

error: connect error: get_candySimplify_data, could not get data from server

If I try to add it to HA, I get the Failed to detect encryption, check logs

The machine works fine with the hOn app.

ofalvai commented 1 year ago

@dennisnn87 if even the CLI tool can't connect to your appliance then I don't think your problem is related to this integration.

dennisnn87 commented 1 year ago

Any ideas what the problem could be?Best regards l Med venlig hilsenDennis Nygaard NielsenDen 30. nov. 2022 kl. 08.32 skrev Olivér Falvai @.***>: @dennisnn87 if even the CLI tool can't connect to your appliance then I don't think your problem is related to this integration.

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.***>

SirLouen commented 1 year ago

Any ideas what the problem could be?Best regards l Med venlig hilsenDennis Nygaard NielsenDen 30. nov. 2022 kl. 08.32 skrev Olivér Falvai @.>: @dennisnn87 if even the CLI tool can't connect to your appliance then I don't think your problem is related to this integration. —Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.>

I have a Candy washing machine and when I put it on "Wifi" mode, it lasts for 5 or 10 minutes before it goes standby. So you have to be quick configuring everything, otherwise, Home Assistant will not recognize it.

Anyway this Washing machine automation is very weird. One the bright side, it's using an ESP device, so maybe it can be Tasmotized!

Eikkargh commented 1 year ago

@SirLouen I find I get more reliable responses from the machines API when a manually set program is running. Not sure why this is. In Wifi mode it can take me a few requests to get a response with curl.

It has been a year though and I still have not got this integration working. This update fails differently to all previous versions. After entering IP in the dialogue flow it just hangs. No responses and no errors. This locked up all of Home Assistant even after closing the box and restarting home assistant. I had to reboot to clear it. No errors showing in logs.

I still use the python script that I wrote to test responses a year ago. A few modifications and I can call it with a command line sensor and that works fine. Not as robust as the integration but does the job for me. I tried comparing what my script does differently but nothing obvious jumps out. The code is here if anybody want to have a go at it.

AlexRux commented 11 months ago

Logger: custom_components.candy.config_flow Source: custom_components/candy/config_flow.py:45 Integration: Candy (documentation, issues) First occurred: 12:32:29 (3 occurrences) Last logged: 12:45:23

Cannot connect to host 192.168.1.28:80 ssl:default [Connect call failed ('192.168.1.28', 80)] Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/aiohttp/connector.py", line 992, in _wrap_create_connection return await self._loop.create_connection(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/asyncio/base_events.py", line 1085, in create_connection raise exceptions[0] File "/usr/local/lib/python3.11/asyncio/base_events.py", line 1069, in create_connection sock = await self._connect_sock( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/asyncio/base_events.py", line 973, in _connect_sock await self.sock_connect(sock, address) File "/usr/local/lib/python3.11/asyncio/selector_events.py", line 628, in sock_connect return await fut ^^^^^^^^^ File "/usr/local/lib/python3.11/asyncio/selector_events.py", line 668, in _sock_connect_cb raise OSError(err, f'Connect call failed {address}') ConnectionRefusedError: [Errno 111] Connect call failed ('192.168.1.28', 80)

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/config/custom_components/candy/config_flow.py", line 45, in async_step_user encryption_type, key = await detect_encryption( ^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/candy/client/init.py", line 81, in detect_encryption async with _LIMITER, session.get(url) as resp: File "/usr/local/lib/python3.11/site-packages/aiohttp/client.py", line 574, in _request conn = await self._connector.connect( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/connector.py", line 544, in connect proto = await self._create_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/connector.py", line 911, in _createconnection , proto = await self._create_direct_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/connector.py", line 1235, in _create_direct_connection raise last_exc File "/usr/local/lib/python3.11/site-packages/aiohttp/connector.py", line 1204, in _create_direct_connection transp, proto = await self._wrap_create_connection( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/connector.py", line 1000, in _wrap_create_connection raise client_error(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 192.168.1.28:80 ssl:default [Connect call failed ('192.168.1.28', 80)]