Vaillant vr900/vr920/ambisense

Hello guys,

I’m wondering if something is planned to include vaillant vr900/vr920/ambisense into home assistant ?
It’s quite the same thing as honeywell evohome (control heating room per room and so). Here is a link for more information: https://www.vaillant.com/homecomfort/.

I already played a bit, and I discovered the API base URL: https://smart.vaillant.com/mobile/api/v4.

I decompiled the APK and I found a lot of (all ?) usefull endpoints to get and alter configuration.

Right now, I’m able to do everything I want using postman (well, ok, it’s not a big step, but it means the API is accessible outside the android / ios application).

Here are few steps to get general information about your installation

1. Request a token

  • Endpoint:

https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new

  • Payload:
{
   "smartphoneId": "whatever",
   "username": "usr", 
   "password": "pwd"
}
  • Response:
{
    "body": {
        "authToken": "yourtoken"
    },
    "meta": {}
}

2. Authenticate

  • Endpoint:

https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/authenticate

  • Payload:
{
    "smartphoneId": "whatever",
    "username": "usr",
    "authToken": "yourtoken"
}
  • Response:

Empty body, but you receive 2 cookies

3. Requesting information

  • Endpoint:

https://smart.vaillant.com/mobile/api/v4/facilities

  • Payload:

Pass cookies

  • Response:
 {
     "body": {
         "facilitiesList": [
             {
                 "serialNumber": "xxx",
                 "name": "Name",
                 "responsibleCountryCode": "BE",
                 "supportedBrand": "XXX",
                 "capabilities": [
                     "ROOM_BY_ROOM",
                     "SYSTEMCONTROL_MULTIMATIC"
                 ],
                 "networkInformation": {
                     "macAddressEthernet": "xx:xx:xx:xx:xx:xx",
                     "macAddressWifiAccessPoint": "xx:xx:xx:xx:xx:xx",
                     "macAddressWifiClient": "xx:xx:xx:xx:xx:xx"
                 },
                 "firmwareVersion": "1.2.3"
             }
         ]
     }
     "meta": {}
 }

The API seems straightforward, so the only thing to do is “just” (I know, what “just” means, I’m developer too :slight_smile:) implementing calls to endpoints and get data and integrate that into home assistant.

I’m not so confident with python, but if there is a chance that a pull request will get accepted, then I can try to do something.

If somebody is interested, please let me know.

Thanks,

Thomas

1 Like

Hello,

so, i’m replying to myself :cry:

I already started something here: https://github.com/thomasgermain/vr900-connector
This is quite workable, I’m able to retrieve a lot of information. For now, the connector is only able to fetch data from API. I’m able to fetch as much data as the android app (and I think even a bit more)

I think it could be nice to have one first version which only fetch data from API and later some improvements. I also think I will be able to integrate the connector to home-assistant (I sill have to check the doc).

By the way, this is my first python project, so if you pass by here, let me know if there is something weird, stupid, strange etc.

Thanks,

Thomas

Hello,

I am very interested in the development for the Vaillant VR9x0 connector as I will have flexoCOMPACT heat pump installed in my new house at the end of spring 2019 and was looking for a solution to integrate it into Home Assistant.

I will be following you development but can’t join in until i have the hardware installed.

Good luck and thank you for working on this project.

Tomaž

Hi. Just wanted to mention that if VRC900/920 support ebus protocol (as all other VRC models) then you can use ebusd and control your boiler and controller through ebus interface.
It definetely wont be as user-friendly as API is, but way more powerful, you can literally monitor ever single thing in your boiler and manually set many of them.

Hello,

@kromosomX , I will be glad to have more function integrated into to project. Hope everything will be fine with the new house :slight_smile:

@dinth, i read a little about the ebusd. I’m currently running home-assistant on a synology so it’s a bit pain in the ass to install ebusd, but i’m affraid I will only be able to handle boiler and domestic hot water and not all the rooms separetly. But anyway, I will install hassio on a linux and check that. Thanks !

Thomas

