Termostato programmabile da Telegram

Termostato programmabile da Telegram

06/03/2020 aggiornamento package v 3.0

Continuano le guide dei nostri lettori. Grazie ancora al nostro utente Telegram @MaGiDeL per aver realizzato questa guida

Salve a tutti, condivido con voi il mio progetto per gestire il riscaldamento di casa.
E’ doveroso fare una premessa: l’idea parte da qui (https://ledstripsandcode.blogspot.com/2018/11/simple-thermostat-scheduler-in-home.html), per poi svilupparsi in base alle mie esigenze.
Chi volesse modificarlo/aggiornarlo/migliorarlo è il benvenuto!  🙂

Da questo Link potete scaricare l’intero package già suddiviso in cartelle dato che i due file python .py vanno nella directory config\python_scripts mentre il package nella cartella config\package, ed infine il codice per la parte di Lovelace

Condizioni iniziali

Necessitavo di uno programma orario e giornaliero/settimanale per gestire il riscaldamento di casa, oltre alla funzione più semplice del termostato (sotto una certa soglia di temperatura accendi la caldaia).
Nello specifico del programma dal lunedì al venerdì orari alquanto stabiliti, fissi, sempre quelli e il fine settimana, invece, due alternative:

  • termosifoni sempre spenti, poiché non siamo in casa
  • termosifoni sempre accessi, poiché siamo sempre in casa

Ho pensato quindi di gestire il tutto attraverso due modalità, AUTO e MANUAL.
Con AUTO c’è uno scheduler (script python del link della premessa) già preimpostato dove ci sono tre programmi:

  • quello settimanale dal lunedì al venerdì
  • quello del fine settimana nel quale non siamo in casa
  • quello del fine settimana nel quale siamo sempre presenti

Con MANUAL, invece, la caldaia si accende quando la temperatura scende al di sotto di una temperatura di setpoint.
Infine, solo per completezza, gestisto da remoto attraverso i “bottoni” di telegram.
Tutto ciò poichè ho in casa una connessione 4G e poichè:

  • DuckDNS non funziona
  • dal 2 settembre anche serveo.net è stato “temporaneamente” bloccato dal suo autore per phishing

…l’unica alternativa a tutto ciò è Telegram… con telegram posso fare tutto! 😉

Package

Entriamo quindi nel dettaglio. Partiamo dal package.
Descrizione delle varie sezioni.

#####################################################################
## INPUT
#####################################################################
input_number:
temp_high:
name: HighTarget
min: 15
max: 22
step: 0.5
temp_low:
name: LowTarget
min: 15
max: 22
step: 0.5
setpoint:
name: SetPoint
min: 15
max: 22
step: 0.5

input_datetime:
period_thermo_on:
name: Period Thermo Start
has_date: true
has_time: true
period_thermo_off:
name: Period Thermo Stop
has_date: true
has_time: true

input_boolean:
weekend_on:
name: Weekend At Home
initial: off
icon: mdi:calendar-week
auto_mode:
name: Auto Mode
initial: on
icon: mdi:brightness-auto

In questa sezione creiamo tre tipi di input:

  • number, ovvero le temperature high e low che servono da riferimento per la modalità AUTO e la temperatura setpoint per il riferimento nella modalità MANUAL.
  • datetime, per registrare data e orario di accensione e spegnimento caldaia e magari, con una differenza, quanto tempo è rimasta accesa.
  • boolean, per attivare o meno la modalità AUTO e stabilire se si è in casa il fine settimana.
#####################################################################
### CLIMATE
#####################################################################
climate:
- platform: generic_thermostat
name: Generic Thermo
heater: switch.shelly_shsw_1_76a12b
target_sensor: sensor.avgtempthermo
min_temp: 17
max_temp: 20
target_temp: 19.5
ac_mode: false
min_cycle_duration:
seconds: 5
keep_alive:
minutes: 3
initial_hvac_mode: "heat"
away_temp: 15
hot_tolerance: 0

Creiamo, quindi, il componente climate, come generico termostato.
Da notare due cose:

  • ho utilizzato uno shelly con contatto pulito come switch
  • come sensore di riferimento non ho utilizzato un singolo sensore, ma la media tra diversi sensori, non tutti i sensori di casa, ma quelli più significativi: per esempio quello all’ingresso (dove c’era il vecchio termostato) e quello della camera da letto più fredda, così da bilanciare meglio il riscaldamento, non disponendo di singole valvole termostatiche.
#####################################################################
### AVG Thermo
#####################################################################
- platform: min_max
name: AvgTempThermo
type: mean
round_digits: 1
entity_ids:
- sensor.temperature_158dxxxxxx # CAMERETTA
- sensor.temperature_158dxxxxxx # INGRESSO

Questo è il metodo per creare la media nel file sensors.yaml.

#####################################################################
### SENSORS
#####################################################################
sensor:
########################################################################
### THERMO Timer
########################################################################
- platform: history_stats
name: Thermo Switch (last 24h)
entity_id: switch.shelly_shsw_1_76a12b
state: 'on'
type: time
end: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}'
duration:
hours: 24

