home-assistant / core

:house_with_garden: Open source home automation that puts local control and privacy first.
https://www.home-assistant.io
Apache License 2.0
73.32k stars 30.62k forks source link

Error setting up entry Home Assistant Cloud for netatmo since 2022.3 #67560

Closed atchoum31 closed 2 years ago

atchoum31 commented 2 years ago

The problem

Since the 2022.3 update, the Netatmo integration didn't work. After a delete/reinstall here is the issue. I have one camera and several temperature sensors.

For information the IP address 169.254.214.58 doesn't mean anything, my local IP range is 192.168.x.x

What version of Home Assistant Core has the issue?

core-2022.3.0

What was the last working version of Home Assistant Core?

core-2022.2.9

What type of installation are you running?

Home Assistant Container

Integration causing the issue

Netatmo

Link to integration documentation on our website

https://www.home-assistant.io/integrations/netatmo/

Diagnostics information

No response

Example YAML snippet

No response

Anything in the logs that might be useful for us?

Logger: homeassistant.config_entries
Source: components/netatmo/data_handler.py:166 
First occurred: 17:35:38 (2 occurrences) 
Last logged: 19:19:07

Error setting up entry Home Assistant Cloud for netatmo
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 986, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)  # type: ignore[return-value]  # noqa
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1056, in create_connection
    raise exceptions[0]
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1041, in create_connection
    sock = await self._connect_sock(
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 955, in _connect_sock
    await self.sock_connect(sock, address)
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 502, in sock_connect
    return await fut
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 537, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
OSError: [Errno 113] Connect call failed ('169.254.214.58', 80)

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

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 335, in async_setup
    result = await component.async_setup_entry(hass, self)
  File "/usr/src/homeassistant/homeassistant/components/netatmo/__init__.py", line 144, in async_setup_entry
    await data_handler.async_setup()
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 108, in async_setup
    await asyncio.gather(
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 210, in register_data_class
    await self.async_fetch_data(data_class_entry)
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 166, in async_fetch_data
    await self.data[data_class_entry].async_update()
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 649, in async_update
    await self._async_update_all_camera_urls()
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 659, in _async_update_all_camera_urls
    await self.async_update_camera_urls(camera_id)
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 724, in async_update_camera_urls
    ] = await self._async_check_url(
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 731, in _async_check_url
    resp = await self.auth.async_post_request(url=f"{url}/command/ping")
  File "/usr/local/lib/python3.9/site-packages/pyatmo/auth.py", line 335, in async_post_request
    async with self.websession.post(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 1138, in __aenter__
    self._resp = await self._coro
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 535, in _request
    conn = await self._connector.connect(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 542, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 907, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1206, in _create_direct_connection
    raise last_exc
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1175, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 992, in _wrap_create_connection
    raise client_error(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 169.254.214.58:80 ssl:default [Connect call failed ('169.254.214.58', 80)]

Additional information

No response

cgtobi commented 2 years ago

@buhito81 Does that happen right after HA starting up?

buhito81 commented 2 years ago

@buhito81 Does that happen right after HA starting up?

No, this is about 6 minutes after startup

cgtobi commented 2 years ago

Does anything else work as expected? If so, please open a separate issue as this seems different.

hamerse commented 2 years ago

Same issue here.

ultratoto14 commented 2 years ago

Hi @cgtobi, i took some time trying to debug that error. It seems to not be completely linked to the component itself. Environment: Docker Image on QNAP Nas

What I've done:

2022-03-31 15:28:31 ERROR (MainThread) [homeassistant.components.light] Error while setting up netatmo platform for light
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 986, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)  # type: ignore[return-value]  # noqa
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1056, in create_connection
    raise exceptions[0]
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1041, in create_connection
    sock = await self._connect_sock(
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 955, in _connect_sock
    await self.sock_connect(sock, address)
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 502, in sock_connect
    return await fut
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 537, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
OSError: [Errno 113] Connect call failed ('169.254.113.204', 80)

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

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 249, in _async_setup_platform
    await asyncio.shield(task)
  File "/usr/src/homeassistant/homeassistant/components/netatmo/light.py", line 38, in async_setup_entry
    await data_handler.register_data_class(
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 198, in register_data_class
    await self.async_fetch_data(data_class_entry)
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 154, in async_fetch_data
    await self.data[data_class_entry].async_update()
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 649, in async_update
    await self._async_update_all_camera_urls()
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 659, in _async_update_all_camera_urls
    await self.async_update_camera_urls(camera_id)
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 724, in async_update_camera_urls
    ] = await self._async_check_url(
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 731, in _async_check_url
    resp = await self.auth.async_post_request(url=f"{url}/command/ping")
  File "/usr/local/lib/python3.9/site-packages/pyatmo/auth.py", line 335, in async_post_request
    async with self.websession.post(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 1138, in __aenter__
    self._resp = await self._coro
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 535, in _request
    conn = await self._connector.connect(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 542, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 907, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1206, in _create_direct_connection
    raise last_exc
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1175, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 992, in _wrap_create_connection
    raise client_error(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 169.254.113.204:80 ssl:default [Connect call failed ('169.254.113.204', 80)]
cgtobi commented 2 years ago

Thanks @ultratoto14 for your efforts. It is very unfortunate that the issue is so hard to reproduce or isolate.

Friedi1970 commented 2 years ago

Today I updated to core-2022.04.0 and everything works! I hope this is the end of that odyssey.

dailybits commented 2 years ago

I did also did the upgrade, removed the integration, rebooted the host and reconfigured the Netatmo integration, however same error in the logs.

Friedi1970 commented 2 years ago

OK, the problem is here again after rebooting.

Logger: homeassistant.config_entries
Source: components/netatmo/data_handler.py:166
First occurred: 11:11:53 (1 occurrences)
Last logged: 11:11:53

Error setting up entry Home Assistant Cloud for netatmo
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 986, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)  # type: ignore[return-value]  # noqa
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1056, in create_connection
    raise exceptions[0]
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1041, in create_connection
    sock = await self._connect_sock(
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 955, in _connect_sock
    await self.sock_connect(sock, address)
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 502, in sock_connect
    return await fut
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 537, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
OSError: [Errno 101] Connect call failed ('169.254.249.210', 80)

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

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 335, in async_setup
    result = await component.async_setup_entry(hass, self)
  File "/usr/src/homeassistant/homeassistant/components/netatmo/__init__.py", line 144, in async_setup_entry
    await data_handler.async_setup()
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 108, in async_setup
    await asyncio.gather(
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 210, in register_data_class
    await self.async_fetch_data(data_class_entry)
  File "/usr/src/homeassistant/homeassistant/components/netatmo/data_handler.py", line 166, in async_fetch_data
    await self.data[data_class_entry].async_update()
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 649, in async_update
    await self._async_update_all_camera_urls()
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 659, in _async_update_all_camera_urls
    await self.async_update_camera_urls(camera_id)
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 724, in async_update_camera_urls
    ] = await self._async_check_url(
  File "/usr/local/lib/python3.9/site-packages/pyatmo/camera.py", line 731, in _async_check_url
    resp = await self.auth.async_post_request(url=f"{url}/command/ping")
  File "/usr/local/lib/python3.9/site-packages/pyatmo/auth.py", line 335, in async_post_request
    async with self.websession.post(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 1138, in __aenter__
    self._resp = await self._coro
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 535, in _request
    conn = await self._connector.connect(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 542, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 907, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1206, in _create_direct_connection
    raise last_exc
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1175, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 992, in _wrap_create_connection
    raise client_error(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 169.254.249.210:80 ssl:default [Connect call failed ('169.254.249.210', 80)]
Friedi1970 commented 2 years ago

Hi @cgtobi Is there any progress? Btw. the I found a hint regarding the address: https://community.home-assistant.io/t/ha-trying-to-connect-to-169-254-60-206-8443/373686/2 Does this help?

You mentioned to create a custom Netatmo. I surely would do but to be honest, I haven't a clue how to do this :(

cgtobi commented 2 years ago

Well, it does not help me but it might help you. 😉

If you want to go the custom component route ping me on Discord. But I am pretty sure this won't help as this is probably a structural issue nothing the component could help with.

Friedi1970 commented 2 years ago

Well, it does not help me but it might help you. 😉

Actually not. The thing is that the Netatmo integration is the only cloud integration which has this problem. All the others work fine.

If you want to go the custom component route ping me on Discord. But I am pretty sure this won't help as this is probably a structural issue nothing the component could help with.

Hmm. OK, make sense.

cgtobi commented 2 years ago

Maybe this gives a hint at what might go wrong: https://github.com/home-assistant/core/issues/28700#issuecomment-557034970

Friedi1970 commented 2 years ago

Maybe this gives a hint at what might go wrong: #28700 (comment)

All my devices have fixed addresses. That’s why it all seems so strange to me …

cgtobi commented 2 years ago

Would be interesting if others have similar setups.

gyoori commented 2 years ago

Same issue here (HA 2022.4.2)

nxtpl commented 2 years ago

Not sure if it's related at all, but my "configuration.yaml" started to be wrong since few days after HA update. All the automations couldn't load because of it. The configuration checker started to say "Unexpected error calling config validator: 'NoneType' object has no attribute 'model'".

When I traced the reason, it was because of this Netatmo entry:

- id: '1631039003267'
  alias: Animal detection entrance
  description: ''
  trigger:
  - platform: device
    device_id: 815a7866d2eb5ee486a93426fe7bb8ac
    domain: netatmo
    entity_id: camera.netatmo_entrance
    type: animal
  condition:
  - condition: time
    after: '20:00'
    before: '23:00'
  action:
  - scene: scene.studio_led1_green
  - wait_template: ''
    timeout: 00:00:01
  - scene: scene.studio_led1_off
  mode: single
cgtobi commented 2 years ago

That doesn't sound related at all.

dlawnurg commented 2 years ago

Today I updated to core-2022.04.0 and everything works! I hope this is the end of that odyssey.

I did the same and it worked until the next server reboot. Now I have to go back to 2022.03 again.

Flink commented 2 years ago

Same issue here since a week ago I’d say. My cameras have fixed IP addresses. Weird thing though, I can connect on port 80 on any camera except for the “main” one which has the IP from the logs :thinking:

yan14 commented 2 years ago

It's really strange! This error here just appeared two days ago. My HA is always at the latest version. But two days ago my router had lost power and afterwards this error came up. The nslookup looks good.

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
Nicht autorisierende Antwort:
Name:    front-azure.netatmo.net
Address:  51.145.143.28
Aliases:  api.netatmo.com

It's really strange...

Flink commented 2 years ago

After applying the latest update (2022.4.6), it now works again! I don’t know for how long it will work though :grimacing:

yan14 commented 2 years ago

So if I get the post about the IP Address right, this is a local Address. @cgtobi could you reproduce the problem? As I wrote my steps where:

And there was the error!

Well the weatherstation, valves and camera are still available via app. The camera is also still available as a generic camera. The webhooks doesn't seem to work either.

dailybits commented 2 years ago

After applying the latest update (2022.4.6), it now works again! I don’t know for how long it will work though 😬

I can confirm. Everything is working again! 🎉

Molodax commented 2 years ago

The issue persists in 2022.4.6

dailybits commented 2 years ago

The issue persists in 2022.4.6

Did you remove the integration, reboot everything and configure it again? At my side it's working again (I have a full netatmo install: weather, energy, security,...).

Friedi1970 commented 2 years ago

The issue persists in 2022.4.6

Did you remove the integration, reboot everything and configure it again? At my side it's working again (I have a full netatmo install: weather, energy, security,...).

It worked. But after a reboot the same problem again.

ultratoto14 commented 2 years ago

As I updated to the last version, I decided to dig in as it still fails. HA running in a docker container on a 8 bay nas, with multiple gbits ports. I checked the reported failing ip address and looked on the available interfaces. (ifconfig -a) It corresponds to a bridge that does not have a linked interface. (brctl show; docker network ls) Looking more, it seems that that bridge was created by docker but is somehow orphan. I decided to delete it (ip link delete br-xxxxxxxxx type bridge) and restart HA, everything is working again. Hope it can help.

yan14 commented 2 years ago

It seems, that the new update fixed it for me. Maybe #70413 fixed it.

Friedi1970 commented 2 years ago

It seems, that the new update fixed it for me. Maybe #70413 fixed it.

Nope. I updated to core-2022.4.7 right now and it is still the same error.

SiebeRoets commented 2 years ago

It started working briefely after updating to home assistant 2022.4 but then same error. Now on 2022.4.7 and still broken. I'm running HA OS in a VM everything els works. Anyone found a solid solution?

yan14 commented 2 years ago

So today I had to restart my home assistant, due to the update, and as always, everything is gone.

A question to the guys here. What hardware version of the weatherstation do you have? What I saw is, that the weatherstation with version 1 or 2, are connected to the wifi roundabout all 10 minutes. In the mean time, they seem to be offline. Maybe thats also something, which is causing this problem.

Friedi1970 commented 2 years ago

A question to the guys here. What hardware version of the weatherstation do you have? What I saw is, that the weatherstation with version 1 or 2, are connected to the wifi roundabout all 10 minutes. In the mean time, they seem to be offline. Maybe thats also something, which is causing this problem.

I have v2 but to be honest, I don’t believe that the problem ist caused in that way. Firstly I can’t say that the devices are disconnected between the reportings. Furthermore I have fixed IPs; how could this be a impact?

Molodax commented 2 years ago

I have v2 but to be honest, I don’t believe that the problem ist caused in that way. Firstly I can’t say that the devices are disconnected between the reportings.

Exactly the same, v2 and static IP and having this issue with HA.

cgtobi commented 2 years ago

Either way in my opinion this is rather an issue with your specific setup than a problem with the integration itself. I know of lots of user who have a perfectly working Netatmo setup with lots of devices. Unfortunately I don't know how to solve your specific issue. I know this is not a very satisfying answer, so, sorry about it.

Friedi1970 commented 2 years ago

Either way in my opinion this is rather an issue with your specific setup than a problem with the integration itself. I know of lots of user who have a perfectly working Netatmo setup with lots of devices. Unfortunately I don't know how to solve your specific issue. I know this is not a very satisfying answer, so, sorry about it.

Well, this is an answer I really can't understand! Just scroll up and you will figure out that the count of people who have the same problem is growing. That's why I can't understand that you are talking about "your specific setup". When you are talking about a specific setup, could you please tell what you are talking about? I mean, there is nothing at Netatmo what you can really change.

Friedrieck commented 2 years ago

I imagine what you're all going through. I own several Netatmo products (climate, weather, cameras) and would be mad if they were not connecting to HA any more. I had a long time weird issue with my three Presence cameras (light switches not working, just that), and it got only resolved once I was asked to re-confirm something in their dev site (don't remember exactly what), i.e. it was not something to do on HA side. In your case, unless already tried, I would create a new app in the dev.netatmo.com site and update HA config. accordingly. Why not?

Friedi1970 commented 2 years ago

I imagine what you're all going through. I own several Netatmo products (climate, weather, cameras) and would be mad if they were not connecting to HA any more. I had a long time weird issue with my three Presence cameras (light switches not working, just that), and it got only resolved once I was asked to re-confirm something in their dev site (don't remember exactly what), i.e. it was not something to do on HA side. In your case, unless already tried, I would create a new app in the dev.netatmo.com site and update HA config. accordingly. Why not?

Thanks for this idea. Till now my configuration was connection via Nabu Casa. I tried your way by creating a new app und configuration within the config.yaml. Unfortunately this didn‘t work either :-(

yan14 commented 2 years ago

Thanks for the reply about your settings. All three of us have the same version and static ips. I think that this is a sign here. In my setting I have a presence cam and valves as well. The cam is reachable and configured as a local cam as well. So I think it has something to do with the weather station v2 and that it is only connected to the WiFi every ten minutes when it sends the information to the server!

Molodax commented 2 years ago

Either way in my opinion this is rather an issue with your specific setup than a problem with the integration itself. I know of lots of user who have a perfectly working Netatmo setup with lots of devices. Unfortunately I don't know how to solve your specific issue. I know this is not a very satisfying answer, so, sorry about it.

I have a lot of Netatmo devices which are working with HA except Weather station. Can you please explain what is your opinion based on? Which specific setup you imply to? There were no changes in my setup and the weather station is connected in the same way as my other Netatmo devices. Still, the error comes from the integration.

cgtobi commented 2 years ago

The error indicates that this is a DNS issue. If the integration itself is working for other devices this is even more curious. I am still convinced that this is nothing I can fix.

I'd suggest to reboot the weather station. Is the weather station only in HA working? Do you get data when using the webapp or the api itself? I ask because HA does not communicate directly to the weather station. Cameras are the only devices we can access directly and only for very specific things.

Friedi1970 commented 2 years ago

But you see that this obviously came up with 2022.3.0. Before there was no problem. I ask again, did you contact the guys of HA like Frenck to ask whether something was changed what could led to this issue? By the way I also have two cams from Netatmo and the don‘t work either since 2022.03. Another curious thing is that sometimes after rebooting it is working but with the next reboot the same problem comes up again :(

cgtobi commented 2 years ago

I sure had a chat with other core devs, they also told me that this looks like a dns issue.

Friedi1970 commented 2 years ago

OK. But isn’t it obvious that this, whatever it is, is due to a change in 2022.03.?

cgtobi commented 2 years ago

No, because this was also replicated in versions before that.

Friedi1970 commented 2 years ago

Really? Didn’t get this.

Molodax commented 2 years ago

I'd suggest to reboot the weather station. Is the weather station only in HA working? Do you get data when using the webapp or the api itself? I ask because HA does not communicate directly to the weather station. Cameras are the only devices we can access directly and only for very specific things.

I get the data from the weather station via app and via Web all the time. It doesn’t work only in HA unless I restart the station/router and HA. Cameras and valves are working in HA at the same time.

cgtobi commented 2 years ago

That doesn't make sense at all. I wonder if the API has an issue. Could you kindly take a look at the dev portal and see if the weather data endpoint gives you anything? @Molodax

anaegeli commented 2 years ago

Hi there, I don't know how a can help you, but i can confirm that since 2022.03 I also have some problems with the Netatmo. Here a printscreen: Battery It's not only the battery. also other values. Can someone help.

Molodax commented 2 years ago

That doesn't make sense at all. I wonder if the API has an issue. Could you kindly take a look at the dev portal and see if the weather data endpoint gives you anything? @Molodax

I don't see on the dev portal how I can check it, is there any console? Could you guide? I agree it seems strange but I've started experiencing it from 2022.3 very similar to others on this thread.