dext0r / yandex_smart_home

Adds support for Yandex Smart Home (Alice voice assistant) into Home Assistant
https://docs.yaha-cloud.ru
MIT License
790 stars 113 forks source link

Хочется, чтобы теперь и датчики поддерживались :) #118

Closed tuxamat closed 3 years ago

tuxamat commented 3 years ago

Яндекс объявил о поддержке датчиков Алисой, осталось их пробросить через ХА в нее...

sashayohan commented 3 years ago

у меня например вот так работает

yandex_smart_home:
  entity_config:
    sensor.temperature_kitchen_comfort:
      name: Датчик климата
      room: Кухня
      properties:
        - type: temperature
          entity: sensor.temperature_kitchen_comfort
        - type: humidity
          entity: sensor.humidity_kitchen_comfort
        - type: co2_level
          entity:  sensor.co2_kitchen_comfort
tuxamat commented 3 years ago

не появляются отдельные датчики(

tuxamat commented 3 years ago

Победил

yandex_smart_home:
  filter:
   include_domains:
     - switch
     - sensor
  entity_config:
    sensor.narodmon:
      name: Климат на улице
      properties:
        - type: temperature
          entity: sensor.narodmon_temperature
        - type: humidity
          entity: sensor.narodmon_humidity
    sensor.0x00158d0000da9eb4_eco2:
      name: Климат в спальне
      properties:
        - type: temperature
          entity: sensor.0x00158d0000da9eb4_temperature
        - type: humidity
          entity: sensor.0x00158d0000da9eb4_humidity
        - type: co2_level
          entity:  sensor.0x00158d0000da9eb4_eco2
tuxamat commented 3 years ago

ну значит теперь надо только датчики открытия/закрытия и движения, яндекс их поддерживает, а компонент нет(

glebsterx commented 3 years ago

ну значит теперь надо только датчики открытия/закрытия и движения, яндекс их поддерживает, а компонент нет(

кажется Яндекс поддерживает эти датчики как "sensor" а в ХА они как "binary_sensor".. нужна доработка, да, но автор вроде отказался от поддержки =(

dmitry-k commented 3 years ago

Постараюсь посмотреть в ближайшее время что там с сенсорами

glebsterx commented 3 years ago

Постараюсь посмотреть в ближайшее время что там с сенсорами

Спасибо, Дмитрий =) Там также добавилось несколько других новых типов устройств в УДЯ

Snarky73 commented 3 years ago

чего то недопонимаю, в секции sensor. что за сенсор указывать? Один из entity? или какой то свой надо объявлять?

tuxamat commented 3 years ago

чего то недопонимаю, в секции sensor. что за сенсор указывать? Один из entity? или какой то свой надо объявлять?

Зависит от датчика(ов) Надо смотреть как залетают в ХА В домене просто указывается тип "sensor" Чтобы этот тип улетал в яндекс

Snarky73 commented 3 years ago

Ну допустим у нас есть sensor.0d043030_himidity и sensor.er87er8r_temp. В entity_config: sensor.(тут что писать? выдумать свое название или одну из существующих сущностей?) properties:

tuxamat commented 3 years ago

Во-первых можете вообще не указывать отдельно датчики, достаточно будет

yandex_smart_home:
  filter:
   include_domains:
     - sensor

Просто все датчики будут отдельно в яндексе. А если надо вместе, то эксперементируйте, у меня датчики с одного устройства, поэтому первое указываю главное как в ХА у меня co2, на сяоми - температурный, возможно это вообще не важно, я не проверял.

glebsterx commented 3 years ago

чего то недопонимаю, в секции sensor. что за сенсор указывать? Один из entity? или какой то свой надо объявлять?

я немного доработал код #120 , и с этой доработкой можно указывать по entity_id и датчик будет добавлен в УДЯ отдельным устройством:

yandex_smart_home: 
  filter:
    include_domains:
#      - sensor # можно указать так - как в сообщении выше
#      - binary_sensor
    include_entities:
      # sensors
      - binary_sensor.door_window_sensor_1580000000000
      - sensor.temperature_1580000000000 # а можно вот так - по 1 датчику

дополнительно конфиг ему прописывать не нужно, оно там само все подхватится но впрочем все это (как писать конфиг) есть в мануале =)

(upd) да, binary_sensor - виден не будет по причинам указанным ниже

и остается сделать бинарные датчики - а Яндекс не включил их еще всем, как я понимаю. в prop.py нужно получается добавить что-то вроде PROPERTY_BOOL = PREFIX_PROPERTIES + 'bool' и с ним дальше уже плясать - как правильно это сделать - я не знаю, честно говоря, опыта маловато, так что ждем Дмитрия =)

dmitry-k commented 3 years ago

boolean я так понял пока в бете, напишите плиз когда выйдет из беты и станет доступно всем. Остальное вроде работает уже. Ну или нужны конкретные примеры.

akarpych commented 3 years ago

Чето я обновился и у меня все равно не появились датчики движения и открытия??? надо добавлять - binary_sensor в includes или все должно работать через -sensor?

dronix27 commented 3 years ago

Чето я обновился и у меня все равно не появились датчики движения и открытия??? надо добавлять - binary_sensor в includes или все должно работать через -sensor?

Да ни у кого их нет пока. Читаем выше

glebsterx commented 3 years ago

boolean я так понял пока в бете, напишите плиз когда выйдет из беты и станет доступно всем. Остальное вроде работает уже. Ну или нужны конкретные примеры.

если мне вдруг доступ даст Яндекс к бета-функцоналу - я отпишусь (запрос отправил). А вообще пример использования есть тут: https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/bool.html/

то есть компонент должен отдавать что-то вроде того:

...
      "devices": [{
        "id": "sensor-001-snsr",  
         "properties": [{
           "type": "devices.properties.bool", 
           "state": {
             "instance": "motion",
             "value": false
           }
         }]
...

Короче говоря это тот же CustomEntityProperty, но без unit и с типом boolean. Я вроде понимаю, что нужно сделать, но не знаю как)) Так что вся надежда на вас =) P.S. Я пробовал поменять там всякое, но компонент не хочет отдавать эти датчики в списке устройств с каким бы то ни было значением..

