Files
2026-07-14 14:12:07 +00:00

171 lines
6.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
import os
import sys
import requests
import globals
import datetime as dt
import appdaemon.plugins.hass.hassapi as hass
from datetime import datetime, tzinfo, timedelta
from bs4 import BeautifulSoup
class EpdBalanceSensor(hass.Hass):
login = ''
pwd = ''
accounts = []
def initialize(self):
# if not globals.check_properties(self,['login', 'pwd', 'accounts']):
# self.log('not enought params')
# return
self.login = self.args.get('login', '')
self.pwd = self.args.get('pwd', '')
self.accounts = self.args.get('accounts', [])
self.timer = self.run_every(self.update_sensors, self.datetime()+timedelta(seconds=1), 1*60*60)
self.run_daily(self.send_counters_callback, "11:00:00", constrain_days = "sun")
self.send_counters_callback(None)
def to_balance(self, value_str):
value_str = value_str.replace(" ", "").replace(",", ".").replace("₽", "")
return -1 * float(value_str)
def update_sensors(self, args) -> None:
entity_ids = self.args.get('entity_ids',[])
session = self.get_auth_session(self.login, self.pwd)
payment_amounts = self.get_payment_amounts(session, self.accounts)
self.log(payment_amounts)
fonvizina_epd_balance = self.to_balance(payment_amounts[0]['service_to_pay'])
if 'fonvizina_epd_balance' in entity_ids:
entity_id = entity_ids['fonvizina_epd_balance']
attributes = {
'unit_of_measurement': '₽',
'icon': 'mdi:bank-transfer',
'date': datetime.now().strftime('%d.%m.%Y'),
'address': payment_amounts[0]['address'],
'friendly_name': 'Баланс (ЕПД)',
'description': 'Created and updated from appdaemon ({})'.format(__name__)
}
self.set_state(entity_id, state = str(fonvizina_epd_balance), attributes = attributes)
fonvizina_trash_balance = self.to_balance(payment_amounts[0]['trash_to_pay'])
if 'fonvizina_trash_balance' in entity_ids:
entity_id = entity_ids['fonvizina_trash_balance']
attributes = {
'unit_of_measurement': '₽',
'icon': 'mdi:bank-transfer',
'date': datetime.now().strftime('%d.%m.%Y'),
'address': payment_amounts[0]['address'],
'friendly_name': 'Баланс Выввоз мусора',
'description': 'Created and updated from appdaemon ({})'.format(__name__)
}
self.set_state(entity_id, state = str(fonvizina_trash_balance), attributes = attributes)
fonvizina_kladovka_balance = self.to_balance(payment_amounts[1]['service_to_pay'])
if 'fonvizina_kladovka_balance' in entity_ids:
entity_id = entity_ids['fonvizina_kladovka_balance']
attributes = {
'unit_of_measurement': '₽',
'icon': 'mdi:bank-transfer',
'date': datetime.now().strftime('%d.%m.%Y'),
'address': payment_amounts[1]['address'],
'friendly_name': 'Баланс Кладовка',
'description': 'Created and updated from appdaemon ({})'.format(__name__)
}
self.set_state(entity_id, state = str(fonvizina_kladovka_balance), attributes = attributes)
def get_auth_session(self, phone, password):
data={
'AUTH_FORM': 'Y',
'TYPE':'AUTH',
'backurl': '/',
'USER_LOGIN': phone,
'USER_PASSWORD': password
}
r = requests.post('https://lkcab.ru/?login=yes', data=data, verify=False, allow_redirects=False)
print(r.cookies)
return r.cookies['PHPSESSID']
def get_payment_amounts(self, session, accounts):
cookies = dict(PHPSESSID=session)
results = []
for account in accounts:
url = 'https://lkcab.ru/?accountID={}'.format(account)
r = requests.get(url, cookies=cookies, verify=False)
result = {}
result['account'] = account
doc = BeautifulSoup(r.content, 'html.parser')
address = doc.find("div", string="Вы собственник по адресу:").parent.find_all('div')[1].text
result['address'] = address
service_to_pay = doc.find('div', string="ЖКУ, к оплате:").parent.find_all('div')[1].text.replace(' Р.', '')
result['service_to_pay'] = service_to_pay
trash_to_pay = '0'
trash_to_pay_item = doc.find('div', string="Обращение с ТКО, к оплате:")
self.log(trash_to_pay_item)
if not trash_to_pay_item is None:
trash_to_pay = trash_to_pay_item.parent.find_all('div')[3].text.replace(' Р.', '')
result['trash_to_pay'] = trash_to_pay
results.append(result)
return results
def send_counters_callback(self, kwargs) -> None:
if 'constraint' in self.args and not self.constrain_input_boolean(self.args['constraint']):
return
current_day = dt.datetime.now().strftime("%a").lower()
if current_day != "sun":
self.log(f'Today is {current_day}, but we run only on sunday.')
return
self.log('sending counters....')
session = self.get_auth_session(self.login, self.pwd)
self.send_counters(session)
return
def send_counters(self, session) -> None:
cookies = dict(PHPSESSID=session)
account = self.accounts[0]
url = 'https://lkcab.ru/?accountID={}'.format(account)
r = requests.get(url, cookies=cookies, verify=False)
url = 'https://lkcab.ru/counters/'
r = requests.get(url, cookies=cookies, verify=False)
doc = BeautifulSoup(r.content, 'html.parser')
bitrix_session = doc.find("input", id="sessid").get('value')
self.log('session: {}'.format(bitrix_session))
data = {
'action':'set_meters',
'sessid': bitrix_session,
}
needToSend = False
if 'heat_total' in self.args:
needToSend = True
value = self.get_state(self.args['heat_total'])
if value != None:
data['indiccur1[294174]'] = value
if 'counter_cold_outer' in self.args:
needToSend = True
value = self.get_state(self.args['counter_cold_outer'])
if value != None:
data['indiccur1[294175]'] = value
if 'counter_hot_outer' in self.args:
needToSend = True
value = self.get_state(self.args['counter_hot_outer'])
if value != None:
data['indiccur1[294173]'] = value
if needToSend:
self.log('sending: {}'.format(data))
r = requests.post("https://lkcab.ru/counters/", cookies=cookies, data=data, verify=False)
self.notify_tg("Показания отправлены в юнисервис. {}".format(data))
self.log('done.')
def notify_tg(self, msg):
if not 'notify' in self.args:
return
globals.send_telegram(self, msg, target = self.args['notify'])