Forum Francophone Home Assistant

Gestion des horaires de chauffage avec Schedy

Utilisant Home Assistant seulement depuis la version 106, je peux juste dire que sur 3 releases je n’ai pas rencontré de problème lors des mises à jour.

1 J'aime

Question :

Comment tu gères Jours fériés, Vacances et Vacances scolaires ?

Sur le même principe qu’avec le booléen homeoffice, en ajoutant des sensors de la platform workday dans le fichier configuration.yml.

binary_sensor:
  - platform: workday
    country: LU
    name: Jours de travail
  - platform: workday
    country: LU
    name: Vacances
    workdays: [holiday]
    excludes: []
    add_holidays: []

Puis dans Schedy :

  expression_environment: |
    def jours_de_travail():
      return is_on("binary_sensor.jours_de_travail")
    def vacances():
      return is_on("binary_sensor.vacances")

Qu’on peut utiliser dans une rules

...
        - rules:
          - x: "Next() if jours_de_travail() else Break()"
          - { v: 21, start: "08:00", end: "18:00" }
1 J'aime

Sais tu si on peut utiliser des input_xx dans schedy ? Si oui il devient facile de lui faire une interface…

Oui, les input_select ou input_boolean que Schedy suit avec la directive watched_entities

Mais pas les input_datetime ?

en fait avec n’importe quelle entité du moment que Schedy suit les changements d’état grâce à « watched_entities » et que tu en fais quelque chose dans les tests "- x: " avec ou sans l’aide d’une fonction « def »

2 J'aimes

J’ai ajouté à la fin de cet article un template intéressant à propos de la gestion des input_datetime à zéro… (pour éviter qu’un start et un stop avec une heure identique soit en true).

trigger:
- platform: template
value_template: '{{ (states.sensor.time.state == states.input_datetime.pompe_stop_p1.state[0:5]) and (states.input_datetime.pompe_start_p1.state != states.input_datetime.pompe_stop_p1.state) }}'

1 J'aime

Hello !

Je me suis replongé dans Schedy qui reste un très bon scheduler mais sans interface.

Sais tu si on peu utiliser des input_xx pour ses variables, genre :

schedule_snippets:
  kids:
  - v: input_number.confort
    rules:
    - weekdays: 1-5
      rules:
      - rules:
        - x: "Next() if heating_mode() != 'All Home' else Break()"
        - { start: "input_datetime.start_kids", end: "input_datetime.stop_kids" }

L’idée serait de pouvoir gérer une interface utilisateur adaptée…

EDIT : A priori c’est possible…

Hello,
Je dois avouer que j’ai abandonné Schedy, et même AppDaemon et les Automations au profit de NodeRed (merci @pitp2 pour le conseil). Marre de devoir redémarrer à chaque changement (ok la plupart des reloads sont arrivés depuis), d’éditer à plusieurs endroits (fichiers de config, automations, scripts, blueprints), de perdre les automations en cas de renommage d’entity.
NodeRed apporte la lecture facile/graphique, le debugging puissant (noeud debug), l’export/import de la configuration (ou juste flows, nodes) et bien sûr le rechargement rapide de la configuration.
Il peut même créer des entities à chaud si on veut interagir depuis le Dashboard HA.

La palette Light Scheduler peut facilement être détourner pour gérer les périodes de chauffe.

Exemple