Zuz666 commented 3 years ago

у меня например вот так работает


yandex_smart_home:
  entity_config:
    sensor.temperature_kitchen_comfort:
      name: Датчик климата
      room: Кухня
      properties:
        - type: temperature
          entity: sensor.temperature_kitchen_comfort
После того как так напишите в конфиге сходите в раздел тестирование навыка и посмотрите, что там в реальности ходит (там есть логи и там видно json), у меня, к примеру, температура дублировалась и я убрал температуру из properties: (это касается публикации температурных датчиков Aqara прокинутых через интеграцию XG3).
Как я понял главный сенсор и так прокидывается, его в properties указывать не нужно иначе будет дублирование.
По мне это баг...
dronix27 commented 3 years ago

у меня например вот так работает

yandex_smart_home:
  entity_config:
    sensor.temperature_kitchen_comfort:
      name: Датчик климата
      room: Кухня
      properties:
        - type: temperature
          entity: sensor.temperature_kitchen_comfort

После того как так напишите в конфиге сходите в раздел тестирование навыка и посмотрите, что там в реальности ходит (там есть логи и там видно json), у меня, к примеру, температура дублировалась и я убрал температуру из properties: (это касается публикации температурных датчиков Aqara прокинутых через интеграцию XG3). Как я понял главный сенсор и так прокидывается, его в properties указывать не нужно иначе будет дублирование. По мне это баг...

А зачем 2 раза один и тот же датчик указывать. Поставьте в properties датчик влажности, например. Тогда это будет единый датчик климата

glebsterx commented 3 years ago

у меня например вот так работает

yandex_smart_home:
  entity_config:
    sensor.temperature_kitchen_comfort:
      name: Датчик климата
      room: Кухня
      properties:
        - type: temperature
          entity: sensor.temperature_kitchen_comfort

