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

:warning: 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.

estores

podesusar

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 “interlock 1”, 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):
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


danger MUITO CUIDADO danger

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.


image

image

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

4 Curtiram

Para comentares este tópico utiliza o link:


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade