ARCHITECTURE.md: neue Multi-File-Struktur und Factory-Muster dokumentiert
This commit is contained in:
@@ -0,0 +1,72 @@
|
|||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architektur (Refactoring)
|
||||||
|
|
||||||
|
Der Code ist jetzt auf mehrere Dateien aufgeteilt, damit neue Sensoren/Geraete
|
||||||
|
nur noch wenige Zeilen Config statt eines kompletten Handlers brauchen:
|
||||||
|
|
||||||
|
```
|
||||||
|
home-assistant-skill/
|
||||||
|
+-- index.js # Nur noch Config: ruft die Factories mit den echten
|
||||||
|
| # Entity-IDs auf und registriert die Handler
|
||||||
|
+-- factories.js # makeApplianceIntent, makeSimpleSensorIntent,
|
||||||
|
| # makeSlotSensorIntent, PERIOD_PHRASES
|
||||||
|
+-- ha-client.js # getHaState() - HA REST API Client
|
||||||
|
+-- static-handlers.js # Launch/Help/Cancel/Fallback/Error (Pflicht-Handler)
|
||||||
|
+-- package.json
|
||||||
|
+-- .env.example
|
||||||
|
```
|
||||||
|
|
||||||
|
Neuer einfacher Sensor (kein Slot), z.B. Luftfeuchtigkeit:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const GetHumidityIntentHandler = makeSimpleSensorIntent({
|
||||||
|
intentName: 'GetHumidityIntent',
|
||||||
|
entityId: 'sensor.wohnzimmer_luftfeuchtigkeit',
|
||||||
|
template: (value, unit) => `Die Luftfeuchtigkeit betraegt ${value} ${unit}.`,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Neues Geraet mit Status/Fortschritt/Endzeit, z.B. Geschirrspueler ohne
|
||||||
|
Fortschritt (nur Status, mit individueller Formulierung ueber
|
||||||
|
`customStatusTemplate`):
|
||||||
|
|
||||||
|
```js
|
||||||
|
const GetDishwasherIntentHandler = makeApplianceIntent({
|
||||||
|
intentName: 'GetDishwasherIntent',
|
||||||
|
deviceName: 'Der Geschirrspueler',
|
||||||
|
statusEntity: 'sensor.geschirrspueler_betriebszustand',
|
||||||
|
customStatusTemplate: (state) => `Der Geschirrspueler laeuft im Programm ${state}.`,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Neue Kostengruppe mit Zeitraum-Slot (Tag/Woche/Monat), nutzt denselben
|
||||||
|
`PeriodList` Slot Type wie `GetEnergyCostIntent`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const GetXyzEnergyCostIntentHandler = makeSlotSensorIntent({
|
||||||
|
intentName: 'GetXyzEnergyCostIntent',
|
||||||
|
slotName: 'Period',
|
||||||
|
idToEntityMap: {
|
||||||
|
tag: 'sensor.xyz_kosten_tag',
|
||||||
|
woche: 'sensor.xyz_kosten_woche',
|
||||||
|
monat: 'sensor.xyz_kosten_monat',
|
||||||
|
},
|
||||||
|
transformValue: (v) => parseFloat(v).toFixed(2).replace('.', ','),
|
||||||
|
template: (value, unit, periodSpoken, periodId) =>
|
||||||
|
`Die Stromkosten fuer ${PERIOD_PHRASES[periodId] || periodSpoken} betragen ${value} ${unit}.`,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
In jedem Fall bleibt bestehen: Der zugehoerige **Intent mit Sample Utterances**
|
||||||
|
muss weiterhin in der Alexa Developer Console angelegt werden - das laesst
|
||||||
|
sich unabhaengig vom Code-Aufbau nicht vermeiden.
|
||||||
|
|
||||||
|
`PERIOD_PHRASES` sorgt fuer korrekte deutsche Grammatik ("diese Woche" statt
|
||||||
|
"diesen Woche"), da `periodId` (die feste Slot-ID) statt des roh gesprochenen
|
||||||
|
Texts fuer die Formulierung verwendet wird.
|
||||||
|
|
||||||
|
Aktuell zusaetzlich vorhanden: `GetPowerKammerUsageIntent` (Leistung
|
||||||
|
Kammer-Serverschrank) und `GetEnergyCostKammerIntent` (Stromkosten
|
||||||
|
Kammer-Serverschrank nach Tag/Woche/Monat) - gleiches Muster wie oben.
|
||||||
Reference in New Issue
Block a user