thomasgermain / vaillant-component

Multimatic integration for Home Assistant (also compatible with sensoAPP)
MIT License
136 stars 24 forks source link

Hotwater without timeprogram #67

Closed dupondje closed 3 years ago

dupondje commented 3 years ago

With a VR900 it can't seem to create all the sensors:

2021-06-22 15:47:25 ERROR (MainThread) [homeassistant.components.binary_sensor] Error while setting up multimatic platform for binary_sensor
Traceback (most recent call last):
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity_platform.py", line 258, in _async_setup_platform
    await asyncio.gather(*pending)
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity_platform.py", line 383, in async_add_entities
    await asyncio.gather(*tasks)
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity_platform.py", line 588, in _async_add_entity
    await entity.add_to_platform_finish()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 615, in add_to_platform_finish
    self.async_write_ha_state()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 368, in async_write_ha_state
    self._async_write_ha_state()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 402, in _async_write_ha_state
    state = self._stringify_state()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 374, in _stringify_state
    state = self.state
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/components/binary_sensor/__init__.py", line 162, in state
    return STATE_ON if self.is_on else STATE_OFF
  File "/home/homeassistant/.homeassistant/custom_components/multimatic/binary_sensor.py", line 77, in is_on
    a_mode = self.active_mode
  File "/home/homeassistant/.homeassistant/custom_components/multimatic/binary_sensor.py", line 95, in active_mode
    return self.coordinator.data.get_active_mode_circulation()
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/model/system.py", line 228, in get_active_mode_circulation
    return circulation.active_mode
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/model/common.py", line 52, in active_mode
    setting = self.time_program.get_for(datetime.now())
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/model/timeprogram.py", line 107, in get_for
    tp_day = self.days[day]
KeyError: 'tuesday'
thomasgermain commented 3 years ago

Do you have hotwater in your installation ?

dupondje commented 3 years ago

I do have. It provides hotwater and heating.

thomasgermain commented 3 years ago

Do you have any time program configured ? It sounds you don't have it

dupondje commented 3 years ago

For heating there is a time program configured (but disabled at this moment, as its running permanent night mode).

dupondje commented 3 years ago

There is another error popping up which shows the time programs btw:

