signalkraft / mypyllant-component

Home Assistant component for the myVAILLANT API, controls Vaillant devices such as aroTHERM heatpumps and ecoTEC boilers
https://signalkraft.com/mypyllant-component/
MIT License
107 stars 19 forks source link

Bad request, Client Response Code 400 #153

Open dmnkmnr opened 3 months ago

dmnkmnr commented 3 months ago

Before submitting a new issue

Problem description

If I try to send a command towards the api (e.g. to set the zone operation mode), I get error code 400. Could it be bad authentication or a NULL parameter?

Logs


Logger: homeassistant.components.automation.heizung_heizung_ausschalten
Quelle: components/automation/__init__.py:666
Integration: Automatisierung (Dokumentation, Probleme)
Erstmals aufgetreten: 21:55:29 (2 Vorkommnisse)
Zuletzt protokolliert: 21:59:42

While executing automation automation.heizung_heizung_ausschalten
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/automation/__init__.py", line 666, in async_trigger
    return await self.action_script.async_run(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1600, in async_run
    return await asyncio.shield(run.async_run())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 435, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 487, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 512, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 485, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 723, in _async_call_service_step
    response_data = await self._async_run_long_action(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 685, in _async_run_long_action
    return long_task.result()
           ^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2319, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2356, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 905, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 975, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/config/custom_components/mypyllant/climate.py", line 564, in set_zone_operating_mode
    await self.coordinator.api.set_zone_operating_mode(
  File "/usr/local/lib/python3.12/site-packages/myPyllant/api.py", line 481, in set_zone_operating_mode
    await self.aiohttp_session.patch(
  File "/usr/local/lib/python3.12/site-packages/aiohttp/client.py", line 691, in _request
    await raise_for_status(resp)
  File "/usr/local/lib/python3.12/site-packages/myPyllant/http_client.py", line 49, in on_raise_for_status
    raise e
  File "/usr/local/lib/python3.12/site-packages/myPyllant/http_client.py", line 46, in on_raise_for_status
    response.raise_for_status()
  File "/usr/local/lib/python3.12/site-packages/aiohttp/client_reqrep.py", line 1060, in raise_for_status
    raise ClientResponseError(
aiohttp.client_exceptions.ClientResponseError: 400, message='Bad Request, response was: {"stackTrace":[{"classLoaderName":"app","methodName":"build","fileName":"ProblemBuilder.java","lineNumber":83,"className":"org.zalando.problem.ProblemBuilder","nativeMethod":false},{"classLoaderName":"app","methodName":"handle","fileName":"ReactiveHttpExceptionHandler.java","lineNumber":78,"className":"com.vaillantgroup.iot.facade.rest.error.ReactiveHttpExceptionHandler","nativeMethod":false},{"moduleName":"java.base","moduleVersion":"19.0.2","methodName":"invoke","lineNumber":-1,"className":"jdk.internal.reflect.DirectMethodHandleAccessor","nativeMethod":false},{"moduleName":"java.base","moduleVersion":"19.0.2","methodName":"invoke","lineNumber":-1,"className":"java.lang.reflect.Method","nativeMethod":false},{"classLoaderName":"app","methodName":"lambda$invoke$0","fileName":"InvocableHandlerMethod.java","lineNumber":145,"className":"org.springframework.web.reactive.result.method.InvocableHandlerMethod","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"MonoFlatMap.java","lineNumber":132,"className":"reactor.core.publisher.MonoFlatMap$FlatMapMain","nativeMethod":false},{"classLoaderName":"app","methodName":"signal","fileName":"MonoZip.java","lineNumber":293,"className":"reactor.core.publisher.MonoZip$ZipCoordinator","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"MonoZip.java","lineNumber":474,"className":"reactor.core.publisher.MonoZip$ZipInner","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"MonoPeekTerminal.java","lineNumber":180,"className":"reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"request","fileName":"Operators.java","lineNumber":2545,"className":"reactor.core.publisher.Operators$ScalarSubscription","nativeMethod":false},{"classLoaderName":"app","methodName":"request","fileName":"MonoPeekTerminal.java","lineNumber":139,"className":"reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onSubscribe","fileName":"MonoZip.java","lineNumber":466,"className":"reactor.core.publisher.MonoZip$ZipInner","nativeMethod":false},{"classLoaderName":"app","methodName":"onSubscribe","fileName":"MonoPeekTerminal.java","lineNumber":152,"className":"reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"subscribe","fileName":"MonoJust.java","lineNumber":55,"className":"reactor.core.publisher.MonoJust","nativeMethod":false},{"classLoaderName":"app","methodName":"subscribe","fileName":"InternalMonoOperator.java","lineNumber":64,"className":"reactor.core.publisher.InternalMonoOperator","nativeMethod":false},{"classLoaderName":"app","methodName":"request","fileName":"MonoZip.java","lineNumber":216,"className":"reactor.core.publisher.MonoZip$ZipCoordinator","nativeMethod":false},{"classLoaderName":"app","methodName":"request","fileName":"MonoFlatMap.java","lineNumber":194,"className":"reactor.core.publisher.MonoFlatMap$FlatMapMain","nativeMethod":false},{"classLoaderName":"app","methodName":"request","fileName":"MonoFlatMap.java","lineNumber":194,"className":"reactor.core.publisher.MonoFlatMap$FlatMapMain","nativeMethod":false},{"classLoaderName":"app","methodName":"request","fileName":"FluxContextWrite.java","lineNumber":136,"className":"reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"set","fileName":"Operators.java","lineNumber":2341,"className":"reactor.core.publisher.Operators$MultiSubscriptionSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onSubscribe","fileName":"FluxOnErrorResume.java","lineNumber":74,"className":"reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onSubscribe","fileName":"FluxContextWrite.java","lineNumber":101,"className":"reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onSubscribe","fileName":"MonoFlatMap.java","lineNumber":117,"className":"reactor.core.publisher.MonoFlatMap$FlatMapMain","nativeMethod":false},{"classLoaderName":"app","methodName":"onSubscribe","fileName":"MonoFlatMap.java","lineNumber":117,"className":"reactor.core.publisher.MonoFlatMap$FlatMapMain","nativeMethod":false},{"classLoaderName":"app","methodName":"subscribe","fileName":"MonoZip.java","lineNumber":125,"className":"reactor.core.publisher.MonoZip","nativeMethod":false},{"classLoaderName":"app","methodName":"subscribe","fileName":"Mono.java","lineNumber":4495,"className":"reactor.core.publisher.Mono","nativeMethod":false},{"classLoaderName":"app","methodName":"onError","fileName":"FluxOnErrorResume.java","lineNumber":103,"className":"reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onError","fileName":"FluxOnAssembly.java","lineNumber":544,"className":"reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onError","fileName":"MonoFlatMap.java","lineNumber":180,"className":"reactor.core.publisher.MonoFlatMap$FlatMapMain","nativeMethod":false},{"classLoaderName":"app","methodName":"onError","fileName":"FluxContextWrite.java","lineNumber":121,"className":"reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onError","fileName":"FluxDoFinally.java","lineNumber":119,"className":"reactor.core.publisher.FluxDoFinally$DoFinallySubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onError","fileName":"FluxMap.java","lineNumber":265,"className":"reactor.core.publisher.FluxMap$MapConditionalSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onError","fileName":"FluxPeekFuseable.java","lineNumber":903,"className":"reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"FluxPeekFuseable.java","lineNumber":849,"className":"reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"FluxSwitchIfEmpty.java","lineNumber":74,"className":"reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"FluxOnErrorResume.java","lineNumber":79,"className":"reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"MonoFlatMap.java","lineNumber":158,"className":"reactor.core.publisher.MonoFlatMap$FlatMapMain","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"FluxContextWrite.java","lineNumber":107,"className":"reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"FluxMapFuseable.java","lineNumber":299,"className":"reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onNext","fileName":"FluxFilterFuseable.java","lineNumber":337,"className":"reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"completePossiblyEmpty","fileName":"Operators.java","lineNumber":2071,"className":"reactor.core.publisher.Operators$BaseFluxToMonoOperator","nativeMethod":false},{"classLoaderName":"app","methodName":"onComplete","fileName":"MonoCollect.java","lineNumber":145,"className":"reactor.core.publisher.MonoCollect$CollectSubscriber","nativeMethod":false},{"classLoaderName":"app","methodName":"onAllDataRead","fileName":"AbstractListenerReadPublisher.java","lineNumber":484,"className":"org.springframework.http.server.reactive.AbstractListenerReadPublisher$State","nativeMethod":false},{"classLoaderName":"app","methodName":"onAllDataRead","fileName":"AbstractListenerReadPublisher.java","lineNumber":134,"className":"org.springframework.http.server.reactive.AbstractListenerReadPublisher","nativeMethod":false},{"classLoaderName":"app","methodName":"onAllDataRead","fileName":"ServletServerHttpRequest.java","lineNumber":352,"className":"org.springframework.http.server.reactive.ServletServerHttpRequest$RequestBodyPublisher$RequestBodyPublisherReadListener","nativeMethod":false},{"classLoaderName":"app","methodName":"asyncDispatch","fileName":"CoyoteAdapter.java","lineNumber":205,"className":"org.apache.catalina.connector.CoyoteAdapter","nativeMethod":false},{"classLoaderName":"app","methodName":"dispatch","fileName":"AbstractProcessor.java","lineNumber":242,"className":"org.apache.coyote.AbstractProcessor","nativeMethod":false},{"classLoaderName":"app","methodName":"process","fileName":"AbstractProcessorLight.java","lineNumber":50,"className":"org.apache.coyote.AbstractProcessorLight","nativeMethod":false},{"classLoaderName":"app","methodName":"process","fileName":"AbstractProtocol.java","lineNumber":894,"className":"org.apache.coyote.AbstractProtocol$ConnectionHandler","nativeMethod":false},{"classLoaderName":"app","methodName":"doRun","fileName":"NioEndpoint.java","lineNumber":1740,"className":"org.apache.tomcat.util.net.NioEndpoint$SocketProcessor","nativeMethod":false},{"classLoaderName":"app","methodName":"run","fileName":"SocketProcessorBase.java","lineNumber":52,"className":"org.apache.tomcat.util.net.SocketProcessorBase","nativeMethod":false},{"classLoaderName":"app","methodName":"runWorker","fileName":"ThreadPoolExecutor.java","lineNumber":1191,"className":"org.apache.tomcat.util.threads.ThreadPoolExecutor","nativeMethod":false},{"classLoaderName":"app","methodName":"run","fileName":"ThreadPoolExecutor.java","lineNumber":659,"className":"org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker","nativeMethod":false},{"classLoaderName":"app","methodName":"run","fileName":"TaskThread.java","lineNumber":61,"className":"org.apache.tomcat.util.threads.TaskThread$WrappingRunnable","nativeMethod":false},{"moduleName":"java.base","moduleVersion":"19.0.2","methodName":"run","lineNumber":-1,"className":"java.lang.Thread","nativeMethod":false}],"type":"about:blank","title":"Bad Request","status":"BAD_REQUEST","detail":"Validation failed for argument at index 2 in method: public default reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<com.vaillantgroup.systemcontrol.tliv2.model.rest.AcceptedResponseRest>> com.vaillantgroup.systemcontrol.tliv2.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono<com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest>,org.springframework.web.server.ServerWebExchange), with 1 error(s): [Field error in object \'modifyHeatingOperationModeRequestRestMono\' on field \'operationMode\': rejected value [null]; codes [NotNull.modifyHeatingOperationModeRequestRestMono.operationMode,NotNull.operationMode,NotNull.com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest$OperationModeEnum,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modifyHeatingOperationModeRequestRestMono.operationMode,operationMode]; arguments []; default message [operationMode]]; default message [must not be null]] ","parameters":{},"message":"Bad Request: Validation failed for argument at index 2 in method: public default reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<com.vaillantgroup.systemcontrol.tliv2.model.rest.AcceptedResponseRest>> com.vaillantgroup.systemcontrol.tliv2.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono<com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest>,org.springframework.web.server.ServerWebExchange), with 1 error(s): [Field error in object \'modifyHeatingOperationModeRequestRestMono\' on field \'operationMode\': rejected value [null]; codes [NotNull.modifyHeatingOperationModeRequestRestMono.operationMode,NotNull.operationMode,NotNull.com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest$OperationModeEnum,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modifyHeatingOperationModeRequestRestMono.operationMode,operationMode]; arguments []; default message [operationMode]]; default message [must not be null]] ","suppressed":[],"localizedMessage":"Bad Request: Validation failed for argument at index 2 in method: public default reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<com.vaillantgroup.systemcontrol.tliv2.model.rest.AcceptedResponseRest>> com.vaillantgroup.systemcontrol.tliv2.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono<com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest>,org.springframework.web.server.ServerWebExchange), with 1 error(s): [Field error in object \'modifyHeatingOperationModeRequestRestMono\' on field \'operationMode\': rejected value [null]; codes [NotNull.modifyHeatingOperationModeRequestRestMono.operationMode,NotNull.operationMode,NotNull.com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest$OperationModeEnum,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modifyHeatingOperationModeRequestRestMono.operationMode,operationMode]; arguments []; default message [operationMode]]; default message [must not be null]] "}', url=URL('https://api.vaillant-group.com/service-connected-control/end-user-app-api/v1/systems/5ed6ef15-7d13-4562-8f2b-f4c30e744e10/tli/zones/0/heating-operation-mode')
ccle610 commented 3 months ago

Fist of all: Thx for this absolute great Plugin, it is so useful for my, like no other on HA ;-) And now the Problem description for Today;-) I can agree, having the similar Problem, but only, when I try to change the Operation Mode in HA. The Problem also was in the App yesterday (not ayailable now, please try again later, or so) but here it works today. Also the Status is correct in HA when changing it in the App. I have uploaded a File (with Log Details) in my next Post to keep this chat clean.

signalkraft commented 3 months ago

Are you calling the operation mode service in HA? Can you share exactly what parameters you are sending?

ccle610 commented 3 months ago

I simply click on the Button Off in Thermostat or use the Service [cid:eu.faircode.email.5347]

30.03.2024 12:10:14 signalkraft @.***>:

Are you calling the operation mode service in HA? Can you share exactly what parameters you are sending?

— Reply to this email directly, view it on GitHub[https://github.com/signalkraft/mypyllant-component/issues/153#issuecomment-2028015343], or unsubscribe[https://github.com/notifications/unsubscribe-auth/A7GF7AM3LM4PICLHDOG4K3TY22FP7AVCNFSM6AAAAABFNPT4WWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDAMRYGAYTKMZUGM]. You are receiving this because you commented. [Verfolgungsbild][https://github.com/notifications/beacon/A7GF7AJ24P3MK7K6MDSEXZDY22FP7A5CNFSM6AAAAABFNPT4WWWGG33NNVSW45C7OR4XAZNMJFZXG5LFINXW23LFNZ2KUY3PNVWWK3TUL5UWJTTY4EHO6.gif]

dmnkmnr commented 3 months ago

Personally I am using the HA service in an automation. But I can confirm @ccle610‘s problem: if I use the thermostat and if I change the mode it is the same error. IMG_6968 IMG_6969

ccle610 commented 3 months ago

Here is my logfile belonging to the Action: aroTherm Zone Oben (Circuit 0) Button heat/cool was pressed in Simple Thermostat.

home-assistant_mypyllant_2024-03-30T15-25-46.687Z.log

elmaswebon commented 2 months ago

Hi!

Same problem here when changing the operation mode from the climate entity in HA.

error.txt

Voyager08 commented 2 months ago

Hello, i have exactly the same problem when changing the operation mode from off to auto or vice versa.

errorVaillant.txt

JanNJNS commented 2 months ago

Hi all, same problem here. ClientResponseError 400.txt

thomastt80 commented 2 months ago

Same Problem!

thepreatorian commented 2 months ago

Hello I have the same problem Everything else works great, only if i change Hvac mode to off, heat_cool, auto big error appear on the screen Rejestrator: aiohttp.server Źródło: /usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py:421 Pierwsze zdarzenie: 09:17:54 (46229 zdarzenia) Ostatnio zalogowany: 16:11:57

Error handling request Traceback (most recent call last): File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 350, in data_received messages, upgraded, tail = self._request_parser.feed_data(data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "aiohttp/_http_parser.pyx", line 557, in aiohttp._http_parser.HttpParser.feed_data aiohttp.http_exceptions.BadStatusLine: 400, message: Expected CRLF after version:

b'POST /api/webhook/onvif1868cb2f380b HTTP/1.1 '

Error

zawatowskib commented 1 month ago

Hi,

Can confirm, I have the same issue. (v0.8.2) I've noticed that the Vaillant app is even MORE buggy than usual too. (I couldn't believe this was technically possible, but here we are) Could it be an api issue at their end?

dwing33 commented 1 month ago

I've exactly same issue as previous reporters. I can control DHW without an issue, but it fails on the heating. I've a flexoCOMPACT exclusive, sensoCOMFORT VRC 720/2 and sensoNET VR291. The myVaillant App works as expected. I've no recording of what the app is sending to the server unfortunately. Heating_Mode_Change.log

christiangonre commented 3 weeks ago

First of all thanks for your integration, is the best so far to integrate Migo Link devices in HA!

I have the same problem than the rest using Saunier Duval, my problem is about changing the mode to OFF, heat_cool or auto. However, if I update the mode from the Migo Link Android APP the Home Assistant plugin can get the new status and I can update for example the temperature in HA without any problem, not sure if this information is helpful. Without digging a lot in their API seems to be something about permissions? Is weird that I can detect the mode without any problem from HA but I cannot update it.

Thanks in advance for your help!

dylan09 commented 1 week ago

Same problem here with my installation. Tried to extract the relevant part of error message from Vailant server:

   "type": "about:blank",
   "title": "Bad Request",
   "status": "BAD_REQUEST",
   "detail": "Validation failed for argument at index 2 in method: public default reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<com.vaillantgroup.systemcontrol.tliv2.model.rest.AcceptedResponseRest>> com.vaillantgroup.systemcontrol.tliv2.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono<com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest>,org.springframework.web.server.ServerWebExchange), with 1 error(s): [Field error in object \'modifyHeatingOperationModeRequestRestMono\' on field \'operationMode\': rejected value [null]; codes [NotNull.modifyHeatingOperationModeRequestRestMono.operationMode,NotNull.operationMode,NotNull.com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest$OperationModeEnum,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modifyHeatingOperationModeRequestRestMono.operationMode,operationMode]; arguments []; default message [operationMode]]; default message [must not be null]] ",
   "parameters": {},
   "message": "Bad Request: Validation failed for argument at index 2 in method: public default reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<com.vaillantgroup.systemcontrol.tliv2.model.rest.AcceptedResponseRest>> com.vaillantgroup.systemcontrol.tliv2.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono<com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest>,org.springframework.web.server.ServerWebExchange), with 1 error(s): [Field error in object \'modifyHeatingOperationModeRequestRestMono\' on field \'operationMode\': rejected value [null]; codes [NotNull.modifyHeatingOperationModeRequestRestMono.operationMode,NotNull.operationMode,NotNull.com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest$OperationModeEnum,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modifyHeatingOperationModeRequestRestMono.operationMode,operationMode]; arguments []; default message [operationMode]]; default message [must not be null]] ",
   "suppressed": [],
   "localizedMessage": "Bad Request: Validation failed for argument at index 2 in method: public default reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<com.vaillantgroup.systemcontrol.tliv2.model.rest.AcceptedResponseRest>> com.vaillantgroup.systemcontrol.tliv2.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono<com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest>,org.springframework.web.server.ServerWebExchange), with 1 error(s): [Field error in object \'modifyHeatingOperationModeRequestRestMono\' on field \'operationMode\': rejected value [null]; codes [NotNull.modifyHeatingOperationModeRequestRestMono.operationMode,NotNull.operationMode,NotNull.com.vaillantgroup.systemcontrol.tliv2.model.rest.ModifyHeatingOperationModeRequestRest$OperationModeEnum,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modifyHeatingOperationModeRequestRestMono.operationMode,operationMode]; arguments []; default message [operationMode]]; default message [must not be null]] "

Maybe there are some changes to the Vaillant API.

Controler type îs VRC720 with version 0357.40.35.

Changing settings for domestic hot water works as expected. And many thanks for this great integration.