Configurar Sonoff Basic com Espurna para Portão de Correr

Boas Pessoal,

Sou novo nisto dos switch`s, covers etc etc e pedia a vossa ajuda para resolver o meu problema.

Tenho instalado no Sonoff Basic o Espurna e colocado no meu Portão da rua e fica como Switch (está claro) e funciona no HA.

Eu queria configurar de forma que por tempo saiba o estado da abertura (cover) e não com sensores.

A config que o Espurna me dá é seguinte:

switch:
  - name: portal
    platform: mqtt
    state_topic: portal/relay/0
    command_topic: portal/relay/0/set
    payload_on: 1
    payload_off: 0
    availability_topic: portal/status
    payload_available: 1
    payload_not_available: 0

Abraços

Acho que tens de meter um sonoff dual, para o portao abrir e depois fechar, caso contrario, o portao vai ficar sempre aberto.

Já o tenho a funcionar, porque o próprio portão já tem o sensor de fim de carreira e tem o sensor de passagem, porque era um portão de correr que já tinha isso.

Esta a funcionar como switch. Dás ao botão (abre), Dás ao Botão (pára), Dás ao Botão (fecha).

Espurna , não domino.
@j_assuncao tá mais dentro do assunto que diz respeito a Espurna.

1 Like

Rodolfo,

Como se tenho de por o Tasmota, a mim dá-me igual, desde que funcione.

@tcruz quando publicares código, selecciona o texto e clica no ícone </>

Assim de cabeça penso que o que queres fazer só dá para fazer no HA e não importa se tens o Espurna, Tasmota, ESPEasy ou outro.

Queres saber se o portão está a fazer o movimento de abertura ou de fecho? Explica lá melhor para saber exactamente o que pretendes.

1 Like

@j_assuncao desculpa não ter colocado o código, mas já editei e já resolvi.

O que gostaria é:

Por exemplo o meu portão demora 24 segundos em estar totalmente aberto, então como tenho o sonoff basic o que queria era configurar no HA (que depois deteta o Homekit) o portão e pelos segundos que demora a abrir saber em que posição está.

Não sei se me fiz entender.

Sim, já percebi. A questão que vejo é que demora 24s hoje sem vento, amanhã com vento leva 25 ou 26 e daqui a uns anos leva ainda mais e as contas deixam de bater certo.

Mas pode ser feito no HA independentemente de teres Espurna, Tasmota ou outro.

Lê este tópico que tem a base para o que precisas:

1 Like

Obrigado pela ajuda @j_assuncao mas resolvi neste link https://community.home-assistant.io/t/template-cover/11141/10

Mas não ficou a funcionar o tema do tempo.

Mas ainda não está ainda implementado o estado por tempo de funcionamento no template ou não está a funcionar contigo?

Tanto nesse link que enviaste, como no que coloquei eu, a questão do tempo não está muito bem esclarecida, porque a maioria o que procuram é que ao final de X tempo el feche ou abra, mas continuo a indagar para implementar.

Pelo que vejo no teu link , se estou a perceber bem, os atributos opening_time: e closing_time: definem o tempo dos movimentos de abertura e de fecho respectivamente.

No teu caso como demora 24s basta alterar os respectivos valores mas se o portão demorar tempo diferentes a abrir e a fechar podes alterar conforme o teu caso.

cover:
  - platform: template
    covers:
     testing:
        friendly_name: 'Just Testing'
        position_template: '{{ states.cover.testing.attributes.current_position | int }}'
        open_cover:
          service: switch.turn_on
          entity_id: switch.test
        close_cover:
          service: switch.turn_off
          entity_id: switch.test
        stop_cover:
          service: switch.turn_on
          entity_id: switch.test_stop    
        opening_time: 24
        closing_time: 24

O calculo para mostrar a posição e feito depois em função destes valores.

Eu experimentei esse todo, mas dá um erro, por isso tive de tirar o tempo:

Invalid config for [cover.template]: [opening_time] is an invalid option for [cover.template]. Check: cover.template->covers->portal->opening_time. (See ?, line ?). Please check the docs at https://home-assistant.io/components/cover.template/

Era isso que precisava de saber. Quando chegar a casa vou confirmar o código.

@j_assuncao

Vou experimentar esta solução:
Sonoff Dual Window Cover with set position

Tenta antes adaptar a “nossa” versão:
https://forum.cpha.tech/t/como-controlares-os-estores-electricos-e-estimares-a-sua-posicao/570

1 Like

Apoio a ideia de tentares com a “nossa” versão que é bastante boa.

1 Like

Estou a tentar, mas dá-me sempre o mesmo erro ao verificar config e eu só alterei os nomes, a opção de só 1 rele e nada mais.

Invalid config for [automation]: required key not provided @ data[‘action’]. Got None
required key not provided @ data[‘trigger’]. Got None. (See ?, line ?). Please check the docs at https://home-assistant.io/components/automation/

automation:

- id: iniciofecho
  alias: começou a fechar
  trigger:
  - platform: state
    entity_id: binary_sensor.rele
    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
    to: 'off'
  condition:
  - condition: state
    entity_id: 'input_boolean.alterarslider'
    state: 'on'
  action:
  - service: input_number.set_value
    data_template:
      entity_id: input_number.aberturaportalold
      value: >-
        {% if (states.input_number.aberturaportal.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.aberturaportal.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.aberturaportal
      value: '{{ states.input_number.aberturaportalold.state }}'
- id: inicioabertura
  alias: começou a abrir
  trigger:
  - platform: state
    entity_id: binary_sensor.rele
    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
    to: 'off'
  condition:
  - condition: state
    entity_id: 'input_boolean.alterarslider'
    state: 'on'
  action:
  - service: input_number.set_value
    data_template:
      entity_id: input_number.aberturaportalold
      value: >-
        {% if (states.input_number.aberturaportal.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.aberturaportal.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.aberturaportal
      value: '{{ states.input_number.aberturaportalold.state }}'

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

Tens os input-number e sensor criados e com os nomes correctos?

Atenção aos espaçamentos, o Yaml é muito sensivél a isso!

Assim de repente vi dois erros relacionados com a mensagem de erro que tens:

automation:

- id: iniciofecho
  alias: começou a fechar
  trigger:
  - platform: state
    entity_id: binary_sensor.rele
    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
    to: 'off'

A seguir ao trigger: tens de dar mais dois espaços no - platform:

automation:

- id: iniciofecho
  alias: começou a fechar
  trigger:
    - platform: state
      entity_id: binary_sensor.rele
      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
      to: 'off'

Pode haver mais, não vi o código todo…

EDIT: Tens bastantes erros no código! Além da indentação também tens a falta do - antes do platform em alguns sítios do código…