signalkraft / myPyllant

A Python library to interact with the API behind the myVAILLANT app
MIT License
38 stars 14 forks source link

Error set_zone_operating_mode #92

Open gsegatori opened 3 months ago

gsegatori commented 3 months ago

Hello, I'm trying to change the operation mode, I can correctly read it but when I try to change:

async def set_zone_mode_off(api, system, zone):
    await api.set_zone_operating_mode(zone, ZoneHeatingOperatingMode.OFF, "heating")

I get: 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":77,"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/my-id/tli/zones/2/heating-operation-mode')

gsegatori commented 3 months ago

my script:

import asyncio
import logging
from datetime import datetime
from myPyllant.api import MyPyllantAPI
from myPyllant.const import ALL_COUNTRIES, BRANDS, DEFAULT_BRAND
from myPyllant.enums import DeviceDataBucketResolution, ZoneHeatingOperatingMode, ZoneHeatingOperatingModeVRC700

# Definisci le tue credenziali e altre variabili qui
username = 'username'
password = 'password'
brand = 'vaillant'
country = 'italy' 

verbose = False
if verbose:
    logging.basicConfig(level=logging.DEBUG)

async def set_zone_mode_off(api, system, zone):
    await api.set_zone_operating_mode(zone, ZoneHeatingOperatingMode.OFF, "heating")
    print(f"Modalità della zona {zone.name} impostata su Riscaldamento spento.")

async def main(user, password, brand, country):
    async with MyPyllantAPI(user, password, brand, country) as api:
        await api.login()
        async for system in api.get_systems():
            for device in system.devices:
                if device.device_type == "BOILER":
                    start_date = datetime(2024, 5, 1)
                    end_date = datetime(2024, 5, 31, 23, 59, 59)
                    async for data in api.get_data_by_device(device, DeviceDataBucketResolution.MONTH, start_date, end_date):
                        if data.operation_mode == "DOMESTIC_HOT_WATER" and data.energy_type == "CONSUMED_PRIMARY_ENERGY":
                            for bucket in data.data:
                                value_m3 = bucket.value / 10000  # Converti il valore in m³
                                print(f"Consumo di gas per maggio 2024: {value_m3} m³")
                            break

            # Cicla attraverso tutte le zone e stampa le informazioni sulle temperature e sullo stato della modalità di riscaldamento
            if system.zones:
                for i, zone in enumerate(system.zones):
                    current_temperature = zone.current_room_temperature
                    desired_temperature = zone.desired_room_temperature_setpoint
                    heating_state = zone.heating_state

                    # Determina la modalità di riscaldamento
                    operation_mode = zone.heating.operation_mode_heating
                    if isinstance(operation_mode, ZoneHeatingOperatingMode):
                        if operation_mode == ZoneHeatingOperatingMode.MANUAL:
                            zone_status = "Manuale"
                        elif operation_mode == ZoneHeatingOperatingMode.TIME_CONTROLLED:
                            zone_status = "Temporizzato"
                        elif operation_mode == ZoneHeatingOperatingMode.OFF:
                            zone_status = "Riscaldamento spento"
                        else:
                            zone_status = "Sconosciuto"
                    elif isinstance(operation_mode, ZoneHeatingOperatingModeVRC700):
                        if operation_mode == ZoneHeatingOperatingModeVRC700.MANUAL:
                            zone_status = "Manuale"
                        elif operation_mode == ZoneHeatingOperatingModeVRC700.AUTO:
                            zone_status = "Temporizzato"
                        elif operation_mode == ZoneHeatingOperatingModeVRC700.OFF:
                            zone_status = "Riscaldamento spento"
                        else:
                            zone_status = "Sconosciuto"
                    else:
                        zone_status = "Sconosciuto"

                    print(f"Zona {zone.name}:")
                    print(f"  Temperatura attuale: {current_temperature}°C")
                    print(f"  Temperatura desiderata: {desired_temperature}°C")
                    print(f"  Stato del riscaldamento: {heating_state}")
                    print(f"  Modalità di riscaldamento: {zone_status}")
                    await api.set_zone_operating_mode(zone, ZoneHeatingOperatingMode.OFF, "heating")

if __name__ == "__main__":
    asyncio.run(main(username, password, brand, country))

The output: Consumo di gas per maggio 2024: 11.4 m³ Zona Piano 0: Temperatura attuale: 26.0375°C Temperatura desiderata: 5.0°C Stato del riscaldamento: IDLE Modalità di riscaldamento: Riscaldamento spento Traceback (most recent call last): File "C:\Users\gsegatori\PycharmProjects\VaillantServerAPI\main.py", line 82, in asyncio.run(main(username, password, brand, country)) File "C:\Users\gsegatori\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "C:\Users\gsegatori\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\gsegatori\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\Users\gsegatori\PycharmProjects\VaillantServerAPI\main.py", line 75, in main await api.set_zone_operating_mode(zone, ZoneHeatingOperatingMode.OFF, "heating") File "C:\Users\gsegatori\PycharmProjects\VaillantServerAPI\venv\Lib\site-packages\myPyllant\api.py", line 482, in set_zone_operating_mode await self.aiohttp_session.patch( File "C:\Users\gsegatori\PycharmProjects\VaillantServerAPI\venv\Lib\site-packages\aiohttp\client.py", line 694, in _request await raise_for_status(resp) File "C:\Users\gsegatori\PycharmProjects\VaillantServerAPI\venv\Lib\site-packages\myPyllant\http_client.py", line 49, in on_raise_for_status raise e File "C:\Users\gsegatori\PycharmProjects\VaillantServerAPI\venv\Lib\site-packages\myPyllant\http_client.py", line 46, in on_raise_for_status response.raise_for_status() File "C:\Users\gsegatori\PycharmProjects\VaillantServerAPI\venv\Lib\site-packages\aiohttp\client_reqrep.py", line 1070, 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":77,"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.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono,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.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono,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.rest.HeatingApi.v2SetHeatingOperationMode(java.lang.String,java.lang.Integer,reactor.core.publisher.Mono,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/my-system-it/tli/zones/0/heating-operation-mode')