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


(Rodolfo) #1

:bookmark_tabs: MadBlinds v2 - Como Controlares os estores eléctricos e "estimares" a sua posição
Criação da casa inteligente
(Daniel Pereira) #2

Queria preparar os 11sonoff dual com tasmota para colocar na minha nova moradia mas lá ainda não tenho Wi-Fi.

Posso flashar já com tasmota e fazer as ligações definitivas na moradia nova e depois apenas configurar com o Wi-Fi de lá?


(Rodolfo) #3

Podes fazer isso sim, nada impede.


(Daniel Pereira) #4

E achas que me podes dar uma ajuda?


(Rodolfo) #5

Tens tudo aqui como fazer:


(Daniel Pereira) #6

Pois, não tem o step by step para flashar… vou ter de ler melhor a ver se me safo… já tenho os jumpers wires femeas e macho e o CP2102…


(Rodolfo) #7

Tem, tens é que pesquisar no forum


(Hugo Neves) #8

Antes de mais muito obrigado pelo tutorial.

Sou um iniciado nesta andanças mas já consegui por a funcionar ainda em fase de teste(sonoff dual ligado a duas lâmpadas mas assim que tiver testado tudo vou ligar ao motor dos estores) . Minha dúvida é se seria possível adicionar um segundo sonoff dual ligado a um motor de estores usando a mesma automation? se sim como posso fazer a nível código?


(Jorge Assunção) #9

Explica lá isso melhor, a mesma automação a controlar dois Dual diferentes em estores diferentes?


(Hugo Neves) #10

Sim exacto, ter dois dual em estores diferentes e usar a mesma automação (como se fosse uma função em que passava o argumento estores1 ou estores2 dependendo de qual fosse activado)


(Jorge Assunção) #11

Isso é um pouco mais complicado e não tenho como testar. Para já, é preferível teres duas automações, uma para cada estore.

Se quiseres posso tentar ver isso, mas como te digo não tenho como testar.


(Hugo Neves) #12

Obrigado pelo feedback vou tentar com uma automação para cada estore para já e tentar aprender mais um pouco. Caso @j_assuncao queira eu depois posso testar se encontrar alguma solução


(Jorge Assunção) #13

Se te quiseres entreter e aprender ao mesmo tempo, vou dar-te alguns exemplos que podes alterar para o que queres fazer.

  1. Criar um input_select com a lista dos estores que queres controlar
input_select:
  lista_estores:
    name: 'Selecciona o Estore'
    options:
      - Estore 1
      - Estore 2
  1. cria uma automação que envie o comando em função do estore seleccionado
action:
    service: home assistant.turn_on
    data_template : 
      entity_id: >
        {%- if is_state("input_select.lista_estores", "Estore 1") -%}
        switch.motor_subida_estore_1
        {%- else -%}
         switch.motor_subida_estore_2
        {%- endif %}

Pode parecer complicado mas não é. A parte da automação podes utilizar a que já tens e alteras apenas a parte da action modificando o que está no exemplo acima para o nome dos teus switches.

O que essa action faz é que se estiver seleccionado o estore 1 executa a operação no estore 1, se for outra a selecção executa a operação no estore 2.

O código original é do @Maddoctor, talvez ele te possa guiar melhor que eu se lhe pedires com jeitinho :grin: mas depende do tempo que ele tenha disponível…


(Nuno Neves) #14

Como o @j_assuncao disse, é possível, mas não sei se é boa ideia, isto porque estores diferentes, em princípio, terão tempos de abertura e fecho diferentes…


(Hugo Neves) #15

Obrigado @j_assuncao vou me entreter :smile: .
@Maddoctor sim possivelmente terei problemas mas mesmo assim acho que vou arriscar sempre aprendo qualquer coisa :wink:


(Tiago Rôxo) #16

Eu estou a usar o z-wave fibaro roller shutter 2, e não deu trabalho nenhum a implementar.


(Rodolfo) #17

@tiagoroxo muito bom essa opção contudo não muito barata mas é sem dúvida fiável, pelo menos quem tem fala bem.


(André F. Cruz) #18

@Maddoctor
Não estou a conseguir que a barra de percentagem do estore funcione.

Podes dar uma olhada no codigo ?

group:

estores:
  view: yes
  icon: mdi:blinds
  entities:
    - group.estoresgrupo

estoresgrupo:
  control: hidden
  name: Estores
  entities:
    - input_number.aberturapersiana
    - cover.persiana

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 tempo de fecho.
tempodeabertura:
name: tempo de maximo de abertura
initial: 14
tempodefecho:
name: tempo de maximo de fecho
initial: 14
iniciofecho:
name: iniciofecho
inicioabertura:
name: inicioabertura

