Implements feature request: https://community.gladysassistant.com/t/matter-integ…ration-lave-vaisselle/10227
### Description
A Matter dishwasher — a real one, or a bridge such as the Home Connect Matterbridge plugin discussed on the forum — was only partly usable in Gladys today: the `OperationalState` and `DishwasherAlarm` clusters were simply ignored during discovery, and the door contact ended up as an anonymous read-only switch feature. The forum topic asks for the "General Status", "Program in progress" and "Door Open" values to become real Gladys features.
This PR was produced by an automated run.
**What is in scope**
- A new `dishwasher` device feature category, with `state` (the operational state of the appliance) and the six faults of the Matter Dishwasher Alarm cluster (`inflow-error`, `drain-error`, `door-error`, `temperature-too-low`, `temperature-too-high`, `water-level-error`), each as its own binary feature so a scene can trigger on a single fault.
- A `DISHWASHER_STATE` enum aligned one to one with the Matter `OperationalStateEnum` (Stopped / Running / Paused / Error). A manufacturer-specific state (Matter reserves 0x80-0xBF) is published raw and displayed as unknown. "Program in progress" is `state = Running`.
- Dishwasher endpoint detection: an endpoint is treated as a dishwasher when it declares the Matter Dishwasher device type (0x0075), **or** when it exposes a dishwasher-specific cluster (`DishwasherAlarm` / `DishwasherMode`) — bridges frequently declare a generic device type, which is exactly the Home Connect case. `OperationalState` is a cluster shared by every Matter appliance, so it is only mapped for those endpoints: a laundry washer or an oven keeps behaving exactly as it does today.
- Only the alarms the appliance declares in the cluster's `Supported` bitmap get a feature, so no feature stays stuck at zero forever. When the bitmap cannot be read, all six are exposed.
- On a dishwasher endpoint, the `BooleanState` cluster is now mapped to an **opening-sensor** door feature instead of a read-only switch. The `external_id` and the published values are unchanged (`true` = contact closed = `OPENING_SENSOR_STATE.CLOSE`), only the category and the feature name are refined — no state history is lost.
- Full plumbing: discovery (`convertToGladysDevice`), subscriptions (`listenToStateChange`), initial state read (`readInitialDeviceStates`), front icons, dashboard rendering of the state and of the alarms, MQTT catalog defaults, and en/fr/de translations.
**What is deliberately out of scope** (can follow in later PRs, none of it is required to make a dishwasher useful today)
- `DishwasherMode` (selecting or reading the wash program) — it needs a program taxonomy and `supported_options` work of its own.
- The `OperationalState` Start / Stop / Pause / Resume commands: the category is read-only for now, powering the appliance still goes through the existing `OnOff` switch feature.
- `countdownTime` (remaining time), `currentPhase`/`phaseList`, and `TemperatureControl`.
- The other Matter appliance device types that share `OperationalState` (laundry washer, laundry dryer, oven, refrigerator). The detection helper is written so they can be added without touching the dishwasher path.
**`docs/specs/device-feature-categories.md` checklist**
- No brand or vendor name in the category or type names; the category describes a dishwashing appliance, whatever the protocol.
- No existing category could hold the operational state of an appliance without distorting its meaning. Conversely, the door contact reuses the existing `opening-sensor` category rather than getting a dishwasher-specific type, and the appliance's on/off, water temperature and consumption stay on `switch`, `temperature-sensor` and `energy-sensor` — the category holds only the metrics intrinsic to running a dish program.
- Semantics follow the Matter model by default: `DISHWASHER_STATE` reuses the `OperationalStateEnum` values as-is, and the fault types are the six alarms of the Dishwasher Alarm cluster, one atomic value each.
- Per-device support is not expressed in the taxonomy: the appliance's `Supported` alarm bitmap decides which features exist.
- Naming is kebab-case, English, protocol-free; the new constants carry an inline scope comment stating their boundary with neighbouring categories and their value conventions.
- Translations added to `en.json`, `fr.json` and `de.json`, including the `deviceFeatureValue` labels of the state enum. The category has no unit, so `DEVICE_FEATURE_UNITS_BY_CATEGORY` is untouched. History grouping falls into the "other" group, like `vacuum-cleaner`.
- The spec's own contracts are unchanged by this PR, so the spec file itself needs no edit.
## Forum
Forum: https://community.gladysassistant.com/t/matter-integration-lave-vaisselle/10227
### Checklist
- [x] Tests pass: `cd server && npm run coverage` (Codecov requires 100% coverage on changed lines) and Cypress (`npm run cypress:run`) if the UI changed
- [x] Linter and prettier pass on both front and server (`npm run eslint`, `npm run prettier`)
- [x] No undocumented breaking change
Tests added: a new `dishwasherMatterMapping` unit suite, plus dishwasher cases in `convertToGladysDevice`, `listenToStateChange` and `readInitialDeviceStates` covering every added line and branch (device-type detection, bridge detection, non-dishwasher appliances left untouched, supported/unsupported alarm bitmaps, unreadable attributes).
---
_Generated by [Claude Code](https://claude.ai/code/session_01REGRUvErzpwtSrsi9gKh4J)_
## Summary by CodeRabbit
* **New Features**
* Added support for Matter-connected dishwashers.
* Displays stopped, running, paused, and error states.
* Reports water-inflow, drain, door, temperature, and water-level alarms.
* Maps dishwasher door status to a dedicated sensor.
* Added dishwasher icons and localized labels in English, French, and German.
* **Bug Fixes**
* Unknown or unavailable states now display clear fallback messages.
* **Tests**
* Expanded coverage for dishwasher detection, states, alarms, and error handling.