home-assistant / intents

Intents to be used with Home Assistant
https://developers.home-assistant.io/docs/voice/overview/
Creative Commons Attribution 4.0 International
464 stars 532 forks source link

Timer wrongly recognise area when we use more then one name variation #2393

Open witold-gren opened 2 months ago

witold-gren commented 2 months ago

I have very simple _fixtures.yaml configuration:

language: pl
areas:
  - name: "Kuchni[a]"
    id: kitchen_id
    floor: "Parter"
...
timers:
  - area: "kitchen_id"
    start_minutes: 5
    total_seconds_left: 190
    rounded_hours_left: 0
    rounded_minutes_left: 3
    rounded_seconds_left: 0

When I run pytest for below test case configuration: sentences:

language: pl
intents:
  HassTimerStatus:
    data:
      - sentences:
          - "<area>[ jaki| jaki jest] <timer_state>[ mojego| moich][ <timer_start>] <timer>[ {timer_name:name}]"
          - "[jaki |jaki jest ]<area> <timer_state>[ mojego| moich][ <timer_start>] <timer>[ {timer_name:name}]"
          - "[jaki |jaki jest ]<timer_state> <area>[ mojego| moich][ <timer_start>] <timer>[ {timer_name:name}]"
          - "[jaki |jaki jest ]<timer_state>[ mojego| moich][ <timer_start>] <timer>[ {timer_name:name}] <area>"
          - "[jaki |jaki jest ]<timer_state>[ mojego| moich][ <timer_start>] (<timer_plural>|<timer>)[ {timer_name:name}]"
          - "ile czasu [po]zostało na [moich |moim ][<timer_start> ](<timer_plural>|<timer>)[ {timer_name:name}] <area>"
          - "ile czasu [po]zostało na [moich |moim ][<timer_start> ](<timer_plural>|<timer>)[ {timer_name:name}]"

test:

  - sentences:
      - "stan minutnika w kuchni"
      - "status minutnika w kuchni"
      - "podsumowanie minutnika w kuchni"
      - "jaki stan minutnika w kuchni"
      - "jaki jest stan minutnika w kuchni"
      - "jaki jest w kuchni stan mojego minutnika"
      - "w kuchni jaki jest stan minutnika"
      - "stan mojego minutnika w kuchni"
      - "ile czasu pozostało na minutniku w kuchni"
    intent:
      name: HassTimerStatus
      slots:
        area: "Kuchni"
    response: |
      Pozostały 3 minuty do zakończenia.

I see that all te time pytest can not discover timer on this area. When I print {{ slots }} in my response I see: {'area': 'kuchni', 'timers': [], 'date': datetime.date(2013, 9, 17), 'time': datetime.time(1, 2)}

Also when I check main params in top of run the test:

language = 'pl'
intent_schemas = {'HassCancelTimer': {'description': 'Cancels a timer', 'domain': 'intent', 'slots': {'area': {'description': 'Area of ...inutes', 'required': False}, 'name': {'description': 'Name attached to the timer', 'required': False}, ...}, ...}, ...}
slot_lists = {'area': TextSlotList(name=None, values=[TextSlotValue(text_in=TextChunk(text='kuchnia', original_text='kuchnia'), val...nk(text='odkurzacz', original_text='odkurzacz'), value_out='Odkurzacz', context={'domain': 'vacuum'}, metadata=None)])}
states = [State(entity_id='light.bedroom_lamp', name='Lampę nocną', hass_state='off', attributes={'device_class': 'light'}, are...s={'device_class': 'blind'}, area_id='living_room_id', human_state=None, aliases={'Roletę salonu'}, _domain=None), ...]
areas = [AreaEntry(id='kitchen_id', name='Kuchnia', aliases={'Kuchni'}), AreaEntry(id='living_room_id', name='Salonie', aliase...ame='Łazienka', aliases={'Łazience'}), AreaEntry(id='balcony_id', name='Balkonie', aliases={'Balkonu', 'Balkon'}), ...]
timers = [Timer(is_active=False, start_hours=1, start_minutes=None, start_seconds=None, rounded_hours_left=0, rounded_minutes_l...ded_hours_left=0, rounded_minutes_left=3, rounded_seconds_left=0, name=None, area='kuchni[a]', total_seconds_left=190)]
language_sentences = Intents(language='pl', intents={'HassClimateGetTemperature': Intent(name='HassClimateGetTemperature', data=[IntentData...Sprawdź', 'Sprawdź mi', 'Sprawdź proszę', 'Zerknij', 'Zerknij czy'], settings=IntentsSettings(ignore_whitespace=False))
language_responses = {'HassCancelTimer': {'default': 'Anulowano minutnik'}, 'HassClimateGetTemperature': {'default': "{% set temperature = ...etTemperature': {'default': 'Ustawiono temperaturę'}, 'HassDecreaseTimer': {'default': 'Zaktualizowano minutnik'}

I observed that my timer use area call area='kuchni[a]'. This is incorrect because I can not use this name in my test templates.

witold-gren commented 2 months ago

The similar issue exist when we have response from HassTimerStatus.yaml. We can use one params {{ next_timer.area }} to return area name. But when we use some variations of name for our area like: name: "Kuchni[a]" the this variable return configuration string, not correct area name. In my case:

language: pl
tests:
  - sentences:
      - "stan minutnika"
      - "status minutnika"
      - "podsumowanie minutnika"
      - "jaki stan minutnika"
      - "jaki jest stan minutnika"
      - "stan moich minutników"
      - "jaki jest stan moich minutników"
      - "ile czasu pozostało na moich minutnikach"
    intent:
      name: HassTimerStatus
    response: |
      2 uruchomione minutniki. 1 wstrzymany minutnik. Pozostały 3 minuty na 5 minutowym minutniku w kuchni[a].

I see the answer: 2 uruchomione minutniki. 1 wstrzymany minutnik. Pozostały 3 minuty na 5 minutowym minutniku w kuchni[a]. but it should be: 2 uruchomione minutniki. 1 wstrzymany minutnik. Pozostały 3 minuty na 5 minutowym minutniku w kuchni.

spuljko commented 3 days ago

@witold-gren I have written macro that parse area name and return first option for it, check it out here, I hope you will find it useful: https://github.com/home-assistant/intents/pull/2684 Area names in fixtures should be written in the way that first option returns nominative case and use that when checking. For example, return message is "No timers found in the area kitchen" ("Nema timera u prostoriji kuhinja" in Croatian).