После того как так напишите в конфиге сходите в раздел тестирование навыка и посмотрите, что там в реальности ходит (там есть логи и там видно json), у меня, к примеру, температура дублировалась и я убрал температуру из properties: (это касается публикации температурных датчиков Aqara прокинутых через интеграцию XG3). Как я понял главный сенсор и так прокидывается, его в properties указывать не нужно иначе будет дублирование. По мне это баг...

Последним обновлением компонента Дмитрий внес поправки с которыми сенсоры добавляются сами по себе - читайте тут и не нужно в entity_config ничего прописывать теперь. Просто пишете домен sensor в include_domains или нужные датчики в include_entities и все, никаких дополнительных properties не нужно приписывать..

А Ваш "баг" из-за того, что Вы в конфиге дублируете датчик =)

upd: отличная идея в комментарии выше

Zuz666 commented 3 years ago

А Ваш "баг" из-за того, что Вы в конфиге дублируете датчик =)

@glebsterx не знаю, у меня есть такой код:

# Qingping ClearGrass Air Monitor CGS1
air_quality:
  - platform: xiaomi_miio
    name: Qingping ClearGrass Air Monitor
    host: 
    token:

sensor:
  - platform: template
    sensors:
      home_air_quality_temperature:
        value_template: "{{ state_attr('air_quality.qingping_cleargrass_air_monitor', 'temperature') }}"
      home_air_quality_humidity:
        value_template: "{{ state_attr('air_quality.qingping_cleargrass_air_monitor', 'humidity') }}"
      home_air_quality_co2_level:
        value_template: "{{ state_attr('air_quality.qingping_cleargrass_air_monitor', 'carbon_dioxide') }}"

yandex_smart_home:
  filter:
    include_entities:
      - sensor.home_air_quality_co2_level
  entity_config:
    sensor.home_air_quality_co2_level:
      name: Датчик воздуха в кабинете
      room: Кабинет
      properties:
        - type: temperature
          entity: sensor.home_air_quality_temperature
        - type: humidity
          entity: sensor.home_air_quality_humidity
        - type: co2_level
          entity: sensor.home_air_quality_co2_level

И ничего тут не дублируется, вот так выглядит ответ:

{"request_id": "81f115f6-95af-411f-bbcd-97314e393cc6", "payload": {"devices": [{"id": "sensor.home_air_quality_co2_level", "capabilities": [], "properties": [{"type": "devices.properties.float", "state": {"instance": "temperature", "value": 23.8}}, {"type": "devices.properties.float", "state": {"instance": "humidity", "value": 44.2}}, {"type": "devices.properties.float", "state": {"instance": "co2_level", "value": 712.0}}]}]}}

А вот для такого кода

yandex_smart_home:
  filter:
    include_entities:
      - sensor.0x158d000464e073_temperature
  entity_config:
    sensor.0x158d000464e073_temperature:
      name: Датчик климата в кабинете
      room: Кабинет
      properties:
        - type: temperature
          entity: sensor.0x158d000464e073_temperature
        - type: humidity
          entity: sensor.0x158d000464e073_humidity

Температура дублируется в ответе. Почему мне пока не ясно, код компонента детально не смотрел. Явно видно, что поведение отличается, хотя описание одинаковое.

Zuz666 commented 3 years ago

А зачем 2 раза один и тот же датчик указывать. Поставьте в properties датчик влажности, например. Тогда это будет единый датчик климата

@glebsterx собственно я об этом и написал, что так писать не следует, т.к. дублируются данные.

Zuz666 commented 3 years ago

Просто пишете домен sensor в include_domains или нужные датчики в include_entities и все, никаких дополнительных properties не нужно приписывать..

@glebsterx можно, но хотелось бы их сгруппировать, раз такая возможность есть. Это упрощает получение информации по такому датчику. Команда "что с датчиком климата в кабинете?". Ну и названия им дать тоже хочется для команд.

glebsterx commented 3 years ago

А зачем 2 раза один и тот же датчик указывать. Поставьте в properties датчик влажности, например. Тогда это будет единый датчик климата

Собственно я об этом и написал, что так писать не следует, т.к. дублируются данные.

