# Setup-Anleitung: Home Assistant Alexa Skill ## Schritt-für-Schritt-Anleitung ### 1. Skill in der Alexa Developer Console anlegen 1. Auf [developer.amazon.com](https://developer.amazon.com) einloggen → **Alexa** → **Alexa Skills Kit** 2. **Create Skill** 3. Namen vergeben (z.B. "HomeAssistantSkill") 4. Locale: **German (DE)** 5. Modell: **Custom** 6. Hosting-Methode: **Alexa-hosted (Node.js)** 7. Hosting-Region: **EU (Ireland)** 8. Template: **Start from Scratch** 9. **Create Skill** klicken ### 2. Invocation Name festlegen - Build-Tab → **Invocations** → Invocation Name setzen, z.B. `home assistant` - Save klicken ### 3. Slot Type anlegen **PeriodList** (für Stromkosten-Abfragen, wird von mehreren Intents wiederverwendet): - Build-Tab → **Slot Types** → **+ Add** → Namen `PeriodList` → "Create custom slot type" | Value | ID | |---|---| | Tag | tag | | Woche | woche | | Monat | monat | Tipp: Beim Value "Tag" als Synonym z.B. "heute" ergänzen. Die ID ist wichtig: Der Code liest den sauberen, festen Wert über die Slot-Resolution aus. - Save klicken ### 4. Intents anlegen Build-Tab → **Intents** → `HelloWorldIntent` löschen. Danach folgende Intents anlegen: **GetPowerUsageIntent** (kein Slot): ``` wie hoch ist der aktuelle stromverbrauch was ist die aktuelle leistung wie viel strom verbrauchen wir gerade ``` **GetPowerKammerUsageIntent** (kein Slot): ``` wie hoch ist der aktuelle stromverbrauch in der kammer was ist die aktuelle leistung in der kammer ``` **GetEnergyCostIntent** (mit Slot `{Period}`, Slot Type `PeriodList`): ``` wie hoch sind die stromkosten diesen {Period} wie hoch sind die stromkosten {Period} was kostet der strom diesen {Period} ``` Beim Eintippen von `{Period}` Popup "Create a new slot" → **Add**. Danach bei Intent Slots `Period` als Slot Type `PeriodList`. **GetEnergyCostKammerIntent** (mit Slot `{Period}`, Slot Type `PeriodList`): ``` wie hoch sind die stromkosten für die kammer diesen {Period} was kostet die kammer diesen {Period} ``` **GetWashingMachineIntent** (kein Slot): ``` wie lange läuft die waschmaschine noch wann ist die waschmaschine fertig ist die waschmaschine fertig ``` **GetDryerIntent** (kein Slot): ``` wie lange läuft der trockner noch wann ist der trockner fertig ist der trockner fertig ``` > Die Standard-Intents (Cancel/Help/Stop/NavigateHome/Fallback) bleiben unverändert. ### 5. Modell bauen - Oben rechts **Build Skill** klicken - Nach *jeder* Änderung an Utterances/Intents/Slots muss neu gebaut werden. ### 6. Long-Lived Access Token erstellen - Home Assistant: Profil → runterscrollen zu **"Long-lived access tokens"** → Token erstellen → sofort kopieren ### 7. Code einrichten - Skill → Tab **Code** - `index.js`, `factories.js`, `ha-client.js`, `static-handlers.js` aus diesem Repo übernehmen (per **New File** anlegen) - `package.json` ersetzen - Neue Datei `.env` anlegen, Inhalt aus `.env.example` mit echten Werten: ``` HA_URL=https://deine-ha-domain.de HA_TOKEN=dein-long-lived-access-token ``` - Entity-IDs in `index.js` an deine Installation anpassen - **Save** → **Deploy** ### 8. Temperaturabfragen (native Integration) 1. Home Assistant → Einstellungen → Sprachassistenten → Alexa → `climate`-Entitäten freigeben 2. Alexa-App: Gerät dem passenden Raum zuweisen 3. Falls nötig: Geräte neu suchen lassen 4. Danach: *"Alexa, wie warm ist es im Wohnzimmer"* — ohne Skill-Namen ### 9. Testen - Tab **Test** → Development - Simulator, z.B.: `frag home assistant was ist die aktuelle leistung` --- ## Entity-Referenz **Stromverbrauch:** ```js GetPowerUsageIntentHandler: 'sensor.kammer_netzbezug_plus_keller_power_calc' GetPowerKammerUsageIntentHandler: 'sensor.kammer_serverschrank_leistung' ``` **Stromkosten:** ```js // GetEnergyCostIntentHandler tag: 'sensor.netzbezug_kosten_tag', woche: 'sensor.netzbezug_kosten_woche', monat: 'sensor.netzbezug_kosten_monat', // GetEnergyCostKammerIntentHandler tag: 'sensor.kammer_serverschrank_kosten_tag', woche: 'sensor.kammer_serverschrank_kosten_woche', monat: 'sensor.kammer_serverschrank_kosten_monat', ``` **Waschmaschine:** ```js statusEntity: 'sensor.waschmaschine_betriebszustand' progressEntity: 'sensor.waschmaschine_programm_fortschritt' endTimeEntity: 'sensor.waschmaschine_programm_endzeit' ``` **Trockner:** ```js statusEntity: 'sensor.trockner_betriebszustand' progressEntity: 'sensor.trockner_programm_fortschritt' endTimeEntity: 'sensor.trockner_programm_endzeit' ``` --- ## Fehlersuche - **Fehlermeldung im Simulator:** JSON Output rechts prüfen - **Fallback direkt nach neuem Intent:** "Build Skill" vergessen - **Keine Verbindung:** `HA_URL` prüfen (kein Pfad, kein Slash am Ende), HA von außen erreichbar? - **Zahlen falsch vorgelesen:** Werte runden bzw. mit Komma formatieren (bereits umgesetzt) - **Ausführliche Logs:** Code-Tab → CloudWatch Logs