Vaillant/MultiMATIC integration

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.

Hi,

yes, the vr900-connector allows you to do everything you can do on a room/zone (basically, this mean changing temperature and operation mode). As HA component uses vr900-connector you can also do the same through HA.

Kr,

Thomas

1 Like

Hi Thomas,

I am quite new at Home Assistant, but I have plans to use it in Smart Home installations.
Actually I am installing the next Vaillant system for my client:

  • Heat pump aroTHERM VWL 125/5 AS (4000 V) + VWL 127/5 IS split + ekviter. reg.multiMATIC 700
    (floor, wall heating and cooling system)
  • uniSTOR VIH RW 400 for hot water
  • heat recovery ventilation recoVAIR VAR 360/4
    and VR 920 for external access.
    So I will have quite complex Vaillant installation.
    I found your project (Vaillant component for HA) as very interesting and I could be able to support some data or test some functionality, if it could help to improve and enhance the componet for example about ventilation and finalize it as some stable version.
    Pls let me know if you are still working on it or what are your plans about it.
    Thank you.
    Peter

Hi Peter,

yeah, this is a full installation :slight_smile:. It will be very interesting to include ventilation and all other feature your devices support.

May I ask you to create an issue (at least about ventilation for now) here: https://github.com/thomasgermain/pymultiMATIC/issues (this is the underlying connector to vaillant API that HA component is using), so I can follow it easily ?

Many Thanks,

Thomas

Hi Thomas,

Just installed pymultiMATIC and the component, works great! Awesome work :smiling_face_with_three_hearts:

Still have to find a way how to git pull origin master only the vaillant component subdir; somehow I cant’ get that to work and downloaded manually the repo and moved the component dir manually. Or is there another way?

All the best and thanks for that great component (and pymultiMATIC of course),
Matthias

Hi Thomas,
my Vaillant setup is now fully functional in the following configuration:

  • flexoTherm VWF 87/4 + flluoCollect VWW 11/4 ← water-water heat hump
  • multiMatic VRC 700F/4 + VR 91F + VR71 ← wireless control for two separate heating circles (zones)
  • allStor exclusive VPS 1000/3-7 + aquaFlow VPM 20/25/2W < - buffer and hot water station
  • VR920

I’ve sucessfully set up your component (the one from your vaillant branch of home-assistant) with my system about two weeks ago and it was working great until about 2-3 days ago (I can’t say for sure, but it was around the time I updated HA to 0.102.3) , when I started getting the error below. I updated to the latest version of your component (the one using pymultimatic==0.0.6) and downgraded HA to 0.101.3 (it worked for sure on this version of HA) and it’s still the same. The sensor part works OK. But the climate component doesn’t (any more). Do you have any idea what causes this? Any help would be much appreciated.

Regards,
Tomaž

Error while setting up platform vaillant
Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/helpers/entity_platform.py”, line 150, in _async_setup_platform
await asyncio.wait_for(asyncio.shield(task), SLOW_SETUP_MAX_WAIT)
File “/usr/local/lib/python3.7/asyncio/tasks.py”, line 442, in wait_for
return fut.result()
File “/config/custom_components/vaillant/climate.py”, line 88, in async_setup_platform
entity = ZoneClimate(hub.system, zone)
File “/config/custom_components/vaillant/climate.py”, line 371, in init
super().init(system, zone.id, zone.name, zone)
File “/config/custom_components/vaillant/climate.py”, line 113, in init
self._refresh(system, component)
File “/config/custom_components/vaillant/climate.py”, line 233, in _refresh
self._active_mode = self.get_active_mode()
File “/config/custom_components/vaillant/climate.py”, line 433, in get_active_mode
return self._system.get_active_mode_zone(self._component)
File “/usr/local/lib/python3.7/site-packages/pymultimatic/model/system.py”, line 98, in get_active_mode_zone
mode: ActiveMode = zone.active_mode
File “/usr/local/lib/python3.7/site-packages/pymultimatic/model/component.py”, line 71, in active_mode
setting = self.time_program.get_for(datetime.now())
File “/usr/local/lib/python3.7/site-packages/pymultimatic/model/timeprogram.py”, line 110, in get_for
tp_day = self.days[day]
KeyError: ‘monday’

Well this is wierd. I’ve reset HA multiple times and the error was still there, but today I had to cut the electricity to the complete heating system. And now everything is working OK.

Hi Matthias,

for now there is no other way. I understand this is a bit annoying. I’m gonna have a look.

Thomas

Hi Tomaž,

this is in my TODO list. I had the same issue this summer, I just shut down my boiler and multiples errors popped up. I noticed that when my boiler was down, the VRC700 was also down and in this case there is some missing information in the API (like time program). But I think in this case, you are not even able to manage your system with the android/ios app.

Thomas

Thanks a lot for your work! Exactly what I needed :slight_smile: