Heaty will die, Schedy be born!

Thanks, I will give this a go in a single room and see how it goes

Currently I have about 5 watched entities and have 11 rooms I apply this to so may take some time to test

I will feedback as it will certaininy bring me back to a much small config than my previsous 4000+ lines and my now 800 lines

Once again, thank for the suggestions

Power to schedy !

I have started a monthly donation to schedy. Only 10 €, but it’s something.
I think Home Assistant will have a great future. The only really open system with a good UI. And schedy is a powerful control system with all the possibilities you can imagine.

My wish for schedy is:
- a forum section of its own with well structured topics
- an improved description also with a chapter for HA beginners who have never heard of Python before
- More blueprints
- And at some point a user interface

Until the wishes are fulfilled, I will donate monthly

Greetings Markus

Hello @roschi !

I have tried many schedule solutions. This one is of course the most complete, unfortunately there is no interface for the end user.

I saw that it was not possible to use input_numbers, it’s good for the temperament for example, but why not also use input_datetime (with time only) in order to be able to manage a Lovelace control interface?

It will never be a real interface for Schely but it would allow to present all the variables to the end user. Well, almost all of them…

Have a look at the scheduler card below, it has a custom component and lovelace interface. Unfortunately it has some issue controlling climate entities.

If both @roshi and the dev of scheduler-card can work together it could bring schedy to the next level.

2 Likes

I know very well the work of the developer of this. Nice work. But this scheduler is not at the same functional level as Schedy, if it was easy it would be known !
But it has the advantage of not needing appDaemon and of doing very well for simple things (no overflow from one day to another, no rescheduling, no end action on a beach, etc… this said it is only at its beginning, so you have to be indulgent).

It could be a good inspiration to build a GUI in Schedy…

Hi All,

I have just started with Schedy, and i must say i am impressed! However i have a challange which i have not yet solved.

Let me explain a bit;
my house has 3 floors

  • 1st floor a thermostat and floor heating (with a smart radiator valve, seen as a climate device in HA)
  • 2nd floor a thermostat and 4 rooms (each with one or more radiators, all with the same smart valves)
  • 3rd floor 2 rooms (also with radiators and the same smart valves)

Both thermostats are attached to the same central heating system. The thermostat on the ground floor is also attached to a valve for the floor heating. So, if i turn the thermostat on the 2nd floor up, it will not heat my floor heating on the 1st floor. All works as designed, and very happy with it.

Now comes my challange; I can get schedy to set the correct values on my radiator valves, however i also need to send a signal to my thermostat of the corresponding floor to start heating (eg. turn temp to 25 degrees)

I have not yet found a method to do this in Schedy, and before i dive into the Custom Actors i wanted to know if there is a simpler solution for this.

Hi,

@Goethe14

Thanks for your recurring donation! This means a lot to me.

My wish for schedy is:

  • a forum section of its own with well structured topics

Well, this forum is operated by the Home Assistant project. I don’t know if Schedy is important enough to justify a separate forum section, although I agree this would make finding relevant information and questions that have already been asked easier. Maybe I can ask them and see how it goes.

  • an improved description also with a chapter for HA beginners who have never heard of Python before

That should be doable and is something I already tried when I reworked the docs last time. For instance, the tutorial was added back then. I created an issue where we can collect ideas for what should be included in such an improved introduction.

  • More blueprints

I guess you mean something like the tips and tricks section we have in the docs right now? Maybe we can rename this section, e.g. to “Examples” and include more snippets in there? Or maybe we want a separate repository on GitHub where the community can submit their snippets? That’s even better I think. In any case, somebody has to moderate it and process what’s being submitted.

  • And at some point a user interface

I’m afraid this won’t happen, at least not from my side. Beside the fact that I totally dislike GUIs, I can’t imagine a way of representing schedules with expressions in a graphical way that’s superior to the YAML representation. And of course, properly developing such an interface would require a tremenduous amount of work which I simply can’t handle.

Right now, Schedy is based on AppDaemon, which is something I wasn’t too happy with from the beginning, but there was no real alternative and that’s how things have evolved. I plan to migrate it to a new underlying app platform which I started developing already, so that probably is the next big step for Schedy and will be labor-intensive enough on its own.

Until the wishes are fulfilled, I will donate monthly

Then better stop it right away…

No, seriously, I really appreciate donations, they show me that others could take advantage of the things I’m building in my free time and that all the hours spent with writing docs and giving support are good for something. Every now and then, I also implement features that are requested often but which I don’t need or use myself (I’d probably been fine with only 50% of the amount of code Schedy has right now). And that’s totally ok.

However, I don’t want to leave you under the impression that, by donating, you buy the right to demand new features or premium support. Don’t get me wrong please, I’m not supposing anybody (esp. not you, @Goethe14) to think that way, just want to make it clear. Such a subscription model would be an interesting idea of course, but I simply don’t have the time and resources to offer such guarantees, neither paid nor for free. As you probably noted already - and I’m sorry for and discouraged about that myself - I hardly even found the time to answer to this thread over the last weeks.

So yes, I’m always open for suggestions on how to make Schedy a better experience for all, but don’t expect prompt reactions, especially not over the next months.

That being said, happy new year to you all!

Best regards
Robert

1 Like

