Code Monkey home page Code Monkey logo

ha_mosportal's Introduction

hacs_badge

home_assistant компоненты для работы с порталом Москвы и Мосэнергосбыт (https://www.mos.ru)

ПРОЕКТ НЕ ПОДДЕРЖИВАЕТСЯ по причине отсутствия официального способа программной авторизации на портале Москвы. С предложениями как это можно сделать можете обращаться в телеграм @kkuryshev

Компонент для работы с сервисами моспортала:

  1. получение pdf файла ЕПД
  2. передача данных расхода воды. Есть поддержка нескольких счетчиков воды

Инструкции

  1. Клонировать репозиторий https://github.com/kkuryshev/ha_mosportal.git

  2. Создать при необходимости папку "custom_components" и в нее скопировать папку "mosportal" и ее содержимое.

  3. Добавить следующие настройки в основной файл конфигурации HAS "configuration.yaml".

       mosportal:
         username: !secret mosportal_login
         password: !secret mosportal_passwd
         flats:
           - flat: !secret mosportal_flat_1
             paycode: !secret mosportal_paycode_1
           - flat: !secret mosportal_flat_2
             paycode: !secret mosportal_paycode_2
    
  4. Компонент автоматически добавит сенсоры (по одному на каждый счетчик, зарегистрированный в ЛК на портале Москвы).

    • По умолчанию название счетчика берется из его номера. При желании, название сенсора можно переименовать в Home_assistant (HASS)
    • Счетчики можно так же отключить (в настройках HASS).
    • Автоматическое получения данных с портала для счетчиков отключено. Обновить состояние можно вручную, вызвав для этого стандартный сервис HAS homeassistant.update_entity и указав в входных данных entity_id = названию сенсора. map|258x99
  5. Для передачи показаний нужно воспользоваться сервисом mosportal.publish_water_usage.

    • На вход передается массив из показаний (если счетчиков несколько) согласно примеру ниже:

      - service: mosportal.publish_water_usage
        data_template:
          meter_list_to_update:
            - meter_id: # (номер счетчика, можно использовать !secret meter_1_paycode)
              value: # (текущие показания счетчика, например {{states('input_number.meter_1')}})
              friendly_name: # (наименование счетчика для последующего отображения в event, например 'Счетчик холодной воды')                    
              ...
            - meter_id:
              value:
              friendly_name: 
      
    • Можно так же настроить задачу для автоматической отправки:

      - alias: Send meters value to mosportal
          trigger:
              - platform: time
                at: '12:00:00'
          condition:
              - condition: template
                value_template: "{{ now().day == 20 }}"
          action:
              - service: mosportal.publish_water_usage  #сервис, который публикует компонент 
      
    • При передаче показаний генерируются следующие события (event):

      • Для каждого счетчика, если передача была успешно генерируется событие (event) с типом upload_water_success. Содержит событие json: {friendly_name:str,meter_id:str,usage:str}

      • Для кадлого счетчкиа, если передача была не успешна генерируется событие (event) с типом upload_water_fail. Содержит событие json: {friendly_name:str,meter_id:str,error:str}

      • Один раз после обновления вне зависимости от успешности передачи генерируюется событие upload_water_finish. Тело пустое. На него можно, например, повесить обновление данных с портала:

        - alias: 'mosportal_upload_water_usage_finish'
          trigger:
            - platform: event
              event_type: upload_water_finish
          action:
            - service: homeassistant.update_entity
              entity_id: sensor.meter_1
            - service: homeassistant.update_entity
              entity_id: sensor.meter_2
        
    • События можно использовать для любой последующей обработки, например выводить в качестве информации на экран, или обновлять статусы сенсоров портала

        - alias: 'mosportal_upload_water_usage_fail'
          trigger:
            - platform: event
              event_type: upload_water_fail
          action:
            - service: mqtt.publish
              data_template:
                payload: >
                  Ошибка передачи показаний для счетчика <{{ trigger.event.data['friendly_name'] }}>
                  : {{ trigger.event.data['error'] }}
                topic: 'HASS'
      
  6. Для получения ЕПД нужно вызвать сервис mosportal.get_epd

    • На вход могут быть переданы необязательные параметры:
      • year - год получения ЕПД
      • month - месяц получения EПД
      • data - строка с сериализованным json для проксирования данных. Вся эта информация окажется в event get_epd_success, который будет сгенерирован при выполнении сервиса
      • payload - код платежного документа для идентификации квартиры (если в настройках указана одна квартира, то можно не заполнять)

    В результате работы:

    • В случае, если сервис отработал успешно, будет сгенерировано событие get_epd_success, которое будет содержать json следующего формата: {msg: строка, content: base64 с pdf епд, filename: название файла, ... а так же все атрибуты, которые были переданы в входном парамертре data}
    • В случае, если сервис отработал с ошибой, будет сгенерировано событие get_epd_error, которое будет содержать json следующего формата: {msg:строка с ошибкой}
  7. Для более корректной работы, компонент сохраняет куки в корневой папке has/.storage/.mosportal_cookie

Пример полной автоматизации от получения данных от счетчика до передачи показаний на портал Москвы

  1. К герконам водяных счетчиков подключены микроконтроллеры, которые регистрируют импульсы (по два на каждые 10 литров воды - один логическая 1 и один логический 0).

  2. На каждый импульс генерируется сообщение, которое отправляется в mqtt топик, который слушает HomeAssistant (HA)

  3. Для каждого счеткика в HA создан сенсор для регистрации импульса (Сами значения хранятся в influxdb для будущей аналитики в Grafana):

     - platform: mqtt
       name: "small_restroom_water_cold"
       availability_topic: "sh/restroom/small/water/availability"
       state_topic: "sh/restroom/small/water/cold/pulse"
       value_template: "{{ value_json.pulse | int }}"
       unit_of_measurement: "Pulses"
    
  4. В HA созданы input_number для каждого счетчика для хранения актуального значения:

     big_restroom_water_cold_control_val:
         name: big_restroom_water_cold
         unit_of_measurement: m3
         step: 0.001
         min: 0
         max: 9999
         mode: box
    
  5. Так же HA созданы правила (по одному для каждого счетчика), которое добавляет 10 литров воды к input_number. Важно, что фиксируем только импульсы с логической 1, так как из топика mqtt приходит два импульса. Это связано с необходимостью смены состояния сенсора, иначе не будет вызываться триггер:

     - alias: incriment small_restroom_water_cold
         trigger:
             - platform: numeric_state
               entity_id: sensor.small_restroom_water_cold
               value_template: "{{ states.sensor.small_restroom_water_cold.state | int }}"
               above: 1
               below: 11
         action:
             - service: input_number.set_value
               data_template:
                 entity_id: input_number.small_restroom_water_cold_control_val
                 value: '{{ (states.input_number.small_restroom_water_cold_control_val.state | float + 0.01) | round(2) }}'
    

Такой подход позволяет имеет следующие преимущества:

  1. В HA хранятся актуальные значения данных (легко сверить/отредактировать в случае необходимости): map|658x499
  2. Сами импульсы хранятся в influxdb с временной меткой, что позволяет сделать информативные отчеты: map|658x499

ha_mosportal's People

Contributors

kkuryshev avatar shulyaka avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

ha_mosportal's Issues

Где брать данные по flats?

Не понимаю, что указывать в mosportal_flat_1 и mosportal_paycode_1

 flats:
   - flat: !secret mosportal_flat_1
     paycode: !secret mosportal_paycode_1

Version Key

Hello,
Please, append version to manifest.json

2021-07-25 06:59:22 ERROR (SyncWorker_4) [homeassistant.loader] The custom integration 'mosportal' does not have a valid version key (None) in the manifest file and was blocked from loading. See https://developers.home-assistant.io/blog/2021/01/29/custom-integration-changes#versions for more details

Не отправляет данные в Мосэнергосбыт

Добрый день! Подскажите, что не так? Подключил кабинет с помощью вашего компонента к ХА. Появился датчик со всеми моими данными из ЛК, есть служба. Но при вызове службы ничего не происходит - данные не уходят, в логах ничего нет, и события тоже нет.(

Invalid URL 'None': No schema supplied. Perhaps you meant http://None?

Привет!
С недавнего времени начал получать сообщения, что не получается обновить данные о счетчиках.
В логах следующее:

[custom_components.mosportal] данные не могут быть загружены Ошибка получения данных с моспортала Invalid URL 'None': No schema supplied. Perhaps you meant http://None?
[custom_components.mosportal] информация о счетчиках воды на портале Москвы не найдена

После включения дебаг логов:

2020-12-23 01:42:01 DEBUG (SyncWorker_3) [mosportal.water] запрашиваем данные с портала
2020-12-23 01:42:01 DEBUG (SyncWorker_3) [mosportal.session] попытка чистой авторизации (без сохраненных куки)...
2020-12-23 01:42:01 DEBUG (SyncWorker_3) [mosportal.session] получили код /5f037a42842f2d0f86d358c4.js?1607521550280
2020-12-23 01:42:01 DEBUG (SyncWorker_3) [mosportal.session] получили COORDS 7ccd851171c76f27e541d264c4186df3
2020-12-23 01:42:01 DEBUG (SyncWorker_3) [mosportal.session] переходим к аутентификации
2020-12-23 01:42:01 DEBUG (SyncWorker_3) [mosportal.session] переходим на адрес, который вернул запрос аутентификации None

Похоже что-то не так он возвращает )
Логин и пароль проверил на всякий случай - они верные.

P.S. Спасибо за компонент! Очень крутой)

