Este tutorial está desactualizado devem utilizar este
Este tutorial é baseado em vários testes que foram feitos em diferentes placas.
Aqui a ideia é puderes controlar os teus estores pelos teus interruptores actuais sejam eles de pressão ou convencionais, mas também controlares os estores pelo Home Assistant através de um Cover ou de um Slider, permitindo-te “estimar” qual a posição em que se encontram os estores, ou mesmo abrires ou fechares para uma posição pretendida.
O código abaixo apresentado é baseado no firmware Tasmota, e serve para quaisquer os equipamentos descritos acima. Ao longo deste tutorial irão ser deixadas as diferentes configurações para cada um dos equipamentos a usar.
De uma forma simplista:
(Apenas como exemplo)
Raciocínio 1 - Os estores demoram 10 segundos a fechar portanto, se os relés estiverem activos apenas durante uma fracção desse tempo, os estores abriram apenas X%. Se, em seguida se activar o relé mais algum tempo, os estores estão agora abertos X+Y%. Para abrir aplica-se o mesmo.
Raciocínio 2 - Ao escolher a percentagem no slider, a diferença de percentagens corresponde à activação do relé por X décimos de segundo.
Passos a configurar na consola:
-
Definir um pulsetime de 10s para os relés (o valor pode ser igual para os 2 ou não - mudar de acordo com o tempo que o vosso demora - convém 2 ou 3 segundos mais) no tasmota digitando na consola dele (sem as aspas): “pulsetime1 100” (para o relé de subida) e “pulsetime2 100” (para o relé de descida)
-
Definir “interlock 1”, para activar interlocking
-
Definir “poweronstate 0”
-
Definir “powerretain1 off”
5.Definir “powerretain2 off”
- Criar um ficheiro estore.yaml dentro da pasta Package, se usarem packages, ou “encaixar” na configuração os seguintes componentes, alterando “apenas”:
O valor inicial dos input_text tempodeabertura e tempodefecho com o tempo de abertura e de fecho dos vossos estores e os tópicos para os vossos (aconselhável usar a função “subtituir tudo” do vosso editor para trocar janela_garagem pelo nome do tópico que vocês querem dar). Por fim, colocar num grupo o cover.persiana e o input_number.aberturapersiana
input_text:
#Alterar "inicial" para o valor em segundos que o estore demora a abrir desde a posição fechada e vice-versa nos input_text tempodeabertura e tempodefecho.
tempodeabertura_janela_garagem:
name: tempo de maximo de abertura janela_garagem
initial: 15
tempodefecho_janela_garagem:
name: tempo de maximo de fecho janela_garagem
initial: 15
iniciofecho_janela_garagem:
name: iniciofecho janela_garagem
inicioabertura_janela_garagem:
name: inicioabertura janela_garagem
cover:
- platform: template
covers:
janela_garagem:
friendly_name: "janela_garagem"
position_template: '{{ states.input_number.abertura_janela_garagem.state }}'
open_cover:
- service: mqtt.publish
data:
topic: 'cmnd/janela_garagem/POWER1'
payload: 'ON'
close_cover:
- service: mqtt.publish
data:
topic: 'cmnd/janela_garagem/POWER2'
payload: 'ON'
stop_cover:
- service: mqtt.publish
data:
topic: 'cmnd/janela_garagem/Backlog'
payload: 'POWER1 OFF; POWER2 OFF'
binary_sensor:
- platform: mqtt
name: rele_1_janela_garagem
state_topic: "stat/janela_garagem/POWER1"
payload_on: "ON"
payload_off: "OFF"
- platform: mqtt
name: rele_2_janela_garagem
state_topic: "stat/janela_garagem/POWER2"
payload_on: "ON"
payload_off: "OFF"
input_boolean:
alterarslider_janela_garagem:
name: Alterar o slider janela_garagem
initial: on
input_number:
abertura_janela_garagem:
name: Abertura janela_garagem
min: 0
max: 100
step: 1
unit_of_measurement: '%'
icon: mdi:blinds
abertura_janela_garagemold:
name: valor antigo de abertura janela_garagem
min: 0
max: 100
step: 1
unit_of_measurement: '%'
automation:
- id: iniciofecho_janela_garagem
alias: começou a fechar janela_garagem
initial_state: 'on'
trigger:
- platform: state
entity_id: binary_sensor.rele_2_janela_garagem
to: 'on'
action:
service: input_text.set_value
data_template:
entity_id: input_text.iniciofecho_janela_garagem
value: '{{ now() }}'
- id: fimfecho_janela_garagem
alias: parou de fechar janela_garagem
initial_state: 'on'
trigger:
- platform: state
entity_id: binary_sensor.rele_2_janela_garagem
to: 'off'
condition:
- condition: state
entity_id: 'input_boolean.alterarslider_janela_garagem'
state: 'on'
action:
- service: input_number.set_value
data_template:
entity_id: input_number.abertura_janela_garagemold
value: >-
{% if (states.input_number.abertura_janela_garagem.state)|int - ((as_timestamp(now()) - (as_timestamp(states.input_text.iniciofecho_janela_garagem.state))|float|round(2))*100/(states.input_text.tempodefecho_janela_garagem.state|int))|int < 4 %}
0
{% else %}
{{ (states.input_number.abertura_janela_garagem.state)|int - ((as_timestamp(now()) - (as_timestamp(states.input_text.iniciofecho_janela_garagem.state))|float|round(2))*100/(states.input_text.tempodefecho_janela_garagem.state|int))|int }}
{% endif %}
- service: input_number.set_value
data_template:
entity_id: input_number.abertura_janela_garagem
value: '{{ states.input_number.abertura_janela_garagemold.state }}'
- id: inicioabertura_janela_garagem
alias: começou a abrir janela_garagem
initial_state: 'on'
trigger:
- platform: state
entity_id: binary_sensor.rele_1_janela_garagem
to: 'on'
action:
service: input_text.set_value
data_template:
entity_id: input_text.inicioabertura_janela_garagem
value: '{{ now() }}'
- id: fimabertura_janela_garagem
alias: parou de abrir janela_garagem
initial_state: 'on'
trigger:
- platform: state
entity_id: binary_sensor.rele_1_janela_garagem
to: 'off'
condition:
- condition: state
entity_id: 'input_boolean.alterarslider_janela_garagem'
state: 'on'
action:
- service: input_number.set_value
data_template:
entity_id: input_number.abertura_janela_garagemold
value: >-
{% if (states.input_number.abertura_janela_garagem.state)|int + ((as_timestamp(now()) - (as_timestamp(states.input_text.inicioabertura_janela_garagem.state))|float|round(2))*100/(states.input_text.tempodeabertura_janela_garagem.state|int))|int > 96 %}
100
{% else %}
{{ (states.input_number.abertura_janela_garagem.state)|int + ((as_timestamp(now()) - (as_timestamp(states.input_text.inicioabertura_janela_garagem.state))|float|round(2))*100/(states.input_text.tempodeabertura_janela_garagem.state|int))|int }}
{% endif %}
- service: input_number.set_value
data_template:
entity_id: input_number.abertura_janela_garagem
value: '{{ states.input_number.abertura_janela_garagemold.state }}'
- id: aberturapeloslider_janela_garagem
alias: Abertura pelo slider janela_garagem
initial_state: 'on'
trigger:
platform: state
entity_id: input_number.abertura_janela_garagem
condition:
- condition: template
value_template: '{{ states.input_number.abertura_janela_garagem.state|int > states.input_number.abertura_janela_garagemold.state|int }}'
action:
- service: input_boolean.turn_off
data:
entity_id: input_boolean.alterarslider_janela_garagem
- service: mqtt.publish
data:
topic: 'cmnd/janela_garagem/Backlog'
payload_template: "POWER1 ON; delay {% if is_state('input_number.abertura_janela_garagem', '100.0') %} {{ (((states.input_number.abertura_janela_garagem.state|int - states.input_number.abertura_janela_garagemold.state|int)*(states.input_text.tempodeabertura_janela_garagem.state|float)/100)|round(1)*10)|round(0) + 20 }} {% else %}
{{ (((states.input_number.abertura_janela_garagem.state|int - states.input_number.abertura_janela_garagemold.state|int)*(states.input_text.tempodeabertura_janela_garagem.state|float)/100)|round(1)*10)|round(0) }} {% endif %}; POWER1 OFF"
- delay:
milliseconds: 800
- wait_template: "{{ is_state('binary_sensor.rele_1_janela_garagem', 'off') }}"
- service: input_boolean.turn_on
data:
entity_id: input_boolean.alterarslider_janela_garagem
- service: input_number.set_value
data_template:
entity_id: input_number.abertura_janela_garagemold
value: '{{ states.input_number.abertura_janela_garagem.state }}'
- id: fechopeloslider_janela_garagem
alias: Fecho pelo slider janela_garagem
initial_state: 'on'
trigger:
platform: state
entity_id: input_number.abertura_janela_garagem
condition:
- condition: template
value_template: '{{ states.input_number.abertura_janela_garagem.state|int < states.input_number.abertura_janela_garagemold.state|int }}'
action:
- service: input_boolean.turn_off
data:
entity_id: input_boolean.alterarslider_janela_garagem
- service: mqtt.publish
data:
topic: 'cmnd/janela_garagem/Backlog'
payload_template: "POWER2 ON; delay {% if is_state('input_number.abertura_janela_garagem', '0.0') %} {{ (((states.input_number.abertura_janela_garagemold.state|int - states.input_number.abertura_janela_garagem.state|int)*(states.input_text.tempodefecho_janela_garagem.state|float)/100)|round(1)*10)|round(0) + 20 }} {% else %}
{{ (((states.input_number.abertura_janela_garagemold.state|int - states.input_number.abertura_janela_garagem.state|int)*(states.input_text.tempodefecho_janela_garagem.state|float)/100)|round(1)*10)|round(0) }} {% endif %}; POWER2 OFF"
- delay:
milliseconds: 800
- wait_template: "{{ is_state('binary_sensor.rele_2_janela_garagem', 'off') }}"
- service: input_boolean.turn_on
data:
entity_id: input_boolean.alterarslider_janela_garagem
- service: input_number.set_value
data_template:
entity_id: input_number.abertura_janela_garagemold
value: '{{ states.input_number.abertura_janela_garagem.state }}'
Este será o esquema que poderás usar caso optes por usar um wemos d1 como controlador.
Para esta montagem necessitas de:
1x - Wemos D1 Mini
1x - Placa de réles dupla pode ser essa mostrada na imagem ou outra (neste exemplo são “active low”)
1x - Fonte de Alimentação hlk --pm01 220v —> 5v
Para tua segurança deves usar um fusivel antes da ligacao da fonte.
A configuração do “module” no tasmota é a seguinte: (no caso de relés active high, mudar relay1i para relay1 e o mesmo para o relay2 e no caso de botões de pressão deves escolher button em vez de switch)
Depois, na consola, deves definir (para botões que não sejam de pressão):
backlog Switchmode1 2; switchmode2 2
Este será o esquema que poderás usar caso optes por usar um Sonoff Dual VERSÃO R2
Para esta montagem necessitas de:
1x - Sonoff Dual R2
A configuração do “module” no tasmota é a seguinte:
Depois, na consola, deves definir:
SerialLog 0
e, para botões que não sejam de pressão,
backlog Switchmode1 2; switchmode2 2
No caso de serem botões de pressão, usa antes backlog Switchmode1 7; switchmode2 7
ESQUEMA para Shelly2
MUITO CUIDADO
Nos Shelly2 existe 50% de hipótese de os GPIOS terem 230V. Nunca liguem FTDI ao Shelly com o AC ligado, porque podem queimar o FTDI e o PC.
Nos shelly2 podemos tirar partido da medição de consumo para desligar o motor em caso de obstrução (que vai provocar um aumento no consumo)
rule on energy#current>0.500 do backlog power1 0; power2 0 endon
rule 1
rule 5
Esta regra faz com que o shelly ‘desligue’ se o consumo chegar aos 500mA. Devem testar o vosso até encontrarem o valor correto, sendo que a subir o consumo será maior e portanto deverão considerar esse como referência.
CRÉDITOS PARA O CÓDIGO: @Maddoctor
CRÉDITOS PARA TESTES: @Luis_Andrade
COMPILAÇÃO DA INFORMAÇÃO E ESQUEMAS:
@RodolfoVieira
Esquema Ligação Shelly2: @azougado