[{« id »:« 77b84be6.5b67e4 »,« type »:« server-events »,« z »:« e9e2de71.9ee88 »,« name »:"",« server »:« 7e0e34a0.85669c »,« event_type »:« call_service »,« exposeToHomeAssistant »:false,« haConfig »:[{« property »:« name »,« value »:""},{« property »:« icon »,« value »:""}],« waitForRunning »:true,« x »:150,« y »:180,« wires »:[[« 832432e4.fd8e5 »]]},{« id »:« 832432e4.fd8e5 »,« type »:« switch »,« z »:« e9e2de71.9ee88 »,« name »:« domain==climate? »,« property »:« payload.event.domain »,« propertyType »:« msg »,« rules »:[{« t »:« eq »,« v »:« climate »,« vt »:« str »}],« checkall »:« true »,« repair »:false,« outputs »:1,« x »:350,« y »:180,« wires »:[[« ee9cbef.b1a814 »]]},{« id »:« ee9cbef.b1a814 »,« type »:« switch »,« z »:« e9e2de71.9ee88 »,« name »:« service==set_temperature? »,« property »:« payload.event.service »,« propertyType »:« msg »,« rules »:[{« t »:« eq »,« v »:« set_temperature »,« vt »:« str »}],« checkall »:« true »,« repair »:false,« outputs »:1,« x »:580,« y »:180,« wires »:[[« fffd13bc.c09bb »]]},{« id »:« fb4330b8.1597d8 »,« type »:« api-call-service »,« z »:« e9e2de71.9ee88 »,« name »:« Refresh temperature »,« server »:« 7e0e34a0.85669c »,« version »:1,« debugenabled »:false,« service_domain »:« zwave »,« service »:« refresh_entity »,« entityId »:"",« data »:"{« entity_id »:"{{ payload.event.service_data.entity_id }}"}",« dataType »:« json »,« mergecontext »:"",« output_location »:"",« output_location_type »:« none »,« mustacheAltTags »:false,« x »:1000,« y »:180,« wires »:[[]]},{« id »:« fffd13bc.c09bb »,« type »:« delay »,« z »:« e9e2de71.9ee88 »,« name »:"",« pauseType »:« delay »,« timeout »:« 5 »,« timeoutUnits »:« seconds »,« rate »:« 1 »,« nbRateUnits »:« 1 »,« rateUnits »:« second »,« randomFirst »:« 1 »,« randomLast »:« 5 »,« randomUnits »:« seconds »,« drop »:false,« x »:800,« y »:180,« wires »:[[« fb4330b8.1597d8 »]]},{« id »:« aa0b4c98.53f6a »,« type »:« light-scheduler »,« z »:« e9e2de71.9ee88 »,« settings »:"",« events »:"[{« start »:{« dow »:1,« mod »:420},« end »:{« dow »:1,« mod »:1080}},{« start »:{« dow »:2,« mod »:420},« end »:{« dow »:2,« mod »:1080}},{« start »:{« dow »:3,« mod »:420},« end »:{« dow »:3,« mod »:1080}},{« start »:{« dow »:4,« mod »:420},« end »:{« dow »:4,« mod »:1080}},{« start »:{« dow »:5,« mod »:420},« end »:{« dow »:5,« mod »:1080}},{« start »:{« dow »:6,« mod »:510},« end »:{« dow »:6,« mod »:630}},{« start »:{« dow »:0,« mod »:510},« end »:{« dow »:0,« mod »:630}},{« start »:{« dow »:6,« mod »:810},« end »:{« dow »:6,« mod »:960}},{« start »:{« dow »:0,« mod »:810},« end »:{« dow »:0,« mod »:960}}]",« topic »:« heating »,« name »:« Temp bureau »,« onPayload »:« 23 »,« onPayloadType »:« num »,« offPayload »:« 18 »,« offPayloadType »:« num »,« onlyWhenDark »:false,« scheduleRndMax »:0,« sunElevationThreshold »:6,« sunShowElevationInStatus »:false,« outputfreq »:« output.statechange.startup »,« x »:130,« y »:100,« wires »:[[« 5f039f02.f27578 »]]},{« id »:« 875b9dfb.0bc838 »,« type »:« api-call-service »,« z »:« e9e2de71.9ee88 »,« name »:« Radiateur fenêtre »,« server »:« 7e0e34a0.85669c »,« version »:1,« debugenabled »:false,« service_domain »:« climate »,« service »:« set_temperature »,« entityId »:« climate.danfoss_heating »,« data »:"{« temperature »: {{temperature}}}",« dataType »:« json »,« mergecontext »:"",« output_location »:« payload »,« output_location_type »:« msg »,« mustacheAltTags »:false,« x »:970,« y »:120,« wires »:[[]]},{« id »:« b16285ce.81f788 »,« type »:« delay »,« z »:« e9e2de71.9ee88 »,« name »:"",« pauseType »:« delay »,« timeout »:« 5 »,« timeoutUnits »:« seconds »,« rate »:« 1 »,« nbRateUnits »:« 1 »,« rateUnits »:« second »,« randomFirst »:« 1 »,« randomLast »:« 5 »,« randomUnits »:« seconds »,« drop »:false,« x »:800,« y »:120,« wires »:[[« 875b9dfb.0bc838 »]]},{« id »:« 26d2347b.d02994 »,« type »:« api-current-state »,« z »:« e9e2de71.9ee88 »,« name »:« Not homeoffice? »,« server »:« 7e0e34a0.85669c »,« version »:1,« outputs »:2,« halt_if »:« false »,« halt_if_type »:« bool »,« halt_if_compare »:« is »,« override_topic »:false,« entity_id »:« input_boolean.homeoffice »,« state_type »:« habool »,« state_location »:« payload »,« override_payload »:« msg »,« entity_location »:« data »,« override_data »:« msg »,« blockInputOverrides »:false,« x »:590,« y »:140,« wires »:[[« b16285ce.81f788 »],[]]},{« id »:« 81068f7c.a8959 »,« type »:« light-scheduler »,« z »:« e9e2de71.9ee88 »,« settings »:"",« events »:"[{« start »:{« dow »:6,« mod »:510},« end »:{« dow »:6,« mod »:630}},{« start »:{« dow »:0,« mod »:510},« end »:{« dow »:0,« mod »:630}},{« start »:{« dow »:6,« mod »:810},« end »:{« dow »:6,« mod »:960}},{« start »:{« dow »:0,« mod »:810},« end »:{« dow »:0,« mod »:960}}]",« topic »:"",« name »:« Temp bureau »,« onPayload »:« 23 »,« onPayloadType »:« num »,« offPayload »:« 18 »,« offPayloadType »:« num »,« onlyWhenDark »:false,« scheduleRndMax »:0,« sunElevationThreshold »:6,« sunShowElevationInStatus »:false,« outputfreq »:« output.statechange.startup »,« x »:130,« y »:140,« wires »:[[« d886719b.86d838 »]]},{« id »:« 1e4ecc29.6fddd4 »,« type »:« api-current-state »,« z »:« e9e2de71.9ee88 »,« name »:« Homeoffice? »,« server »:« 7e0e34a0.85669c »,« version »:1,« outputs »:2,« halt_if »:« true »,« halt_if_type »:« bool »,« halt_if_compare »:« is »,« override_topic »:false,« entity_id »:« input_boolean.homeoffice »,« state_type »:« habool »,« state_location »:« payload »,« override_payload »:« msg »,« entity_location »:« data »,« override_data »:« msg »,« blockInputOverrides »:false,« x »:550,« y »:100,« wires »:[[« b16285ce.81f788 »],[]]},{« id »:« 5f039f02.f27578 »,« type »:« function »,« z »:« e9e2de71.9ee88 »,« name »:« keep target temperature »,« func »:« msg.temperature = msg.payload;\nreturn msg; »,« outputs »:1,« noerr »:0,« initialize »:"",« finalize »:"",« x »:330,« y »:100,« wires »:[[« 1e4ecc29.6fddd4 »]]},{« id »:« d886719b.86d838 »,« type »:« function »,« z »:« e9e2de71.9ee88 »,« name »:« keep target temperature »,« func »:« msg.temperature = msg.payload;\nreturn msg; »,« outputs »:1,« noerr »:0,« initialize »:"",« finalize »:"",« x »:350,« y »:140,« wires »:[[« 26d2347b.d02994 »]]},{« id »:« 7e0e34a0.85669c »,« type »:« server »,« name »:« Home Assistant »,« legacy »:false,« addon »:true,« rejectUnauthorizedCerts »:true,« ha_boolean »:« y|yes|true|on|home|open »,« connectionDelay »:true,« cacheJson »:true}]

