Versão actualizada e mais completa: 📑 MadBlinds v2 - Como Controlares os estores eléctricos e "estimares" a sua posição (Desactualizado) - #3
(editado para incluir possibilidade de tempos diferentes para subida e descida)
(nova edição - alterada forma como é feito o delay pelo slider para que possa "incluir" décimos de segundo e seja "imune" a lag de comunicação entre HA e sonoff)
(mais uma pequena correcção de bugs para ligar com possíveis delays de comunicação...)
Como o título indica, esta é uma configuração que fiz para ter cover de estores com indicação de percentagem de abertura estimada e possibilidade de escolher a percentagem de abertura (alterando o valor directamente no slider)…
Acabou por ficar bastante complexa, mas, após muitos testes, parece-me estar a funcionar bem…
Os pressupostos são os seguintes:
- Sonoff dual ou equivalente com firmware tasmota
- no exemplo o estore demora ligeiramente menos de 10 segundos a fechar completamente
(é aconselhavel configurar no tasmota o powerretain off)
De uma forma simplista:
Raciocínio 1 - o estore demora 10 segundos a fechar portanto, se os relés estiverem activos apenas durante uma fracção desse tempo, o estore abriu apenas X%. Se, em seguida se activar o relé mais algum tempo, o estore está agora aberto 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 segundos.
Passos:
-
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 “setoption14 on”, para activar interlocking; “poweronstate 0”, “powerretain1 off” e “powerretain2 off”!
-
criar um “package” no home assistant com o código seguinte 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 do vosso e os tópicos para os vossos (aconselhável usar a função “subtituir tudo” do vosso editor para trocar “wemosd1mini” pelo tópico do vosso sonoff). 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: name: tempo de maximo de abertura initial: 10 tempodefecho: name: tempo de maximo de fecho initial: 10 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/wemosd1mini/POWER1' payload: 'ON' close_cover: - service: mqtt.publish data: topic: 'cmnd/wemosd1mini/POWER2' payload: 'ON' stop_cover: - service: mqtt.publish data: topic: 'cmnd/wemosd1mini/Backlog' payload: 'POWER1 OFF; POWER2 OFF' binary_sensor: - platform: mqtt name: rele 1 state_topic: "stat/wemosd1mini/POWER1" payload_on: "ON" payload_off: "OFF" - platform: mqtt name: rele 2 state_topic: "stat/wemosd1mini/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 }}'
Fico a aguardar feedback!