Files
home-assistant/appdaemon/settings/apps/sensors/mosenergosbyt.py
T
2018-12-30 14:13:57 +03:00

153 lines
5.1 KiB
Python

import requests
import hashlib
import globals
import datetime as dt
from xml.etree import ElementTree
from automation import Automation, Base # type: ignore
class MosEnergoSbytSender(Automation):
def initialize(self):
super().initialize()
self.run_daily(self.send_mosenergosbyt_counters, dt.time(12, 0, 0))
# self.send_mosenergosbyt_counters({})
def send_mosenergosbyt_counters(self, kwargs):
if not 'home_power_total' in self.entity_ids:
self.error('Please define home_power_total in entity_ids.')
return
current_counter_value = int(float(self.get_state(self.entity_ids['home_power_total'])))
self.log('Sending current counter value: {}'.format(current_counter_value))
self.app.send(current_counter_value)
class MosEnergoSbytUpdater(Automation):
def initialize(self):
super().initialize()
self.timer = self.run_every(self.update_sensors, self.datetime(), 1*60*60)
# self.send_mosenergosbyt_counters({})
def update_sensors(self, args) -> None:
self.app.update()
counter_value = self.app.value
counter_date = self.app.date
balance = self.app.balance
self.log('Current counter value is: {} (@{}), balance is: {}'.format(counter_value, counter_date, balance))
if 'mosenergosbyt_total' in self.entity_ids:
entity_id = self.entity_ids['mosenergosbyt_total']
attributes = {
'unit_of_measurement': 'kWh',
'date': counter_date,
# 'checkup': checkup,
'icon': 'mdi:av-timer',
'friendly_name': 'Счетчик (мосэнергосбыт)',
'description': 'Created and updated from appdaemon ({})'.format(__name__)
}
self.set_state(entity_id, state = counter_value, attributes = attributes)
if 'mosenergosbyt_balance' in self.entity_ids:
entity_id = self.entity_ids['mosenergosbyt_balance']
attributes = {
'unit_of_measurement': '₽',
'date': counter_date,
'icon': 'mdi:bank-transfer',
'friendly_name': 'Баланс (мосэнергосбыт)',
'description': 'Created and updated from appdaemon ({})'.format(__name__)
}
self.set_state(entity_id, state = balance, attributes = attributes)
class MosEnergoSbytCounter(Base):
_version = 11
_device = "ios/12.1.2/2.14.14(221)"
_session = None
_profile = None
# def initialize(self):
# super().initialize()
@property
def value(self) -> float:
"""Return the current state of counter."""
if (self._profile == None):
self.update()
return float(self._profile['SH_POK_STR'])
@property
def balance(self) -> float:
"""Return the current state of counter."""
if (self._profile == None):
self.update()
balance = -1 * float(self._profile['SM_DEBT'])
if balance == -0:
balance = 0
return balance
@property
def date(self) -> str:
"""Return the current state of counter."""
if (self._profile == None):
self.update()
return self._profile['DT_POK']
def is_active(self):
"""
:return: True если уже залогинился
"""
return self._session is not None
def update(self) -> None:
if not self.is_active():
self._session = self._get_session()
url = 'https://lkkbyt.mosenergosbyt.ru/gate/do?api_version={}&id_session={}&process=refresh&type=1'.format(self._version, self._session)
response = requests.get(url).text
values_response = self._parse_response(response)
self._profile = values_response
# self.log(values_response)
def send(self, value) -> bool:
if not self.is_active():
self._session = self._get_session()
url = 'https://lkkbyt.mosenergosbyt.ru/gate/do?id_session={}&pr_check_ras=0&pr_flat_pu=0&process=dotranspok&type=3&vl_pok_t1={}&vl_pok_t2=0&vl_pok_t3=0'.format(self._session, value)
response = requests.get(url).text
send_response = self._parse_response(response)
result = send_response['KD_RESULT']
if result == 0:
return True
return False
def _get_session(self) -> str:
login = str(self.properties['login'])
pass_md5 = hashlib.md5(self.properties['pwd'].encode('utf-8')).hexdigest()
ls = ''
phone = ''
if len(login) == 10:
ls = login
elif len(login) == 11:
phone = login
else:
self.error('unknown login type: {}'.format(login))
return
url = "https://lkkbyt.mosenergosbyt.ru/gate/do?api_version={}&id_device={}&phone={}&ls={}&process=login&pw_abn={}&type=1".format(self._version, self._device, phone, ls, pass_md5)
response = requests.get(url).text
session_response = self._parse_response(response)
session = session_response['ID_SESSION']
return session
def _parse_response(self, response):
et = ElementTree.fromstring(response)
headers = []
values = []
for node in et.findall('./h/p'):
headers.append(node.text)
for node in et.findall('./b/p'):
values.append(node.text)
result = {}
for i in range(0, len(headers)):
header = headers[i]
value = values[i]
result[header] = value
return result