a blueprint that does schedy re-evaluate as suggested here
# This causes a re-evaluation of all schedules whenever an attribute of the sun
# entity changes. Such a trick is required in order to have the schedules re-evaluated
# regularly. Otherwise, the schedules would only be re-evaluated at start/end times.
# A better way of ensuring regular re-evaluation would be to create an automation
# in HA that fires a schedy_reevaluate event every 15 minutes, so better go that route.
# It will cause less load and don't spam your log too much.
Thnaks for the reply
I have setup using the generich thermostat and external sensors, originally using the TH16 on board but migrated to Xiaomi Aqara
The issue with this setup is that they turn on at the time and min temp set, wait to for the room to get to temp then turn off and thats where the issue is.
These electric storage heaters come on, heat (element in a clay core) and then keep releasing heat evemn after turned off and that where the issue comes in
The room gets to temp, but the heaters keep radiating heat so when the sensor hots the desired temp, the heater switches off but it then keeps radiating and goes over the desired temp and keeps going as the heater eventaully starts to cool but then as the room cools down the heater then will kick in again but has to first heat up and start to radiate heat thus the temp in the room dips below temp until they get going again
Hope that makes sense
So, Yes they are setup and turn on/off as supposed to, I can control manually to turn on/off but as they are designed to be on for 15 mins and off for 15 min having them just based on temp alone creates this yoyo effect I am seeing in the room temp as above
The manufactures dumb thermostat simply turns on/of every 15 min during desired times if the temp is below/above the desired temp and creates an even temp in the room - I guess they spent a lot of money figuring 15min on/off is the “magic” number
Anyway,
I have countered this yoy effect by creating the 15 min on and 15 min off schedule as described above within schedy and seems to work very well to keep an even temp so in essence my setup is working, just not very elegant behind the scenes
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.
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,
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
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!
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
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
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
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
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
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!