Хммм,.. в коде properties температуры, влажности и заряда батареи описаны отдельными функциями, а все остальное CustomEntityProperty - возможно поэтому и не дублируется.. И да, я понял =) перечитал)) "Главный" сенсор теперь прокидывается по умолчанию как сенсор с его данными. То есть логика такая, что мы добавляем дополнительные данные к нему в entity_config

Да, компонент нужно еще дорабатывать, потому что появятся boolean датчики..

Zuz666 commented 3 years ago

"Главный" сенсор теперь прокидывается по умолчанию как сенсор с его данными. То есть логика такая, что мы добавляем дополнительные данные к нему в entity_config

@glebsterx я тоже так думал, но в примере с сенсорами, созданными через шаблоны (я код привёл выше и ответ из логов) так не работает. :) upd: Возможно тут важен порядок в properties, в этом примере co2 последним идёт, а в изначальном примере температура первым в properties.

glebsterx commented 3 years ago

"Главный" сенсор теперь прокидывается по умолчанию как сенсор с его данными. То есть логика такая, что мы добавляем дополнительные данные к нему в entity_config

@glebsterx я тоже так думал, но в примере с сенсорами, созданными через шаблоны (я код привёл выше и ответ из логов) так не работает. :) upd: Возможно тут важен порядок в properties, в этом примере co2 последним идёт, а в изначальном примере температура первым в properties.

Мне все же кажется, что не в порядке дело, а как я писал выше - в том, что температура и влажность отдельно прописаны в prop.py а остальные properties типа универсальные, поэтому они не дублируются.. Спасибо за наблюдения =) я думаю Дмитрий (и другие разработчики) их учтут при доработке работы с датчиками =)

Zuz666 commented 3 years ago

Мне все же кажется, что не в порядке дело, а как я писал выше - в том, что температура и влажность отдельно прописаны в prop.py а остальные properties типа универсальные, поэтому они не дублируются..

@glebsterx будет время посмотрю код, похоже на то, что дублироваться будут именно температура и влажность, остальное как в примере с co2 не будет.

dronix27 commented 3 years ago

Мне все же кажется, что не в порядке дело, а как я писал выше - в том, что температура и влажность отдельно прописаны в prop.py а остальные properties типа универсальные, поэтому они не дублируются..

@glebsterx будет время посмотрю код, похоже на то, что дублироваться будут именно температура и влажность, остальное как в примере с co2 не будет.

Я так прокинул датчики DHT, которые Алиса ввобще не видит. И да, там не дублируется. Именно потому что такого датчика она не видит изначально. А через properties увидела


 entity_config:
    sensor.dht11_temperature:
      name: Климат
      room: Кухня
      properties:
      - type: temperature
        entity: sensor.dht11_temperature
      - type: humidity
        entity: sensor.dht11_humidity
Zuz666 commented 3 years ago

Я так прокинул датчики DHT

@dronix27 а что там выше, какой сенсор? Ваш код не полный, не ясны детали.

dronix27 commented 3 years ago

Я так прокинул датчики DHT

@dronix27 а что там выше, какой сенсор? Ваш код не полный, не ясны детали.

Пардон, не доглядел. Поправил

glebsterx commented 3 years ago

Так как Яндекс еще не дает доступа к бета функционалу попробовал "вслепую" сделать классы для датчиков движения и герконов тут Но в целом результат дает такой:

2020-12-08T16:27:18+03:00: Got response from provider XXXXXXXXXXXXXXXX:
200
{"request_id": "XXXXXXXXXXXXXXXXX", "payload": {"devices": [{"id": "binary_sensor.door_window_sensor_158XXXXXXXXX", "capabilities": [], "properties": [{"type": "devices.properties.bool", "state": {"instance": "magnet", "value": true}}]}]}}
@register_property
class BatteryProperty(_Property):
    type = PROPERTY_FLOAT
    instance = 'battery_level'

    @staticmethod
    def supported(domain, features, entity_config, attributes):
        if domain == vacuum.DOMAIN:
            return vacuum.ATTR_BATTERY_LEVEL in attributes
        elif domain == sensor.DOMAIN:
            return attributes.get(ATTR_BATTERY_LEVEL) is not None
        elif domain == binary_sensor.DOMAIN:
            return attributes.get(ATTR_BATTERY_LEVEL) is not None

        return False

    def parameters(self):
        return {
            'instance': self.instance,
            'unit': 'unit.percent'
        }

    def get_value(self):
        value = 0
        if self.state.domain == vacuum.DOMAIN:
            value = self.state.attributes.get(vacuum.ATTR_BATTERY_LEVEL)
        elif self.state.domain == sensor.DOMAIN:
            value = self.state.attributes.get(ATTR_BATTERY_LEVEL)
        elif self.state.domain == binary_sensor.DOMAIN:
            value = self.state.attributes.get(ATTR_BATTERY_LEVEL)

        if value in (STATE_UNAVAILABLE, STATE_UNKNOWN, None):
            raise SmartHomeError(ERR_NOT_SUPPORTED_IN_CURRENT_MODE, "Invalid value")

        return float(value)

@register_property
class MagnetProperty(_Property):
    type = PROPERTY_BOOL
    instance = 'magnet'

    @staticmethod
    def supported(domain, features, entity_config, attributes):
        if domain == binary_sensor.DOMAIN:
            return attributes.get(ATTR_DEVICE_CLASS) == 'opening'

        return False

    def parameters(self):
        return {
            'instance': self.instance
        }

    def get_value(self):
        value = False
        if self.state.domain == binary_sensor.DOMAIN:
            value = self.state.state

        if value in (STATE_UNAVAILABLE, STATE_UNKNOWN, None):
            raise SmartHomeError(ERR_NOT_SUPPORTED_IN_CURRENT_MODE, "Invalid value")

        return bool(value)

@register_property
class MotionProperty(_Property):
    type = PROPERTY_BOOL
    instance = 'motion'

    @staticmethod
    def supported(domain, features, entity_config, attributes):
        if domain == binary_sensor.DOMAIN:
            return attributes.get(ATTR_DEVICE_CLASS) == 'motion'

        return False

    def parameters(self):
        return {
            'instance': self.instance
        }

    def get_value(self):
        value = False
        if self.state.domain == binary_sensor.DOMAIN:
            value = self.state.state

        if value in (STATE_UNAVAILABLE, STATE_UNKNOWN, None):
            raise SmartHomeError(ERR_NOT_SUPPORTED_IN_CURRENT_MODE, "Invalid value")

        return bool(value)

плюс теперь снимаются показания с батареек датчиков, а не только с пылесосов

Специалистов прошу поправить чего так может не по фен-шую.

UPD: говорят "датчики типа "bool" еще не открыты для использования. Документация и API останутся прежними, но функционал будет доступен ближе к концу месяца."

gumileeev commented 3 years ago

176

glebsterx commented 3 years ago

@gumileeev как я написал в #176 - мы бессильны в этой ситуации - пока Яндекс не начнет поддерживать conductivity А на данный момент он не поддерживает. Актуальный список тут

glebsterx commented 3 years ago

Кстати сегодня стало известно, что Яндекс активно работает над датчиками. ;) @gumileeev я бы вместо conductivity все таки использовал water_level или любой другой вариант из имеющихся и написывал бы в поддержку о добавлении нужного Вам датчика проводимости.

gumileeev commented 3 years ago

Кстати сегодня стало известно, что Яндекс активно работает над датчиками. ;) @gumileeev я бы вместо conductivity все таки использовал water_level или любой другой вариант из имеющихся и написывал бы в поддержку о добавлении нужного Вам датчика проводимости.

water_level не подходит, у него значения в %. Так практически и сделал, прописал что это датчик CO2, пока так придется, и написал в Яндекс, что в стране агрономия на коленях без поддержки этих сенсоров 😁

dreamer2 commented 3 years ago

поддерживает ли это расширение датчики из zigbee2mqtt через кастом конверторы? или что-то я делаю не так

в шаблоне данные датчиков описаны следующим образом

