denpamusic / homeassistant-plum-ecomax

Plum ecoMAX boiler controller integration for Home Assistant.
MIT License
30 stars 7 forks source link

When room panel change day to night mode by schedule, that not reflect in HA thermostat. #33

Closed Safs closed 12 months ago

Safs commented 1 year ago

Is there an existing issue for this?

I'm having the following issue:

When room panel change day to night mode by schedule, that not reflect in HA thermostat. In HA thermostat is same set temperature all the time, in day and night.

I have following devices connected:

I'm connecting to my devices using:

Ethernet/WiFi to RS-485 converter

I'm seeing following log messages:

No response

My diagnostics data:

config_entry-plum_ecomax-e0b403046d4ad77e983a2eb9b33db3b7.json.txt

Code of Conduct

denpamusic commented 1 year ago

Hi,

Thank you for the feedback!

I don't have thermostat myself, so when doing implementation I've done it mostly blind. I've assumed that flag schedule, that is present in thermostat sensors, might indicate that device's profile is being changed by the schedule, but from your info it seems, that it's sadly not the case.

Could you, please, collect diagnostics data two times. First when thermostat is in day mode and second when thermostat is in night mode. Do not change modes manually, wait for it to be changed by the schedule. Send both files to denpa@denpa.pro. I'll hopefully will be able to identify flag that's responsible for profile change then.

Thanks beforehand!

Safs commented 1 year ago

Ok!

Safs commented 1 year ago

I sent the files

Safs commented 1 year ago

As I can understand, there is not at all info about data from ecoSTER 200/ecoSTER Touch....

Safs commented 1 year ago

There is also problem to show "idle"state: image

denpamusic commented 1 year ago

Thanks for the diagnostics!

Yep, sadly there's no binary flag that indicates us which mode we're running currently, only that we're running in schedule mode via "mode=0".

However, there's way, I could make this work (and I will), by comparing value of target_temp sensor with day_target_temp and night_target_temp parameters, when mode=0 to determine thermostat current mode. This will fail in at least one edge case, when both day and night mode set to the same temperature, but that's probably best we can do right now.

I'll implement required changes by the next minor version. Please wait for the release.

Thanks again for your help!

-- To make it easier to find this info, following is thermostat info from the files, that you've provided.

Day mode ```json "thermostats": { "0": { "state": 0, "current_temp": 26.885530471801758, "target_temp": 24.0, "contacts": false, "schedule": false, "thermostat_sensors": true, "mode": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='mode', cls=, multiplier=1, size=1), value=0.0, min_value=0.0, max_value=7.0)" }, "party_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_target_temp', cls=, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "holidays_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_target_temp', cls=, multiplier=10, size=2), value=15.0, min_value=10.0, max_value=35.0)" }, "correction": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='correction', cls=, multiplier=1, size=1), value=100.0, min_value=60.0, max_value=140.0)" }, "away_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='away_timer', cls=, multiplier=1, size=1), value=3.0, min_value=0.0, max_value=60.0)" }, "airing_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='airing_timer', cls=, multiplier=1, size=1), value=60.0, min_value=0.0, max_value=60.0)" }, "party_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_timer', cls=, multiplier=1, size=1), value=5.0, min_value=0.0, max_value=60.0)" }, "holidays_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_timer', cls=, multiplier=1, size=1), value=7.0, min_value=0.0, max_value=60.0)" }, "hysteresis": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='hysteresis', cls=, multiplier=10, size=1), value=0.1, min_value=0.0, max_value=5.0)" }, "day_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='day_target_temp', cls=, multiplier=10, size=2), value=24.0, min_value=10.0, max_value=35.0)" }, "night_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='night_target_temp', cls=, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "antifreeze_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='antifreeze_target_temp', cls=, multiplier=10, size=2), value=9.0, min_value=5.0, max_value=30.0)" }, "thermostat_parameters": true } }, ```
Night mode ```json "thermostats": { "0": { "state": 0, "current_temp": 26.044160842895508, "target_temp": 10.0, "contacts": false, "schedule": false, "thermostat_sensors": true, "mode": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='mode', cls=, multiplier=1, size=1), value=0.0, min_value=0.0, max_value=7.0)" }, "party_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_target_temp', cls=, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "holidays_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_target_temp', cls=, multiplier=10, size=2), value=15.0, min_value=10.0, max_value=35.0)" }, "correction": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='correction', cls=, multiplier=1, size=1), value=100.0, min_value=60.0, max_value=140.0)" }, "away_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='away_timer', cls=, multiplier=1, size=1), value=3.0, min_value=0.0, max_value=60.0)" }, "airing_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='airing_timer', cls=, multiplier=1, size=1), value=60.0, min_value=0.0, max_value=60.0)" }, "party_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_timer', cls=, multiplier=1, size=1), value=5.0, min_value=0.0, max_value=60.0)" }, "holidays_timer": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_timer', cls=, multiplier=1, size=1), value=7.0, min_value=0.0, max_value=60.0)" }, "hysteresis": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='hysteresis', cls=, multiplier=10, size=1), value=0.1, min_value=0.0, max_value=5.0)" }, "day_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='day_target_temp', cls=, multiplier=10, size=2), value=24.0, min_value=10.0, max_value=35.0)" }, "night_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='night_target_temp', cls=, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "antifreeze_target_temp": { "__type": "", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='antifreeze_target_temp', cls=, multiplier=10, size=2), value=9.0, min_value=5.0, max_value=30.0)" }, "thermostat_parameters": true } }, ```
Safs commented 1 year ago