cover:
- platform: template
covers:
persiana:
friendly_name: “Persiana”
position_template: ‘{{ states.input_number.aberturapersiana.state }}’
open_cover:
- service: mqtt.publish
data:
topic: ‘cmnd/persianahall/POWER1’
payload: ‘ON’
close_cover:
- service: mqtt.publish
data:
topic: ‘cmnd/persianahall/POWER2’
payload: ‘ON’
stop_cover:
- service: mqtt.publish
data:
topic: ‘cmnd/persianahall/Backlog’
payload: ‘POWER1 OFF; POWER2 OFF’

binary_sensor:
- platform: mqtt
name: rele 1
state_topic: “stat/persianahall/POWER1”
payload_on: “ON”
payload_off: “OFF”
- platform: mqtt
name: rele 2
state_topic: “stat/persianahall/POWER2”
payload_on: “ON”
payload_off: “OFF”

input_boolean:
alterarslider:
name: Alterar o slider
initial: on

input_number:
aberturapersiana:
name: Abertura
min: 0
max: 100
step: 1
unit_of_measurement: ‘%’
icon: mdi:blinds
aberturapersianaold:
name: valor antigo de abertura
min: 0
max: 100
step: 1
unit_of_measurement: ‘%’

automation:
- id: iniciofecho
alias: começou a fechar
trigger:
- platform: state
entity_id: binary_sensor.rele_2
to: ‘on’
action:
service: input_text.set_value
data_template:
entity_id: input_text.iniciofecho
value: ‘{{ now() }}’
- id: fimfecho
alias: parou de fechar
trigger:
- platform: state
entity_id: binary_sensor.rele_2
to: ‘off’
condition:
- condition: state
entity_id: ‘input_boolean.alterarslider’
state: ‘on’
action:
- service: input_number.set_value
data_template:
entity_id: input_number.aberturapersianaold
value: >-
{% if (states.input_number.aberturapersiana.state)|int - ((as_timestamp(now()) - (as_timestamp(states.input_text.iniciofecho.state))|float|round(2))*100/(states.input_text.tempodefecho.state|int))|int < 4 %}
0
{% else %}
{{ (states.input_number.aberturapersiana.state)|int - ((as_timestamp(now()) - (as_timestamp(states.input_text.iniciofecho.state))|float|round(2))*100/(states.input_text.tempodefecho.state|int))|int }}
{% endif %}
- service: input_number.set_value
data_template:
entity_id: input_number.aberturapersiana
value: ‘{{ states.input_number.aberturapersianaold.state }}’
- id: inicioabertura
alias: começou a abrir
trigger:
- platform: state
entity_id: binary_sensor.rele_1
to: ‘on’
action:
service: input_text.set_value
data_template:
entity_id: input_text.inicioabertura
value: ‘{{ now() }}’
- id: fimabertura
alias: parou de abrir
trigger:
- platform: state
entity_id: binary_sensor.rele_1
to: ‘off’
condition:
- condition: state
entity_id: ‘input_boolean.alterarslider’
state: ‘on’
action:
- service: input_number.set_value
data_template:
entity_id: input_number.aberturapersianaold
value: >-
{% if (states.input_number.aberturapersiana.state)|int + ((as_timestamp(now()) - (as_timestamp(states.input_text.inicioabertura.state))|float|round(2))*100/(states.input_text.tempodeabertura.state|int))|int > 96 %}
100
{% else %}
{{ (states.input_number.aberturapersiana.state)|int + ((as_timestamp(now()) - (as_timestamp(states.input_text.inicioabertura.state))|float|round(2))*100/(states.input_text.tempodeabertura.state|int))|int }}
{% endif %}
- service: input_number.set_value
data_template:
entity_id: input_number.aberturapersiana
value: ‘{{ states.input_number.aberturapersianaold.state }}’

- id: aberturapeloslider
  alias: Abertura pelo slider
  trigger:
    platform: state
    entity_id: input_number.aberturapersiana
  condition:
  - condition: template
    value_template: '{{ states.input_number.aberturapersiana.state|int > states.input_number.aberturapersianaold.state|int }}'
  action:
  - service: input_boolean.turn_off
    data:
      entity_id: input_boolean.alterarslider
  - service: mqtt.publish
    data:
      topic: 'cmnd/persianahall/Backlog'
      payload_template: "POWER1 ON; delay {% if is_state('input_number.aberturapersiana', '100.0') %} {{ (((states.input_number.aberturapersiana.state|int - states.input_number.aberturapersianaold.state|int)*(states.input_text.tempodeabertura.state|float)/100)|round(1)*10)|round(0) + 20 }} {% else %}