- platform: mqtt
  name: outdoorTemperature
  unique_id: 28886B77060000CB
  state_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  unit_of_measurement: "°C"
  value_template: "{{ value_json['temperature_28886B77060000CB'] | round(2) }}"
  availability_topic: "zigbee2mqtt/bridge/state"
  payload_available: "online"
  payload_not_available: "offline"
  json_attributes_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  icon: mdi:thermometer

- platform: mqtt
  name: balkonTemperature
  unique_id: balkonTemperature
  state_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  unit_of_measurement: "°C"
  value_template: "{{ value_json['temperature_l5'] | round(2) }}"
  availability_topic: "zigbee2mqtt/bridge/state"
  payload_available: "online"
  payload_not_available: "offline"
  json_attributes_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  icon: mdi:thermometer

- platform: mqtt
  name: balkonHumidity
  unique_id: balkonHumidity
  state_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  unit_of_measurement: "%"
  value_template: "{{ value_json['humidity_l5'] | round(2) }}"
  availability_topic: "zigbee2mqtt/bridge/state"
  payload_available: "online"
  payload_not_available: "offline"
  json_attributes_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  icon: mdi:water-percent

но в яндекс уходят только обычные датчики, которые ХА понял и создал автоматически

последний вариант конфига пробовал вот такой, но до этого и много других вариантов перебрал

yandex_smart_home:
  filter:
    include_domains:
      - switch
      - light
      - sensor
    include_entities:
      - sensor.balkonTemperature
      - sensor.balkonHumidity
  entity_config:
    sensor.balkon:
      name: Датчик на балконе
      room: Балкон
      properties:
        - type: temperature
          entity: sensor.balkonTemperature
        - type: humidity
          entity: sensor.balkonHumidity
gumileeev commented 3 years ago

поддерживает ли это расширение датчики из zigbee2mqtt через кастом конверторы? или что-то я делаю не так

в шаблоне данные датчиков описаны следующим образом

- platform: mqtt
  name: outdoorTemperature
  unique_id: 28886B77060000CB
  state_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  unit_of_measurement: "°C"
  value_template: "{{ value_json['temperature_28886B77060000CB'] | round(2) }}"
  availability_topic: "zigbee2mqtt/bridge/state"
  payload_available: "online"
  payload_not_available: "offline"
  json_attributes_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  icon: mdi:thermometer

- platform: mqtt
  name: balkonTemperature
  unique_id: balkonTemperature
  state_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  unit_of_measurement: "°C"
  value_template: "{{ value_json['temperature_l5'] | round(2) }}"
  availability_topic: "zigbee2mqtt/bridge/state"
  payload_available: "online"
  payload_not_available: "offline"
  json_attributes_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  icon: mdi:thermometer

- platform: mqtt
  name: balkonHumidity
  unique_id: balkonHumidity
  state_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  unit_of_measurement: "%"
  value_template: "{{ value_json['humidity_l5'] | round(2) }}"
  availability_topic: "zigbee2mqtt/bridge/state"
  payload_available: "online"
  payload_not_available: "offline"
  json_attributes_topic: "zigbee2mqtt/cc2531-ds18dht22-balkon"
  icon: mdi:water-percent

но в яндекс уходят только обычные датчики, которые ХА понял и создал автоматически

последний вариант конфига пробовал вот такой, но до этого и много других вариантов перебрал

yandex_smart_home:
  filter:
    include_domains:
      - switch
      - light
      - sensor
    include_entities:
      - sensor.balkonTemperature
      - sensor.balkonHumidity
  entity_config:
    sensor.balkon:
      name: Датчик на балконе
      room: Балкон
      properties:
        - type: temperature
          entity: sensor.balkonTemperature
        - type: humidity
          entity: sensor.balkonHumidity

Делайте по аналогии, пишите имя температурного сенсора, а потом указывайте его свойства, продублировав его имя и добавив влажность:

sensor.temperature_purifier_gostinaya:
      name: Климат
      room: Гостиная
      properties:
      - type: temperature
        entity: sensor.temperature_purifier_gostinaya
      - type: humidity
        entity: sensor.humidity_purifier_gostinaya
dreamer2 commented 3 years ago

да, переделал ещё раз и взлетело, спасибо