I hope more users will follow.
For my experience Home-assistant with schedy is the only flexible control for your smart home heating and switching. So it is worth to develop and spread the system.
Possibly a forum outside of the community.home-assistant.io is clearer. Also GitHub seems a litlle bit confusing for normal user. And this must be the aim to attract normal no nerd user to the system. But to maintain such a forum is another time expansive thing. First we can try it on https://github.com/efficiosoft/hass-apps/issues/56.
Regarding user interface I understand a GUI is not the way. A little more simple as yaml would help a lot for beginners. But the big range of options with schedy is great benefit and shouldnt reduced.
At the moment I improve my system with 3 different thermostat types for floor heating and radiators and some switches for powerline. I will come with the topics at (https://github.com/efficiosoft/hass-apps/issues/56). Best Markus

What type of thermostat you use ? You can use only the temperature of your thermostat. Or you create an expression with an external sensor. An example is somewhere in that forum.

The thermostat is an Tuya thermostat (https://www.moeshouse.com/collections/smart-thermostat/products/white-zigbee-smart-thermostat-programmable-temperature-controller-zigbee-hub-required-for-water-gas-boiler)

But for now i (together with my friend @Mr_Q) we figured out this solution, still needs more work on it, but for now it works.

Home assistant automations;

  • i always want the rediator valves to stay on mode auto.
  • when there is no more demand, put thermostat to 20
  • when there is demand somewhere, put thermostat on 25
automation:
  - id: "terug_naar_auto"
    alias: "Thermostaat weer naar auto"
    trigger:
      platform: state
      entity_id: climate.radiator_hobbykamer_b92
      attribute: system_mode
      from: auto
    action:
      - service: climate.set_hvac_mode
        data:
          entity_id: "{{ trigger.entity_id }}"
          hvac_mode: auto
  - id: "heating_demand"
    alias: "Heating demand"
    trigger:
      platform: numeric_state
      entity_id: sensor.heating_demand
      above: 0
    action:
      - service: climate.set_temperature
        data:
          entity_id: climate.thermostat_beneden_109
          temperature: 22 # TODO, huidige temp + 1 ofzo
          hvac_mode: heat
  - id: "heating_no_demand"
    alias: "Heating no demand"
    trigger:
      platform: numeric_state
      entity_id: sensor.heating_demand
      below: 1
    action:
      - service: climate.set_temperature
        data:
          entity_id: climate.thermostat_beneden_109
          temperature: 20 # TODO, terug naar vorige temp
          hvac_mode: heat

A template sensor, which counts all radiator valves which have demand (position of the valve > 0)

sensor:
  - platform: template
    sensors:
      heating_demand:
        friendly_name: "Heating demand"
        value_template: "{{ states.climate|selectattr('attributes.radiator','eq',True)|selectattr('attributes.position','gt',0)|list|count }}"

And then all my radiator valves have a custom attribute (customize.yaml)

climate.radiator_hobbykamer_b92:
  radiator: true

And then the schedy config is just a normal one, with actor: thermostat

Ideas on this are welcome ofcourse! :slight_smile:

This solution is a static one and runs the whole day with one temperature. You dont activate different times. And may be you push a button demand or no demand.
Schedy gives me the option to heat the bath in the morning and evening and the other rooms depending of the presence of absence of persons and weekday and so on. I use also different thermostats. Two also from moeshouse. They have a lot of havac modes and you must define a template. This is an extra chapter …

No, it’s not static.

The mode of the actuators is auto because it then itself controls the valve position. In my schedy config I do have times for different rooms.

I am not planning on using the schedules of the thermostats or actuators.

I am using schedy for 1 year on RPi 4 and hass.io and it works pretty cool. Now I try to migrate from RPI to NAS and Docker containers. But when I open window, schedy do not set thermostat to off. I use the same yaml file, but in Docker it do not works. Any idea what is wrong?

log from docker
2021-01-25 18:44:20.813177 INFO schedy_heating: *** Welcome to schedy 0.8.3, running on AppDaemon 4.0.3.
2021-01-25 18:44:20.815620 INFO schedy_heating: *** 
2021-01-25 18:44:20.817785 INFO schedy_heating: *** This is an app from the hass-apps package.
2021-01-25 18:44:20.820199 INFO schedy_heating: ***   DOCS: https://hass-apps.readthedocs.io/en/stable/
2021-01-25 18:44:20.822617 INFO schedy_heating: *** 
2021-01-25 18:44:20.825126 INFO schedy_heating: *** You like this app, want to honor the effort put into
2021-01-25 18:44:20.827272 INFO schedy_heating: *** it, ensure continuous development and support?
2021-01-25 18:44:20.829384 INFO schedy_heating: *** Then please consider making a donation.
2021-01-25 18:44:20.831756 INFO schedy_heating: ***   DONATE: https://hass-apps.readthedocs.io/en/stable/#donations
2021-01-25 18:44:20.834126 INFO schedy_heating: *** Thank you very much and enjoy schedy!
2021-01-25 18:44:20.836320 INFO schedy_heating: *** 
2021-01-25 18:44:20.889597 INFO schedy_heating: --- Actor type is: 'thermostat'
2021-01-25 18:44:20.917934 INFO schedy_heating: --> [R:loznice] [A:climate.loznice] Received value of 20.0��.
/usr/local/lib/python3.8/asyncio/events.py:81: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
  self._context.run(self._callback, *self._args)
2021-01-25 18:44:21.048262 INFO schedy_heating: --> [R:obyvak] [A:climate.obyvaci_pokoj] Received value of 23.0��.
2021-01-25 18:44:21.191282 INFO schedy_heating: --> [R:pokoj_Vitek] [A:climate.pokoj_vitek] Received value of 18.0��.
2021-01-25 18:44:21.318910 WARNING schedy_heating: schedy_heating: Entity person.vitek not found in namespace default
2021-01-25 18:44:21.352416 INFO schedy_heating: --> [R:pokoj_deti] [A:climate.pokoj_deti] Received value of 23.0��.
2021-01-25 18:44:21.491674 INFO schedy_heating: --> [R:pokoj_hoste] [A:climate.pokoj_pro_hosty] Received value of 20.0��.
2021-01-25 18:44:22.046070 INFO schedy_heating: <-- [R:pokoj_hoste] Value set to 22.0��.  [manual]
2021-01-25 18:44:22.050976 INFO schedy_heating: --- [R:pokoj_hoste] Re-applying the schedule not before 19:31:46 (in 0:47:24.396054).
2021-01-25 18:44:22.195364 INFO schedy_heating: --> [R:pokoj_hoste] [A:climate.pokoj_pro_hosty] Received value of 22.0��.
2021-01-25 18:44:22.225347 INFO schedy_heating: --> [R:koupelna nahore] [A:climate.koupelna_patro] Received value of 23.0��.
2021-01-25 18:44:22.360462 INFO schedy_heating: --> [R:koupelna dole] [A:climate.koupelna_prizemi] Received value of 23.0��.
2021-01-25 18:44:22.490756 INFO schedy_heating: *** Initialization done.
2021-01-25 18:44:22.499386 INFO AppDaemon: App initialization complete
2021-01-25 18:45:21.501192 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_pokoj_pro_hosty' changed from 'off' to 'on', reevaluating <Room R:pokoj_hoste>.
2021-01-25 18:45:32.982050 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_pokoj_pro_hosty' changed from 'on' to 'off', reevaluating <Room R:pokoj_hoste>.
2021-01-25 18:46:00.633968 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_koupelna' changed from 'off' to 'on', reevaluating <Room R:koupelna dole>.
2021-01-25 18:46:08.896755 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_koupelna' changed from 'on' to 'off', reevaluating <Room R:koupelna dole>.
2021-01-25 18:46:18.911588 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_koupelna' changed from 'off' to 'on', reevaluating <Room R:koupelna dole>.
2021-01-25 18:46:43.289307 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_koupelna' changed from 'on' to 'off', reevaluating <Room R:koupelna dole>.

in haas.io it works like this

2021-01-25 19:10:12.936742 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_deti' changed from 'off' to 'on', reevaluating <Room R:pokoj_deti>.
2021-01-25 19:10:14.088639 INFO schedy_heating: --- [R:pokoj_deti] Storing value 23.0�� before overlaying.
2021-01-25 19:10:14.181551 INFO schedy_heating: <-- [R:pokoj_deti] Value set to OFF.  [scheduled]
2021-01-25 19:10:14.281081 INFO schedy_heating: --> [R:pokoj_deti] [A:climate.tado_termostat_pokoj_deti] Received value of OFF.

EDIT: Found the mistake. I forgot that the customize.yaml has to be manually included into the configuration.yaml

@roschi

Thanks for the advise and examples, I landed up doing the following although I am sure there are cleaner ways to do the rules, but hey they are working for me :slight_smile:

They turn things on/off when needed based on watched entities (input_boolean , input_select and sensors states) such as summer/winter (Temperature based), who’s home and who’s not

Main thing is I now have a much shorter codebase

So, I created two automations that turn on or off an input_boolean at the times the heaters should be on/off and set this as a watched entity

I then added the following rule into each room, could not use the append or prepend as I have room specific rules and schedulesnippits that conflict although I do use both for other

        - x: "17 if active_time() == 'off' else Next()"

Here is an example of a standard room

  rooms:
    entrance:
      rescheduling_delay: 60
      actors:
        climate.entrance_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_bedtime() == 'on' else Next()"
        - x: "10 if is_on('binary_sensor.frontdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.backdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.slidingdoor_contact') else Next()"
        - x: "17 if active_time() == 'off' else Next()"
        - x: "IncludeSchedule(schedule_snippets['special']) if heating_mode() == 'Special' else Next()"
        - x: "IncludeSchedule(schedule_snippets['home']) if heating_mode() == 'MJPAway' else Next()"
        - x: "IncludeSchedule(schedule_snippets['home']) if heating_mode() == 'Home' else Next()"
        - v: 17

If anyone is interested, here is my full heating schedule

10 rooms, 13 heaters
It monitors if:

  • Doors are open
  • Summer/Winter Season
  • Variable electricity tarif (Octopus Agile or Go)
  • Who’s home
  • High house total energy (V & A)
  • If at Work or Off work (We work from Home)
  • Holiday, Home or Away modes etc
schedy_heating_season:  # This is our app instance name.
  module: hass_apps_loader
  class: SchedyApp
  actor_type: thermostat
  expression_environment: |
    def heating_mode():
        return state("input_select.heating_mode")
    def heating_season():
        return state("input_select.heating_season")
    def front_door():
        return state("binary_sensor.frontdoor_contact")
    def back_door():
        return state("binary_sensor.backdoor_contact")
    def sliding_door():
        return state("binary_sensor.slidingdoor_contact")
    def octopus_price():
        return state("input_select.octopus_price")
    def octopus_tariff():
        return state("input_select.octopus_tariff")
    def power_saving():
        return state("input_boolean.power_saving")
    def heating_bedtime():
        return state("input_boolean.heating_bedtime")
    def gdp_location():
        return state("input_select.gdp_status")
    def bsp_location():
        return state("input_select.bsp_status")
    def mjp_location():
        return state("input_select.mjp_status")
    def jmp_location():
        return state("input_select.jmp_status")
    def mandj_location():
        return state("input_select.mandj_status")
    def heating_active_minutes():
        return state("input_boolean.heating_active_minutes")

  watched_entities:
  - input_select.heating_mode
  - input_select.heating_season
  - input_boolean.heating_active_minutes
  - input_select.octopus_price
  - input_select.octopus_tariff
  - input_boolean.power_saving
  - input_boolean.heating_bedtime
  - binary_sensor.frontdoor_contact
  - binary_sensor.backdoor_contact
  - binary_sensor.slidingdoor_contact
  - input_select.mjp_status
  - input_select.jmp_status
  - input_select.gdp_status
  - input_select.bsp_status
  - input_select.mandj_status

  schedule_snippets:
    bedrooms:
    - { v: 17, start: "07:00", end: "20:00" }
    - { v: 20, start: "20:00", end: "22:00" }
    - { v: 18, start: "22:00", end: "07:00" }
    bedroom4_mjpaway:
    - { v: 17, start: "00:00", end: "18:00" }
    - { v: 20.1, start: "18:00", end: "22:00" }
    - { v: 18, start: "22:00", end: "00:00" }
    home: # Used with rules - x: "IncludeSchedule(schedule_snippets['home']) if heating_mode() == 'Home' else Next()"
    - { v: 17, start: "00:00", end: "08:00" }
    - { v: 18, start: "08:00", end: "20:00" }
    - { v: 17, start: "20:00", end: "00:00" }
    holiday: # Used with rules - x: "IncludeSchedule(schedule_snippets['holiday']) if heating_mode() == 'Holiday' else Next()"
    - { v: 17, start: "00:00", end: "00:00" }
    default: # Used with rules - { "IncludeSchedule(schedule_snippets['default']) }
    - { v: 17.2, start: "00:00", end: "00:00" }
    octopusagile: # Used with rules - { "IncludeSchedule(schedule_snippets['default']) }
    - { v: 17, start: "16:00", end: "19:00" }
    officehours:
    - { v: 17, start: "00:00", end: "07:00" }
    - { v: 21, start: "07:00", end: "17:00" }
    - { v: 17, start: "17:00", end: "00:00" }
    lounge:
    - { v: 17, start: "00:00", end: "08:00" }
    - { v: 18, start: "08:00", end: "16:00" }
    - { v: 21, start: "16:00", end: "22:00" }
    - { v: 17, start: "22:00", end: "00:00" }
    lounge_offwork:
    - { v: 17, start: "00:00", end: "08:00" }
    - { v: 18, start: "08:00", end: "09:00" }
    - { v: 21, start: "09:00", end: "22:00" }
    - { v: 17, start: "22:00", end: "00:00" }
    lounge_mjpaway:
    - { v: 17, start: "00:00", end: "08:00" }
    - { v: 18, start: "08:00", end: "16:00" }
    - { v: 21, start: "16:00", end: "20:00" }
    - { v: 17, start: "20:00", end: "00:00" }


  schedule_prepend:
  - x: "16 if octopus_price() == 'Peak' else Next()"
  - x: "16 if power_saving() == 'On' else Next()"
  - x: "16 if heating_mode() == 'Away' else Next()"
  - x: "18 if heating_season() == 'Summer' else Next()"
  - x: "17 if heating_mode() == 'Holiday' else Next()"

  schedule_apppend:
  - x: "IncludeSchedule(schedule_snippets['octopusagile']) if octopus_tariff() == 'Agile'"

  rooms:
    entrance:
      rescheduling_delay: 60
      actors:
        climate.entrance_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_bedtime() == 'on' else Next()"
        - x: "10 if is_on('binary_sensor.frontdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.backdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.slidingdoor_contact') else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['home']) if heating_mode() == 'Home' else Next()"
        - v: 17

    downstairsufh:
      rescheduling_delay: 60
      actors:
        climate.entrance_ufh:
        climate.passage_ufh:
        climate.diningroom_ufh:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_bedtime() == 'on' else Next()"
        - x: "10 if is_on('binary_sensor.frontdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.backdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.slidingdoor_contact') else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['home']) if heating_mode() == 'Home' else Next()"
        - v: 17

    diningroom:
      rescheduling_delay: 60
      actors:
        climate.diningroom_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_bedtime() == 'on' else Next()"
        - x: "10 if is_on('binary_sensor.frontdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.backdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.slidingdoor_contact') else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['home']) if heating_mode() == 'Home' else Next()"
        - v: 17

    kitchen:
      rescheduling_delay: 60
      actors:
        climate.kitchen_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_bedtime() == 'on' else Next()"
        - x: "10 if is_on('binary_sensor.frontdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.backdoor_contact') else Next()"
        - x: "10 if is_on('binary_sensor.slidingdoor_contact') else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['home']) if heating_mode() == 'Home' else Next()"
        - v: 17

    lounge:
      rescheduling_delay: 60
      actors:
        climate.lounge_front_heater:
        climate.lounge_side_heater:
      schedule:
      - weekdays: 1-5
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_bedtime() == 'on' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['lounge_offwork']) if heating_mode() == 'OffWork' else Next()"
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['lounge_mjpaway']) if mjp_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['lounge']) if heating_mode() == 'Home' else Next()"
        - v: 17
      - weekdays: 6-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_bedtime() == 'on' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['lounge_offwork']) if heating_mode() == 'OffWork' else Next()"
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['lounge_mjpaway']) if mjp_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['lounge']) if heating_mode() == 'Home' else Next()"
        - v: 17

    office:
      rescheduling_delay: 60
      actors:
        climate.office_side_heater:
        climate.office_front_heater:
      schedule:
      - weekdays: 1-5
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['default']) if heating_mode() == 'OffWork' else Next()"
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['officehours']) if mjp_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['officehours']) if heating_mode() == 'Home' else Next()"
        - v: 17
      - weekdays: 6-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - v: 17

    masterbathroom:
      rescheduling_delay: 60
      actors:
        climate.master_bathroom_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - v: 17

    guestbathroom:
      rescheduling_delay: 60
      actors:
        climate.guest_bathroom_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "23 if octopus_price() == 'Plunge' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - v: 17

    bedroom1:
      rescheduling_delay: 60
      actors:
        climate.bedroom1_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "17 if gdp_location() == 'Away' else Next()"
#        - x: "20 if heating_bedtime() == 'on' else Next()"
#        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
#        - x: "IncludeSchedule(schedule_snippets['bedrooms'])"
        - v: 17

    bedroom2:
      rescheduling_delay: 60
      actors:
        climate.bedroom2_heater:
      schedule:
      - weekdays: 1-7
        rules:
#        - x: "20 if heating_bedtime() == 'on' else Next()" # With guests
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
#        - x: "IncludeSchedule(schedule_snippets['bedrooms'])" # With guests
#      - v: 17 # With guests
        - v: 17

    bedroom3:
      rescheduling_delay: 60
      actors:
        climate.bedroom3_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "17 if bsp_location() == 'Away' else Next()"
        - x: "20 if heating_bedtime() == 'on' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['bedrooms']) if heating_mode() == 'Home' else Next()"
        - v: 17

    bedroom4:
      rescheduling_delay: 60
      actors:
        climate.bedroom4_heater:
      schedule:
      - weekdays: 1-7
        rules:
        - x: "20 if heating_bedtime() == 'on' else Next()"
        - x: "17 if heating_active_minutes() == 'off' else Next()" # Used to turn heating on @ xx:00 & xx:30 and off @ xx:15 & xx:45
        - x: "IncludeSchedule(schedule_snippets['default']) if mandj_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['bedroom4_mjpaway']) if mjp_location() == 'Away' else Next()"
        - x: "IncludeSchedule(schedule_snippets['bedrooms']) if heating_mode() == 'Home' else Next()"
        - v: 17
 