Key 'zones' error:
Or(Schema(Or(Schema({'_id': And(<class 'str'>, <built-in function len>), 'configuration': Schema({'name': And(<class 'str'>, <built-in function len>), Optional('enabled'): <class 'bool'>, Optional('inside_temperature'): Or(<class 'int'>, <class 'float'>), Optional('active_function'): And(<class 'str'>, <built-in function len>), Optional('quick_veto'): {'active': <class 'bool'>, 'setpoint_temperature': Or(<class 'int'>, <class 'float'>)}, Optional('quickmode'): Schema({Optional('quickmode'): And(<class 'str'>, <built-in function len>), Optional('duration'): Or(<class 'int'>, <class 'float'>)})}), Optional('currently_controlled_by'): Schema({'name': And(And(<class 'str'>, <built-in function len>), <function <lambda> at 0x7f407ffd84c0>), Optional('link'): {Optional('rel'): <class 'str'>, 'resourceLink': <class 'str'>, Optional('name'): <class 'str'>}}), Optional('heating'): Schema({'configuration': {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, Optional('timeprogram'): Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})}), Optional('cooling'): Schema({'configuration': {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, Optional('timeprogram'): Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})})}), Schema({'_id': And(<class 'str'>, <built-in function len>), Optional('configuration'): Schema({'name': And(<class 'str'>, <built-in function len>), Optional('enabled'): <class 'bool'>, Optional('inside_temperature'): Or(<class 'int'>, <class 'float'>), Optional('active_function'): And(<class 'str'>, <built-in function len>), Optional('quick_veto'): {'active': <class 'bool'>, 'setpoint_temperature': Or(<class 'int'>, <class 'float'>)}, Optional('quickmode'): Schema({Optional('quickmode'): And(<class 'str'>, <built-in function len>), Optional('duration'): Or(<class 'int'>, <class 'float'>)})}), 'currently_controlled_by': Schema({'name': Or('RBR', 'rbr'), Optional('link'): {Optional('rel'): <class 'str'>, 'resourceLink': <class 'str'>, Optional('name'): <class 'str'>}}), Optional('heating'): Schema({Optional('configuration'): {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, 'timeprogram': Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})}), Optional('cooling'): Schema({Optional('configuration'): {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, 'timeprogram': Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})})})))) did not validate {'heating': {'timeprogram': {'monday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '08:00', 'setting': 'NIGHT'}, {'startTime': '16:40', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'tuesday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'wednesday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'thursday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '08:00', 'setting': 'NIGHT'}, {'startTime': '16:30', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'friday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '08:00', 'setting': 'NIGHT'}, {'startTime': '18:30', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'saturday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '10:00', 'setting': 'NIGHT'}, {'startTime': '18:00', 'setting': 'DAY'}, {'startTime': '21:40', 'setting': 'NIGHT'}], 'sunday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:30', 'setting': 'DAY'}, {'startTime': '10:50', 'setting': 'NIGHT'}, {'startTime': '17:00', 'setting': 'DAY'}, {'startTime': '21:30', 'setting': 'NIGHT'}]}}, '_id': 'Control_ZO1'}
Or(Schema({'_id': And(<class 'str'>, <built-in function len>), 'configuration': Schema({'name': And(<class 'str'>, <built-in function len>), Optional('enabled'): <class 'bool'>, Optional('inside_temperature'): Or(<class 'int'>, <class 'float'>), Optional('active_function'): And(<class 'str'>, <built-in function len>), Optional('quick_veto'): {'active': <class 'bool'>, 'setpoint_temperature': Or(<class 'int'>, <class 'float'>)}, Optional('quickmode'): Schema({Optional('quickmode'): And(<class 'str'>, <built-in function len>), Optional('duration'): Or(<class 'int'>, <class 'float'>)})}), Optional('currently_controlled_by'): Schema({'name': And(And(<class 'str'>, <built-in function len>), <function <lambda> at 0x7f407ffd84c0>), Optional('link'): {Optional('rel'): <class 'str'>, 'resourceLink': <class 'str'>, Optional('name'): <class 'str'>}}), Optional('heating'): Schema({'configuration': {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, Optional('timeprogram'): Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})}), Optional('cooling'): Schema({'configuration': {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, Optional('timeprogram'): Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})})}), Schema({'_id': And(<class 'str'>, <built-in function len>), Optional('configuration'): Schema({'name': And(<class 'str'>, <built-in function len>), Optional('enabled'): <class 'bool'>, Optional('inside_temperature'): Or(<class 'int'>, <class 'float'>), Optional('active_function'): And(<class 'str'>, <built-in function len>), Optional('quick_veto'): {'active': <class 'bool'>, 'setpoint_temperature': Or(<class 'int'>, <class 'float'>)}, Optional('quickmode'): Schema({Optional('quickmode'): And(<class 'str'>, <built-in function len>), Optional('duration'): Or(<class 'int'>, <class 'float'>)})}), 'currently_controlled_by': Schema({'name': Or('RBR', 'rbr'), Optional('link'): {Optional('rel'): <class 'str'>, 'resourceLink': <class 'str'>, Optional('name'): <class 'str'>}}), Optional('heating'): Schema({Optional('configuration'): {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, 'timeprogram': Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})}), Optional('cooling'): Schema({Optional('configuration'): {Or('mode', 'operation_mode', 'operationMode'): And(<class 'str'>, <built-in function len>), Optional(Or('setpoint_temperature', 'temperature_setpoint', 'temperatureSetpoint', 'day_level')): Or(<class 'int'>, <class 'float'>), Optional(Or('setback_temperature', 'night_level')): Or(<class 'int'>, <class 'float'>), Optional('day_level'): <class 'int'>, Optional('night_level'): <class 'int'>}, 'timeprogram': Schema({'monday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'tuesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'wednesday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'thursday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'friday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'saturday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}], 'sunday': [{'startTime': And(<class 'str'>, <built-in function len>), Optional('temperatureSetpoint'): Or(<class 'int'>, <class 'float'>), Optional('setting'): And(<class 'str'>, <built-in function len>), Optional('mode'): And(<class 'str'>, <built-in function len>)}]})})})) did not validate {'heating': {'timeprogram': {'monday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '08:00', 'setting': 'NIGHT'}, {'startTime': '16:40', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'tuesday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'wednesday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'thursday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '08:00', 'setting': 'NIGHT'}, {'startTime': '16:30', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'friday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '08:00', 'setting': 'NIGHT'}, {'startTime': '18:30', 'setting': 'DAY'}, {'startTime': '22:00', 'setting': 'NIGHT'}], 'saturday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:00', 'setting': 'DAY'}, {'startTime': '10:00', 'setting': 'NIGHT'}, {'startTime': '18:00', 'setting': 'DAY'}, {'startTime': '21:40', 'setting': 'NIGHT'}], 'sunday': [{'startTime': '00:00', 'setting': 'NIGHT'}, {'startTime': '06:30', 'setting': 'DAY'}, {'startTime': '10:50', 'setting': 'NIGHT'}, {'startTime': '17:00', 'setting': 'DAY'}, {'startTime': '21:30', 'setting': 'NIGHT'}]}}, '_id': 'Control_ZO1'}
Key 'heating' error:
Missing key: 'configuration'
Missing key: 'currently_controlled_by'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/update_coordinator.py", line 187, in _async_refresh
    self.data = await self._async_update_data()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/update_coordinator.py", line 147, in _async_update_data
    return await self.update_method()
  File "/home/homeassistant/.homeassistant/custom_components/multimatic/coordinator.py", line 108, in _fetch_data
    system = await self._manager.get_system()
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/systemmanager.py", line 126, in get_system
    facilities, full_system, live_report, hvac_state, gateway = await asyncio.gather(
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/systemmanager.py", line 43, in wrapper
    return await func(*args, **kwargs)
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/systemmanager.py", line 732, in _call_api
    return await self._validate_schema(schema, response, url)
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/systemmanager.py", line 740, in _validate_schema
    raise WrongResponseError(message=f'Cannot validate response from {url}: {err.code}',
pymultimatic.api.error.WrongResponseError
thomasgermain commented 3 years ago

For heating there is a time program configured (but disabled at this moment, as its running permanent night mode).

But do you have a time program configured for your hot water ?

dupondje commented 3 years ago

But do you have a time program configured for your hot water ?

A time program for hot water? How would that work? It produces hot water when it's needed...

thomasgermain commented 3 years ago

Through multimatic app, you can configure when you want the water to heat (same as the heating actually). For example, I asked the water to heat at 50°C between 6:30am and 7:30am and 7:00pm, and 8:00pm. Outside these timeframes, I don't need hot water.

dupondje commented 3 years ago

I guess that is when you have a boiler? Here it's just on-demand hot water without a boiler.

thomasgermain commented 3 years ago

Aaah, didn't know it was possible, I'll have a look for the next beta

dupondje commented 3 years ago

Aaah, didn't know it was possible, I'll have a look for the next beta

That's quite common no? :) It's called a 'doorstromer' in dutch.

thomasgermain commented 3 years ago

Aaah, didn't know it was possible, I'll have a look for the next beta

That's quite common no? :) It's called a 'doorstromer' in dutch.

Well yeah, this is quite common, but I didn't know it was possible inside the vaillant system :)

thomasgermain commented 3 years ago

By the way, what are you able to do with your water heater through through multimatic app ? Also, are you able to provide the result of this call: GET https://smart.vaillant.com/mobile/api/v4/facilities/{serial_id}/systemcontrol/v1/dhw, so I'm sure how to handle your case :)

dupondje commented 3 years ago

I can put it off, on or Auto. And enter a time program it seems. But nothing is set there. Also I'm able to set the water temperature.

The call gives me an "NOT_AUTHORIZED". I need to do another call first?

thomasgermain commented 3 years ago

I created a script: for windows (powershell): https://github.com/thomasgermain/pymultiMATIC/blob/v0_5_0/script/print_response.ps1 for linux: https://github.com/thomasgermain/pymultiMATIC/blob/v0_5_0/script/print_response.sh.

You have to provide your username, password and the url for which the response will be printed: sh print_response.sh user passw https://smart.vaillant.com/mobile/api/v4/facilities/{serial_id}/systemcontrol/v1/dhw

or for windows: ./print_response.ps1 user passw https://smart.vaillant.com/mobile/api/v4/facilities/{serial_id}/systemcontrol/v1/dhw.

Don't forget to remove some private info (like serial number).

Let me know if it works

dupondje commented 3 years ago

That worked!


  "body": [
    {
      "hotwater": {
        "configuration": {
          "operation_mode": "AUTO",
          "temperature_setpoint": 60
        }
      },
      "circulation": {
        "configuration": {
          "operationMode": "AUTO"
        }
      },
      "_id": "Control_DHW"
    }
  ],
  "meta": {
    "resourceState": [
      {
        "state": "SYNCED",
        "timestamp": 1624477418615,
        "link": {
          "rel": "self",
          "resourceLink": "/facilities/xxxxxxx/systemcontrol/v1/dhw/Control_DHW/circulation/configuration"
        }
      },
      {
        "state": "SYNCED",
        "timestamp": 1624470169435,
        "link": {
          "rel": "self",
          "resourceLink": "/facilities/xxxxxx/systemcontrol/v1/dhw/Control_DHW/hotwater/configuration"
        }
      }
    ]
  }
}
thomasgermain commented 3 years ago

Ok, thanks, I'll see what I can do, but I think you will only be able to set the target temperature. I guess that if you turn it ON, it won't have any effect ? And does the target temperature have any effect ? (I mean if you set it on 80 °C, will it really heat the water to 80 ?)

dupondje commented 3 years ago

Setting it to ON doesn't do anything it seems. Changing temperature changes indeed how hot it heats the water.

thomasgermain commented 3 years ago

Release https://github.com/thomasgermain/vaillant-component/releases/tag/1.7.0b2 should fix the issue, could you confirm ?

dupondje commented 3 years ago

Well everything broke now :( 2021-06-30 09:56:27 WARNING (MainThread) [homeassistant.config_entries] Config entry 'Multimatic' for multimatic integration not ready yet: Cannot get https://smart.vaillant.com/mobile/api/v4/facilities/xxxxx/rbr/v1/rooms; Retrying in background

If I do the call manually it returns: {"errorCode":"ROOM_BY_ROOM_NOT_SUPPORTED_BY_FACILITY"}

thomasgermain commented 3 years ago

Ok thanks,

what do you mean by everything is broken ? you should have all your entities and maybe some log errors related to the rooms

Could you provide me the full error log ?

dupondje commented 3 years ago

Everything shows as unavailable.

And the logs for multimatic only show the following: 2021-06-30 10:16:23 INFO (MainThread) [homeassistant.setup] Setting up multimatic 2021-06-30 10:16:23 INFO (MainThread) [homeassistant.setup] Setup of domain multimatic took 0.0 seconds 2021-06-30 10:16:24 WARNING (MainThread) [homeassistant.config_entries] Config entry 'Multimatic' for multimatic integration not ready yet: Cannot get https://smart.vaillant.com/mobile/api/v4/facilities/xxxx/systemcontrol/v1/zones; Retrying in background

thomasgermain commented 3 years ago

But wait, what kind of installation do you have ?Do you only have the water heater ? Can you rerun the script but with this url: https://smart.vaillant.com/mobile/api/v4/facilities/xxxx/systemcontrol/v1/zones ?

Thanks !

lecocqe commented 3 years ago

I have this one:

Config entry 'Multimatic' for multimatic integration not ready yet: Cannot get https://smart.vaillant.com/mobile/api/v4/facilities/xxxxx/rbr/v1/rooms

I saw somewhere that you wrote that's a warning if you don't have ambisense but in my case (I don't have ambisense yet) all entities are unavailable. I'm back to b1

dupondje commented 3 years ago

But wait, what kind of installation do you have ?Do you only have the water heater ? Can you rerun the script but with this url: https://smart.vaillant.com/mobile/api/v4/facilities/xxxx/systemcontrol/v1/zones ?

Its heating + hot water.

That call returns: {"errorCode":"UPDATE_PENDING"}

But now I open the app, and it suddenly seems to start upgrading the whole system (its showing the gateway is getting updated). Maybe some calls triggered this? I'll come back when the update is completed!

dupondje commented 3 years ago

Update seems to be completed. But same error on the rooms call, and everything unavailable.

thomasgermain commented 3 years ago

ok, will try to provide a fix this evening, thanks for your feedback

dupondje commented 3 years ago

Stripped the rooms call out of the code, and it works like before now. But this bug is still not fixed:

2021-06-30 12:40:52 ERROR (MainThread) [homeassistant.components.binary_sensor] Error adding entities for domain binary_sensor with platform multimatic
Traceback (most recent call last):
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity_platform.py", line 383, in async_add_entities
    await asyncio.gather(*tasks)
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity_platform.py", line 588, in _async_add_entity
    await entity.add_to_platform_finish()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 615, in add_to_platform_finish
    self.async_write_ha_state()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 368, in async_write_ha_state
    self._async_write_ha_state()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 402, in _async_write_ha_state
    state = self._stringify_state()
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 374, in _stringify_state
    state = self.state
  File "/opt/homeassistant/lib/python3.8/site-packages/homeassistant/components/binary_sensor/__init__.py", line 162, in state
    return STATE_ON if self.is_on else STATE_OFF
  File "/home/homeassistant/.homeassistant/custom_components/multimatic/binary_sensor.py", line 89, in is_on
    a_mode = self.active_mode
  File "/home/homeassistant/.homeassistant/custom_components/multimatic/binary_sensor.py", line 107, in active_mode
    return self.coordinator.api.get_active_mode(self.coordinator.data.circulation)
  File "/home/homeassistant/.homeassistant/custom_components/multimatic/coordinator.py", line 165, in get_active_mode
    return multimatic_utils.active_mode_for(
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/utils/__init__.py", line 28, in active_mode_for
    return _method_by_component[comp.__class__.__name__](comp, holiday, quick_mode)
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/utils/__init__.py", line 129, in _active_mode_for_circulation
    return circulation.active_mode
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/model/dhw.py", line 64, in active_mode
    return super().active_mode
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/model/common.py", line 51, in active_mode
    setting = self.time_program.get_for(datetime.now())
  File "/opt/homeassistant/lib/python3.8/site-packages/pymultimatic/model/timeprogram.py", line 105, in get_for
    tp_day = self.days[day]
KeyError: 'wednesday'
thomasgermain commented 3 years ago

release https://github.com/thomasgermain/vaillant-component/releases/tag/1.7.0b3 should eventually fix it

dupondje commented 3 years ago

Seems to work fine now :)