Open Kirilloff73 opened 11 months ago
есть такое. сенсоры в ha обновляются только при перезагрузке ha. плагин 1.0.3
не работает обновление сенсоров
Обновление v. 1.0.4 устранило проблему с обноление датчиков. Автору интеграции большое спасибо!
зря закрыл. проблема не устранена
Подтверждаю, обновление не решило проблему.
вот это уже очень странно, так как код в 1.0.4 ровно то же что был и до добавления user_agent и обновления HA. При этом на тестовом аккаунте - никаких проблем не замечено. Самим устройством я уже давно не пользуюсь.
Ошибки в логе есть?
У меня всё обновляется
Подтверждаю, обновление не решило проблему.
Попробуйте принудительно обновить счетчики через службу, мне это помогало
service: homeassistant.update_entity
data: {}
target:
entity_id:
- sensor.saures_gvs
- sensor.saures_khvs
alias: Обновить данные водосчетчика
нет, не помогает.
Как вариант можно использовать встроенный RESTFull сенсор в Home Assistant. Я реализовал через RESTFull и все подтягивается само.
Все подробности можно изучить на сайте Saures API
Запросы должны быть не чаще чем 15 минут и больше, чем реже, тем лучше, тогда саурес не забанит ваш сервер. Для первого раза, чтобы данные быстрее подтянулись, для SID укажите 600 сек, а для остальных сенсоров 660 сек. Почему 600 и 660? Потому что в первую очередь идет регистрация в облачный сервер саурес и мы получаем токен, он же SID и срок жизни токена 15 минут. Далее, имея SID, мы запрашиваем ID (идентификация объекта), такой ID создается при указании объекта и меняется только в том случае, если удалили контроллер и перепривязали к другому объекту, а имея SID и ID мы можем извлекать всю информацию с контроллера. Проще говоря, сперва мы получаем SID, потом извлекается ID и потом идет опрос контроллера с помощью SID и ID. Помним, что SID живет 15 минут, а ID до тех пор, пока не сменим адрес для контроллера, поэтому его часто не нужно обновлять, можно раз в сутки
1) Saures API: SID (идентификационный токен) - для первого раза в scan_interval
достаточно указать 600 сек, потом укажите к примеру 3600(1 час) или 7200 (2 часа)
2) Saures API: Object - для первого раза в scan_interval
достаточно указать 660. Потом указываем в scan_interval запрос раз в сутки, в месяц, в год, не важно, важно то, что нам достаточно получить один раз актуальный ID и больше нам этот сенсор не нужен, так как ID записывается в другой сенсор Saures Storage: ID Object который хранит в базе ID и не стирает его до тех пор, пока Saures API: Object не получит новый ID и не перешлет его в Saures Storage: ID Object. Поэтому я и назвал Saures Storage (хранение, хранилище)
3) Saures API: Controller - для первого раза в scan_interval
достаточно указать 660 сек. Потом можете указать время как у Saures API: SID или на 60 сек позже, чем у Saures API: SID
Пример для первого раза, чтобы ускорить время получения данных, но при этом не нагружать сервер запросами Saures API: SID - scan_interval: 600 Saures API: Object - scan_interval: 660 Saures API: Controller - scan_interval: 660
Как получили ответы на запросы, то увеличиваем время на свое усмотрение (подбирайте интервалы опытным путем), ниже всего лишь пример Saures API: SID - scan_interval: 7200(2 часа) Saures API: Object - scan_interval: 86400(24 часа) Saures API: Controller - scan_interval: 7200(2 часа) или 7260(2 часа и 1 минута)
В сенсоре Saures API: SID есть строка payload: !secret saures_login_payload
, это ваш логин и пароль для авторизации, указывать их нужно в secrets.yaml
В secrets.yaml
добавляем
saures_login_payload: email=ваш почтовый ящик&password=ваш пароль
Сам код
#RESTful Sensor. Документация https://www.home-assistant.io/integrations/sensor.rest
#Получаем SID. При авторизации система выдает sid, все последующие запросы выполняются передачей этого идентификатора. Cрок жизни #идентификатора 15 минут
sensor:
- platform: rest
name: "Saures API: SID"
unique_id: saures api sid
icon: mdi:package-down
resource: https://api.saures.ru/1.0/login
method: POST
scan_interval: 7200
headers:
Content-Type: application/x-www-form-urlencoded; charset=utf-8
User-Agent: HTTPie/3.2.2
payload: !secret saures_login_payload
value_template: "{{ value_json.data.sid }}"
#Делаем запрос objects на извлечение ID объекта. Это нужно для того, чтобы делать запросы где требуется sid и id
rest:
#GET запрос user/objects
- resource: https://api.saures.ru/1.0/user/objects
scan_interval: 86400
method: GET
headers:
User-Agent: HTTPie/3.2.2
params:
sid: "{{ states('sensor.saures_api_sid') }}"
sensor:
#GET запрос object
- name: "Saures API: Object"
unique_id: saures api object
icon: mdi:home
value_template: "{{ states('sensor.saures_storage_id_object' ) }}"
json_attributes_path: "$.data.objects.0"
json_attributes:
- access_level
- connect_dt
- enable
- house
- id
- label
- number
- object_company_account
- object_company_inn
- object_company_name
- object_company_url
- personal_account
- tariffs
#GET запрос object/meters
- resource: https://api.saures.ru/1.0/object/meters
scan_interval: 7260
method: GET
headers:
User-Agent: HTTPie/3.2.2
params:
sid: "{{ states('sensor.saures_api_sid') }}"
id: "{{ states('sensor.saures_storage_id_object' ) }}"
sensor:
#GET запрос. Контроллер
- name: "Saures API: Controller"
unique_id: saures api controller
value_template: "{{ value_json.status }}"
json_attributes_path: "$.data.sensors.0"
json_attributes:
- active
- bat
- cap_state
- check_hours
- check_period_display
- empty_inputs
- firmware
- hardware
- last_connection
- last_connection_warning
- lic_channels
- local_ip
- log
- model
- name
- nbiot
- power_supply
- readout_dt
- request_dt
- requests
- rssi
- scan
- send
- sn
- ssid
- vol
#GET запрос. Водосчетчик 1
- name: "Saures API: Water Meter 1"
unique_id: saures api water meters 1
icon: mdi:water-pump
value_template: "{{ value_json.data.sensors.0.meters.0.vals.0 }}"
unit_of_measurement: m³
state_class: total
device_class: water
json_attributes_path: "$.data.sensors.0.meters.0"
json_attributes:
- approve_dt
- eirc_num
- input
- meter_id
- meter_name
- sn
- state
- type
- unit
- vals
#GET запрос. Водосчетчик 2
- name: "Saures API: Water Meter 2"
unique_id: saures api water meters 2
icon: mdi:water-pump
value_template: "{{ value_json.data.sensors.0.meters.1.vals.0 }}"
unit_of_measurement: m³
state_class: total
device_class: water
json_attributes_path: "$.data.sensors.0.meters.1"
json_attributes:
- approve_dt
- eirc_num
- input
- meter_id
- meter_name
- sn
- state
- type
- unit
- vals
#Шаблоны. Документация https://www.home-assistant.io/integrations/template/
#Сохраняем ID объект, чтобы после перезагрузки Home Assistant сенсоры Saures не сбрасывался сенсор
template:
- trigger:
- platform: template
value_template: "{{ state_attr('sensor.saures_api_object', 'id') | is_defined }}"
sensor:
- name: "Saures Storage: ID Object"
unique_id: saures storage id object
icon: mdi:home
state: "{{ state_attr('sensor.saures_api_object','id') }}"
#Водосчетчик 1. Сохраняем показания водосчетчика
- trigger:
- platform: state
entity_id:
- sensor.saures_api_water_meter_1
not_to:
- unavailable
- unknown
unique_id: trigger saures storage water meter 1
sensor:
- name: "Saures Storage: Water Meter 1"
unique_id: sensor saures storage water meter 1
icon: mdi:counter
unit_of_measurement: m³
state_class: total
device_class: water
state: >-
{% if trigger.to_state.state != trigger.from_state.state %}
{{ states('sensor.saures_api_water_meter_1') }}
{% endif %}
#Водосчетчик 2. Сохраняем показания водосчетчика
- trigger:
- platform: state
entity_id:
- sensor.saures_api_water_meter_2
not_to:
- unavailable
- unknown
unique_id: trigger saures storage water meter 2
sensor:
- name: "Saures Storage: Water Meter 2"
unique_id: sensor saures storage water meter 2
icon: mdi:counter
unit_of_measurement: m³
state_class: total
device_class: water
state: >-
{% if trigger.to_state.state != trigger.from_state.state %}
{{ states('sensor.saures_api_water_meter_2') }}
{% endif %}
#Автоматизация
#После запуска Home Assistant будут обновлены сенсоры водосчетчиков Saures и загрузятся актуальные данные
automation:
- alias: "Saures API: Обновить сенсоры после запуска Home Assistant"
id: c0192c64-d64b-45b6-ab2e-91170c12f591
trigger:
- platform: homeassistant
event: start
action:
- wait_template: "{{ has_value('sensor.saures_api_sid') }}"
- service: homeassistant.update_entity
target:
entity_id: sensor.saures_api_controller
Если 4 счетчика, то добавляем еще строки кода после #GET запрос. Водосчетчик 2
#GET запрос. Водосчетчик 3
- name: "Saures API: Water Meter 3"
unique_id: saures api water meters 3
icon: mdi:water-pump
value_template: "{{ value_json.data.sensors.0.meters.2.vals.0 }}"
unit_of_measurement: m³
state_class: total
device_class: water
json_attributes_path: "$.data.sensors.0.meters.2"
json_attributes:
- approve_dt
- eirc_num
- input
- meter_id
- meter_name
- sn
- state
- type
- unit
- vals
#GET запрос. Водосчетчик 4
- name: "Saures API: Water Meter 4"
unique_id: saures api water meters 4
icon: mdi:water-pump
value_template: "{{ value_json.data.sensors.0.meters.3.vals.0 }}"
unit_of_measurement: m³
state_class: total
device_class: water
json_attributes_path: "$.data.sensors.0.meters.3"
json_attributes:
- approve_dt
- eirc_num
- input
- meter_id
- meter_name
- sn
- state
- type
- unit
- vals
это всё конечно замечательно.. но мы требуем внимание разработчика к проблеме.
upd// в const включил debug - нет обновления. Хотя может оно и происходит, но в XA ничего не меняется. В логе как и выше..
это всё конечно замечательно.. но мы требуем внимание разработчика к проблеме.
Странно что-то требовать от автора открытого проекта. Это открытый проект, никто, никому, ничего не обязан. Автор сделал исключительно на своем энтузиазме и при желании может забросить и не поддерживать свой проект. Автор неоднократно писал, что больше не пользуется saures.
Последнее сообщение автора https://github.com/volshebniks/sauresha/issues/53#issuecomment-1770345152
Есть несколько путей решения проблемы: 1) Помочь автору устранить ошибку и предоставить ему рабочий код 2) Сделать форк этого проекта и самому продолжать поддерживать этот проект 3) Использовать альтернативное решение 4) Сидеть и ждать, когда автор исправит
Я python не знаю и помочь автору не могу, поэтому пользуюсь готовыми решениями. Понимая, что работа интеграции sauresha находится под угрозой неработоспособности и что автор может забросить проект, я перешел на альтернативный вариант, это RestFull сенсоры - код выложил выше.
у меня вода обновляется, а ээ нет заметил вот что у меня счетчик ээ стоит на 9 канале а в коде 9 канала нет, есть 8
meter = self.current_meter
str_return_value = meter.value
# if meter.type_number == 8: БЫЛО
if meter.type_number == 9:
self._attributes.update(
{
"friendly_name": meter.name,
"condition": meter.state,
"sn": meter.sn,
"type": meter.type,
"meter_id": meter.meter_id,
"input": meter.input,
"approve_dt": meter.approve_dt,
"t1": meter.t1,
"t2": meter.t2,
"t3": meter.t3,
"t4": meter.t4,
... elif meter.type_number == 9: self._attributes.update( { "unit_of_measurement": "kWh", "device_class": "energy", "state_class": "total_increasing", } )
self.isStart = False
это RestFull сенсоры - код выложил выше.
подскажи, плиз, сенсоры в конфиге прописываем?
Могу всем у кого нет обновления показаний в HA после первого запуска предложить такой костыль: в entity.py находим self.isStart= False и меняем на True Сохраняем и перезагружаем HA.
это RestFull сенсоры - код выложил выше.
подскажи, плиз, сенсоры в конфиге прописываем?
Да, прописываем в конфиге. Подробно про RESTful Sensor читаем здесь
Для справки. Я добавил еще парочку сенсоров, которые хранят в себе показания счетчика в базе и не исчезнут, если вруг отвалится саурес через RESTful Sensor. Такое бывает, если время не совпадет при интервале. Я играюсь с интервалом и пока выставил всем 3600, вроде отвалов на второй день не наблюдается как ранее. В общем пробуйте и меняйте код на свое усмотрение
#Шаблоны. Документация https://www.home-assistant.io/integrations/template/
#Сохраняем ID объект в базу, чтобы после перезагрузки Home Assistant сенсоры Saures не сбрасывался сенсор
template:
- trigger:
- platform: template
value_template: "{{ state_attr('sensor.saures_api_object', 'id') | is_defined }}"
sensor:
- name: "Saures Storage: ID Object"
unique_id: saures storage id object
icon: mdi:home
state: "{{ state_attr('sensor.saures_api_object','id') }}"
#Водосчетчик 1. Сохраняем показания водосчетчика в базу
- trigger:
- platform: state
entity_id:
- sensor.saures_api_water_meter_1
not_to:
- unavailable
- unknown
unique_id: trigger saures storage water meter 1
sensor:
- name: "Saures Storage: Water Meter 1"
unique_id: sensor saures storage water meter 1
icon: mdi:counter
unit_of_measurement: m³
state_class: total
device_class: water
state: >-
{% if trigger.to_state.state != trigger.from_state.state %}
{{ states('sensor.saures_api_water_meter_1') }}
{% endif %}
#Водосчетчик 2. Сохраняем показания водосчетчика в базу
- trigger:
- platform: state
entity_id:
- sensor.saures_api_water_meter_2
not_to:
- unavailable
- unknown
unique_id: trigger saures storage water meter 2
sensor:
- name: "Saures Storage: Water Meter 2"
unique_id: sensor saures storage water meter 2
icon: mdi:counter
unit_of_measurement: m³
state_class: total
device_class: water
state: >-
{% if trigger.to_state.state != trigger.from_state.state %}
{{ states('sensor.saures_api_water_meter_2') }}
{% endif %}
а счетчик э/э ты себе не прописывал или у тебя нет?
все заработало странно, что в сущностях стоит 8 канал, а в приложении написано , что используется 9 канал для счетчика ЭЭ
Кто ни будь смог победить ошибку Platform rest does not generate unique IDs. ? Судя по вялотекущей теме #90394 нет.
Update.
Решение для исправления ошибки Platform rest does not generate unique IDs. найдено @timr49.
Необходимо код сенсора для получения API
#Получаем SID. При авторизации система выдает sid, все последующие запросы выполняются передачей
#этого идентификатора. Cрок жизни идентификатора 15 минут
sensor:
- platform: rest
name: "Saures API: SID"
unique_id: saures api sid
icon: mdi:package-down
resource: https://api.saures.ru/1.0/login
method: POST
scan_interval: 7200
headers:
Content-Type: application/x-www-form-urlencoded; charset=utf-8
User-Agent: HTTPie/3.2.2
payload: !secret saures_login_payload
value_template: "{{ value_json.data.sid }}"
изменить на следующий:
rest:
- resource: https://api.saures.ru/1.0/login
scan_interval: 14400
method: POST
headers:
Content-Type: application/x-www-form-urlencoded; charset=utf-8
User-Agent: HTTPie/3.2.2
payload: !secret saures_login_payload
sensor:
- name: "Saures API: SID"
unique_id: saures_api_sid
icon: mdi:package-down
value_template: "{{ value_json.data.sid }}"
После этого ошибка не возникает. Данные с сайта saures забираются корректно.
PS. Если есть желание получить дополнительную информацию с контролера, можно создать дополнительные сенсоры. Например батарея и время последней передачи контролером информации. Размещаем в template
#Дачики контролера
#Батарея
- sensor:
- name: "Saures Api: Controller battery"
unique_id: saures_api_controller_battery
icon: mdi:battery
unit_of_measurement: "%"
state: >-
{{ state_attr('sensor.saures_api_controller', 'bat') }}
#Последняя отправка данных
- sensor:
- name: "Saures Api: Controller last connection"
unique_id: saures_api_controller_last_connection
icon: mdi:timer-sync-outline
state: >-
{{ (state_attr('sensor.saures_api_controller', 'last_connection') | as_timestamp()) | timestamp_custom("%H:%M:%S") }}
Посмотрел документацию RESTful, никаких изменении. Ошибка Platform rest does not generate unique IDs может возникать из-за того, что пытаетесь создать или создали несколько сенсоров с одинаковыми unique_id. Проверьте свой код внимательно и обращайте внимание на строки unique_id, где не должно быть повторяющихся имен. Вы просто создали другой сенсор без unique_id, поэтому и заработало. Ищите у себя в коде сенсор у которого имеется одинаковый unique_id или ищите в объектах GUI
У меня стоит крайняя версия Home Assistant.
Home Assistant
Core 2024.6.4
Supervisor 2024.06.2
Operating System 12.4
Пользовательский интерфейс 20240610.1
Использую этот код для запроса API SID
sensor:
- platform: rest
name: "Saures API: SID"
unique_id: saures api sid
icon: mdi:package-down
resource: https://api.saures.ru/1.0/login
method: POST
scan_interval: 3600 #Запрос через каждые 15 минут
headers:
Content-Type: application/x-www-form-urlencoded; charset=utf-8
User-Agent: HTTPie/3.2.2
payload: !secret saures_login_payload
value_template: "{{ value_json.data.sid }}"
API sid успешно генерится
Верните назад код и в строке unique_id для проверки вместо saures api sid укажите другое имя, например saures api sid rest sensor и перезапустите конфигурацию REST через Панель разработчика. После посмотрите в журнале, появляется ли ошибка Platform rest does not generate unique IDs
sensor:
- platform: rest
name: "Saures API: SID"
unique_id: saures api sid rest sensor #указал другое имя для unique_id
icon: mdi:package-down
resource: https://api.saures.ru/1.0/login
method: POST
scan_interval: 3600 #Запрос через каждые 15 минут
headers:
Content-Type: application/x-www-form-urlencoded; charset=utf-8
User-Agent: HTTPie/3.2.2
payload: !secret saures_login_payload
value_template: "{{ value_json.data.sid }}"
В документации RESTful пишется
unique_id string (optional)
An ID that uniquely identifies this entity. This allows changing the name, icon and entity_id from the web interface.
Вы можете не указывать в коде unique_id, тогда unique_id сгенерится автоматически и присвоится свой уникальный unique_id, но вам не будет доступно через GUI редактировать сущность и вы не сможете изменить название, иконку и т.д
> sensor:
> - platform: rest
> name: "Saures API: SID"
> unique_id: saures api sid
> icon: mdi:package-down
> resource: https://api.saures.ru/1.0/login
> method: POST
> scan_interval: 3600 #Запрос через каждые 15 минут
> headers:
> Content-Type: application/x-www-form-urlencoded; charset=utf-8
> User-Agent: HTTPie/3.2.2
> payload: !secret saures_login_payload
> value_template: "{{ value_json.data.sid }}"
@DivanX10 Вы неверно поняли. По Вашей схеме как раз с датчиком "Saures API: SID" никаких проблем нет, Он единственный исправно получает данные. А вот все остальные получают ровно один раз после запуска. При втором обращении они вываливаются с ошибкой Platform rest does not generate unique IDs. По исправленной схеме остальные датчики получают информацию без ошибок.
Проверьте свой код внимательно и обращайте внимание на строки unique_id,
Ну это проверилось в первую очередь. Эта проблема совсем не причем. Но если у Вас работает по описанной у вас схеме, то хорошо. У меня не работает, для чего я и написал как можно исправить.
По Вашей схеме как раз с датчиком "Saures API: SID" никаких проблем нет, Он единственный исправно получает данные. А вот все остальные получают ровно один раз после запуска. При втором обращении они вываливаются с ошибкой Platform rest does not generate unique IDs.
Если получают ровно один раз после запуска, значит работает. Проведите эксперимент. Создайте копию вашего файла и скопируйте в другое место. В коде уберите у всех unique_id. Проверьте все сущности в разделе Объекты, которые связаны с saures, и чтобы не было красного круга с восклицательным знаком. Если есть, то удалите все сущности связанные с saures, у которых такой знак. Почистите свой Home Assistant от старых и недействительных сущностей связанные с saures. Сократите интервал опроса до 600 сек., для всех сенсоров для проверки. После всех настроек перезапустите Home Assistant. Потом повторно проверьте все сущности saures, не должно быть недействительных сущностей или дублей
Когда объект недоступен, то справа будет красный кружок с восклицательным знаком
Мои интервалы подобранные путем проб и из-за превышения интервала сенсоры не работали. Если у SID стоит интервал 7200 и больше, то сенсоры не работают
Для запроса login (SID) интервал: 3600 сек Для запроса user/objects интервал: 86400 сек Для запроса object/meters интервал: 3600 сек
Проведите эксперимент. Создайте копию вашего файла и скопируйте в другое место. В коде уберите у всех unique_id. Проверьте все сущности в разделе Объекты, которые связаны с saures, и чтобы не было красного круга с восклицательным знаком. Если есть, то удалите все сущности связанные с saures, у которых такой знак. Почистите свой Home Assistant от старых и недействительных сущностей связанные с saures. Сократите интервал опроса до 600 сек., для всех сенсоров для проверки. После всех настроек перезапустите Home Assistant. Потом повторно проверьте все сущности saures, не должно быть недействительных сущностей или дублей
Хоть и все это пройдённый этап, но решил всё таки проверить еще раз. Ну вдруг что не так делаю.
Поднял новый пустой тестовый сервер на распбери, на него скопировал ваш файл с указанными настройками.
При запуске Saures API: SID тут же получил SID. 1 и 2 счетчики получили данные.
Saures API: Object получил статус unknown, но данные в Saures Storage: ID Object записались правильные.
Далее прошел час Saures API: SID получил новый SID, все остальное вывалилось в unknown, * в логи записалась ошибка
Platform rest does not generate unique IDs. saures_api_object already exists - ignoring sensor.saures_api_controller
Platform rest does not generate unique IDs. ID saures_api_controller already exists - ignoring sensor.saures_api_controller
Platform rest does not generate unique IDs. saures_api_water_meters_1 already exists - ignoring sensor.saures_api_controller
Platform rest does not generate unique IDs. saures_api_water_meters_2 already exists - ignoring sensor.saures_api_controller
Хорошо, решил убрать unique_id, ошибка исчезла, через сутки в системе было 24 счётчика холодной воды, 24 горячей и так далее. С unique_id:
Убрал Saures API: SID из секции sensor: в секцию rest: всё заработало, все данные получает вовремя и корректно. Ошибок нет.
@DivanX10 я нисколько не сомневаюсь, что у вас всё работает, но у меня так. И исправляется ситуация только выносом датчика в другую секцию. Поэтому, если у кого то возникнет ситуация аналогичная моей с появлением ошибки Platform rest does not generate unique IDs. , то они могут попробовать исправить ситуацию предложенным решением.
В любом случае, Вам огромный респект, за указания направления и конфиг. А то модуль по-моему, к сожалению, всё
После обновления Homeassistant 2023.9.3 отвалилась интеграция SauresHA, после обновления интеграции она вроде как ожила, но перестали обновляться датчики. Вернее они обновляются только при перезагрузке Homeassistant.