3 Likes

Waiting for input_datetime:

What is the format of the input_number: for the time?

I found this site where its author has circumvented the absence of input_datetime: by a monstrous complexity…

Well, yes and no :slight_smile:

The complexity is there because of requirmenet to have nice sliders in Lovelace to set every aspect of the planning (the second screenshot). Not to put the values into Schedy config.

It is working exactly as expected for two heating seasons already :wink:

It took me a long time, but your GitHub helped me understand a lot of things, even if I did it a bit differently. Thanks a lot!

I have a Mitsubishi mini-split that is working great with Schedy (thank you!). My unit does not have the auto setting and I have it configured like this:

  module: hass_apps_loader
  class: SchedyApp

  actor_type: thermostat

  expression_environment: |
    def hvac_mode():
      return state("climate.porch")

  schedule_snippets:
    cooling_season:
      - v: 76
        rules:
          - {start: "20:30", end: "07:00", weekdays: 1-5}
          - {start: "20:30", end: "07:30", weekdays: 6-7}
      - v: 72
    heating_season:
      - v: 45
        rules:
          - {start: "21:00", end: "07:00"}
          - {start: "22:00", end: "07:00"}
          - {start: "23:00", end: "07:00"}
          - {start: "01:00", end: "07:00"}
          - {start: "02:00", end: "07:00"}
      - v: 68
    drying:
      - v: 68
        rules:
          - {start: "20:30", end: "07:00"}
      - v: 70

  rooms:

    porch:

      actors:
        climate.porch:
          supports_hvac_modes: false
          max_temp: 95
          min_temp: 45

      rescheduling_delay: 0

      schedule:
        - x: "IncludeSchedule(schedule_snippets['cooling_season']) if hvac_mode() == 'cool' else Next()"
        - x: "IncludeSchedule(schedule_snippets['heating_season']) if hvac_mode() == 'heat' else Next()"
        - x: "IncludeSchedule(schedule_snippets['drying']) if hvac_mode() == 'dry' else Next()"

  watched_entities:
    - climate.porch

