Vaillant/MultiMATIC integration

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

1 Like

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/MultiMATIC component. 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

I understand it. Yes, I can control the ventilation through the Vaillant MultiMatic application.
Can I give you a username and password from my account and will you take the data you need?

PS: Sorry for my English :frowning:

No, I cannot get your username/password, but maybe visa card ? :stuck_out_tongue:

I can create a python script which will dump some data about the system and the ventilation specifically. So you will only have to run the script at your side without revealing password. Then you will just have to anonymized your data. Are you ok with that ?

Maybe you can create an issue here https://github.com/thomasgermain/vr900-connector/issues/, it will be easier to me to track the ventilation implementation.

Don’t worry for your english, mine is not perfect neither :grinning:

Hi, thank you for response this looks very nice. Now I need to wait for moving and will consider to buy the VR 920 starter pack with 3 valves. Am I right that this is no more read only so you can increase/decrease temperature for valves or room via HA?

Thanks and Regards,
M.