homeassistant-microsoft-todo icon indicating copy to clipboard operation
homeassistant-microsoft-todo copied to clipboard

Server Error 500

Open potnot3 opened this issue 3 years ago • 16 comments

500 Internal Server Error Server got itself in trouble

log: 2021-03-17 20:03:40 WARNING (MainThread) [homeassistant.util.async_] Detected I/O inside the event loop. This is causing stability issues. Please report issue to the custom component author for microsoft_todo doing I/O at custom_components/microsoft_todo/calendar.py, line 170: token = self.oauth.fetch_token( 2021-03-17 20:03:40 ERROR (MainThread) [aiohttp.server] Error handling request Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 422, in _handle_request resp = await self._request_handler(request) File "/usr/local/lib/python3.8/site-packages/aiohttp/web_app.py", line 499, in _handle resp = await handler(request) File "/usr/local/lib/python3.8/site-packages/aiohttp/web_middlewares.py", line 119, in impl return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 56, in security_filter_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 18, in request_context_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 72, in ban_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 129, in auth_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 126, in handle result = handler(request, **request.match_info) File "/config/custom_components/microsoft_todo/calendar.py", line 170, in get token = self.oauth.fetch_token( File "/usr/local/lib/python3.8/site-packages/requests_oauthlib/oauth2_session.py", line 360, in fetch_token self._client.parse_request_body_response(r.text, scope=self.scope) File "/usr/local/lib/python3.8/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 421, in parse_request_body_response self.token = parse_token_response(body, scope=scope) File "/usr/local/lib/python3.8/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 431, in parse_token_response validate_token_parameters(params) File "/usr/local/lib/python3.8/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 438, in validate_token_parameters raise_from_error(params.get('error'), params) File "/usr/local/lib/python3.8/site-packages/oauthlib/oauth2/rfc6749/errors.py", line 405, in raise_from_error raise cls(**kwargs) oauthlib.oauth2.rfc6749.errors.InvalidClientError: (invalid_client) AADSTS7000215: Invalid client secret is provided. Trace ID: 5e70887e-b5eb-41ac-afb4-e2797dc21a00 Correlation ID: 19cf23c7-cb73-400c-97a3-c3cb900ac1aa Timestamp: 2021-03-17 19:03:40Z

Thank you. :)

potnot3 avatar Mar 17 '21 19:03 potnot3

I'm seeing the same problem, am I doing something wrong ?


I’m sure this is me doing something stupid, but I’ve tried everything. I’ve setup the azure end and got the client ID and the secret.

When I try to link the account I get.

Copy to clipboard 500 Internal Server Error Server got itself in trouble The URL is…

https://xxxxxxx.nabu.casa/api/microsoft-todo?code=xxxxxxxxVERYLONGCODExxxxxx&state=xxxxxxxxxxxxxxx&session_state=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx#

I’ve tried setting internal_url and external_url to the nabu casa id. I’ve tried faking a hosts file to give me a local https URL and set it to that.

Whatever URL combination I use, I get this same error.

If I go to the URL without any parameters, I get…

No code returned from Microsoft Graph Auth API

So I’m happy it’s the correct URL ?

Am I doing something wrong ?

Thanks

B-Hartley avatar Mar 20 '21 22:03 B-Hartley

I had the same error while setting up the integration.

I've tried a few things and now I can't say exactly what helped me.

Here are my suggestions:

  • Check your Secret ID. The interface from Microsoft has changed a bit. The Secret ID must now be copied for Value, not at the end of ID.

  • I would check whether the integration already appears in Microsoft account After I deleted it and did the authentication again, it worked. Linkt to the Apps -> https://account.live.com/consent/Manage?mkt=de-DE

If you see this show up in your Browser Microsoft To-Do has been successfully authorized! You can close this window now!

you may be connected successfully. Don´t get irritated if the notification still shows up. In my case, it also shows up but I tried to call the service from the example and it shows up in my To-do app

everthought avatar Mar 28 '21 09:03 everthought

I’m getting this too. I’m running core-2012.4.3 at the moment. Here’s what pops up in my log.

2021-04-12 18:01:42 ERROR (MainThread) [custom_components.microsoft_todo.calendar] No code returned from Microsoft Graph Auth API
2021-04-12 18:03:17 WARNING (MainThread) [homeassistant.util.async_] Detected I/O inside the event loop. This is causing stability issues. Please report issue to the custom component author for microsoft_todo doing I/O at custom_components/microsoft_todo/calendar.py, line 170: token = self.oauth.fetch_token(
2021-04-12 18:03:17 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
File "/opt/homeassistant/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 422, in _handle_request
resp = await self._request_handler(request)
File "/opt/homeassistant/lib/python3.8/site-packages/aiohttp/web_app.py", line 499, in _handle
resp = await handler(request)
File "/opt/homeassistant/lib/python3.8/site-packages/aiohttp/web_middlewares.py", line 119, in impl
return await handler(request)
File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/components/http/security_filter.py", line 56, in security_filter_middleware
return await handler(request)
File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/components/http/request_context.py", line 18, in request_context_middleware
return await handler(request)
File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/components/http/ban.py", line 74, in ban_middleware
return await handler(request)
File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/components/http/auth.py", line 129, in auth_middleware
return await handler(request)
File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/components/http/view.py", line 128, in handle
result = handler(request, **request.match_info)
File "/home/ha-arcana/.homeassistant/custom_components/microsoft_todo/calendar.py", line 170, in get
token = self.oauth.fetch_token(
File "/opt/homeassistant/lib/python3.8/site-packages/requests_oauthlib/oauth2_session.py", line 336, in fetch_token
r = self.request(
File "/opt/homeassistant/lib/python3.8/site-packages/requests_oauthlib/oauth2_session.py", line 515, in request
return super(OAuth2Session, self).request(
File "/opt/homeassistant/lib/python3.8/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/opt/homeassistant/lib/python3.8/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/opt/homeassistant/lib/python3.8/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/opt/homeassistant/lib/python3.8/site-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/opt/homeassistant/lib/python3.8/site-packages/urllib3/connectionpool.py", line 394, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/opt/homeassistant/lib/python3.8/site-packages/urllib3/connection.py", line 234, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/usr/lib/python3.8/http/client.py", line 1230, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1241, in _send_request
self.putrequest(method, url, **skips)
File "/opt/homeassistant/lib/python3.8/site-packages/urllib3/connection.py", line 214, in putrequest
return _HTTPConnection.putrequest(self, method, url, *args, **kwargs)
File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/util/async_.py", line 150, in protected_loop_func
check_loop()
File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/util/async_.py", line 139, in check_loop
raise RuntimeError(
RuntimeError: I/O must be done in the executor; Use `await hass.async_add_executor_job()` at custom_components/microsoft_todo/calendar.py, line 170: token = self.oauth.fetch_token(

I don’t know anything about Home Assistant component dev, but the last line seems quite telling? Could be a different issue to the bug OP is encountering though.

aetha avatar Apr 12 '21 08:04 aetha

I did a bit of f'ing around and finding out. I’m not sure if I’m understanding the source code properly, but the callback seems to be trying a POST request to https://login.microsoftonline.com/common/oauth2/v2.0/token with only code and client_secret parameters. I tried this manually with curl.

$ curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token -d 'code=xxx&client_secret=xxx'
{"error":"invalid_request","error_description":"AADSTS900144: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID: xxx\r\nCorrelation ID: xxx\r\nTimestamp: 2021-04-12 08:32:04Z","error_codes":[900144],"timestamp":"2021-04-12 08:32:04Z","trace_id":"xxx","correlation_id":"xxx","error_uri":"https://login.microsoftonline.com/error?code=900144"}

Looking at this page on Azure docs, it says that more parameters are needed: scope, client_id, and of course, grant_type. After some messing about, I was able to successfully get a token.

$ curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token -d 'code=xxx&client_secret=xxx&grant_type=authorization_code&client_id=xxx&redirect_uri=https://xxx.ui.nabu.casa/api/microsoft-todo&scope=Tasks.ReadWrite+offline_access'
{"token_type":"Bearer","scope":"Tasks.ReadWrite","expires_in":3600,"ext_expires_in":3600,"access_token":"xxx","refresh_token":"xxx"}

(Edit: I originally wrote that it didn't work, thought it was a scope problem. Nope, I was just using grant_type=client_credentials when I actually needed grant_type=authorization_code.)

So that was pretty cool. 😌 I put access_token and refresh_token in .ms_todo_auth.json and tried restarting Home Assistant. Progress! My to-do lists are syncing now. But, reminder times and due dates are not. Not sure if that's a config error on my behalf or not.

Either ways, this seems to be an underlying problem: the auth process needs updated Graph API requests.

aetha avatar Apr 12 '21 09:04 aetha

I did a bit of f'ing around and finding out. I’m not sure if I’m understanding the source code properly, but the callback seems to be trying a POST request to https://login.microsoftonline.com/common/oauth2/v2.0/token with only code and client_secret parameters. I tried this manually with curl.

$ curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token -d 'code=xxx&client_secret=xxx'
{"error":"invalid_request","error_description":"AADSTS900144: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID: xxx\r\nCorrelation ID: xxx\r\nTimestamp: 2021-04-12 08:32:04Z","error_codes":[900144],"timestamp":"2021-04-12 08:32:04Z","trace_id":"xxx","correlation_id":"xxx","error_uri":"https://login.microsoftonline.com/error?code=900144"}

Looking at this page on Azure docs, it says that more parameters are needed: scope, client_id, and of course, grant_type. After some messing about, I was able to successfully get a token.

$ curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token -d 'code=xxx&client_secret=xxx&grant_type=authorization_code&client_id=xxx&redirect_uri=https://xxx.ui.nabu.casa/api/microsoft-todo&scope=Tasks.ReadWrite+offline_access'
{"token_type":"Bearer","scope":"Tasks.ReadWrite","expires_in":3600,"ext_expires_in":3600,"access_token":"xxx","refresh_token":"xxx"}

(Edit: I originally wrote that it didn't work, thought it was a scope problem. Nope, I was just using grant_type=client_credentials when I actually needed grant_type=authorization_code.)

So that was pretty cool. 😌 I put access_token and refresh_token in .ms_todo_auth.json and tried restarting Home Assistant. Progress! My to-do lists are syncing now. But, reminder times and due dates are not. Not sure if that's a config error on my behalf or not.

Either ways, this seems to be an underlying problem: the auth process needs updated Graph API requests.

Awesome that you have dived into this. I do get the callback url with the code when using the link provided by HA. Possibly I would be needed to add use your "custom" POST to get a correct token. Either way - where is the file '.ms_todo_auth.json' located? Should I just create it inside '/config/custom_components/microsoft_todo'?

ezpl avatar Apr 14 '21 08:04 ezpl

@ezpl Oh I kinda skipped over some details there. You might’ve figured this out but I’ll clarify anyways. The authorisation process has more than one step. First HA opens the url to Microsoft’s OAuth login page, and once that’s complete you get that callback, the one that has HA throwing the 500 error.

When I looked through the code, I found MSToDoAuthCallbackView() in calendar.py. This class implements the callback handler. It takes the code parameter it gets back from that initial step, then uses it to complete a second step in the auth process, which is where I think it’s tripping up.

token = self.oauth.fetch_token(
    TOKEN_URL,
    client_secret=self.client_secret,
    code=data.get("code")
)

TOKEN_URL is defined in const.py, it’s the address I manually called with curl (https://login.microsoftonline.com/common/oauth2/v2.0/token). So looking at this, I copied code from the login callback, then used it to complete the second stage like mentioned.

.ms_todo_auth.json is kept in the root dir of your Home Assistant config, (ie ~/.homeassistant/.ms_todo_auth.json for me). I just filled it with {"access_token": "xxx", "refresh_token": "xxx"} but idk if there’s meant to be more config values in there that I skipped over or whatever.

aetha avatar Apr 16 '21 18:04 aetha

Thanks, @aetha - I was not aware of the second callback, though if I had followed your previous steps I would probably have figured it out. My main issue seems to be localising the .ms_todo_auth.json file. There is no .homeassistant or any other directory that contains a .ms_todo_auth.json file. Trying to add some logging into the calendar.py file now to see what values are actually there.

ezpl avatar Apr 16 '21 19:04 ezpl

Alas, did some more digging and actually yes, my theory was a red herring. I don’t know Python well good. 🤔 The oauth object is defined in setup_platform(), which indeed adds scope and client_id. I’m guessing the requests_oauthlib package adds grant_type too. So it’s all there.

Going back to the original error I was getting, Googled and found this, bingo: https://github.com/home-assistant/core/pull/48387 (And here’s a doc on doing async in Hass.) More mucking about, and I actually fixed it. Wasn’t even that hard once I actually understood it. https://github.com/aetha/homeassistant-microsoft-todo/commit/b839f6f9f9f37ed0c537e4a76a854014e27af863

Try replacing calendar.py in your custom_components/microsoft_todo directory with this one here I’ve committed, let me know if that works. If there’s no issues I’ll do a pull request.

aetha avatar Apr 16 '21 21:04 aetha

I've upgraded to the latest version of the component. I'm still seeing the 500 internal server error?

What logs do you need to help me figure this out?

Thanks

B-Hartley avatar Apr 21 '21 15:04 B-Hartley

@B-Hartley Have a look at your Hass full log, and look for a line that starts something like this:

2021-05-xx xx:xx:xx ERROR (MainThread) [custom_components.microsoft_todo.calendar] 

Copy that line, and everything down to and including the trace, and post that here.

aetha avatar Apr 24 '21 05:04 aetha

I believe I am having the same problem. Error 500.

I have the Reply URL set to my nabu.casa URL, and I even tried changing it to the localhost:xxxxx url. Problem is according to Microsoft documentation, it drops the port configuration and treats all reply URLs with different ports as the same now... https://docs.microsoft.com/en-us/azure/active-directory/develop/reply-url#localhost-exceptions

File "/config/custom_components/microsoft_todo/calendar.py", line 158, in get_token return self.oauth.fetch_token( File "/usr/local/lib/python3.8/site-packages/requests_oauthlib/oauth2_session.py", line 360, in fetch_token self._client.parse_request_body_response(r.text, scope=self.scope) File "/usr/local/lib/python3.8/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 429, in parse_request_body_response self.token = parse_token_response(body, scope=scope) File "/usr/local/lib/python3.8/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 425, in parse_token_response validate_token_parameters(params) File "/usr/local/lib/python3.8/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 455, in validate_token_parameters raise w Warning: Scope has changed from "Tasks.ReadWrite.Shared Tasks.ReadWrite" to "email Tasks.ReadWrite User.Read openid Tasks.ReadWrite.Shared profile". 2021-06-08 08:29:46 ERROR (MainThread) [aiohttp.server] Error handling request

Would love to get this working for me (just got HA setup and am still very new to all this), but would really love to get To-Do working. Thanks!

alvinchen1 avatar Jun 08 '21 12:06 alvinchen1

Anyone got this working? I'm also seeing the Error 500 after authorising the on the microsoft page.

[myip]/api/microsoft-todo works (shows: No code returned from Microsoft Graph Auth API)

[myip]/api/microsoft-todo?code=...&state=... shows an error 500

2021-09-09 11:42:25 ERROR (MainThread) [aiohttp.server] Error handling request Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/aiohttp/web_protocol.py", line 422, in _handle_request resp = await self._request_handler(request) File "/usr/local/lib/python3.9/site-packages/aiohttp/web_app.py", line 499, in _handle resp = await handler(request) File "/usr/local/lib/python3.9/site-packages/aiohttp/web_middlewares.py", line 119, in impl return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 60, in security_filter_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 89, in forwarded_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 24, in request_context_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 78, in ban_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 144, in auth_middleware return await handler(request) File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 135, in handle result = await result File "/config/custom_components/microsoft_todo/calendar.py", line 177, in get token = await hass.async_add_executor_job(self.get_token, data.get("code")) File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 52, in run result = self.fn(*self.args, **self.kwargs) File "/config/custom_components/microsoft_todo/calendar.py", line 158, in get_token return self.oauth.fetch_token( File "/usr/local/lib/python3.9/site-packages/requests_oauthlib/oauth2_session.py", line 360, in fetch_token self._client.parse_request_body_response(r.text, scope=self.scope) File "/usr/local/lib/python3.9/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 429, in parse_request_body_response self.token = parse_token_response(body, scope=scope) File "/usr/local/lib/python3.9/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 425, in parse_token_response validate_token_parameters(params) File "/usr/local/lib/python3.9/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 432, in validate_token_parameters raise_from_error(params.get('error'), params) File "/usr/local/lib/python3.9/site-packages/oauthlib/oauth2/rfc6749/errors.py", line 402, in raise_from_error raise cls(**kwargs) oauthlib.oauth2.rfc6749.errors.InvalidClientError: (invalid_client) AADSTS7000215: Invalid client secret is provided. Trace ID: 6fd62e75-9d70-4175-bf3a-0d2f77a41200 Correlation ID: be782cd6-1771-4903-9b79-bc04743cb97a Timestamp: 2021-09-09 09:42:25Z

wouters avatar Sep 09 '21 09:09 wouters

Ok. I just didn't get it right. I used the "secret id" instead of the "secret value". Works now

wouters avatar Sep 09 '21 09:09 wouters

Hi all,

I've been having the same issue as described above. To be clear, I'm running Home Assistant core-2021.9.7, and I have it hooked up via Nabu Casa. When clicking the link to "Link Microsoft To Do Account", I get the the 500 error:

500 Internal Server Error
Server got itself in trouble

If I access my HA server directly (https:///api/microsoft-todo), I get the "No code returned from Microsoft Graph Auth API". Likewise, when I do the same but use the nabu casa base url, i get the same error. but when I access via this integration link, I get the 500 error.

I'm pretty sure I have the app set up correctly using the "Application (client) ID" and the value of the secret.

Here's what the log says:

2021-09-27 01:19:41 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/aiohttp/web_protocol.py", line 422, in _handle_request
    resp = await self._request_handler(request)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/web_app.py", line 499, in _handle
    resp = await handler(request)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/web_middlewares.py", line 119, in impl
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 60, in security_filter_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 83, in forwarded_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 24, in request_context_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 78, in ban_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 144, in auth_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 135, in handle
    result = await result
  File "/config/custom_components/microsoft_todo/calendar.py", line 177, in get
    token = await hass.async_add_executor_job(self.get_token, data.get("code"))
  File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 52, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/microsoft_todo/calendar.py", line 158, in get_token
    return self.oauth.fetch_token(
  File "/usr/local/lib/python3.9/site-packages/requests_oauthlib/oauth2_session.py", line 360, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "/usr/local/lib/python3.9/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 429, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/usr/local/lib/python3.9/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 425, in parse_token_response
    validate_token_parameters(params)
  File "/usr/local/lib/python3.9/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 455, in validate_token_parameters
    raise w
Warning: Scope has changed from "Tasks.ReadWrite Tasks.ReadWrite.Shared" to "profile openid Tasks.ReadWrite.Shared email Tasks.ReadWrit

One thing I noticed is that this integration finds the nabu casa url - i guess from getting the config in calendar.py? - and I can't seem to override it. This despite the docs saying:

To be able to authenticate please make sure that base_url option is configured properly and your browser can access the redirect URI (it doesn’t have to be accessible from the Internet, it can be even localhost).

If I could override the Redirect URL, maybe I could make some progress?

Any help, suggestions or tips would be very much appreciated!

P.S.: does anyone know definitively if nabu casa will pass through URIs? (in this case, the /api/microsoft-todo part), or does it try to process them itself?

Thanks!

J

oddboy avatar Sep 27 '21 06:09 oddboy

I'm facing the same issue as @oddboy and @alvinchen1. It seems like I'm fully authenticated, but the log reports the same Tasks.ReadWrite Tasks.ReadWrite.Shared scope change. Any recommendations here, @black-roland ?

ronnydahl avatar Dec 05 '21 10:12 ronnydahl

First I also got the "No code error" but after a few tries I got it working and wrote a guide how I did it. See https://community.home-assistant.io/t/microsoft-to-do/139614/40?u=rvdbrink

vdbrink avatar Apr 25 '22 22:04 vdbrink