{{ (((states.input_number.aberturapersiana.state|int - states.input_number.aberturapersianaold.state|int)*(states.input_text.tempodeabertura.state|float)/100)|round(1)10)|round(0) }} {% endif %}; POWER1 OFF"
- delay:
milliseconds: 800
- wait_template: “{{ is_state(‘binary_sensor.rele_1’, ‘off’) }}”
- service: input_boolean.turn_on
data:
entity_id: input_boolean.alterarslider
- service: input_number.set_value
data_template:
entity_id: input_number.aberturapersianaold
value: ‘{{ states.input_number.aberturapersiana.state }}’
- id: fechopeloslider
alias: Fecho pelo slider
trigger:
platform: state
entity_id: input_number.aberturapersiana
condition:
- condition: template
value_template: ‘{{ states.input_number.aberturapersiana.state|int < states.input_number.aberturapersianaold.state|int }}’
action:
- service: input_boolean.turn_off
data:
entity_id: input_boolean.alterarslider
- service: mqtt.publish
data:
topic: ‘cmnd/persianahall/Backlog’
payload_template: "POWER2 ON; delay {% if is_state(‘input_number.aberturapersiana’, ‘0.0’) %} {{ (((states.input_number.aberturapersianaold.state|int - states.input_number.aberturapersiana.state|int)
(states.input_text.tempodefecho.state|float)/100)|round(1)10)|round(0) + 20 }} {% else %}
{{ (((states.input_number.aberturapersianaold.state|int - states.input_number.aberturapersiana.state|int)
(states.input_text.tempodefecho.state|float)/100)|round(1)*10)|round(0) }} {% endif %}; POWER2 OFF"
- delay:
milliseconds: 800
- wait_template: “{{ is_state(‘binary_sensor.rele_2’, ‘off’) }}”
- service: input_boolean.turn_on
data:
entity_id: input_boolean.alterarslider
- service: input_number.set_value
data_template:
entity_id: input_number.aberturapersianaold
value: ‘{{ states.input_number.aberturapersiana.state }}’


(Nuno Neves) #19

assim não dá para perceber… formata o código usando </>


(André F. Cruz) #20
  group:
  
    estores:
      view: yes
      icon: mdi:blinds
      entities:
        - group.estoresgrupo

    estoresgrupo:
      control: hidden
      name: Estores
      entities:
        - input_number.aberturapersiana
        - cover.persiana

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:
    name: tempo de maximo de abertura
    initial: 14
  tempodefecho:
    name: tempo de maximo de fecho
    initial: 14
  iniciofecho:
    name: iniciofecho
  inicioabertura:
    name: inicioabertura

cover:
  - platform: template
    covers:
      persiana:
        friendly_name: "Persiana"
        position_template: '{{ states.input_number.aberturapersiana.state }}'
        open_cover:
          - service: mqtt.publish
            data:
              topic: 'cmnd/persianahall/POWER1'
              payload: 'ON'
        close_cover:
          - service: mqtt.publish
            data:
              topic: 'cmnd/persianahall/POWER2'
              payload: 'ON'
        stop_cover:
          - service: mqtt.publish
            data:
              topic: 'cmnd/persianahall/Backlog'
              payload: 'POWER1 OFF; POWER2 OFF'

binary_sensor:
  - platform: mqtt
    name: rele 1
    state_topic: "stat/persianahall/POWER1"
    payload_on: "ON"
    payload_off: "OFF"
  - platform: mqtt
    name: rele 2
    state_topic: "stat/persianahall/POWER2"
    payload_on: "ON"
    payload_off: "OFF"

input_boolean:
  alterarslider:
    name: Alterar o slider
    initial: on

input_number:
  aberturapersiana:
    name: Abertura
    min: 0
    max: 100
    step: 1
    unit_of_measurement: '%'
    icon: mdi:blinds
  aberturapersianaold:
    name: valor antigo de abertura
    min: 0
    max: 100
    step: 1
    unit_of_measurement: '%'