1 J'aime

Ce qui est bien est parfois un peu compliqué à appréhender. Et c’est le cas de Shedy. En plus la prise en compte des modifs yaml sous AppDaemon est dynamique et c’est top. La philosophie yaml reste identique à HA. Je me sert aussi de ControlerX qui est sous AppDaemon.

Il y a aussi le scheduler très bien qui est ici https://community.home-assistant.io/t/scheduler-card-custom-component/ qui devrait être suffisant dans la majorité des cas.

Quant à NR, la réponse est non, c’est pas juste que je n’aime pas, je déteste. Bon, blague à part, c’est bien et même intéressant, surtout pour ceux qui ne réussissent pas à entrer dans la logique yaml, ce qui se comprends très bien. Mais dans l’absolu ça n’a pas besoin de HA, à part pour l’interface, ah oui NR n’a pas d’interface utilisateur, juste une interface dev. Bon, après chacun son truc.

Il y a aussi les Blueprint, et ça va changer bcp de choses sous HA je crois.

Bref, dans toutes ces solutions, seul Shedy sait faire de la replanification dynamique, c-a-d que toutes les x minutes il reconsidère l’état des lieux et agit en fonction. Les autres se contentent de faire ON au début et OFF à la fin (ou augmenter la consigne et la baisser).

