Skip to content

Instantly share code, notes, and snippets.

@Drafteed
Last active October 20, 2025 16:01
Show Gist options
  • Select an option

  • Save Drafteed/574096f0525c1150d090873324cee0b6 to your computer and use it in GitHub Desktop.

Select an option

Save Drafteed/574096f0525c1150d090873324cee0b6 to your computer and use it in GitHub Desktop.
Python скрипт отправки показаний счетчиков в Kvado (КВАДО.РУ)

Cкрипт отправки показаний счетчиков в КВАДО.РУ

Python скрипт отправки показаний счетчиков в личный кабинет Kvado (КВАДО.РУ).

./kvado_send_counters.py <username> <password> <key1=value> <key2=value2> <key3=value3> <key4=value4>

Пример:

./kvado_send_counters.py [email protected] password values[1111][2222]=20 values[321][1122]=40

Имена полей счетчков можно посмотреть в личном кабинете КВАДО.ру через Инспектор в браузере:

image

Интеграция в Home Assistant

Копируем скрипт, например, в директорию scripts конфигурации Home Assistant.

Не забываем дать права на запуск:

cd scripts
sudo chmod +x ./kvado_send_counters.py

Создаем shell_command для отправки показаний:

configuration.yaml:

shell_command:
  kvado_send_counters: 'python3 ./scripts/kvado_send_counters.py [email protected] password values[1111][111]={{ COLD_WATER }} values[2222][2222]={{ HOT_WATER }}'

Создаем автоматизацию для отправки показаний со счетчков в 1:00 каждое 20 число:

automations.yaml:

- alias: Kvado (Send)
  description: 'Отправка показаний счетчков в ЛК КВАДО.РУ'
  triggers:
  - trigger: time
    at: 01:00:00
  conditions:
  - condition: template
    value_template: '{{ now().day == 20 }}'
  actions:
  - action: shell_command.kvado_send_counters
    data:
      COLD_WATER: "{{ states('sensor.waterius_111111_ch1') | round }}"
      HOT_WATER: "{{ states('sensor.waterius_111111_ch0') | round }}"
    response_variable: response
  - if:
    - condition: template
      value_template: '{{ response[''returncode''] == 0 }}'
    then:
    - action: notify.persistent_notification
      data:
        title: КВАДО.РУ
        message: Показания успешно переданы
    else:
    - action: notify.persistent_notification
      data:
        title: КВАДО.РУ
        message: Ошибка при отправке показаний
  mode: single
#!/usr/bin/python3
import sys
import re
import requests
# Get params
if len(sys.argv) < 4:
print(f"Usage: {sys.argv[0]} <username> <password> <key1=value> <key2=value2> <key3=value3> <key4=value4> ...")
sys.exit(64)
# Configuration
LOGIN_PAGE = "https://cabinet.kvado.ru/login"
COUNTER_PAGE = "https://cabinet.kvado.ru/counters"
HEADERS = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/128 Safari/537.36",
"Origin": "https://cabinet.kvado.ru",
"Referer": "https://cabinet.kvado.ru",
}
# Set default headers
session = requests.Session()
session.headers.update(HEADERS)
# Get CSRF token
response = session.get(LOGIN_PAGE)
match = re.search(r'value="([^"]+)"\s+name="YII_CSRF_TOKEN"', response.text)
if not match:
print("Error: CSRF token not found!")
sys.exit(1)
csrf_token = match.group(1)
print("Got CSRF token:", csrf_token)
# Authorize
response = session.post(LOGIN_PAGE, data={
'LoginForm[email]': sys.argv[1],
'LoginForm[password]': sys.argv[2],
'YII_CSRF_TOKEN': csrf_token,
})
if response.status_code != 200:
print(f"Login failed: {response.status_code}")
sys.exit(1)
print('Auth OK')
# Send counters
data = {
'YII_CSRF_TOKEN': csrf_token,
}
for arg in sys.argv[3:]:
if "=" in arg:
key, value = arg.split("=", 1)
data[key] = value
else:
print(f"Invalid argument: {arg}")
sys.exit(1)
print('Sending data:', data)
response = session.post(COUNTER_PAGE, data=data)
if response.status_code != 200:
print(f"Send failed: {response.status_code}")
sys.exit(1)
print('Send OK')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment