Мониторинг и управление роутерами Keenetic из Home Assistant
Возврат:: к списку статей
У данных роутеров есть CLI, консоль управления, вот все что можно сделать в ней можно сделать через ХА. Тут мануал по командам.
1. Нужно включить доступ к ней в ЛОКАЛЬНОЙ СЕТИ без авторизации. Для этого в самом роутере нужно создать правило переадресации портов.
цифрой 1 отмечено, это диапазон ВАШЕЙ ЛОКАЛЬНОЙ сети, у кого то 192.168.0.0 или 192.168.1.0. Порты оставить как на скрине.
После этого из локальной сети для проверки можно зайти http://IP-адрес:81/rci/show/system , должны увидеть инфо, если так все норм.
2. Теперь можно создавать сенсоры, ip заменить на свой. Эти сенсоры стандартные для всех кинетиков. Загрузка проца\памяти и аптайм.
sensor:
- platform: rest
resource: http://10.0.0.1:81/rci/show/system
name: Keenetic CPU load
value_template: "{{ value_json.cpuload }}"
unit_of_measurement: '%'
unique_id: Keenetic CPU load
- platform: rest
resource: http://10.0.0.1:81/rci/show/system
name: Keenetic RAM load
value_template: >
{%- set mem = value_json.memory-%}
{%- set memfree = mem.split('/')[0]|int(0)-%}
{%- set memtotal = mem.split('/')[1]|int(1)-%}
{{ (memfree*100/memtotal)| round(2) }}
unit_of_measurement: '%'
unique_id: Keenetic RAM load
- platform: rest
resource: http://10.0.0.1:81/rci/show/system
name: Keenetic Uptime
unique_id: Keenetic Uptime
value_template: >
{%- set test = value_json.uptime | int(0) / 60-%}
{%- set minutes = (test % 60) | int %}
{%- set hours = ((test % 1440) /60) | int %}
{%- set days = (test / 1440)|int -%}
{%if days > 0 %}{{days}}д {% endif %}{%if hours > 0 %}{{hours}}ч {% endif %}{%if minutes > 0 or test >60 %}{{minutes}}м{%else%}<1m{%endif%}
3. Можно мониторить интернет соединение или подключенный ВПН, в моем случае это интерфейсы PPPoE0 и Wireguard0
посмотреть свои можно если зайти на страницу http://IP-адрес:81/rci/show/interface , Далее создаем сенсоры этих интерфейсов где будет видно поднят он или нет, и в атрибутах IP адрес, есть ли линк и аптайм именно этого подключения.
- platform: rest
resource: http://10.0.0.1:81/rci/show/interface/PPPoE0
name: Keenetic PPPoE0
value_template: "{{ value_json.state }}"
unique_id: Keenetic PPPoE0
json_attributes:
- address
- link
- uptime
- platform: rest
resource: http://10.0.0.1:81/rci/show/interface/Wireguard0
name: Keenetic Wireguard0
value_template: "{{ value_json.state }}"
unique_id: Keenetic Wireguard0
json_attributes:
- address
- link
- uptime
Если требуются интерфейсы с двойным названием через слеш (например WifiMaster0/WifiStation0)
то строка запроса на них будет вида
resource: http://10.0.0.1:81/rci/show/interface/?name=WifiMaster0/WifiStation0
4. Так же есть возможность перезагрузить роутер. Это уже не сенсор, а rest_command , прописываем отдельно в configuration.yaml И второй rest принудительного обновления KeenDNS
rest_command:
keenetic_reboot:
url: http://10.0.0.1:81/rci/system/reboot
method: POST
payload: "{}"
keenetic_keendns_update:
url: http://10.0.0.1:81/rci/ndns/get-update
method: POST
payload: "{}"
5. вообще возможностей куча, для роутеров с USB и подключенными хардами, можно достать так же инфо о диске, сколько свободного места. Можно кол-во подключенных устройств достать и вообще все все) так же можно управлять таблицей маршрутизации, я например прямо из телеги, для обхода блокировок, отправляю ХА домен который мне нужно обойти через ВПН, и ха его добавляет.
6. Отключение итнернета конкретному устройству сети. Заменить mac в 3 местах, на нужный!
switch:
- platform: rest
name: keenetic_comp_inet
unique_id: keenetic_comp_inet
resource: "http://10.0.0.1:81/rci/ip/hotspot/host"
body_on: '{"mac":"54:48:e6:0b:67:8a", "access":"permit"}'
body_off: '{"mac":"54:48:e6:0b:67:8a", "access":"deny" }'
is_on_template: >
{% for k in value_json %}
{% if k.mac == '54:48:e6:0b:67:8a' %}
{{ k.access == 'permit' }}
{% endif %}{% endfor %}
7. включение и отключение интерфейсов роутера, на примере гостевой WiFi сети
switch:
- platform: rest
name: keenetic_GuestWiFi
unique_id: keenetic_GuestWiFi
resource: "http://10.0.0.1:81/rci/interface/GuestWiFi"
body_on: '{"up":"true"}'
body_off: '{"down":"true"}'
is_on_template: >
{{ value_json.up is defined }}
8. Скорость приема\передачи в мегабитах в секунду, на интерфейсе PPPoE0
- platform: rest
resource: http://10.0.0.1:81/rci/show/interface/stat?name=PPPoE0
name: Keenetic txspeed
value_template: "{{ (value_json.txspeed / 1250000) | round(2) }}"
unique_id: Keenetic txspeed
scan_interval: 20
unit_of_measurement: 'Mbit/s'
json_attributes:
- txbytes
- txerrors
- txspeed
- platform: rest
resource: http://10.0.0.1:81/rci/show/interface/stat?name=PPPoE0
name: Keenetic rxspeed
value_template: "{{ (value_json.rxspeed / 1250000) | round(2) }}"
unique_id: Keenetic rxspeed
scan_interval: 20
unit_of_measurement: 'Mbit/s'
json_attributes:
- rxbytes
- rxerrors
- rxspeed
9. Температура чипов Wi-Fi 2,4 и 5 ГГц
- platform: rest
resource: http://10.0.0.1:81/rci/show/interface/WifiMaster0
name: Keenetic temperature cip wifi 2.4
value_template: "{{ value_json.temperature }}"
unit_of_measurement: '°C'
unique_id: Keenetic temperature cip wifi 2.4
- platform: rest
resource: http://10.0.0.1:81/rci/show/interface/WifiMaster1
name: Keenetic temperature cip wifi 5
value_template: "{{ value_json.temperature }}"
unit_of_measurement: '°C'
unique_id: Keenetic temperature cip wifi 5
10. Включение и выключение через ХА, удаленного доступа к веб морде роутера.
- platform: rest
name: "Web Ext Access"
unique_id: Web Ext Access
resource: http://10.0.0.1:81/rci/ip/http/security-level
method: post
body_on: '{ "public": true, "ssl": true }'
body_off: '{ "private": true }'
is_on_template: "{{ 'public' in value_json }}"
Для меш роутеров
Можно мониторить ресурсы меш роутеров , доступны они на странице(главного роутера)http://IP:81/rci/show/mws/member в виде массива
если роутер один, то первый элемент массива это 0, ниже в коде [0], для остальных 1\2\3 и так далее..
- platform: rest
resource: http://10.0.0.1:81/rci/show/mws/member
name: Keenetic_mesh CPU load
value_template: "{{ value_json[0].system.cpuload }}"
unit_of_measurement: '%'
unique_id: Keenetic_mesh CPU load
- platform: rest
resource: http://10.0.0.1:81/rci/show/mws/member
name: Keenetic_mesh RAM load
value_template: >
{%- set mem = value_json[0].system.memory-%}
{%- set memfree = mem.split('/')[0]|int(0)-%}
{%- set memtotal = mem.split('/')[1]|int(1)-%}
{{ (memfree*100/memtotal)| round(2) }}
- platform: rest
resource: http://10.0.0.1:81/rci/show/mws/member
name: Keenetic_mesh Uptime
unique_id: Keenetic_mesh Uptime
value_template: >
{%- set test = value_json[0].system.uptime | int(0) / 60-%}
{%- set minutes = (test % 60) | int %}
{%- set hours = ((test % 1440) /60) | int %}
{%- set days = (test / 1440)|int -%}
{%if days > 0 %}{{days}}д {% endif %}{%if hours > 0 %}{{hours}}ч {% endif %}{%if minutes > 0 or test >60 %}{{minutes}}м{%else%}<1m{%endif%}
Перезагрузить пока возможно только через сторонний скрипт авторизации.
Нужно создать файл keenetic.py, положить в корень, рядом с configuration.yaml. В нем подправить логин и пароль на свои.
# -*- coding: utf-8 -*-
import sys
ip_addr=str(sys.argv[1])
method_str=str(sys.argv[2])
command_str=str(sys.argv[3])
data_str=str(sys.argv[4])
login = "admin"
passw = "password"
CONFIG_FILE_NAME = "keenetic.conf"
import configparser
import requests
import hashlib
cookies_current = None
session = requests.session()
def keen_auth(login, passw):
response = keen_request(ip_addr, "auth", None, "GET")
if response.status_code == 401:
md5 = login + ":" + response.headers["X-NDM-Realm"] + ":" + passw
md5 = hashlib.md5(md5.encode('utf-8'))
sha = response.headers["X-NDM-Challenge"] + md5.hexdigest()
sha = hashlib.sha256(sha.encode('utf-8'))
response = keen_request(ip_addr, "auth", {"login": login, "password": sha.hexdigest()}, "POST")
if response.status_code == 200:
return True
elif response.status_code == 200:
return True
else:
return False
def keen_request(ip_addr, query, data = None, method="GET"):
global session
url = "http://" + ip_addr + "/" + query
if method == "POST":
return session.post(url, json=data)
else:
return session.get(url)
config = configparser.ConfigParser()
config.read(CONFIG_FILE_NAME)
ip_addr = ip_addr
login = login
passw = passw
if keen_auth(login, passw):
response = keen_request(ip_addr, command_str, data_str, method_str);
print(response.text)
командой вида, где IP-адрес это ip меш роутера
- switch:
name: Reboot Keenetic_mash
command_on: "python3 /config/keenetic.py 'IP-адрес' 'POST' 'rci/system/reboot' '{}'"
При помощи данного скрипта можно, через command_line, выдергивать с меш роутера любые данные, копии которых нет на главном.
Для примера загрузка процессора:
command_line:
- sensor:
name: kenetic_mash_cpu
unique_id: kenetic_mash_cpu
command: "python3 /config/keenetic.py '10.0.0.2' 'GET' 'rci/show/system' ''"
value_template: '{{value_json.cpuload}}'
scan_interval: 120
unit_of_measurement: '%'