Thanks for you job and support!  

----- Reply to message ----- Subject: Re: [denpamusic/homeassistant-plum-ecomax] When room panel change day to night mode by schedule, that not reflect in HA thermostat. (Issue #33) Date: trešd., 4 okt. 2023, 16:14 From: Denis Paavilainen @.> To: denpamusic/homeassistant-plum-ecomax @.>

 

Thanks for the diagnostics!

Yep, sadly there's no binary flag that indicates us which mode we're running currently, only that we're running in schedule mode via "mode=0".

However, there's way, I could make this work (and I will), by comparing value of target_temp sensor with day_target_temp and night_target_temp parameters, when mode=0 to determine thermostat current mode. This will fail in at least one edge case, when both day and night mode set to the same temperature, but that's probably best we can do right now.

I'll implement required changes by the next minor version. Please wait for the release.

Thanks again for your help!

-- To make it easier to find this info, following is thermostat info from the files, that you've provided. Day mode

"thermostats": { "0": { "state": 0, "current_temp": 26.885530471801758, "target_temp": 24.0, "contacts": false, "schedule": false, "thermostat_sensors": true, "mode": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='mode', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=0.0, min_value=0.0, max_value=7.0)" }, "party_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "holidays_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=15.0, min_value=10.0, max_value=35.0)" }, "correction": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='correction', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=100.0, min_value=60.0, max_value=140.0)" }, "away_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='away_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=3.0, min_value=0.0, max_value=60.0)" }, "airing_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='airing_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=60.0, min_value=0.0, max_value=60.0)" }, "party_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=5.0, min_value=0.0, max_value=60.0)" }, "holidays_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=7.0, min_value=0.0, max_value=60.0)" }, "hysteresis": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='hysteresis', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=1), value=0.1, min_value=0.0, max_value=5.0)" }, "day_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='day_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=24.0, min_value=10.0, max_value=35.0)" }, "night_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='night_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "antifreeze_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='antifreeze_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=9.0, min_value=5.0, max_value=30.0)" }, "thermostat_parameters": true } },

Night mode

"thermostats": { "0": { "state": 0, "current_temp": 26.044160842895508, "target_temp": 10.0, "contacts": false, "schedule": false, "thermostat_sensors": true, "mode": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='mode', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=0.0, min_value=0.0, max_value=7.0)" }, "party_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "holidays_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=15.0, min_value=10.0, max_value=35.0)" }, "correction": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='correction', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=100.0, min_value=60.0, max_value=140.0)" }, "away_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='away_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=3.0, min_value=0.0, max_value=60.0)" }, "airing_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='airing_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=60.0, min_value=0.0, max_value=60.0)" }, "party_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='party_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=5.0, min_value=0.0, max_value=60.0)" }, "holidays_timer": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='holidays_timer', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=1, size=1), value=7.0, min_value=0.0, max_value=60.0)" }, "hysteresis": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='hysteresis', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=1), value=0.1, min_value=0.0, max_value=5.0)" }, "day_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='day_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=24.0, min_value=10.0, max_value=35.0)" }, "night_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='night_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=10.0, min_value=10.0, max_value=35.0)" }, "antifreeze_target_temp": { "type": "<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>", "repr": "ThermostatParameter(device=Thermostat, description=ThermostatParameterDescription(name='antifreeze_target_temp', cls=<class 'pyplumio.structures.thermostat_parameters.ThermostatParameter'>, multiplier=10, size=2), value=9.0, min_value=5.0, max_value=30.0)" }, "thermostat_parameters": true } },

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

 

denpamusic commented 1 year ago

Thanks for you job and support!

You're welcome!

There is also problem to show "idle"state: image

This has now been fixed. See #34.

denpamusic commented 1 year ago

This is now done in https://github.com/denpamusic/homeassistant-plum-ecomax/commit/af61dbaa69220bfb5e09d02dbe89160fbb29c124.

To be totally honest, I'm not in love with this solution. It's pretty inelegant and might have some unexpected problems beyond mentioned edge case, but a least it would generally work and shouldn't break anything else. That being said, this is probably the only way to make ecoSTERS work nicely with HASSes climate entity.

Either way, you can now wait until v0.3.11 release or try it right away by installing a main branch via HACS as described here.

Safs commented 1 year ago

Thanks, it's working now.

denpamusic commented 1 year ago

Awesome! Thanks for the testing!👍