My only issue is that when I turn the unit OFF, I get lots of these messages in my log:

ERROR porch_thermostat_schedule: !!! [R:porch] [A:climate.porch] Invalid target temperature, ignoring thermostat.

Is there anything I can do to suppress this message - or do I just have my config messed up?

Thanks again for such a great app!

hi there,
I am new at the home assistant topic…
Now I get 3 “essentials smart home thermostats” and want to implement them in schedy.
My system is running on a Synology 220+ VM and I use the Zigbee Conbee2Stick to connect the thermostats.
I am not sure, if my code is wrong or what I do wrong, but the schedule doesnt works :confused:
Maybe you can help me, because I dont find the problem (watched some youtube videos and tutorials).
For test I reduced the time of the schedule to 1min.

  module: hass_apps_loader
  class: SchedyApp

  actor_type: thermostat

  rooms:

    bad:
      rescheduling_delay: 1
      actors:
        climate.bad_thermostat:
      schedule:
      - v: 21
        rules:
        - weekdays: 1-5
          rules:
          - { start: "05:00", end: "08:30" }
        - weekdays: 6-7
          rules:
          - { start: "07:30", end: "10:30" }
        - weekdays: 1-7
          rules:
          - { start: "18:00", end: "22:00" }

    büro2:
      rescheduling_delay: 1
      actors:
        climate.buero_thermostat:
      schedule:
      - v: 21
        rules:
        - weekdays: 1-5
          rules:
          - { start: "05:00", end: "08:30" }
        - weekdays: 6-7
          rules:
          - { start: "07:30", end: "10:30" }
        - weekdays: 1-7
          rules:
          - { start: "18:00", end: "22:00" }

    schlafzimmer:
      rescheduling_delay: 1
      actors:
        climate.schlafzimmer_thermostat:
      schedule:
      - v: 21
        rules:
        - weekdays: 1-5
          rules:
          - { start: "05:00", end: "08:30" }
        - weekdays: 6-7
          rules:
          - { start: "07:30", end: "10:30" }
        - weekdays: 1-7
          rules:
          - { start: "18:00", end: "22:00" }

I installed AppDaemon and added in /config/appdaemon/apps new .yaml named schedy_heating.yaml.

Is there anything what I have to configure that schedy works?

Hello,

I was migrate my Home Assistant to another HW (Synology NAS). I have installed HA and Appdaemon in docker.

I have problem with this :