- platform: template
sensors:
template_thermo_switch_last_24h:
friendly_name: "Template Thermo Switch last 24h"
icon_template: "mdi:timer"
value_template: "{{ states('sensor.thermo_switch_last_24h') | multiply(3600) | timestamp_custom('%H:%M:%S', 0) }}"

########################################################################
- platform: template
sensors:
template_period_thermo:
friendly_name: "Last Period Thermo Switch ON"
icon_template: "mdi:timer"
value_template: >-
{{ ((state_attr('input_datetime.period_thermo_off', 'timestamp')) - (state_attr('input_datetime.period_thermo_on', 'timestamp'))) | int | timestamp_custom('%H:%M:%S', 0) }}

########################################################################
### THERMO Uptime
########################################################################
- platform: template
sensors:
template_thermo_switch_uptime:
friendly_name: 'Template Thermo Switch Uptime'
icon_template: "mdi:timer"
# value_template: "{{ states('sensor.shelly_shsw_1_76a12b_uptime_attr') | int | timestamp_custom('%d %b %Y %H:%M:%S', 1) }}"
value_template: >-

{%- set time = states('sensor.shelly_shsw_1_76a12b_uptime_attr') | int %}
{%- set seconds = ((time % 60) // 1) %}
{%- set seconds = '{}s '.format(seconds) if seconds > 0 else '' %}
{%- set minutes = ((time % 3600) // 60) %}
{%- set minutes = '{}m '.format(minutes) if minutes > 0 else '' %}
{%- set hours = ((time % 86400) // 3600) %}
{%- set hours = '{}h '.format(hours) if hours > 0 else '' %}
{%- set days = (time // 86400) %}
{%- set days = '{}d '.format(days) if days > 0 else '' %}
{{ 'Less than 1 minute' if time < 60 else days + hours + minutes + seconds }}ago

Sensori.

  •  Thermo Timer.

E’ il sensore che mi dice nelle ultime 24 ore quanto tempo è stato acceso (history_stats), con il suo relativo template (per una visualizzazione più “umana” del tempo, poichè il primo sensore mi restituisce solo le ore). Il secondo template (template_period_thermo) serve per conoscere quanto tempo è passato tra un’accesione e il suo relativo spegnimento, in ore, minuti e secondi.

  • Thermo Uptime

L’uptime template dello shelly, in giorni, ore, minuti e secondi.

########################################################################
### BINARY_SENSORS
########################################################################
binary_sensor:
- platform: rest
resource: http://10.10.1.50/status
name: Shelly Thermo MQTT Connected
value_template: "{{ value_json['mqtt'].connected }}"
username: !secret usr_shelly
password: !secret psw_shelly

- platform: rest
resource: http://10.10.1.50/status
name: Shelly Thermo Cloud connected
value_template: "{{ value_json['cloud'].connected }}"
username: !secret usr_shelly
password: !secret psw_shelly

Binary_sensor, riferiti allo shelly, sia in modalità mqtt che in modalità cloud.

#####################################################################
### AUTOMATION
#####################################################################
automation:
- alias: Thermo AUTO Mode
initial_state: True
trigger:
- platform: time_pattern
minutes: '/5' # ogni 5 minuti
# seconds: 00
- platform: homeassistant
event: start
condition:
condition: state
entity_id: input_boolean.auto_mode
state: 'on'
action:
service: python_script.scheduler_auto


- alias: Thermo MANUAL Mode
initial_state: True
trigger:
- platform: time_pattern
minutes: '/5' # ogni 5 minuti
# seconds: 00
- platform: homeassistant
event: start
condition:
condition: state
entity_id: input_boolean.auto_mode
state: 'off'
action:
service: python_script.scheduler_manual

Iniziamo con le prime due automazioni.

  • Thermo AUTO Mode:

Il trigger è scaturito ogni 5 minuti (oppure ogni 15 minuti, se considero la casa un volano termico) oppure all’avvio di Hassio.
La condizione è che ci troviamo proprio nella modalità AUTO
L’automazione lancerà lo script scheduler_auto.

  • Thermo MANUAL Mode

Come per la prima automazione il trigger non cambia, ma la condizione adesso è l’opposta, ovvero ci troviamo nella modalità MANUAL.
L’automazione lancerà quindi lo script scheduler_manual.
Entrambi gli script li vedremo più avanti.

########################################################################
- alias: Notify Thermo Switch ON
initial_state: True
trigger:
- platform: state
entity_id: switch.shelly_shsw_1_76a12b
from: 'off'
to: 'on'
- platform: state
entity_id: climate.generic_thermo
from: 'off'
to: 'heat'
condition:
condition: state
entity_id: input_boolean.auto_mode
state: 'on'
action:
- service: notify.telegram
data_template:
title: '--- *Thermo Switch/Climate start by scheduler* ---'
message: |-

{{ "\U0001F525" }} *Thermo Switch ON*

Set Temperature at: {{ states('input_number.temp_high') }} (current Temp AVG Thermo: {{ states('sensor.avgtempthermo') }})

state Thermo Switch: {{ states('switch.shelly_shsw_1_76a12b') }} at {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
- service: input_datetime.set_datetime
entity_id: input_datetime.period_thermo_on
data_template:
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
  • Notify Thermo Switch ON

Quest’altra automazione, il trigger è l’accensione dello switcha caldaia, oppure l’accensione del climate.
La condizione è che ci troviamo sempre nella modalità AUTO.
L’azione è quella di avvisarci tramite notifica che lo switch è partito attraverso lo scheduler.
Viene visualizzato il riferimento al quale viene portato il termostato e la temperatura corrente del riferimento sensore.
L’ultimo dato è quando è stata accesa la caldaia.
Questo dato, infine, viene salvato nella variabile datetime, data e ora

########################################################################
- alias: Notify Thermo Switch OFF
initial_state: True
trigger:
- platform: state
entity_id: switch.shelly_shsw_1_76a12b
from: 'on'
to: 'off'
- platform: state
entity_id: climate.generic_thermo
from: 'heat'
to: 'off'
condition:
condition: state
entity_id: input_boolean.auto_mode
state: 'on'
action:
- service: input_datetime.set_datetime
entity_id: input_datetime.period_thermo_off
data_template:
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
- service: notify.telegram
data_template:
title: '--- *Thermo Switch/Climate stop by scheduler* ---'
message: |-

{{ "\u2744\ufe0f" }} *Thermo Switch OFF*

Set Temperature at: {{ states('input_number.temp_low') }} (current Temp AVG Thermo: {{ states('sensor.avgtempthermo') }})

state Thermo Switch: {{ states('switch.shelly_shsw_1_76a12b') }} at {{ states('input_datetime.period_thermo_off') }}

Period Thermo ON: {{ states('sensor.template_period_thermo') }}

Discorso duale per la notifica di spegnimento della caldaia attraverso lo scheduler.
Il trigger è dato dallo sepgnimento dello shelly oppure del climate.
La condizione rimane sempre quella della modalità AUTO.
L’azione che scaturisce è segnarsi data e ora di spegnimento con relativa notifica che la caldaia è stata spenta dallo scheduler; la temperatura di riferimento adesso è quella più bassa e la temperatura corrente è quella del sensore della media; lo stato dello switch in questo momento; infine, il periodo nel quale è stata accesa la caldaia.
Per le automazioni si possono aggiungere anche le notifiche di accensione e spegnimento nel caso di modalità MANUAL, con le dovute piccole modifiche.

Python Script (scheduler_auto.py)

Passiamo quindi allo script python.

########################################################################
TEMP_HIGH = hass.states.get('input_number.temp_high')
TEMP_LOW = hass.states.get('input_number.temp_low')
WEEKEND_ON = hass.states.get('input_boolean.weekend_on')
climate_entity = 'climate.generic_thermo'
current_temp = hass.states.get(climate_entity).attributes['current_temperature']

Definizioni di variabili:

  • TEMP_HIGH, l’input_number del riferimento di temperatura alta
  • TEMP_LOW, quello del riferimento di temperatura bassa
  • WEEKEND_ON, l’input_boolean che descrive la presenza o meno di qualcuno nel fine settimana.
  • climate_entity, l’entità climate generica
  • current_temp, la temperatura corrente

Passiamo ai programmi

######################################################################## 
WEEK_SCHEDULE = [
[datetime.time( 0, 0), datetime.time( 7, 30)], # dalle 00:00 alle 07:30
[datetime.time(12, 30), datetime.time(23, 59, 59)] # dalle 12:30 alle 23:59:59
]
WEEKEND_OFF_SCHEDULE = [
]
WEEKEND_ON_SCHEDULE = [
[datetime.time( 0, 0), datetime.time( 23, 59,59)], # dalle 00:00 alle 23:59:59
]

Queste sono i tre programmi impostati.

  • WEEK_SCHEDULE: tutti i giorni lavorativi della settimana, dal lunedì al venerdì
  • WEEKEND_OFF_SCHEDULE: il weekend (sabato e domenica) nel quale non vi è nessuno in casa, quindi inutile tenere acceso, la temperatura di riferimento sarà quindi quella “low”
  • WEEKEND_ON_SCHEDULE: il weekend (sabato e domenica) nel quale vi è qualcuno in casa e che quindi deve essere sempre acceso, ovvero la temperatura di riferimento deve essere la “high”.
########################################################################
now = datetime.datetime.now().time()
if datetime.datetime.now().date().weekday() < 5:
current_schedule = WEEK_SCHEDULE
elif WEEKEND_ON == 'on':
current_schedule = WEEKEND_ON_SCHEDULE
else:
current_schedule = WEEKEND_OFF_SCHEDULE

Entriamo così nel vivo dello script.
Alla variabile “now” impostiamo l’ora attuale.
Se il giorno della settimana è < 5, ovvero dal lunedì al venerdì, allora imposta la variabile current_schedule al programma WEEK_SCHEDULE.
Altrimenti se la variabile booleana WEEKEND_ON è ‘on’, current_schedule diventa il programma WEEKEND_ON_SCHEDULE.
Altrimenti current_schedule sarà il programma WEEKEND_OFF_SCHEDULE.

########################################################################
in_high_time = False
for high_time in current_schedule:
start = high_time[0]
end = high_time[1]
if start <= now <= end:
in_high_time = True
break

Impostiamo la variabile ‘in_high_time’ a false.
Ciclo for:
Per ogni fascia oraria impostata nel programma, alla variabile ‘start’ imposto il primo orario, alla variabile ‘end’ il secondo orario.
Se l’ora attuale è compresa tra ‘start’ e ‘end’, imposta ‘in_high_time’ a true ed esci dal ciclo for, altrimenti in_high_time rimarrà a false.

########################################################################
new_temp = TEMP_HIGH if in_high_time else TEMP_LOW
if str(new_temp.state) != str(current_temp):
hass.services.call( 'climate', 'set_temperature', { 'entity_id': climate_entity, 'temperature': float(new_temp.state) } )

Imposta la variabile ‘new_temp’ alla temperatura ‘high’ se ‘in_high_time’ è true, altrimenti lasciala al livello di temperatura ‘low’.
Se la temperatura ‘new_temp’ è diversa dalla temperatura attuale, richiama il servizio ‘climate.set_temperature’ per impostare la nuova temperatura dell’entità climate_entity alla temperatura ‘new_temp’.

Python Script (scheduler_manual.py)

########################################################################
SETPOINT = 'input_number.setpoint'
climate_entity = 'climate.generic_thermo'
current_temp = hass.states.get(climate_entity).attributes['current_temperature']

Definizioni di variabili:

  • SETPOINT, l’input_number
  • climate_entity, l’entità climate generica
  • current_temp, la temperatura corrente
########################################################################
if current_temp < SETPOINT:
hass.services.call( 'climate', 'set_temperature', { 'entity_id': climate_entity, 'temperature': SETPOINT } )

Se la temperatura corrente è minore del setpoint, richiama il servizio ‘climate.set_temperature’ per impostare la nuova temperatura dell’entità climate_entity alla temperatura ‘SETPOINT’.

Telegram

Riprendendo la mia condizione di connessione in 4G, ecco la gestione della caldaia.
Da un menu principale su telegram, si seleziona il menu ‘thermo’ che richiama la seguente automazione:

########################################################################
- alias: Button Bot Thermo
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /thermo
action:
- service: notify.telegram
data_template:
# title:
message: |-

{{ "\U0001F341" }} *Thermo Management*

state *Thermo Switch*: {{ states('switch.shelly_shsw_1_76a12b') }}
state *Climate Switch*: {{ states('climate.generic_thermo') }}

----------------------------------------------------------
state *Auto Mode*: {{ states('input_boolean.auto_mode') }}
state *Weekend At Home*: {{ states('input_boolean.weekend_on') }}
*Last Period Thermo Switch ON*: {{ states('sensor.template_period_thermo') }}

----------------------------------------------------------
*TempExt*: {{ states('sensor.temperature_158d000273c773') }}
*Temp AVG Thermo*: {{ states('sensor.avgtempthermo') }}

----------------------------------------------------------
*Temp SetPoint*: {{ states('input_number.setpoint') }}
*Temp HighTarget*: {{ states('input_number.temp_high') }}
*Temp LowTarget*: {{ states('input_number.temp_low') }}

Choose your command
data:
inline_keyboard:
- '{{ "\U0001F4DF" }} ThermoAUTO:/thermoauto, {{ "\U0001F91A" }} ThermoMANUAL:/thermomanual'
- '{{ "\u21a9\ufe0f" }} Home:/home'

La notifica è un elenco di stati dove sono mostrate le principali variabili per decidere quindi se andare di AUTO o di MANUAL

Telegram AUTO MODE

#####################################################################
### THERMO AUTO Mode
#####################################################################
- alias: Button Thermo AUTO
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /thermoauto
action:
- service: climate.turn_on
entity_id: climate.generic_thermo
- service: input_boolean.turn_on
data:
entity_id: input_boolean.auto_mode
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\U0001F4DF" }} *Thermo AUTO ON*

state *Auto Mode*: {{ states('input_boolean.auto_mode') }}
state *Thermo Switch*: {{ states('switch.shelly_shsw_1_76a12b') }}
state *Climate Switch*: {{ states('climate.generic_thermo') }}
state *Weekend At Home*: {{ states('input_boolean.weekend_on') }}
-----------------------------------------------------------------
Datetime: {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
data:
inline_keyboard:
- '{{ "\U0001F3E1" }} Weekend at Home:/weekendon'
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

Selezionando ‘ThermoAUTO’ si eseguono una serie di eventi:

  • accensione del climate
  • accensione del boolean AUTO Mode
  • notifica con le principali variabili della modalità AUTO

Infine si ha l’opportunità di attivare, in questa modalità, la presenza in casa durante il fine settimana, attraverso la seguente automazione:

####################################################################### 
- alias: Button Thermo WeekendON
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /weekendon
action:
- service: input_boolean.toggle
data:
entity_id: input_boolean.weekend_on
- delay: '00:00:03'
- service: notify.telegram
data_template:
# title: '*Thermo ON*'
message: |-

{{ "\U0001F3E1" }} *Weekend at Home*

state *Weekend at Home*: {{ states('input_boolean.weekend_on') }}
data:
inline_keyboard:
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

L’azione è dovuta al toggle del boolean ‘weekend_on’

Telegram MANUAL MODE

#####################################################################
### THERMO MANUAL Mode
#####################################################################
- alias: Button Thermo MANUAL
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /thermomanual
action:
- service: input_boolean.turn_off
data:
entity_id: input_boolean.auto_mode
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\U0001F91A" }} *Thermo MANUAL ON*

state *Auto Mode*: {{ states('input_boolean.auto_mode') }}
state *Thermo Switch*: {{ states('switch.shelly_shsw_1_76a12b') }}
state *Climate Switch*: {{ states('climate.generic_thermo') }}
-----------------------------------------------------------------
*Temp SetPoint*: {{ states('input_number.setpoint') }}
Datetime: {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
data:
inline_keyboard:
- '{{ "\u2705\ufe0f" }} ThermoON:/thermoon, {{ "\u274c\ufe0f" }} ThermoOff:/thermooff'
- '{{ "\u2795\ufe0f" }} +SetPoint:/increment, {{ "\u2796\ufe0f" }} -SetPoint:/decrement'
- '{{ "\u274c\ufe0f" }} ClimateOff:/climateoff, {{ "\u2705\ufe0f" }} ClimateON:/climateon'
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

Per la modalità MANUAL, il boolean ‘auto_mode’ viene portato a ‘off’.
La notifica racchiude le principale variabili per tale modalità.
Si passa quindi a poter decidere l’accensione e lo spegnimento dell’entità shelly e del climate.
Inoltre si può aumentare o diminuire il setpoint a seconda delle necessità.

Di seguito le automazioni di questi ultimi comandi:

####################################################################### 
- alias: Button Thermo ON
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /thermoon
action:
- service: switch.turn_on
entity_id: switch.shelly_shsw_1_76a12b
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\U0001F525" }} *Thermo switch ON*

state Thermo Switch: {{ states('switch.shelly_shsw_1_76a12b') }} at {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
data:
inline_keyboard:
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

#######################################################################
- alias: Button Thermo OFF
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /thermooff
action:
- service: switch.turn_off
entity_id: switch.shelly_shsw_1_76a12b
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\u2744\ufe0f" }} *Thermo Switch OFF*

state Thermo: {{ states('switch.shelly_shsw_1_76a12b') }} at {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
data:
inline_keyboard:
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

#######################################################################
- alias: Button SetPoint increment
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /increment
action:
- service: input_number.increment
data:
entity_id: input_number.setpoint
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\u2795\ufe0f" }} {{ "\U0001F4C8" }} *+SetPoint*

state SetPoint: {{ states('input_number.setpoint') }}
data:
inline_keyboard:
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

#######################################################################
- alias: Button SetPoint decrement
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /decrement
action:
- service: input_number.decrement
data:
entity_id: input_number.setpoint
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\u2796\ufe0f" }} {{ "\U0001F4C9" }} *-SetPoint*

state SetPoint: {{ states('input_number.setpoint') }}
data:
inline_keyboard:
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

#######################################################################
- alias: Button Climate OFF
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /climateoff
action:
- service: climate.turn_off
entity_id: climate.generic_thermo
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\u2744\ufe0f" }} *Climate Manual OFF*

state Thermo: {{ states('climate.generic_thermo') }} at {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
data:
inline_keyboard:
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

#######################################################################
- alias: Button Climate ON
hide_entity: true
initial_state: 'on'
trigger:
- platform: event
event_type: telegram_callback
event_data:
data: /climateon
action:
- service: climate.turn_on
entity_id: climate.generic_thermo
- delay: '00:00:03'
- service: notify.telegram
data_template:
message: |-

{{ "\u2744\ufe0f" }} *Climate Manual ON*

state Thermo: {{ states('climate.generic_thermo') }} at {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
data:
inline_keyboard:
- '{{ "\u2b06\ufe0f" }} UpLevel:/thermo, {{ "\u21a9\ufe0f" }} Home:/home'

Lovelace

La parte grafica è abbastanza soggettiva io l’ho impostata in questo modo

Questo è il relativo codice nella versione yaml, lo trovate anche nel file zippato.

##############################
# 3RD MENU
##############################
- title: Weather/Thermo Conditions
panel: true
path: weather_condition
icon: 'mdi:thermostat'
cards:

- type: vertical-stack
cards:
##############################
# RIGA 1
##############################
- type: horizontal-stack
cards:
##############################
# COLONNA 1
##############################
- type: entities
title: Weather Conditions
show_header_toggle: false
entities:
- entity: sensor.avgtempthermo
name: TempAVG thermo
icon: 'mdi:water-boiler'
- entity: sensor.temperature_158d00xxx
name: TempIngresso
- type: divider
style:
height: 2px
width: 95%
margin-left: auto
margin-right: auto
background: '#03A9F4'
- entity: sensor.temperature_158d00xxx
name: TempExt
- entity: sensor.humidity_158d00xxx
name: HumExt
- entity: sensor.pressure_158d00xxx
name: PressExt

##############################
# COLONNA 2
##############################
- type: thermostat
entity: climate.generic_thermo

##############################
# COLONNA 3
##############################
- type: entities
title: Thermostat Mode
show_header_toggle: false
entities:
- input_boolean.auto_mode
- input_number.setpoint

##############################
# RIGA 3
##############################
- type: horizontal-stack
cards:
##############################
# COLONNA 2
##############################
- type: conditional
conditions:
- entity: input_boolean.auto_mode
state: "on"
card:
type: entities
title: Scheduler Mode
show_header_toggle: false
entities:
- input_boolean.weekend_on
- input_number.temp_high
- input_number.temp_low
- type: divider
style:
height: 2px
width: 95%
margin-left: auto
margin-right: auto
background: '#03A9F4'
- sensor.thermo_switch_last_24h
- sensor.template_thermo_switch_last_24h
- sensor.template_period_thermo
- entity: input_datetime.period_thermo_on
name: '*DateTime ON*'
- entity: input_datetime.period_thermo_off
name: '*DateTime OFF*'
- sensor.template_thermo_switch_uptime
- sensor.shelly_shsw_1_76a12b_uptime_attr
- switch.shelly_shsw_1_76a12b
- sensor.shelly_shsw_1_76a12b_switch

Potete continuare a seguire gli sviluppi di questo argomento sul forum di hassiohelp a questo link.

 

11 risposte

  1. Alberto ha detto:

    Bel progetto, se non erro manca però una cosa fondamentale al funzionamento del termostato, cioè i parametri di isteresi. Se imposto ad esempio 20 gradi, senza isteresi i termosifoni si spegneranno al raggiungimento della temperatura ma continueranno a riscaldare e la temperatura potrebbe arrivare a 20,6 gradi ad esempio. Con il parametro di isteresi, i termosifoni si spegneranno a 19,4 e continueranno a scaldare per i 0,6 gradi di isteresi prima di essere freddi.

    • magidel ha detto:

      Ciao Alberto,
      attendiamo allora la tua modifica, così anche tu potrai fare un bel regalo al gruppo e migliorare ancor di più la qualità delle sue guide! ^_^
      Grazie in anticipo! 😉

  2. Fabio ha detto:

    Progetto interessante, possiedo un termostato Tado con cui regolo il riscaldamento dalla app, penso che si potrebbe adattare questo progetto usando le entità climate turn on e off alla stregua di uno switch, giusto?

  3. Gabriele Giavatto ha detto:

    Bellissimo progetto complimenti, ho faticato un po’ per integrarlo nel mio HA, ne frattempo volevo sottolineare che le due automazioni per attivazione “Manual” e “Auto”, ognuna che invoca un python script forse possono essere ridotte a una sola cosi: che ne dite ?
    – alias: Thermo AUTO Mode
    initial_state: True
    trigger:
    – platform: time_pattern
    minutes: ‘/5’ # ogni 5 minuti
    – platform: homeassistant
    event: start
    action:
    service_template: >-
    {% if is_states (‘input_boolean.auto_mode’, ‘on’) %}
    python_script.scheduler_auto
    {% else %}
    python_script.scheduler_manual
    {% endif %}

  4. Mario ha detto:

    Ciao Gabriele e ciao a tutti.
    Ho aperto un post sul forum per gestire e seguire meglio il pacakge e le sue modifiche/suggerimenti.

    Ecco il link: https://forum.hassiohelp.eu/showthread.php?tid=515

    Buona continuzaione di gioranta a tutti! ?

  5. Claudio ha detto:

    Ciao, ma come hai fatto a realizzare la grafica su telegram?

  6. Andrea ha detto:

    Ciao, anch’io ho connessione 4g..volevo capire se sei riuscito o se esiste un modo per connettersi da remoto non potendo utilizzare DuckDns..

  7. MaGiDeL ha detto:

    Qui di seguito vi lascio il link corretto al nuovo forum di HassioHelp:

    https://forum.hassiohelp.eu/d/515-termostato-programmabile-da-telegram

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Advertisment ad adsense adlogger