Ошибка авторизации на портале Москвы: 'NoneType' object has no attribute 'group'

Что делать?
Какие вообще нужно указывать данные в полях логин, flat, paycode?
Я вхожу на сайт указывая логин от СНИЛС.
Тут тоже этот логин указывать?

Logger: custom_components.mosportal
Source: custom_components/mosportal/__init__.py:153
Integration: mosportal HA integration ([documentation](https://github.com/kkuryshev/ha_mosportal.git))
First occurred: 10:22:41 (1 occurrences)
Last logged: 10:22:41

данные не могут быть загружены Ошибка получения данных с моспортала ошибка авторизации на портале Москвы: 'NoneType' object has no attribute 'group'

image

image

Setup failed for mosportal: Unable to import component: No module named 'mosportal'

Hi,

After updating HA to 2021.6.1 got "Setup failed for mosportal: Unable to import component: No module named 'mosportal'" message during HA startup. Trying to reinstall mosportal completely (removing it from HACS, remove repository, add repository amn reinstall it again) - no any changes, error still in place. Folder custom_components/mosportal still in place with files inside, my /config/configuration.yaml looks like:

mosportal: username: !secret mosportal_login password: !secret mosportal_passwd flats: - flat: !secret mosportal_flat_1 paycode: !secret mosportal_paycode_1

Is there any way to help with that issue? Thanks in advance.
P.S. tried HA 2021.6.2 - issue still in place.

Error on device update in HA 0.116

I receive the next error log since upgrade to Home Assistant 0.116:

2020-10-08 23:38:30 ERROR (MainThread) [homeassistant.components.sensor] mosportal: Error on device update!
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 346, in _async_add_entity
    await entity.async_device_update(warning=False)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 469, in async_device_update
    await self.async_update()  # type: ignore
  File "/config/custom_components/mosportal/sensor.py", line 83, in async_update
    self._state, self.update_time = await self.async_fetch_state()
TypeError: cannot unpack non-iterable NoneType object
2020-10-08 23:38:30 ERROR (MainThread) [homeassistant.components.sensor] mosportal: Error on device update!
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 346, in _async_add_entity
    await entity.async_device_update(warning=False)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 469, in async_device_update
    await self.async_update()  # type: ignore
  File "/config/custom_components/mosportal/sensor.py", line 83, in async_update
    self._state, self.update_time = await self.async_fetch_state()
TypeError: cannot unpack non-iterable NoneType object

Не работает передача показаний.

Добрый день.
Счетчики определяются корректно, но вот отправка показаний не проходит.

Автоматизация настроена следующим образом (сенсоры содержат данные в м3):

- alias: Передача показаний счетчиков воды в mos.ru
  trigger:
    - platform: time
      at: '22:37:00'
  condition:
    - condition: template
      value_template: "{{ now().day == 24 }}"
  action:
    - service: mosportal.publish_water_usage
      data_template:
        meter_list_to_update:
          - meter_id: 14-009559
            value: '{{ states.sensor.water_counter_hot.state|int}}'
          - meter_id: 14-009553
            value: '{{ states.sensor.water_counter_bathroom_cold.state|int }}'
          - meter_id: 14-009562
            value: '{{ states.sensor.water_counter_toilet_cold.state|int }}'

Ниже - debug-log от homeassistant

Инициализация при старте

2021-04-24 22:35:48 INFO (MainThread) [homeassistant.setup] Setting up mosportal
2021-04-24 22:35:48 INFO (MainThread) [custom_components.mosportal] Используется версия модуля mosportal: 0.2.2
2021-04-24 22:35:48 DEBUG (MainThread) [custom_components.mosportal] настройка компонента моспортал
2021-04-24 22:35:48 DEBUG (SyncWorker_8) [custom_components.mosportal] получение списка счетчиков с портала
2021-04-24 22:35:48 DEBUG (SyncWorker_8) [mosportal.water] запрашиваем данные с портала
2021-04-24 22:35:49 DEBUG (SyncWorker_8) [mosportal.water] запрашиваем данные с портала
2021-04-24 22:35:49 DEBUG (SyncWorker_8) [custom_components.mosportal] успешно получены следующие данные {'14-009562': <mosportal.water.Meter object at 0x7f3dfe127d60>, '14-009553': <mosportal.water.Meter object at 0x7f3dfe127e80>, '14-009559': <mosportal.water.Meter object at 0x7f3dfe127dc0>, '046450': <mosportal.water.Meter object at 0x7f3e1a63a190>, '11 831212': <mosportal.water.Meter object at 0x7f3e1a63a130>}
2021-04-24 22:35:50 DEBUG (MainThread) [custom_components.mosportal] счетчики получены
2021-04-24 22:35:50 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event service_registered[L]: domain=mosportal, service=get_epd>
2021-04-24 22:35:50 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event service_registered[L]: domain=mosportal, service=publish_water_usage>
2021-04-24 22:35:50 INFO (MainThread) [homeassistant.setup] Setup of domain mosportal took 2.1 seconds

Передача показаний

2021-04-24 22:37:00 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: domain=mosportal, service=publish_water_usage, service_data=meter_list_to_update=[{'meter_id': '14-009559', 'value': 819}, {'meter_id': '14-009553', 'value': 764}, {'meter_id': '14-009562', 'value': 284}]>
2021-04-24 22:37:00 DEBUG (SyncWorker_16) [custom_components.mosportal] входные данные для передачи на портал: {'14-009559': {'meter_id': '14-009559', 'value': 819}, '14-009553': {'meter_id': '14-009553', 'value': 764}, '14-009562': {'meter_id': '14-009562', 'value': 284}}
2021-04-24 22:37:00 DEBUG (SyncWorker_16) [mosportal.water] запрашиваем данные с портала
2021-04-24 22:37:00 DEBUG (SyncWorker_16) [mosportal.water] запрашиваем данные с портала
2021-04-24 22:37:00 ERROR (SyncWorker_16) [custom_components.mosportal] ошибка отправки данных на портал 'friendly_name'
2021-04-24 22:37:00 ERROR (SyncWorker_16) [custom_components.mosportal] ошибка отправки данных на портал 'friendly_name'
2021-04-24 22:37:00 ERROR (SyncWorker_16) [custom_components.mosportal] ошибка отправки данных на портал 'friendly_name'

Компонент автоматически не добавляет сенсоры

Добрый день. Огромное спасибо за компонент.
Помогите плз разобраться.
Клонировать репозиторий. Прописал в configuration.yaml
mos-1

Перезапускаю HA.
Сенсоры не добавляются.
в логе следующая надписть
mos-2

Хотя на почту приходит письмо о успешном входе.
mos-3

Посоветуйте плз, что можно ещё попробовать

Интеграция

Доброе время суток. Подскажите пожалуйста интеграция работает?
Спасибо

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.