Hi,
This project looks very interesting. I downloaded the code and it works perfectly. I’m mainly interested in obtaining the usage/yield data. Currently it seems like this information is not available in the app anymore, what I read this is since a server upgrade. I hope it will be available quickly again. Does anyone know the URL for this information?
My guess is:
/facilities/{serialNumber}/emf/v1/devices
not sure though since this now returns error code 409.

Regards,
Simon

Hi,

glad to hear that it works. I quickly try /facilities/{serialNumber}/emf/v1/devices. Got a 409 too with error

{
    "errorCode": "NO_REPORT_ENABLED_DEVICES"
}

I check source code, but I only find this: facilities/{serialNumber}/spine/v1/currentPVMeteringInfo and I got

{
   "body": {
       "currentPVMeteringInfo": {
           "pvCurrentGeneration": null,
           "pvSelfConsumptionRate": null,
           "pvAutarchyRate": null,
           "pvGridFeedIn": null,
           "pvPeakPerformance": null,
           "pvPowerFeedInLimit": null,
           "pvSelfConsumptionPower": null
       }
   },
   "meta": {}
}

As you can see, nothing interesting for me, but maybe you will have more luck.

Kr,

Thomas

Hi Thomas,
It has been a while, and I downloaded the latest sources.
I am still trying to figure out how to obtain a report from the server. This can be done in the app if you have a device which supports this. I suspect that the URL is:
@ GET(“facilities/{serialNumber}/emf/v1/devices/{deviceId}”)

In the java sources I see the following data entry:
@ GET(“facilities/{serialNumber}/emf/v1/devices/{deviceId}”)
@ Path(“serialNumber”) String paramString1,
@ Path(“deviceId”) String paramString2,
@ Query(“timeRange”) String paramString3,
@ Query(“function”) String paramString4,
@ Query(“energyType”) String paramString5,
@ Query(“start”) String paramString6,
@ Query(“offset”) int paramInt);

Do you have any idea what is meant by the @Query? The function is declared as a @ GET, not a @ PUT, so I don’t know how to add extra data.

I found a similar function which is easier to test with:
@ GET(“common/username/v1/availability”)
@ Query(“username”) String paramString);

I tried the ApiConnector with the put() function and the data as payload, but this does not work. The ApiConnector get() returns HTTP code 499, so the URL seems to exists.

If you have any ideas I would like to hear them.

Thanks, and keep up the great work!

Regards,
Simon

Hi,