Au printemps dernier je n’avais pas pris le temps de vraiment creuser Schedy, mais je vais peut être reconsidérer, au moins pour expliquer et écrire un article. Après le manque d’interface est cruel !

Joyeuses fêtes!

Bonjour,

Merci pour ton partage d’expérience @pyg
Je suis également fan de Node Red, mais comme l’indique @Canaletto je crois que les blueprint vont être une très bonne alternative. J’ai vaguement regardé et cela s’annonce pas mal dutout.
La notion de partage sur le même principe que ce que propose Node Red est un grand plus et vu que je suis partisan dès que possible d’utiliser les fonctions les plus proche du Core pour des raisons de maintenabilité entre les versions et bien je vais essayer de migrer vers les Blueprint.

J’ai un peu creusé Schedy qui me plait de plus en plus, et j’ai essayé de lui offrir une interface… (si tu te lasses de NR :wink:

2 J'aimes

Bonjour,
Merci pour ton « ping » et ton article. Tu as réussi à raviver la flamme Schedy :wink:
Malgré son côté austère, il a de nombreux avantages : robuste/stable, les fautes de syntaxe sont faciles à identifier, logs bien détaillés pour comprendre les décisions prise, ré-envoi en cas d’échec de prise en compte des commandes, gestion des réglables manuels et reprise du « scheduling » après un certain délai.

Merci pour tes astuces: 1) externaliser les variables de Schedy, 2) fichiers de variables dans /config/packages/*.yaml, 3) typages de variables pour créer une interface facilement dans Lovelace.

  • Variables Home Assistant

OK ça fait beaucoup de variables (booléen, début, fin, templates, …) mais ça se génère bien à coup de script.

Exemple pour 3 pièces et 4 planifications par pièces
/bin/bash
test -d /config/packages || mkdir /config/packages
cd /config/packages
cat >heating_global.yaml<<EOF
input_boolean:
  heating_enabled:
    name: Heating Global
    icon: mdi:toggle-switch
EOF
for room in bureau sdb_rdc sdb_1er
do
for period in {1..4}
do
cat >${room}_heating_period_${period}.yaml<<EOF
input_datetime:
  ${room}_heating_period_${period}_start:
    name: "Heating Period ${period} Start Time"
    has_date: false
    has_time: true
  ${room}_heating_period_${period}_end:
    name: "Heating Period ${period} End Time"
    has_date: false
    has_time: true
sensor:
  platform: template
  sensors:
    ${room}_heating_period_${period}_start:
      value_template: "{{ (state_attr('input_datetime.${room}_heating_period_${period}_start', 'timestamp') / 60)|int }}"
    ${room}_heating_period_${period}_end:
      value_template: "{{ (state_attr('input_datetime.${room}_heating_period_${period}_end', 'timestamp') / 60)|int }}"
input_number:
  ${room}_heating_period_${period}_temperature:
    name: Heating Period ${period} Temperature
    min: 18
    max: 25
    step: 1
    unit_of_measurement: °C
input_boolean:
  ${room}_heating_period_${period}:
    name: Heating Period ${period} Enabled
    icon: mdi:toggle-switch
EOF
done
done
exit

Puis tester la configuration « check configuration » et recharger les éléments nécessaire:
« reload input booleans »
« reload input date times »
« reload input numbers »
« reload templates entities »

  • Application Schedy
/config/appdaemon/apps/schedy_heating.yaml
schedy_heating:
  module: hass_apps_loader
  class: SchedyApp
  
  actor_type: thermostat
  
  actor_templates:
    default:
      send_retry_interval: 30
      send_retries: 10
      supports_hvac_modes: false
    danfoss:
      template: default
      send_retry_interval: 60
      supports_hvac_modes: false
      off_temp: 18
  
  watched_entities:
  - input_boolean.homeoffice
  - binary_sensor.workday_sensor
  - binary_sensor.holiday_sensor
  - input_boolean.heating_enabled
  
  expression_environment: |
    def homeoffice():
      return is_on("input_boolean.homeoffice")
    def workday():
      return is_on("binary_sensor.workday_sensor")
    def holiday():
      return is_on("binary_sensor.holiday_sensor")
    def time_between(start, end):
        start = int(state(start))
        end = int(state(end))
        current = time.hour * 60 + time.minute + 1
        if start >= end:
            return current >= start or current < end
        return current >= start and current < end

  schedule_prepend:
  - x: "14 if is_off('input_boolean.heating_enabled') else Next()"
  
  rooms:
    bureau:
      allow_manual_changes: true
      rescheduling_delay: 120
      actors:
        climate.danfoss_heating:
          template: danfoss
      watched_entities:
      - input_number.bureau_heating_period_1_temperature
      - input_boolean.bureau_heating_period_1
      - sensor.bureau_heating_period_1_start
      - sensor.bureau_heating_period_1_end
      - input_number.bureau_heating_period_2_temperature
      - input_boolean.bureau_heating_period_2
      - sensor.bureau_heating_period_2_start
      - sensor.bureau_heating_period_2_end
      - input_number.bureau_heating_period_3_temperature
      - input_boolean.bureau_heating_period_3
      - sensor.bureau_heating_period_3_start
      - sensor.bureau_heating_period_3_end
      - input_number.bureau_heating_period_4_temperature
      - input_boolean.bureau_heating_period_4
      - sensor.bureau_heating_period_4_start
      - sensor.bureau_heating_period_4_end
      schedule:
      - rules:
        # not homeoffice
        - rules:
          - x: "Break() if homeoffice() else Next()"
          - x: >
              state("input_number.bureau_heating_period_1_temperature")
              if (is_on("input_boolean.bureau_heating_period_1")
              and time_between("sensor.bureau_heating_period_1_start", "sensor.bureau_heating_period_1_end"))
              else Next()
          - x: >
              state("input_number.bureau_heating_period_2_temperature")
              if (is_on("input_boolean.bureau_heating_period_2")
              and time_between("sensor.bureau_heating_period_2_start", "sensor.bureau_heating_period_2_end"))
              else Next()
          - x: "Break(2)"
        # homeoffice
        - rules:
          - x: >
              state("input_number.bureau_heating_period_3_temperature")
              if (is_on("input_boolean.bureau_heating_period_3")
              and time_between("sensor.bureau_heating_period_3_start", "sensor.bureau_heating_period_3_end"))
              else Next()
          - x: >
              state("input_number.bureau_heating_period_4_temperature")
              if (is_on("input_boolean.bureau_heating_period_4")
              and time_between("sensor.bureau_heating_period_4_start", "sensor.bureau_heating_period_4_end"))
              else Next()
          - x: "Break(2)"
      # default
      - v: 20
    sdb_rdc:
      allow_manual_changes: true
      replicate_changes: true
      rescheduling_delay: 30
      actors:
        climate.fgt001_fenetre_sdb_rdc:
        climate.fgt001_serviettes_sdb_rdc:
      watched_entities:
      - input_number.sdb_rdc_heating_period_1_temperature
      - input_boolean.sdb_rdc_heating_period_1
      - sensor.sdb_rdc_heating_period_1_start
      - sensor.sdb_rdc_heating_period_1_end
      - input_number.sdb_rdc_heating_period_2_temperature
      - input_boolean.sdb_rdc_heating_period_2
      - sensor.sdb_rdc_heating_period_2_start
      - sensor.sdb_rdc_heating_period_2_end
      - input_number.sdb_rdc_heating_period_3_temperature
      - input_boolean.sdb_rdc_heating_period_3
      - sensor.sdb_rdc_heating_period_3_start
      - sensor.sdb_rdc_heating_period_3_end
      - input_number.sdb_rdc_heating_period_4_temperature
      - input_boolean.sdb_rdc_heating_period_4
      - sensor.sdb_rdc_heating_period_4_start
      - sensor.sdb_rdc_heating_period_4_end
      schedule:
      - rules:
        # workday
        - rules:
          - x: "Break() if workday() else Next()"
          - x: >
              state("input_number.sdb_rdc_heating_period_1_temperature")
              if (is_on("input_boolean.sdb_rdc_heating_period_1")
              and time_between("sensor.sdb_rdc_heating_period_1_start", "sensor.sdb_rdc_heating_period_1_end"))
              else Next()
          - x: >
              state("input_number.sdb_rdc_heating_period_2_temperature")
              if (is_on("input_boolean.sdb_rdc_heating_period_2")
              and time_between("sensor.sdb_rdc_heating_period_2_start", "sensor.sdb_rdc_heating_period_2_end"))
              else Next()
          - x: "Break(2)"
        # not workday
        - rules:
          - x: >
              state("input_number.sdb_rdc_heating_period_3_temperature")
              if (is_on("input_boolean.sdb_rdc_heating_period_3")
              and time_between("sensor.sdb_rdc_heating_period_3_start", "sensor.sdb_rdc_heating_period_3_end"))
              else Next()
          - x: >
              state("input_number.sdb_rdc_heating_period_4_temperature")
              if (is_on("input_boolean.sdb_rdc_heating_period_4")
              and time_between("sensor.sdb_rdc_heating_period_4_start", "sensor.sdb_rdc_heating_period_4_end"))
              else Next()
          - x: "Break(2)"
      # default
      - v: 21
    sdb_1er:
      allow_manual_changes: true
      replicate_changes: true
      rescheduling_delay: 30
      actors:
        climate.fgt001_fenetre_sdb_1er:
        climate.fgt001_serviettes_sdb_1er:
      watched_entities:
      - input_number.sdb_1er_heating_period_1_temperature
      - input_boolean.sdb_1er_heating_period_1
      - sensor.sdb_1er_heating_period_1_start
      - sensor.sdb_1er_heating_period_1_end
      - input_number.sdb_1er_heating_period_2_temperature
      - input_boolean.sdb_1er_heating_period_2
      - sensor.sdb_1er_heating_period_2_start
      - sensor.sdb_1er_heating_period_2_end
      - input_number.sdb_1er_heating_period_3_temperature
      - input_boolean.sdb_1er_heating_period_3
      - sensor.sdb_1er_heating_period_3_start
      - sensor.sdb_1er_heating_period_3_end
      - input_number.sdb_1er_heating_period_4_temperature
      - input_boolean.sdb_1er_heating_period_4
      - sensor.sdb_1er_heating_period_4_start
      - sensor.sdb_1er_heating_period_4_end
      schedule:
      - rules:
        # workday
        - rules:
          - x: "Break() if workday() else Next()"
          - x: >
              state("input_number.sdb_1er_heating_period_1_temperature")
              if (is_on("input_boolean.sdb_1er_heating_period_1")
              and time_between("sensor.sdb_1er_heating_period_1_start", "sensor.sdb_1er_heating_period_1_end"))
              else Next()
          - x: >
              state("input_number.sdb_1er_heating_period_2_temperature")
              if (is_on("input_boolean.sdb_1er_heating_period_2")
              and time_between("sensor.sdb_1er_heating_period_2_start", "sensor.sdb_1er_heating_period_2_end"))
              else Next()
          - x: "Break(2)"
        # not workday
        - rules:
          - x: >
              state("input_number.sdb_1er_heating_period_3_temperature")
              if (is_on("input_boolean.sdb_1er_heating_period_3")
              and time_between("sensor.sdb_1er_heating_period_3_start", "sensor.sdb_1er_heating_period_3_end"))
              else Next()
          - x: >
              state("input_number.sdb_1er_heating_period_4_temperature")
              if (is_on("input_boolean.sdb_1er_heating_period_4")
              and time_between("sensor.sdb_1er_heating_period_4_start", "sensor.sdb_1er_heating_period_4_end"))
              else Next()
          - x: "Break(2)"
      # default
      - v: 21
  • View Lovelace
Exemple basic mais fonctionnel
type: grid
columns: 3
square: true
cards:
  - type: vertical-stack
    cards:
      - type: entities
        entities:
          - entity: input_boolean.sdb_rdc_heating_period_3
          - entity: input_datetime.sdb_rdc_heating_period_3_start
          - entity: input_datetime.sdb_rdc_heating_period_3_end
          - entity: input_number.sdb_rdc_heating_period_3_temperature
          - entity: input_boolean.sdb_rdc_heating_period_4
          - entity: input_datetime.sdb_rdc_heating_period_4_start
          - entity: input_datetime.sdb_rdc_heating_period_4_end
          - entity: input_number.sdb_rdc_heating_period_4_temperature
        title: SDB RDC Workdays
        show_header_toggle: false
      - type: entities
        entities:
          - entity: input_boolean.sdb_rdc_heating_period_1
          - entity: input_datetime.sdb_rdc_heating_period_1_start
          - entity: input_datetime.sdb_rdc_heating_period_1_end
          - entity: input_number.sdb_rdc_heating_period_1_temperature
          - entity: input_boolean.sdb_rdc_heating_period_2
          - entity: input_datetime.sdb_rdc_heating_period_2_start
          - entity: input_datetime.sdb_rdc_heating_period_2_end
          - entity: input_number.sdb_rdc_heating_period_2_temperature
        title: SDB RDC Not-workdays
        show_header_toggle: false
      - type: button
        name: Reset Schedy for SDB RDC
        show_state: false
        tap_action:
          action: call-service
          service: script.schedy_reevaluate
          service_data:
            room: sdb_rdc
  - type: vertical-stack
    cards:
      - type: entities
        entities:
          - entity: input_boolean.sdb_1er_heating_period_3
          - entity: input_datetime.sdb_1er_heating_period_3_start
          - entity: input_datetime.sdb_1er_heating_period_3_end
          - entity: input_number.sdb_1er_heating_period_3_temperature
          - entity: input_boolean.sdb_1er_heating_period_4
          - entity: input_datetime.sdb_1er_heating_period_4_start
          - entity: input_datetime.sdb_1er_heating_period_4_end
          - entity: input_number.sdb_1er_heating_period_4_temperature
        title: SDB 1er Workdays
        show_header_toggle: false
      - type: entities
        entities:
          - entity: input_boolean.sdb_1er_heating_period_1
          - entity: input_datetime.sdb_1er_heating_period_1_start
          - entity: input_datetime.sdb_1er_heating_period_1_end
          - entity: input_number.sdb_1er_heating_period_1_temperature
          - entity: input_boolean.sdb_1er_heating_period_2
          - entity: input_datetime.sdb_1er_heating_period_2_start
          - entity: input_datetime.sdb_1er_heating_period_2_end
          - entity: input_number.sdb_1er_heating_period_2_temperature
        title: SDB 1er Not-workdays
        show_header_toggle: false
      - type: button
        name: Reset Schedy for SDB 1er
        show_state: false
        tap_action:
          action: call-service
          service: script.schedy_reevaluate
          service_data:
            room: sdb_1er
  - type: vertical-stack
    cards:
      - type: entities
        entities:
          - entity: input_boolean.bureau_heating_period_3
          - entity: input_datetime.bureau_heating_period_3_start
          - entity: input_datetime.bureau_heating_period_3_end
          - entity: input_number.bureau_heating_period_3_temperature
          - entity: input_boolean.bureau_heating_period_4
          - entity: input_datetime.bureau_heating_period_4_start
          - entity: input_datetime.bureau_heating_period_4_end
          - entity: input_number.bureau_heating_period_4_temperature
        title: Bureau Homeoffice
        show_header_toggle: false
      - type: entities
        entities:
          - entity: input_boolean.bureau_heating_period_1
          - entity: input_datetime.bureau_heating_period_1_start
          - entity: input_datetime.bureau_heating_period_1_end
          - entity: input_number.bureau_heating_period_1_temperature
          - entity: input_boolean.bureau_heating_period_2
          - entity: input_datetime.bureau_heating_period_2_start
          - entity: input_datetime.bureau_heating_period_2_end
          - entity: input_number.bureau_heating_period_2_temperature
        title: Bureau Not-Homeoffice
        show_header_toggle: false
      - type: button
        name: Reset Schedy for Bureau
        show_state: false
        tap_action:
          action: call-service
          service: script.schedy_reevaluate
          service_data:
            room: bureau
2 J'aimes

Super merci pour ton partage :smiley:

@pyg Ton script est redoutable… On voit la différence, moi je ne suis pas dev ! (hassos tu le lance ou ?)

Je vais tester dès que j’ai un peu de temps

Bonjour

Well done @pyg

Re-sending value due to missing confirmation …

Petite update pour le paramétrage Shedy, avec l’option par défaut « supports_hvac_modes: true », il envoie dans la foulée un « climate.set_hvac_mode » et un « climate.set_temperature ». Chez moi avec mes Fibaro Heat Controller, dans la plupart des cas, la deuxième instruction « climate.set_temperature » était ignorée (droppée ?). Shedy passait son température à faire des « Re-sending value due to missing confirmation ».
Avec l’option « supports_hvac_modes: false », OK le chauffage n’est plus jamais mis en OFF mais à une température de chauffe basse (kif-kik nan ?), ainsi Shedy n’envoie que la commande « climate.set_temperature » qui, chez moi, passe dès le premier coup.

1 J'aime

@pyg
Merci pour ton script, j’ai adapté à mon besoin et mis à jour mon article. Pour bien faire je vais ajouter la création des input_number pour les consignes par defaut (chauffage off et plage off).

Il me faut également trouver une solution pour planifier les 1/2 journées de travail (cas de qq un qui bosse le samedi matin…) Idées welcome :wink:

Il semblerait que si j’ai une plage qui se termine à 10.30 et une autre qui commence à 10.30 ça ne fonctionne pas. C’est ce que je voudrais utiliser pour juste changer la température de consigne.

Il me reste à l’adapter au mode froid pour cet été…

EDIT : En fait les plages ne sont pas prises en compte correctement. As tu changé qq chose ?

@pyg en fait j’ai trouvé une autre solution à base de binary afin d’éviter trop de choses dans Schedy.