Блог

Сенсор открытого внешнего порта для Home Assistant

Большинство провайдеров всегда выдают своим пользователям динамические IP-адреса. Иногда адреса бывают белыми, иногда серыми. Некоторые провайдеры выдают белые/серые адреса через раз.

В примере ниже показаны несколько полезных сенсоров:

  • сенсор вашего публичного IP-адреса, обновляется раз в 2 минуты
  • сенсор открытого порта, обновляется автоматизацией при изменении IP-адреса
  • сенсоры скорости Интернета, обновляется раз в час

И несколько полезных скриптов:

  • принудительное обновление всех сенсоров по кнопке
  • перезагрузка главного роутера (для получения нового IP-адреса)

Для перезагрузки роутера используется мой кастомный компонент PythonScriptPro. Он позволяет добавлять в Home Assistant любую логику на языке Python. А также пользоваться любыми внешними библиотеками Python, в том числе устанавливать эти библиотеке в Docker контейнер, если вы пользуетесь Hass.io.

Например, можно посылать команды роутеру не по HTTP, как в моём примере, а по SSH (пример есть на GitHub компонента).

Конечно именно для вашего роутера команда будет совсем другой, не стоит бездумно копировать мой вариант.

PS. У меня в примере открытый порт обновляется раз в сутки или автоматизацией при смене IP-адреса. Просьба не злоупотреблять этим интервалом. А то сайт 2ip.ru обидится на нас всех и вообще заблокирует эту возможность.

PS. В примере показано принудительное обновление сенсоров. Таким подходом можно пользоваться с любыми объектами в Home Assistant, данные которых обновляются по времени.

binary_sensor: - platform: rest name: Open Port resource: 'https://2ip.ru/check-port/?port=80' headers: device_class: connectivity value_template: '{{ "Порт&nbsp;открыт" in value }}' scan_interval: '24:00:00' sensor: - platform: dnsip name: Public IP speedtestdotnet: scan_interval: '24:00:00' automation: - alias: Update open port trigger: platform: state entity_id: sensor.public_ip action: service: homeassistant.update_entity data: entity_id: sensor.public_ip # custom component: https://github.com/AlexxIT/PythonScriptsPro python_script: script: update_internet: alias: Update Internet Info sequence: - service: homeassistant.update_entity entity_id: - sensor.public_ip - binary_sensor.open_port - sensor.speedtest_download - sensor.speedtest_upload - sensor.speedtest_ping reboot_main_router: alias: Reboot main router sequence: - service: python_script.exec data: source: | import requests from requests.auth import HTTPDigestAuth requests.post( 'http://192.168.1.1/ci', auth=HTTPDigestAuth('admin', 'admin'), data='<request id="0"><command name="system reboot"/></request>', headers={'Content-Type': 'application/xml'} )


Отличная статья. Хоть большинство полезных фич у меня организовано силами скриптов в прошивке Padawan, но вот телеграмм уведомления о изменении IP, я себе наверное сделаю, да и перезагрузка по кнопке из HA не будет лишнее. Спасибо большое!!!

А такая структура не рабочая получается?

Или я что-то упускаю? 


sensors.yaml

- platform: python_script


name: Telegram status


scan_interval: '00:05:00'


data:


token: !secret telegram_api


source: |


import requests


import json

token = data.get('token','')


r = requests.get('https://api.telegram.org/bot'+token+'/getMe')


if r.json()['ok'] is True:


self.state = "online"


else:


self.state = "offline"

В сенсоре нету data. Его данные можно вставить прям в код. Но secret не поддерживается

Спасибо! Тогда через скрипты сделаю. Там же можно будет secret вставить? Не хочется идентификаторы по всему конфигу растаскивать, потом ищи где вот это вот всё лежит )

Через python файл можно. Поддерживается код во внешнем python-скрипте

Спасибо! 

Ещё раз хочу сказать спасибо за этот компонент! 
Перенёс в ХА скрипт для которого ранее был отдельный бот сделан. 


Вернуться назад
Вернуться назад