SETUP.md: vollständige Schritt-für-Schritt-Anleitung ausgelagert, ohne Temperatur/RoomList-Reste
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user