updating configuration

This commit is contained in:
Your Name
2026-03-10 07:08:59 +00:00
commit 9498a076ee
238 changed files with 18119 additions and 0 deletions
@@ -0,0 +1,171 @@
# -*- 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
extra_data = {'parse_mode': 'html'}
self.notify(msg, name = self.args['notify'], data=extra_data)