|2021-02-28 19:35:34|stdout|2021-02-28 20:35:34.008082 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Gave up sending value after 10 retries.|
|---|---|---|
|2021-02-28 19:35:33|stdout|2021-02-28 20:35:33.006551 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Gave up sending value after 10 retries.|
|2021-02-28 19:35:32|stdout|2021-02-28 20:35:32.008210 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Gave up sending value after 10 retries.|
|2021-02-28 19:35:31|stdout|2021-02-28 20:35:31.008642 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Gave up sending value after 10 retries.|
|2021-02-28 19:35:08|stdout|2021-02-28 20:35:08.006959 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Gave up sending value after 10 retries.|
|2021-02-28 19:35:04|stdout|2021-02-28 20:35:04.007371 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:35:03|stdout|2021-02-28 20:35:03.006922 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:35:02|stdout|2021-02-28 20:35:02.006808 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:35:01|stdout|2021-02-28 20:35:01.006286 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:38|stdout|2021-02-28 20:34:38.006202 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:34|stdout|2021-02-28 20:34:34.006667 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:33|stdout|2021-02-28 20:34:33.006692 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:32|stdout|2021-02-28 20:34:32.006173 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:31|stdout|2021-02-28 20:34:31.007544 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:08|stdout|2021-02-28 20:34:08.006246 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:04|stdout|2021-02-28 20:34:04.006736 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:03|stdout|2021-02-28 20:34:03.007049 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:02|stdout|2021-02-28 20:34:02.006483 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:34:01|stdout|2021-02-28 20:34:01.006711 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:38|stdout|2021-02-28 20:33:38.006933 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:34|stdout|2021-02-28 20:33:34.007293 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:33|stdout|2021-02-28 20:33:33.006846 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:32|stdout|2021-02-28 20:33:32.007505 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:31|stdout|2021-02-28 20:33:31.008892 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:08|stdout|2021-02-28 20:33:08.006424 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:04|stdout|2021-02-28 20:33:04.006929 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:03|stdout|2021-02-28 20:33:03.006675 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:02|stdout|2021-02-28 20:33:02.006520 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:33:01|stdout|2021-02-28 20:33:01.006790 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:38|stdout|2021-02-28 20:32:38.007234 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:34|stdout|2021-02-28 20:32:34.007245 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:33|stdout|2021-02-28 20:32:33.006875 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:32|stdout|2021-02-28 20:32:32.006689 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:31|stdout|2021-02-28 20:32:31.007162 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:08|stdout|2021-02-28 20:32:08.007571 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:04|stdout|2021-02-28 20:32:04.007139 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:03|stdout|2021-02-28 20:32:03.007120 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:02|stdout|2021-02-28 20:32:02.006619 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:32:01|stdout|2021-02-28 20:32:01.009121 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:38|stdout|2021-02-28 20:31:38.006759 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:34|stdout|2021-02-28 20:31:34.007756 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:33|stdout|2021-02-28 20:31:33.006731 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:32|stdout|2021-02-28 20:31:32.006643 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:31|stdout|2021-02-28 20:31:31.006843 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:08|stdout|2021-02-28 20:31:08.007437 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:03|stdout|2021-02-28 20:31:03.411574 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:03|stdout|2021-02-28 20:31:03.006958 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:02|stdout|2021-02-28 20:31:02.006774 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:31:01|stdout|2021-02-28 20:31:01.006782 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:30:38|stdout|2021-02-28 20:30:38.008124 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|
|2021-02-28 19:30:33|stdout|2021-02-28 20:30:33.007210 WARNING schedy_heating: !!! [R:koupelna dole] [A:climate.koupelna_prizemi] Re-sending value due to missing confirmation.|
|2021-02-28 19:30:32|stdout|2021-02-28 20:30:32.392910 WARNING schedy_heating: !!! [R:koupelna nahore] [A:climate.koupelna_patro] Re-sending value due to missing confirmation.|
|2021-02-28 19:30:32|stdout|2021-02-28 20:30:32.009061 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.|
|2021-02-28 19:30:31|stdout|2021-02-28 20:30:31.007349 WARNING schedy_heating: !!! [R:loznice] [A:climate.loznice] Re-sending value due to missing confirmation.|
|2021-02-28 19:30:08|stdout|2021-02-28 20:30:08.008546 WARNING schedy_heating: !!! [R:pokoj_Vitek] [A:climate.pokoj_vitek] Re-sending value due to missing confirmation.|

Another example:

2021-03-01 06:20:03	stdout	2021-03-01 07:20:03.006655 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Gave up sending value after 10 retries.
2021-03-01 06:19:33	stdout	2021-03-01 07:19:33.007225 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:19:03	stdout	2021-03-01 07:19:03.007588 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:18:33	stdout	2021-03-01 07:18:33.008348 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:18:03	stdout	2021-03-01 07:18:03.008137 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:17:33	stdout	2021-03-01 07:17:33.007359 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:17:03	stdout	2021-03-01 07:17:03.007396 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:16:33	stdout	2021-03-01 07:16:33.008136 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:16:03	stdout	2021-03-01 07:16:03.007033 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:15:33	stdout	2021-03-01 07:15:33.007364 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:15:03	stdout	2021-03-01 07:15:03.006663 WARNING schedy_heating: !!! [R:obyvak] [A:climate.obyvaci_pokoj] Re-sending value due to missing confirmation.
2021-03-01 06:14:32	stdout	2021-03-01 07:14:32.617006 INFO schedy_heating: <-- [R:obyvak] Value set to 23.0��.  [manual]
2021-03-01 06:14:32	stdout	2021-03-01 07:14:32.031156 INFO schedy_heating: --- [R:obyvak] Restoring overlaid value 23.0��.
2021-03-01 06:14:31	stdout	2021-03-01 07:14:31.381801 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_terasa' changed from 'on' to 'off', reevaluating <Room R:obyvak>.
2021-03-01 06:14:28	stdout	2021-03-01 07:14:28.221837 INFO schedy_heating: <-- [R:obyvak] Value set to OFF.  [scheduled]
2021-03-01 06:14:28	stdout	2021-03-01 07:14:28.024529 INFO schedy_heating: --- [R:obyvak] Storing value 23.0�� before overlaying.
2021-03-01 06:14:26	stdout	2021-03-01 07:14:26.923818 INFO schedy_heating: --> Attribute 'state' of 'binary_sensor.okno_terasa' changed from 'off' to 'on', reevaluating <Room R:obyvak>.

Logs from restarting looks good, only values are not.

2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.872822 INFO AppDaemon: App initialization complete
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.869409 INFO schedy_heating: *** Initialization done.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.793644 INFO schedy_heating: --> [R:koupelna dole] [A:climate.koupelna_prizemi] Received value of OFF.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.720081 INFO schedy_heating: --> [R:koupelna nahore] [A:climate.koupelna_patro] Received value of OFF.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.664378 INFO schedy_heating: --> [R:pokoj_hoste] [A:climate.pokoj_pro_hosty] Received value of 23.0��.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.614559 INFO schedy_heating: --> [R:pokoj_deti] [A:climate.pokoj_deti] Received value of OFF.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.549136 INFO schedy_heating: --> [R:pokoj_Vitek] [A:climate.pokoj_vitek] Received value of OFF.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.489681 INFO schedy_heating: --> [R:obyvak] [A:climate.obyvaci_pokoj] Received value of OFF.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.435909 INFO schedy_heating: --> [R:loznice] [A:climate.loznice] Received value of OFF.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.425404 INFO schedy_heating: --- Actor type is: 'thermostat'
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.402848 INFO schedy_heating: *** 
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.402043 INFO schedy_heating: *** Thank you very much and enjoy schedy!
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.401242 INFO schedy_heating: ***   DONATE: https://hass-apps.readthedocs.io/en/stable/#donations
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.400434 INFO schedy_heating: *** Then please consider making a donation.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.399625 INFO schedy_heating: *** it, ensure continuous development and support?
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.398822 INFO schedy_heating: *** You like this app, want to honor the effort put into
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.398016 INFO schedy_heating: *** 
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.397212 INFO schedy_heating: ***   DOCS: https://hass-apps.readthedocs.io/en/stable/
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.396399 INFO schedy_heating: *** This is an app from the hass-apps package.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.395591 INFO schedy_heating: *** 
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.394751 INFO schedy_heating: *** Welcome to schedy 0.8.3, running on AppDaemon 4.0.3.
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.392294 INFO hello_world: You are now ready to run Apps!
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.391420 INFO hello_world: Hello from AppDaemon
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.245153 INFO AppDaemon: Initializing app schedy_heating using class SchedyApp from module hass_apps_loader
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.244165 INFO AppDaemon: Initializing app hello_world using class HelloWorld from module hello
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.220434 INFO AppDaemon: Loading App Module: /conf/apps/hass_apps_loader.py
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.171532 INFO AppDaemon: Loading App Module: /conf/apps/hello.py
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.169674 INFO AppDaemon: Adding /conf/apps to module import path
2021-03-01 06:34:40	stdout	2021-03-01 07:34:40.049596 INFO AppDaemon: Scheduler running in realtime
2021-03-01 06:34:39	stdout	2021-03-01 07:34:39.046129 INFO AppDaemon: Running on port 5050
2021-03-01 06:34:39	stdout	2021-03-01 07:34:39.045200 INFO AppDaemon: Starting Apps with 2 workers and 2 pins
2021-03-01 06:34:39	stdout	2021-03-01 07:34:39.044827 INFO AppDaemon: Found 2 total apps
2021-03-01 06:34:39	stdout	2021-03-01 07:34:39.043516 INFO AppDaemon: App 'schedy_heating' added
2021-03-01 06:34:39	stdout	2021-03-01 07:34:39.043154 INFO AppDaemon: App 'hello_world' added
2021-03-01 06:34:39	stdout	2021-03-01 07:34:39.022515 INFO AppDaemon: Got initial state from namespace default
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.955066 INFO HASS: Evaluating startup conditions
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.921518 INFO HASS: Connected to Home Assistant 2021.2.3
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.912567 INFO AppDaemon: Starting Dashboards
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.912271 INFO AppDaemon: Starting Admin Interface
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.909003 INFO AppDaemon: Starting API
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.896996 INFO AppDaemon: Using 'ws' for event stream
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.896711 INFO AppDaemon: Initializing HTTP
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.896356 INFO HASS: HASS Plugin initialization complete
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.896173 INFO HASS: HASS Plugin Initializing
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.722105 INFO AppDaemon: Loading Plugin HASS using class HassPlugin from module hassplugin
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.672998 INFO AppDaemon: Added log: Diag
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.672888 INFO AppDaemon: Added log: Access
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.672778 INFO AppDaemon: Added log: Error
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.672655 INFO AppDaemon: Added log: AppDaemon
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.672540 INFO AppDaemon: Configuration read from: /conf/appdaemon.yaml
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.672428 INFO AppDaemon: Python version is 3.8.2
2021-03-01 06:34:38	stdout	2021-03-01 07:34:38.672252 INFO AppDaemon: AppDaemon Version 4.0.3 starting

similar logs from working instance:

2021-03-01 08:01:17.306089 INFO AppDaemon: AppDaemon Version 4.0.3 starting
2021-03-01 08:01:17.306793 INFO AppDaemon: Python version is 3.8.2
2021-03-01 08:01:17.307630 INFO AppDaemon: Configuration read from: /conf/appdaemon.yaml
2021-03-01 08:01:17.308117 INFO AppDaemon: Added log: AppDaemon
2021-03-01 08:01:17.308696 INFO AppDaemon: Added log: Error
2021-03-01 08:01:17.309117 INFO AppDaemon: Added log: Access
2021-03-01 08:01:17.309639 INFO AppDaemon: Added log: Diag
2021-03-01 08:01:17.397732 INFO AppDaemon: Loading Plugin HASS using class HassPlugin from module hassplugin
2021-03-01 08:01:17.455021 INFO HASS: HASS Plugin Initializing
2021-03-01 08:01:17.455608 INFO HASS: HASS Plugin initialization complete
2021-03-01 08:01:17.456865 INFO AppDaemon: Initializing HTTP
2021-03-01 08:01:17.457817 INFO AppDaemon: Using 'ws' for event stream
2021-03-01 08:01:17.482430 INFO AppDaemon: Starting API
2021-03-01 08:01:17.489649 INFO AppDaemon: Starting Admin Interface
2021-03-01 08:01:17.490649 INFO AppDaemon: Starting Dashboards
/usr/local/lib/python3.8/site-packages/appdaemon/__main__.py:134: DeprecationWarning: Task.all_tasks() is deprecated, use asyncio.all_tasks() instead
  pending = asyncio.Task.all_tasks()
