Dando seguimento à minha dúvida, e porque pode vir a ajudar alguém, deixo a forma como consegui deixa o meu videoporteiro mais inteligente.
Notas prévias:
-
Sempre que a campainha toca, o terminar 4A recebe 12v DC (a cada toque).
-
Sempre que se pega no telefone do videoporteiro, quando o ecrã está inativo, o terminal 4A também recebe 12v DC.
O que é necessário:
-
Sonoff SV em modo isolado (com Tasmota):
-
Optoacoplador 12v:
Pode ser adquirido no Aliexpress: https://www.aliexpress.com/item/32719957788.html?spm=a2g0s.9042311.0.0.15c3b90aYrzklS
Como efetuar as ligações:
-
Alimentar o sonoff com o +V (10Vds Input/Outpud) e - (Ground reference for +V terminal)
-
Ligar o 3A (Output switched ground for parallel telephone) ao input positivo do relé do Sonoff;
-
Ligar o 5A (Input for door-open command from parallel telephone) ao output positivo do relé do Sonoff;
-
Ligar o Output do optoacoplador ao GPIO14 do Sonoff (imagem com identificação do GPIO14):
-
Ligar o 4A (Output call tone for parallel telephone) ao input do optoacoplador - o negativo pode ser “puxado” da alimentação do Sonoff.
O resultado será isto:
Com caixa, e com as ligações finais (não se percebe bem por causa da quantidade de fios…):
Resultado final (estou a utilizar um sensor de vibração no telefone para tentar evitar os falsos positivos de quando alguém pega no telefone quando o ecrã está desligado):
No Tasmota, é necessário configurar o GPIO14 para Switch2:
No HomeAssistant:
#######################################################################################################################
# _____ ___ ___ ___ ___
# / /::\ / /\ / /\ / /\ _____ / /\
# / /:/\:\ / /::\ / /::\ / /::\ / /::\ / /:/_
# / /:/ \:\ / /:/\:\ / /:/\:\ / /:/\:\ / /:/\:\ / /:/ /\ ___ ___ ___ ___
# /__/:/ \__\:| / /:/ \:\ / /:/ \:\ / /:/~/:/ / /:/~/::\ / /:/ /:/_ /__/\ / /\ /__/\ / /\
# \ \:\ / /:/ /__/:/ \__\:\ /__/:/ \__\:\ /__/:/ /:/___ /__/:/ /:/\:| /__/:/ /:/ /\ \ \:\ / /:/ \ \:\ / /:/
# \ \:\ /:/ \ \:\ / /:/ \ \:\ / /:/ \ \:\/:::::/ \ \:\/:/~/:/ \ \:\/:/ /:/ \ \:\ /:/ \ \:\ /:/
# \ \:\/:/ \ \:\ /:/ \ \:\ /:/ \ \::/~~~~ \ \::/ /:/ \ \::/ /:/ \ \:\/:/ \ \:\/:/
# \ \::/ \ \:\/:/ \ \:\/:/ \ \:\ \ \:\/:/ \ \:\/:/ \ \::/ \ \::/
# \__\/ \ \::/ \ \::/ \ \:\ \ \::/ \ \::/ \__\/ \__\/
# \__\/ \__\/ \__\/ \__\/ \__\/
#
#######################################################################################################################
# _ _ _ _
# (_) _ __ _ __ _ _ | |_ | |__ ___ ___ | | ___ __ _ _ __
# | | | '_ \ | '_ \ | | | | | __| | '_ \ / _ \ / _ \ | | / _ \ / _` | | '_ \
# | | | | | | | |_) | | |_| | | |_ | |_) | | (_) | | (_) | | | | __/ | (_| | | | | |
# |_| |_| |_| | .__/ \__,_| \__| _____ |_.__/ \___/ \___/ |_| \___| \__,_| |_| |_|
# |_| |_____|
input_boolean:
notify_videoporteiro:
name: Notifica video-porteiro
icon: mdi:bell-ring
movimentovideoporteiro:
name: Movimento do video-porteiro
initial: off
icon: mdi:deskphone
campainhatocar:
name: Campainha a Tocar
initial: off
icon: mdi:doorbell-video
# ____ _ _ _
# / ___| __ __ (_) | |_ ___ | |__
# \___ \ \ \ /\ / / | | | __| / __| | '_ \
# ___) | \ V V / | | | |_ | (__ | | | |
# |____/ \_/\_/ |_| \__| \___| |_| |_|
switch:
- platform: mqtt
name: "Videoporteiro"
state_topic: "stat/videoporteiro/POWER"
command_topic: "cmnd/videoporteiro/power"
availability_topic: "tele/videoporteiro/LWT"
payload_available: "Online"
payload_not_available: "Offline"
qos: 1
payload_on: "ON"
payload_off: "OFF"
retain: false
- platform: mqtt
name: "Campainha"
state_topic: "cmnd/videoporteiro/POWER2"
command_topic: "cmnd/videoporteiro/power2"
availability_topic: "tele/videoporteiro/LWT"
payload_available: "Online"
payload_not_available: "Offline"
qos: 1
payload_on: "ON"
payload_off: "OFF"
retain: false
# ____
# / ___| ___ _ __ ___ ___ _ __
# \___ \ / _ \ | '_ \ / __| / _ \ | '__|
# ___) | | __/ | | | | \__ \ | (_) | | |
# |____/ \___| |_| |_| |___/ \___/ |_|
#zigbe2mqtt
sensor:
- platform: "mqtt"
name: "Vibração Campainha"
state_topic: "zigbee2mqtt/campainha"
availability_topic: "zigbee2mqtt/bridge/state"
icon: "mdi:gesture-double-tap"
value_template: "{{ value_json.action }}"
- platform: "mqtt"
name: "Bateria Campainha"
state_topic: "zigbee2mqtt/campainha"
availability_topic: "zigbee2mqtt/bridge/state"
unit_of_measurement: "%"
device_class: "battery"
value_template: "{{ value_json.battery }}"
- platform: "mqtt"
name: "Força sinal Campainha"
state_topic: "zigbee2mqtt/campainha"
availability_topic: "zigbee2mqtt/bridge/state"
unit_of_measurement: "dB"
icon: mdi:speedometer
value_template: "{{ value_json.linkquality }}"
# _ _ _ _
# / \ _ _ | |_ ___ _ __ ___ __ _ | |_ (_) ___ _ __
# / _ \ | | | | | __| / _ \ | '_ ` _ \ / _` | | __| | | / _ \ | '_ \
# / ___ \ | |_| | | |_ | (_) | | | | | | | | (_| | | |_ | | | (_) | | | | |
# /_/ \_\ \__,_| \__| \___/ |_| |_| |_| \__,_| \__| |_| \___/ |_| |_|
automation:
- id: sensor_vibracao_mudou_estado
alias: 'Sensor de vibração'
trigger:
- platform: state
entity_id: sensor.vibracao_campainha
condition:
condition: state
entity_id: input_boolean.movimentovideoporteiro
state: 'off'
action:
- service: input_boolean.turn_on
data:
entity_id: input_boolean.movimentovideoporteiro
- service: notify.telegram
data_template:
title: "Telefone do video-porteiro"
message: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }} - O telefone do videoporteiro detetou movimento - alguém pegou no telefone.'
- id: desliga_movimentovideoporteiro
alias: 'Desliga movimento do video-porteiro'
trigger:
- platform: state
entity_id: input_boolean.movimentovideoporteiro
to: 'on'
for:
hours: 0
minutes: 1
seconds: 30
action:
- service: input_boolean.turn_off
data:
entity_id: input_boolean.movimentovideoporteiro
- id: sensor_campainha_mudou_estado
alias: 'Campainha mudou de estado'
trigger:
- platform: state
entity_id: switch.campainha
to: 'on'
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.campainhatocar
state: 'off'
- condition: state
entity_id: input_boolean.movimentovideoporteiro
state: 'off'
action:
- service: input_boolean.turn_on
data:
entity_id: input_boolean.campainhatocar
- id: desliga_campainha
alias: 'Desliga campainha do video-porteiro'
trigger:
- platform: state
entity_id: input_boolean.campainhatocar
to: 'on'
for:
hours: 0
minutes: 0
seconds: 30
action:
- service: input_boolean.turn_off
data:
entity_id: input_boolean.campainhatocar
- id: campainha_a_tocar_com_foto
alias: 'Campainha a tocar - com foto'
trigger:
- platform: state
entity_id: input_boolean.campainhatocar
to: 'on'
condition:
condition: state
entity_id: input_boolean.notify_videoporteiro
state: 'on'
action:
- service: camera.snapshot
data:
entity_id: camera.rua
filename: "/config/www/cam_captures/frente_{{ now ().year }}_{{ now ().month }}_{{ now ().day }}_{{ now ().hour }}_{{ now ().minute }}.jpg"
- delay:
seconds: 10
- service: notify.telegram
data_template:
title: "A campainha está a tocar"
message: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }} - A campainha está a tocar'
data:
photo:
- file: "/config/www/cam_captures/frente_{{ now ().year }}_{{ now ().month }}_{{ now ().day }}_{{ now ().hour }}_{{ now ().minute }}.jpg"
caption: "A campainha está a tocar"