📑 MadBlinds v2 - Como Controlares os estores eléctricos e "estimares" a sua posição


(Rodolfo) #1

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.

estores

VVVVV

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:

consola

  1. 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)

  2. Definir “setoption14 on”, para activar interlocking

  3. Definir “poweronstate 0”

  4. Definir “powerretain1 off”

5.Definir “powerretain2 off”

  1. 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):
Switchmode1 2 e 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: (no caso de botões de pressão deves escolher button em vez de switch)

Depois, na consola, deves definir:
SerialLog 0
e, para botões que não sejam de pressão,
Switchmode1 2 e switchmode2 2

CRÉDITOS PARA O CÓDIGO: @Maddoctor
CRÉDITOS PARA TESTES: @Luis_Andrade
COMPILAÇÃO DA INFORMAÇÃO E ESQUEMAS:
@RodolfoVieira


MadBlinds v1 - Como ligar estores eléctricos a um Sonoff Dual (descontinuado)
:bookmark_tabs: Como criar um cover para estores com indicação e controlo da percentagem de abertura (aproximada) - desactualizado
Como ligar um BH Onofre a uns estores eléctricos
Configurar Sonoff Basic com Espurna para Portão de Correr
MadBlinds v2 - Como Controlares os estores eléctricos e "estimares" a sua posição
:bookmark_tabs: MadBlinds v1 - Como ligar estores eléctricos a um Sonoff Dual (descontinuado)
MadBlinds v2 - Como Controlares os estores eléctricos e "estimares" a sua posição
Ajuda na adaptação de Solução de controlo de estores SONOFF para uma solução RF
Como flashar um Sonoff Touch Single e Sonoff Touch Dual com Tasmota
Controlo de portão BFT e estimar posição com Sensor ultrassonico
MadBlinds v2 - Como Controlares os estores eléctricos e "estimares" a sua posição
MadBlinds v1 - Como ligar estores eléctricos a um Sonoff Dual (descontinuado)
(system) #2

Para comentares este tópico utiliza o link:


(Rodolfo) #3

Controlar estores electricos por IR e saber a sua posição