2021-03-01 08:01:17.513205 INFO HASS: Connected to Home Assistant 2021.1.5
/usr/local/lib/python3.8/site-packages/aiohttp/connector.py:964: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
  hosts = await asyncio.shield(self._resolve_host(
2021-03-01 08:01:17.686394 INFO HASS: Evaluating startup conditions
2021-03-01 08:01:17.773969 INFO AppDaemon: Got initial state from namespace default
2021-03-01 08:01:17.776064 INFO AppDaemon: App 'hello_world' added
2021-03-01 08:01:17.777280 INFO AppDaemon: App 'schedy_heating' added
2021-03-01 08:01:17.780083 INFO AppDaemon: App 'schedy_water' added
2021-03-01 08:01:17.783699 INFO AppDaemon: Found 3 total apps
2021-03-01 08:01:17.785058 INFO AppDaemon: Starting Apps with 3 workers and 3 pins
2021-03-01 08:01:17.787812 INFO AppDaemon: Running on port 5050
2021-03-01 08:01:18.794885 INFO AppDaemon: Scheduler running in realtime
/usr/local/lib/python3.8/asyncio/events.py:81: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
  self._context.run(self._callback, *self._args)
2021-03-01 08:01:18.810542 INFO AppDaemon: Adding /conf/apps to module import path
2021-03-01 08:01:18.815225 INFO AppDaemon: Loading App Module: /conf/apps/hello.py
2021-03-01 08:01:18.864266 INFO AppDaemon: Loading App Module: /conf/apps/hass_apps_loader.py
2021-03-01 08:01:18.882922 INFO AppDaemon: Initializing app hello_world using class HelloWorld from module hello
2021-03-01 08:01:18.885285 INFO AppDaemon: Initializing app schedy_heating using class SchedyApp from module hass_apps_loader
2021-03-01 08:01:18.995235 INFO AppDaemon: Initializing app schedy_water using class SchedyApp from module hass_apps_loader
2021-03-01 08:01:19.172515 INFO hello_world: Hello from AppDaemon
2021-03-01 08:01:19.174892 INFO hello_world: You are now ready to run Apps!
2021-03-01 08:01:19.182251 INFO schedy_heating: *** Welcome to schedy 0.8.3, running on AppDaemon 4.0.3.
2021-03-01 08:01:19.185116 INFO schedy_heating: *** 
2021-03-01 08:01:19.187659 INFO schedy_heating: *** This is an app from the hass-apps package.
2021-03-01 08:01:19.191028 INFO schedy_heating: ***   DOCS: https://hass-apps.readthedocs.io/en/stable/
2021-03-01 08:01:19.193496 INFO schedy_heating: *** 
2021-03-01 08:01:19.195422 INFO schedy_heating: *** You like this app, want to honor the effort put into
2021-03-01 08:01:19.198353 INFO schedy_heating: *** it, ensure continuous development and support?
2021-03-01 08:01:19.200475 INFO schedy_heating: *** Then please consider making a donation.
2021-03-01 08:01:19.202680 INFO schedy_heating: ***   DONATE: https://hass-apps.readthedocs.io/en/stable/#donations
2021-03-01 08:01:19.204992 INFO schedy_heating: *** Thank you very much and enjoy schedy!
2021-03-01 08:01:19.207258 INFO schedy_heating: *** 
2021-03-01 08:01:19.265291 INFO schedy_heating: --- Actor type is: 'thermostat'
2021-03-01 08:01:19.291548 INFO schedy_heating: --> [R:loznice] [A:climate.loznice] Received value of OFF.
/usr/local/lib/python3.8/asyncio/events.py:81: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
  self._context.run(self._callback, *self._args)
2021-03-01 08:01:19.416310 INFO schedy_heating: --> [R:obyvak] [A:climate.obyvaci_pokoj] Received value of OFF.
2021-03-01 08:01:19.557413 INFO schedy_heating: --> [R:pokoj_Vitek] [A:climate.pokoj_vitek] Received value of OFF.
2021-03-01 08:01:20.154484 INFO schedy_heating: <-- [R:pokoj_Vitek] Value set to 22.0��.  [scheduled]
2021-03-01 08:01:20.198966 INFO schedy_heating: --> [R:pokoj_Vitek] [A:climate.pokoj_vitek] Received value of 15.0��.
2021-03-01 08:01:20.256366 INFO schedy_heating: --> [R:pokoj_deti] [A:climate.pokoj_deti] Received value of OFF.
2021-03-01 08:01:20.272384 INFO schedy_heating: --> [R:pokoj_Vitek] [A:climate.pokoj_vitek] Received value of 22.0��.
2021-03-01 08:01:20.416635 INFO schedy_heating: --- [R:pokoj_deti] Restoring overlaid value OFF.
2021-03-01 08:01:20.464118 INFO schedy_heating: --> [R:pokoj_hoste] [A:climate.pokoj_pro_hosty] Received value of 23.0��.
2021-03-01 08:01:20.597552 INFO schedy_heating: --> [R:koupelna nahore] [A:climate.koupelna_patro] Received value of OFF.
2021-03-01 08:01:21.179528 INFO schedy_heating: <-- [R:koupelna nahore] Value set to 18.0��.  [scheduled]
2021-03-01 08:01:21.219345 INFO schedy_heating: --> [R:koupelna nahore] [A:climate.koupelna_patro] Received value of 23.0��.
2021-03-01 08:01:21.284069 INFO schedy_heating: --> [R:koupelna dole] [A:climate.koupelna_prizemi] Received value of OFF.
2021-03-01 08:01:21.291324 INFO schedy_heating: --> [R:koupelna nahore] [A:climate.koupelna_patro] Received value of 18.0��.
2021-03-01 08:01:21.893054 INFO schedy_heating: <-- [R:koupelna dole] Value set to 18.0��.  [scheduled]
2021-03-01 08:01:21.931177 INFO schedy_heating: --> [R:koupelna dole] [A:climate.koupelna_prizemi] Received value of 23.0��.
2021-03-01 08:01:21.941433 INFO schedy_heating: *** Initialization done.

appdaemon.yaml:

appdaemon:
  latitude: 51.23
  longitude: 16.975
  elevation: 250
  time_zone: Europe/Prague

  plugins:
    HASS:
      type: hass
      ha_url: http://192.168.0.150:8123

      token: iOiJIUzI1NiJ9.eyJpc3MiOiJjY2I2MTQxZWRkMDM0N2I4YjNmNTcwYWJmMDJlN2RmYSIsImlhdCI6MTYxNDU0MTYxNSwiZXhwIjoxOTI5OTAxNjE1fQ.4wn5T1P5glwFtIGxkZrQjc_i_wPucTDE4rNdYeKGBPQ

http:
  url: http://192.168.0.150:5050

admin:
api:
hadashboard:

In previous installation it works with the same (different IP and token)configuration yaml. Differences is only HA version. Any advice for me?

From HA I am not able to set temperature on or turn on a valve. I am able only turn off a valve. I remove container and make new with the same configuration (only different token), but still the same problem. Old instance of HA and Appdaemon is working.