automation:
  - id: iniciofecho
    alias: começou a fechar
    trigger:
    - platform: state
      entity_id: binary_sensor.rele_2
      to: 'on'
    action:
      service: input_text.set_value
      data_template:
        entity_id: input_text.iniciofecho
        value: '{{ now() }}'
  - id: fimfecho
    alias: parou de fechar
    trigger:
    - platform: state
      entity_id: binary_sensor.rele_2
      to: 'off'
    condition:
    - condition: state
      entity_id: 'input_boolean.alterarslider'
      state: 'on'
    action:
    - service: input_number.set_value
      data_template:
        entity_id: input_number.aberturapersianaold
        value: >-
          {% if (states.input_number.aberturapersiana.state)|int - ((as_timestamp(now()) - (as_timestamp(states.input_text.iniciofecho.state))|float|round(2))*100/(states.input_text.tempodefecho.state|int))|int < 4 %}
            0
          {% else %}
            {{ (states.input_number.aberturapersiana.state)|int - ((as_timestamp(now()) - (as_timestamp(states.input_text.iniciofecho.state))|float|round(2))*100/(states.input_text.tempodefecho.state|int))|int }}
          {% endif %}
    - service: input_number.set_value
      data_template:
        entity_id: input_number.aberturapersiana
        value: '{{ states.input_number.aberturapersianaold.state }}'
  - id: inicioabertura
    alias: começou a abrir
    trigger:
    - platform: state
      entity_id: binary_sensor.rele_1
      to: 'on'
    action:
      service: input_text.set_value
      data_template:
        entity_id: input_text.inicioabertura
        value: '{{ now() }}'
  - id: fimabertura
    alias: parou de abrir
    trigger:
    - platform: state
      entity_id: binary_sensor.rele_1
      to: 'off'
    condition:
    - condition: state
      entity_id: 'input_boolean.alterarslider'
      state: 'on'
    action:
    - service: input_number.set_value
      data_template:
        entity_id: input_number.aberturapersianaold
        value: >-
          {% if (states.input_number.aberturapersiana.state)|int + ((as_timestamp(now()) - (as_timestamp(states.input_text.inicioabertura.state))|float|round(2))*100/(states.input_text.tempodeabertura.state|int))|int > 96 %}
            100
          {% else %}
            {{ (states.input_number.aberturapersiana.state)|int + ((as_timestamp(now()) - (as_timestamp(states.input_text.inicioabertura.state))|float|round(2))*100/(states.input_text.tempodeabertura.state|int))|int }}
          {% endif %}
    - service: input_number.set_value
      data_template:
        entity_id: input_number.aberturapersiana
        value: '{{ states.input_number.aberturapersianaold.state }}'

  - id: aberturapeloslider
    alias: Abertura pelo slider
    trigger:
      platform: state
      entity_id: input_number.aberturapersiana
    condition:
    - condition: template
      value_template: '{{ states.input_number.aberturapersiana.state|int > states.input_number.aberturapersianaold.state|int }}'
    action:
    - service: input_boolean.turn_off
      data:
        entity_id: input_boolean.alterarslider
    - service: mqtt.publish
      data:
        topic: 'cmnd/wemosd1mini/Backlog'
        payload_template: "POWER1 ON; delay {% if is_state('input_number.aberturapersiana', '100.0') %} {{ (((states.input_number.aberturapersiana.state|int - states.input_number.aberturapersianaold.state|int)*(states.input_text.tempodeabertura.state|float)/100)|round(1)*10)|round(0) + 20 }} {% else %}
{{ (((states.input_number.aberturapersiana.state|int - states.input_number.aberturapersianaold.state|int)*(states.input_text.tempodeabertura.state|float)/100)|round(1)*10)|round(0) }} {% endif %}; POWER1 OFF"
    - delay:
        milliseconds: 800
    - wait_template: "{{ is_state('binary_sensor.rele_1', 'off') }}"
    - service: input_boolean.turn_on
      data:
        entity_id: input_boolean.alterarslider
    - service: input_number.set_value
      data_template:
        entity_id: input_number.aberturapersianaold
        value: '{{ states.input_number.aberturapersiana.state }}'
  - id: fechopeloslider
    alias: Fecho pelo slider
    trigger:
      platform: state
      entity_id: input_number.aberturapersiana
    condition:
    - condition: template
      value_template: '{{ states.input_number.aberturapersiana.state|int < states.input_number.aberturapersianaold.state|int }}'
    action:
    - service: input_boolean.turn_off
      data:
        entity_id: input_boolean.alterarslider
    - service: mqtt.publish
      data:
        topic: 'cmnd/wemosd1mini/Backlog'
        payload_template: "POWER2 ON; delay {% if is_state('input_number.aberturapersiana', '0.0') %} {{ (((states.input_number.aberturapersianaold.state|int - states.input_number.aberturapersiana.state|int)*(states.input_text.tempodefecho.state|float)/100)|round(1)*10)|round(0) + 20 }} {% else %}
{{ (((states.input_number.aberturapersianaold.state|int - states.input_number.aberturapersiana.state|int)*(states.input_text.tempodefecho.state|float)/100)|round(1)*10)|round(0) }} {% endif %}; POWER2 OFF"
    - delay:
        milliseconds: 800
    - wait_template: "{{ is_state('binary_sensor.rele_2', 'off') }}"
    - service: input_boolean.turn_on
      data:
        entity_id: input_boolean.alterarslider
    - service: input_number.set_value
      data_template:
        entity_id: input_number.aberturapersianaold
        value: '{{ states.input_number.aberturapersiana.state }}'