sorry I didn’t receive any notification for your message :(, so i’m a bit late

So,

  • @Get means it’s an http GET, so you have to use ApiConnector#get function
  • @Path means you have to replace {serialNumber} and {deviceId} by your serial number and device id. (The connector is able to replace the serial number by himself, so you just have to found the device Id
  • @Query means it’s a query param to something like this: https://websiste.com?timeRange=123&function=456
  • Since it’s an http GET, there is no payload

EDIT: I did some tests. So I as usual, when I try to get emf device capable, I get an HTTP 409 error (which is certainly means I don’t have any emf device).

I also tried that:

connector = ApiConnector('xxx', 'xxx')
url = Urls.emf_report_device('Control_DWH')  # replace by your device id
url += '?energyType=LIVE_DATA&function=DHW&timeRange=YEAR&start=2019-01-01&offset=6'
try:
      print(connector.get(url))
except ApiError as e:
      print(e.response.content)

But I got an HTTP 500 error with content:

{
    "errorCode": "IllegalArgumentException"
}

Which means I’m passing an illegal argument (or maybe it’s just because I don’t have any emf capable device)

Anyway, here is what I found for the @Query param:

  • energyType, it can be
    – LIVE_DATA
    – CONSUMED_PRIMARY_ENERGY
    – CONSUMED_ELECTRICAL_POWER
    – ENVIRONMENTAL_YIELD
    – SOLAR_YIELD
    – GRID_FEED_IN_ENERGY
    – SELF_CONSUMED_ENERGY
    – EARNED_PV_ENERGY

  • function:
    – CENTRAL_HEATING
    – DHW
    – COOLING
    – COMBINED
    – PV

  • timeRange
    – DAY
    – WEEK
    – MONTH
    – YEAR

  • start:
    – any date with format yyyy-MM-dd

  • offset
    – Well, I check the source code of the android apk and the only value I found is 6

Feel free the change parameters as you can and let me know if it works. On my side, i’m trying to know what’s going wrong

Thomas

Hi Barry,

well I can’t talk about heat pump / energy monitoring since I don’t have any compatible device.

For the URL, you’re actually right, it should be like this: https://smart.vaillant.com/mobile/api/v4/facilities/12345, but it’s incomplete, this is why you get the 404.

You could use this https://github.com/thomasgermain/vr900-connector (done by me). It’s a python project which will allow you to get data from vaillant server (as the android/ios app does). The ApiConnector will handle authentication (token, cookies) and a single serial number. You can check the example in the doc.

If you want to do it manually (I mean, without my project), than you can still check https://github.com/thomasgermain/vr900-connector/blob/master/vr900connector/api/urls.py, I extracted all urls from the mobile app. You can print the result of the method, so you have an idea of what you want.

If you have more question about the project, you can still open a ticket on github.

Let me know if you need more information.

Thomas

Hi Thomas,

thanks for the reply.

I will likely look at using your project, but for now I wanted to verify API capability against my device by simply firing calls through Postman.

I already looked at you urls.py script to find the method paths which is how I came up with the path I provided.

You mention that I had the url correct, but that it was incomplete. Can you please describe how and why it is incomplete as I don’t have a python environment to run your project on currently.

Hopefully that will fill my gap in understanding. If I can then prove that the Valiant API has what I need, then I will look to implement your project. My goal is not to use with home-assistant, but to emoncms data monitoring.

Thanks
Barry

Hi Barry,

here is all the urls I was able to extract from mobile app:

https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/authenticate
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/circulation
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/circulation/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/circulation/configuration/timeprogram
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/repeaters/{sgtin}
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/emf/v1/devices
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/emf/v1/devices/{device_id}
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/storage/default
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/system/v1/details
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/system/v1/installerinfo
https://smart.vaillant.com/mobile/api/v4/facilities
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/storage
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/system/v1/status
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/hotwater
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/hotwater/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/hotwater/configuration/operation_mode
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/hotwater/configuration/temperature_setpoint
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/dhw/{dhw_id}/hotwater/configuration/timeprogram
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/hvacstate/v1/overview
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/hvacstate/v1/hvacMessages/update
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/livereport/v1
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/livereport/v1/devices/{device_id}/reports/{report_id}
https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/logout
https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/spine/v1/currentPVMeteringInfo
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/installationStatus
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/underfloorHeatingStatus
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/repeaters
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/configuration/operationMode
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/configuration/quickVeto
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/configuration/childLock
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/configuration/devices/{sgtin}/name
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/configuration/name
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/configuration/temperatureSetpoint
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms/{room_index}/timeprogram
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/rooms
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/rbr/v1/repeaters/{sgtin}/name
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/ventilation/{ventilation_id}/fan/configuration/day_level
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/ventilation/{ventilation_id}/fan/configuration/night_level
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/ventilation/{ventilation_id}/fan/configuration/operation_mode
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/status/datetime
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/configuration/holidaymode
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/parameters
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/configuration/quickmode
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/status
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/ventilation/{ventilation_id}
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/ventilation/{ventilation_id}/fan/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/ventilation/{ventilation_id}/fan/configuration/timeprogram
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/cooling/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/cooling/configuration/manual_mode_cooling_temperature_setpoint
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/cooling/configuration/mode
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/cooling/configuration/setpoint_temperature
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/cooling/timeprogram
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/heating/configuration
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/heating/configuration/mode
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/heating/configuration/setback_temperature
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/heating/configuration/setpoint_temperature
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/heating/timeprogram
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/configuration/name
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones/{zone_id}/configuration/quick_veto
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1/zones 

I guess you understand you have to replace {xxx} by the actual value.

I would recommend you starting with https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/systemcontrol/v1 which will dump a big overview of your system (including ids you will need for other calls).

You can also have a look at

  • https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/emf/v1/devices
  • https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/emf/v1/devices/{device_id}
    I cannot help you that much with theses calls since i’m receiving empty responses (I don’t have any emf capable device)

Eventually, if you have photovoltaics stuff, you can try

  • https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/spine/v1/currentPVMeteringInfo

Honestly, I don’t know if you will be able to have useful information, I have a water heater and solar (not photovolatics) panels to warm hot water. On the water heater device itself, I can have information about energy monitoring, but i’m not able to find that through vaillant API.

I would be glad if I could have some (anonymized) data in order to implement emf functionalities in my project.

Kr,

Thomas

1 Like

I then tried…

https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/emf/v1/devices/NoneGateway-LL_HMU00_0304_flexoTHERM_PR_EBUS

but I’m receiving

{
"errorCode": "INVALID_PARAMS"

}

Am I using the wrong device id?

Thanks
Barry

Everything seems good systemcontrol/v1

I’m glad to see what emf/v1/devices looks like.

emf/v1/devices for a specific device should work. I’m gonna check the mobile app code to see if there is any manipulation on the id, or something else.

–>EDIT: stupid me, you should read my post here: Vaillant vr900/vr920/ambisense. It will explain you how to build the url and it should work.
At the end, your url should look like:
https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/emf/v1/devices/{device_id}?energyType=LIVE_DATA&function=DHW&timeRange=YEAR&start=2019-01-01&offset=6

By the way, you can also check that:

  • https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/livereport/v1
  • https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/livereport/v1/devices/{device_id}/reports/{report_id}
    Maybe you will find another device id. I don’t know what could be the report id.

Thanks again… Making some progress here…

So, firstly, using
mobile/api/v4/facilities/{serial_number}/emf/v1/devices/NoneGateway-LL_HMU00_0304_flexoTHERM_PR_EBUS?energyType=LIVE_DATA&function=CENTRAL_HEATING&timeRange=DAY&start=2019-05-16&offset=0

gives

{
"errorCode": "IllegalArgumentException"

}

I believe that the energyType=LIVE_DATA is the culprit here. Reason being that

mobile/api/v4/facilities/{serial-number}/emf/v1/devices/NoneGateway-LL_HMU00_0304_flexoTHERM_PR_EBUS?energyType=CONSUMED_ELECTRICAL_POWER&function=CENTRAL_HEATING&timeRange=DAY&start=2019-05-16&offset=2

works just fine with the following output…

{
"body": [
    {
        "key": "2019-05-14",
        "summaryOfValues": 6000,
        "dataset": [
            {
                "key": "2019-05-14 00",
                "value": 0
            },
            {
                "key": "2019-05-14 01",
                "value": 0
            },
            {
                "key": "2019-05-14 02",
                "value": 1000
            },
            {
                "key": "2019-05-14 03",
                "value": 2000
            },
            {
                "key": "2019-05-14 04",
                "value": 1000
            },
            {
                "key": "2019-05-14 05",
                "value": 1000
            },
            {
                "key": "2019-05-14 06",
                "value": 0
            },
            {
                "key": "2019-05-14 07",
                "value": 0
            },
            {
                "key": "2019-05-14 08",
                "value": 0
            },
            {
                "key": "2019-05-14 09",
                "value": 0
            },
            {
                "key": "2019-05-14 10",
                "value": 0
            },
            {
                "key": "2019-05-14 11",
                "value": 0
            },
            {
                "key": "2019-05-14 12",
                "value": 0
            },
            {
                "key": "2019-05-14 13",
                "value": 0
            },
            {
                "key": "2019-05-14 14",
                "value": 0
            },
            {
                "key": "2019-05-14 15",
                "value": 0
            },
            {
                "key": "2019-05-14 16",
                "value": 0
            },
            {
                "key": "2019-05-14 17",
                "value": 0
            },
            {
                "key": "2019-05-14 18",
                "value": 0
            },
            {
                "key": "2019-05-14 19",
                "value": 0
            },
            {
                "key": "2019-05-14 20",
                "value": 1000
            },
            {
                "key": "2019-05-14 21",
                "value": 0
            },
            {
                "key": "2019-05-14 22",
                "value": 0
            },
            {
                "key": "2019-05-14 23",
                "value": 0
            }
        ]
    },
    {
        "key": "2019-05-15",
        "summaryOfValues": 6000,
        "dataset": [
            {
                "key": "2019-05-15 00",
                "value": 1000
            },
            {
                "key": "2019-05-15 01",
                "value": 0
            },
            {
                "key": "2019-05-15 02",
                "value": 0
            },
            {
                "key": "2019-05-15 03",
                "value": 0
            },
            {
                "key": "2019-05-15 04",
                "value": 2000
            },
            {
                "key": "2019-05-15 05",
                "value": 1000
            },
            {
                "key": "2019-05-15 06",
                "value": 1000
            },
            {
                "key": "2019-05-15 07",
                "value": 0
            },
            {
                "key": "2019-05-15 08",
                "value": 0
            },
            {
                "key": "2019-05-15 09",
                "value": 0
            },
            {
                "key": "2019-05-15 10",
                "value": 0
            },
            {
                "key": "2019-05-15 11",
                "value": 0
            },
            {
                "key": "2019-05-15 12",
                "value": 0
            },
            {
                "key": "2019-05-15 13",
                "value": 0
            },
            {
                "key": "2019-05-15 14",
                "value": 0
            },
            {
                "key": "2019-05-15 15",
                "value": 0
            },
            {
                "key": "2019-05-15 16",
                "value": 0
            },
            {
                "key": "2019-05-15 17",
                "value": 0
            },
            {
                "key": "2019-05-15 18",
                "value": 0
            },
            {
                "key": "2019-05-15 19",
                "value": 1000
            },
            {
                "key": "2019-05-15 20",
                "value": 0
            },
            {
                "key": "2019-05-15 21",
                "value": 0
            },
            {
                "key": "2019-05-15 22",
                "value": 0
            },
            {
                "key": "2019-05-15 23",
                "value": 0
            }
        ]
    },
    {
        "key": "2019-05-16",
        "summaryOfValues": 6000,
        "dataset": [
            {
                "key": "2019-05-16 00",
                "value": 1000
            },
            {
                "key": "2019-05-16 01",
                "value": 0
            },
            {
                "key": "2019-05-16 02",
                "value": 0
            },
            {
                "key": "2019-05-16 03",
                "value": 0
            },
            {
                "key": "2019-05-16 04",
                "value": 0
            },
            {
                "key": "2019-05-16 05",
                "value": 0
            },
            {
                "key": "2019-05-16 06",
                "value": 2000
            },
            {
                "key": "2019-05-16 07",
                "value": 1000
            },
            {
                "key": "2019-05-16 08",
                "value": 0
            },
            {
                "key": "2019-05-16 09",
                "value": 0
            },
            {
                "key": "2019-05-16 10",
                "value": 0
            },
            {
                "key": "2019-05-16 11",
                "value": 0
            },
            {
                "key": "2019-05-16 12",
                "value": 0
            },
            {
                "key": "2019-05-16 13",
                "value": 0
            },
            {
                "key": "2019-05-16 14",
                "value": 0
            },
            {
                "key": "2019-05-16 15",
                "value": 0
            },
            {
                "key": "2019-05-16 16",
                "value": 1000
            },
            {
                "key": "2019-05-16 17",
                "value": 0
            },
            {
                "key": "2019-05-16 18",
                "value": 0
            },
            {
                "key": "2019-05-16 19",
                "value": 0
            },
            {
                "key": "2019-05-16 20",
                "value": 0
            },
            {
                "key": "2019-05-16 21",
                "value": 0
            },
            {
                "key": "2019-05-16 22",
                "value": 1000
            },
            {
                "key": "2019-05-16 23",
                "value": 0
            }
        ]
    },
    {
        "key": "2019-05-17",
        "summaryOfValues": 4000,
        "dataset": [
            {
                "key": "2019-05-17 00",
                "value": 0
            },
            {
                "key": "2019-05-17 01",
                "value": 0
            },
            {
                "key": "2019-05-17 02",
                "value": 0
            },
            {
                "key": "2019-05-17 03",
                "value": 0
            },
            {
                "key": "2019-05-17 04",
                "value": 0
            },
            {
                "key": "2019-05-17 05",
                "value": 1000
            },
            {
                "key": "2019-05-17 06",
                "value": 1000
            },
            {
                "key": "2019-05-17 07",
                "value": 1000
            },
            {
                "key": "2019-05-17 08",
                "value": 0
            },
            {
                "key": "2019-05-17 09",
                "value": 0
            },
            {
                "key": "2019-05-17 10",
                "value": 0
            },
            {
                "key": "2019-05-17 11",
                "value": 1000
            },
            {
                "key": "2019-05-17 12",
                "value": 0
            },
            {
                "key": "2019-05-17 13",
                "value": null
            },
            {
                "key": "2019-05-17 14",
                "value": null
            },
            {
                "key": "2019-05-17 15",
                "value": null
            },
            {
                "key": "2019-05-17 16",
                "value": null
            },
            {
                "key": "2019-05-17 17",
                "value": null
            },
            {
                "key": "2019-05-17 18",
                "value": null
            },
            {
                "key": "2019-05-17 19",
                "value": null
            },
            {
                "key": "2019-05-17 20",
                "value": null
            },
            {
                "key": "2019-05-17 21",
                "value": null
            },
            {
                "key": "2019-05-17 22",
                "value": null
            },
            {
                "key": "2019-05-17 23",
                "value": null
            }
        ]
    },
    {
        "key": "2019-05-18",
        "summaryOfValues": null,
        "dataset": [
            {
                "key": "2019-05-18 00",
                "value": null
            },
            {
                "key": "2019-05-18 01",
                "value": null
            },
            {
                "key": "2019-05-18 02",
                "value": null
            },
            {
                "key": "2019-05-18 03",
                "value": null
            },
            {
                "key": "2019-05-18 04",
                "value": null
            },
            {
                "key": "2019-05-18 05",
                "value": null
            },
            {
                "key": "2019-05-18 06",
                "value": null
            },
            {
                "key": "2019-05-18 07",
                "value": null
            },
            {
                "key": "2019-05-18 08",
                "value": null
            },
            {
                "key": "2019-05-18 09",
                "value": null
            },
            {
                "key": "2019-05-18 10",
                "value": null
            },
            {
                "key": "2019-05-18 11",
                "value": null
            },
            {
                "key": "2019-05-18 12",
                "value": null
            },
            {
                "key": "2019-05-18 13",
                "value": null
            },
            {
                "key": "2019-05-18 14",
                "value": null
            },
            {
                "key": "2019-05-18 15",
                "value": null
            },
            {
                "key": "2019-05-18 16",
                "value": null
            },
            {
                "key": "2019-05-18 17",
                "value": null
            },
            {
                "key": "2019-05-18 18",
                "value": null
            },
            {
                "key": "2019-05-18 19",
                "value": null
            },
            {
                "key": "2019-05-18 20",
                "value": null
            },
            {
                "key": "2019-05-18 21",
                "value": null
            },
            {
                "key": "2019-05-18 22",
                "value": null
            },
            {
                "key": "2019-05-18 23",
                "value": null
            }
        ]
    }
],
"meta": {}

}

Note that the offset shows additional sets of data for the previous periods to that requested. So in my example, I requested a data set of DAY = 16th May 2019, with an offset of 0, I only get 1 set of data for the 16th of May 2019. With an offset of 2, I also get datasets for 15th and 14th May as per the results above. Note that 6 is the maximum allowed, 7 or greater will cause an

{
"errorCode": "INVALID_REPORT_PARAMETER"

}

I have also tried using the following energy types…

LIVE_DATA - Error

CONSUMED_PRIMARY_ENERGY, dataset returned but all values null, maybe correct for CENTRAL_HEATING?

ENVIRONMENTAL_YIELD (results below - using offset 0 to save space)
{
“body”: [
{
“key”: “2019-05-16”,
“summaryOfValues”: 18000,
“dataset”: [
{
“key”: “2019-05-16 00”,
“value”: 2000
},
{
“key”: “2019-05-16 01”,
“value”: 0
},
{
“key”: “2019-05-16 02”,
“value”: 0
},
{
“key”: “2019-05-16 03”,
“value”: 0
},
{
“key”: “2019-05-16 04”,
“value”: 0
},
{
“key”: “2019-05-16 05”,
“value”: 1000
},
{
“key”: “2019-05-16 06”,
“value”: 5000
},
{
“key”: “2019-05-16 07”,
“value”: 2000
},
{
“key”: “2019-05-16 08”,
“value”: 0
},
{
“key”: “2019-05-16 09”,
“value”: 0
},
{
“key”: “2019-05-16 10”,
“value”: 0
},
{
“key”: “2019-05-16 11”,
“value”: 0
},
{
“key”: “2019-05-16 12”,
“value”: 1000
},
{
“key”: “2019-05-16 13”,
“value”: 0
},
{
“key”: “2019-05-16 14”,
“value”: 0
},
{
“key”: “2019-05-16 15”,
“value”: 0
},
{
“key”: “2019-05-16 16”,
“value”: 3000
},
{
“key”: “2019-05-16 17”,
“value”: 0
},
{
“key”: “2019-05-16 18”,
“value”: 0
},
{
“key”: “2019-05-16 19”,
“value”: 2000
},
{
“key”: “2019-05-16 20”,
“value”: 0
},
{
“key”: “2019-05-16 21”,
“value”: 0
},
{
“key”: “2019-05-16 22”,
“value”: 2000
},
{
“key”: “2019-05-16 23”,
“value”: 0
}
]
}
],
“meta”: {}
}

SOLAR_YIELD / GRID_FEED_IN_ENERGY / SELF_CONSUMED_ENERGY / EARNED_PV_ENERGY

  • all dataset returned but all values null, probably correct for CENTRAL_HEATING?

I need to verify if the numbers returned under CONSUMED_ELECTRICAL_POWER reflect what my device shows and I’d still like to find the numbers for LIVE_DATA if we only knew the correct paramter name.

Wow this is precious data ! Really nice, thanks.

I guess I will be able to make some test cases with your example so I can implement something.

For LIVE_DATA, I crossed check, this is definitely a value used in the mobile app. Did you try:

  • https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/livereport/v1 and
  • https://smart.vaillant.com/mobile/api/v4/facilities/{serial_number}/livereport/v1/devices/{device_id}/reports/{report_id}

With livereport/v1, i’m able to get information like live water pressure and water temperature in the boiler and live water temperature from water heater. Maybe you can have what you want using URLs above ?

Basically, you will have information you can see “Information” tab in the android app.

Hello Thomas,

I will move soon to new house with Vaillant boiler with some thermostat and outside temperature sensor. I beleive it should be possible to buy VRC920 as an addon. Just interested how far you went with your https://github.com/thomasgermain/vaillant-component how it is working with i.e. recent 0.97 version and if you recommend it. Possible screens? Thanks a lot
BR Marek

Hello,

you can find here the last version of the component: https://github.com/thomasgermain/home-assistant/tree/vaillant/homeassistant/components/vaillant

The component is migrated to 0.96 (hvac refactoring) and working with 0.97.x as well, but still under tests.
I think you can have a pretty good idea of what the component is able to do reading the readme.
Please note this is not even a beta version, so you may encounter errors and bugs.

Here is what it looks like in my HA (in french, but you can have a good overview):

Let me know if you have some remarks.

Thomas

2 Likes

Hello Thomas,

Are you planning to add ventilation control recoVAIR VAR150 / 4 - 360/4? I would really like to be able to change the speed of ventilation through a smart home.

Thank you for what you are doing!

Hello,

it’s not really plan (since I don’t have any ventilation system, so I cannot reverse engineer the API), but it’s doable if I have some test data.

Are you able to control your ventilation through vaillant multiMatic application ?

Thomas