5.2 KiB
Home Assistant
Nouri stellt für Home Assistant eine kleine token-geschützte JSON-API bereit. Sie ist für Sprachbefehle wie diese gedacht:
Füge Erbsen auf die Einkaufsliste hinzuFüge Erbsen mit Hinweis TK auf die Einkaufsliste hinzuFüge Blumenerde als Einkaufsartikel hinzuFüge Skyr als Lebensmittel hinzu
Nouri konfigurieren
Setze in der Nouri-Umgebung:
NOURI_HA_TOKEN=<langes-zufälliges-token>
NOURI_HA_USER_ID=<optionale-nouri-user-id>
NOURI_HA_USER_ID ist optional. Ohne diesen Wert nutzt Nouri zuerst den ersten aktiven Admin und danach den ersten aktiven Nutzer.
Lokal zum Testen:
export NOURI_HA_TOKEN='ein-langes-zufälliges-token'
flask --app wsgi run --debug
Auf Cloudron:
cloudron env set --app <nouri-app> NOURI_HA_TOKEN='ein-langes-zufälliges-token'
cloudron restart --app <nouri-app>
Home Assistant vorbereiten
Lege in Home Assistant in secrets.yaml diese Werte an:
nouri_ha_token: ein-langes-zufälliges-token
nouri_url: https://deine-nouri-domain.example.org
Wenn Home Assistant lokal auf Nouri zugreift, nimm die aus Home Assistant erreichbare Adresse, zum Beispiel:
nouri_url: http://192.168.178.50:5000
127.0.0.1 funktioniert nur, wenn Home Assistant und Nouri im selben Prozess- oder Container-Kontext laufen.
Eintrag hinzufügen
POST /api/home-assistant/shopping
Authorization: Bearer <NOURI_HA_TOKEN>
Content-Type: application/json
{
"name": "Erbsen",
"note": "TK"
}
Wenn Nouri den Eintrag kennt, wird er direkt auf die Einkaufsliste gesetzt. note landet im bestehenden Feld Einkaufshinweis.
Wenn Nouri den Eintrag nicht kennt, kommt eine Rückfrage-Antwort:
{
"ok": true,
"status": "needs_confirmation",
"name": "Erbsen",
"note": "TK",
"options": ["food", "shopping"],
"message": "Erbsen kenne ich noch nicht. Soll ich es als Lebensmittel oder Einkaufsartikel anlegen?"
}
Rückfrage bestätigen
POST /api/home-assistant/shopping/confirm
Authorization: Bearer <NOURI_HA_TOKEN>
Content-Type: application/json
{
"name": "Erbsen",
"note": "TK",
"create_as": "food"
}
Mögliche Werte für create_as:
foodfür Lebensmittelshoppingfür reine Einkaufsartikel
Alternativ kann der erste Endpoint mit confirm_create: true verwendet werden:
{
"name": "Blumenerde",
"create_as": "shopping",
"confirm_create": true
}
REST Commands
Trage in configuration.yaml ein:
rest_command:
nouri_shopping:
url: "{{ url }}/api/home-assistant/shopping"
method: post
headers:
X-Nouri-Token: !secret nouri_ha_token
Content-Type: "application/json"
payload: >
{
"name": "{{ name }}",
"note": "{{ note | default('') }}",
"create_as": "{{ create_as | default('') }}",
"confirm_create": {{ confirm_create | default(false) | tojson }}
}
nouri_shopping_confirm:
url: "{{ url }}/api/home-assistant/shopping/confirm"
method: post
headers:
X-Nouri-Token: !secret nouri_ha_token
Content-Type: "application/json"
payload: >
{
"name": "{{ name }}",
"note": "{{ note | default('') }}",
"create_as": "{{ create_as }}"
}
Danach Home Assistant neu starten oder die YAML-Konfiguration neu laden.
Manuell testen
In Home Assistant:
- Öffne
Entwicklerwerkzeuge. - Öffne
Aktionen. - Wähle
rest_command.nouri_shopping. - Nutze zum Testen:
url: !secret nouri_url
name: Erbsen
note: TK
Wenn Erbsen in Nouri existiert, wird es auf die Einkaufsliste gesetzt. Wenn nicht, antwortet Nouri mit needs_confirmation.
Assist-Sprachsätze
Minimal in configuration.yaml:
conversation:
intents:
NouriShopping:
- "füge {name} auf die einkaufsliste hinzu"
- "füge {name} mit hinweis {note} auf die einkaufsliste hinzu"
- "füge {name} als lebensmittel hinzu"
- "füge {name} als einkaufsartikel hinzu"
Dazu ein Intent Script:
intent_script:
NouriShopping:
action:
- action: rest_command.nouri_shopping
data:
url: !secret nouri_url
name: "{{ name }}"
note: "{{ note | default('') }}"
create_as: >
{% if 'lebensmittel' in text | default('') | lower %}food{% elif 'einkaufsartikel' in text | default('') | lower %}shopping{% else %}{% endif %}
confirm_create: false
response_variable: nouri_response
- stop: "Nouri Antwort"
response_variable: nouri_response
speech:
text: >
{{ action_response.content.message }}
Rückfrage-Logik
Der erste Schritt ist damit fertig: bekannte Lebensmittel oder Einkaufsartikel landen direkt auf der Nouri-Einkaufsliste.
Wenn Nouri mit needs_confirmation antwortet, muss Home Assistant im nächsten Schritt nachfragen:
Soll ich das als Lebensmittel oder als Einkaufsartikel anlegen?
Danach ruft Home Assistant /api/home-assistant/shopping/confirm mit create_as: food oder create_as: shopping auf. Diese zweite Stufe kann je nach Setup über Assist, eine Automation, eine mobile Benachrichtigung oder später über Alexa umgesetzt werden.