From 0ebbde49da110509bdb9f56cbc43ce3cb9607580 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Sun, 28 Jun 2026 12:49:57 +0200 Subject: [PATCH] =?UTF-8?q?chore(docs):=20range=20specs/contrats/refs=20da?= =?UTF-8?q?ns=20docs/,=20track=20l'autorit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - specs -> docs/ (DASHBOARD_SPEC compagnon du contrat) - ref introspection nymea-jsonRPC -> docs/reference/ - mockups HTML -> docs/mockups/ ; briefs consommés -> docs/archive/ - track AGENTS.md + INTERFACE_etmvariableload.md (étaient untracked) - INTERFACE_*: marqué miroir, canonique = repo plugin --- AGENTS.md | 32 + INTERFACE_etmvariableload.md | 171 + docs/DASHBOARD_SPEC.md | 252 + docs/archive/BRIEF_agent_app.md | 68 + docs/archive/BRIEF_agent_app_connexion.md | 80 + docs/mockups/config_ecs_mockup.html | 249 + docs/mockups/etm-powersync-dashboard-v4.html | 239 + .../mockups/etm-powersync-flux-drilldown.html | 182 + docs/mockups/installations_mockup.html | 232 + docs/mockups/roles_appareils_mockup.html | 400 ++ docs/reference/jsonRPC.txt | 4228 +++++++++++++++++ 11 files changed, 6133 insertions(+) create mode 100644 AGENTS.md create mode 100644 INTERFACE_etmvariableload.md create mode 100644 docs/DASHBOARD_SPEC.md create mode 100644 docs/archive/BRIEF_agent_app.md create mode 100644 docs/archive/BRIEF_agent_app_connexion.md create mode 100644 docs/mockups/config_ecs_mockup.html create mode 100644 docs/mockups/etm-powersync-dashboard-v4.html create mode 100644 docs/mockups/etm-powersync-flux-drilldown.html create mode 100644 docs/mockups/installations_mockup.html create mode 100644 docs/mockups/roles_appareils_mockup.html create mode 100644 docs/reference/jsonRPC.txt diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..6b8b472 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,32 @@ +# AGENTS.md — etm-powersync-app +Application mobile Flutter ETM : lecture live + écrans add & config. +- **Licence** : à confirmer · **Miroir public** : selon licence +- **Agent** : app · **Branche** : feature/beta-add-config · **Scope** : écrans add & config + +## Invariants locaux +1. Lecture live + transport JSON-RPC DÉJÀ faits — ne pas y toucher. +2. Câbler sur l'API publiée (namespace `NymeaEnergy` actuel ; cible `Ems`). +3. Mode Optimiser / Manuel. Héos GRISÉ par défaut (capabilities `community/false/false`). + Objet capabilities à 4 champs : tier / optimizerExpected / optimizerAlive / activeStrategy. +4. Pas de libellé « Héos » dans la config GPL. Pas d'écran tier Auto/Predict en beta. +5. Distribution TestFlight (iOS) + APK/Play internal (Android) — pas de review store sur le chemin critique. + +## Déploiement live-demo + +Sur instruction explicite uniquement (`"déploie la demo"` / `"mets à jour app.etm-powersync.fr"`). +Ne pas déployer automatiquement, même après un build réussi. + +```bash +flutter build web --release +rsync -avz --delete build/web/ etm@192.168.1.241:/var/www/html/app.etm-powersync.fr/ +``` + +**Prérequis** : build `--release` sans erreur. +**Serveur** : DMZ Apache · `192.168.1.241` · user `etm` +**URL** : https://app.etm-powersync.fr +**Routing** : `FallbackResource /index.html` (go_router côté client) + +## Références +- `CLAUDE.md` existant, `TODO.md`. + +Carte globale et frontières : voir `../AGENTS.md`. diff --git a/INTERFACE_etmvariableload.md b/INTERFACE_etmvariableload.md new file mode 100644 index 0000000..08d5c6b --- /dev/null +++ b/INTERFACE_etmvariableload.md @@ -0,0 +1,171 @@ + + +# INTERFACE `etmvariableload` — contrat charge pilotée · **rév. 2** + +> **Source de vérité unique.** Déposé **à l'identique dans les deux repos** +> (`etm-powersync-app` et `etm-powersync-energy-plugin-etm`). Toute divergence se tranche **ici**, +> pas dans le code. Un agent qui a besoin d'un champ absent met à jour ce doc **d'abord**, dans +> les deux repos. +> +> **rév. 2 — corrige la rév. 1 sur un point structurant :** `etmvariableload` ne couvre **que les +> charges à puissance pilotable** (EV, ECS résistif, routeur PV). **La PAC SG-Ready en est exclue** : +> elle reste un modèle **à états**, interface séparée et conservée (voir §8). `LoadAction` garde +> donc **deux** kinds (`Setpoint` ET l'état SG-Ready), pas un seul. + +--- + +## 1. Principe & frontière + +Trois niveaux, trois responsables. **Aucune notion de matériel ne remonte au-dessus du thing.** + +| Niveau | Où | Quoi | +|---|---|---| +| **Câblage** | thing / plugin device (wizard Things) | GPIO, registres Modbus, quelle résistance sur quelle phase | +| **Déclaration** | config charge pilotée (app) | mode, paliers atteignables **en W**, priorité, besoins | +| **Runtime** | interface `etmvariableload` | setpoint W envoyé ↔ puissance réelle remontée | + +> **Invariant directeur.** L'energymanager raisonne **uniquement en watts**. Aucune résistance, +> aucun relais, aucun index de palier matériel ne franchit l'app ni n'atteint l'arbitre. +> **Le thing décide du matériel ; l'energymanager décide de la puissance.** + +--- + +## 2. Portée de `etmvariableload` + +**EST une `etmvariableload`** (charge à puissance pilotable) : +- **EV charger** (setpoint courant/puissance), +- **ECS résistif** — classique (on/off) ou multipalier, +- **Routeur PV / triac** (modulation continue). + +**N'EST PAS une `etmvariableload`** : +- **PAC SG-Ready** → modèle à **états** (2 bits, hystérésis, `minStateHold`). Interface distincte, + conservée telle quelle. Voir §8. Un signal SG-Ready est une *suggestion d'état* à la PAC, pas + une consigne de puissance en watts — le forcer en setpoint W serait faux. + +--- + +## 3. Interface device `etmvariableload` + +Implémentée par le thing (ECS / EV / routeur). **Côté moteur, seul l'`EtmVariableLoadAdapter` +consommateur est livré** ; la déclaration de l'interface nymea + le driver (résistances/triac/ +anti-rebond/phases) sont une **session device dédiée, hors repo moteur**. + +| State | Accès | Type | Unité | Sémantique | +|---|---|---|---|---| +| `maxPowerW` | read | uint | W | Plafond physique de la charge. | +| `powerLevels` | read | list<uint> | W | Paliers atteignables, triés croissants, **`0` inclus**. Présent en *fixed*. Vide/absent ⇒ modulation continue. | +| `powerSetpoint` | **write** | uint | W | Consigne demandée par l'energymanager. | +| `currentPowerW` | read | uint | W | Puissance **réellement** appliquée. Ferme la boucle de quantification. | + +**Le thing, en recevant un `powerSetpoint` :** choisit la combinaison matérielle concrète, +applique ses **verrous anti-rebond** (minOn/minOff) et son **équilibrage de phases**, puis publie +`currentPowerW`. L'energymanager n'a aucune visibilité là-dessus — c'est voulu. + +--- + +## 4. `LoadDescriptor` — config app → energymanager + +Émis par l'écran « Configurer charge pilotée » (sous-ensemble de `OPTIMIZER_PROTOCOL.md §5`, +noms identiques) : + +```jsonc +{ + "id": "uuid-thing-ecs", + "label": "Chauffe-eau", + "adapter": "etmvariableload", + "mode": "fixed", // "fixed" | "dynamic" + "powerLevels": [0, 600, 1200, 1800, 2400], // REQUIS si fixed — absent si dynamic + "maxPowerW": 3000, // REQUIS si dynamic ; plafond aussi en fixed + "priority": 2, // rang ; 1 = servi en premier + "enabled": true, + "needs": { "dailyDeadline": "06:00", "minEnergyWhPerDay": 4000 } +} +``` + +- `powerLevels` saisi par l'installateur — directement ou via l'**assistant résistances** (UI-only : + additionne les unités, pré-remplit, puis disparaît ; **aucune résistance n'est stockée ni envoyée**). +- Config **persistée côté plugin** (`/var/lib/nymea/energy-load-configuration.json`), jamais en + SharedPreferences. App = éditeur : `NymeaEnergy.GetLoadConfig` / `SetLoadConfig`. + +--- + +## 5. Règle d'arrondi (energymanager) + +À chaque cycle, pour une charge dont c'est le tour dans la priorité : + +- **Fixed** : `level = max( l ∈ powerLevels | l ≤ budget )` puis `setPowerSetpoint(level)`. + L'arbitre connaît la **granularité déclarée** → pas de sur-allocation, **zéro cycle de retard**. +- **Dynamic** : `setPowerSetpoint( clamp(budget, 0, maxPowerW) )`. +- **Résidu** : lire le `currentPowerW` **de début de cycle** (télémétrie de l'adapter, comme la + Correction B — **PAS** une relecture post-setpoint : invariant 8, aucune boucle de feedback). + Le résidu `budget − currentPowerW` repart vers la charge suivante de la priorité **du même cycle**. + +**Déclaré vs réel :** la **déclaration** (`powerLevels`/`maxPowerW`) est la référence de +**planification**. `currentPowerW` est le **juge de paix runtime**. Si le réel plafonne durablement +sous le déclaré → erreur de déclaration, l'installateur corrige. L'energymanager **n'écrase jamais** +la déclaration. + +--- + +## 6. `LoadAction` — **deux** kinds + +| Kind | Pour | Porte | +|---|---|---| +| `Setpoint` | EV / ECS / routeur (`etmvariableload`) | `powerW` | +| *état SG-Ready* | PAC (interface à états, §8) | `state` (1–4) | +| `Constraint` | batterie (déféré 3f) | conservé | + +- **Supprimer `Stage`** (ECS → `Setpoint`). Retirer `stage/minStage/maxStage` de + `LoadContextTelemetry` (le verrou ECS redescend dans le thing). +- **Conserver le kind d'état SG-Ready** et `state/minState/maxState` pour la PAC — son + `minStateHold` (protection court-cycling compresseur) reste dans son chemin, **inchangé**. +- `reason` reste porté par chaque `LoadAction` (déjà le cas). + +--- + +## 7. Expo du `reason` — tableau additif `loadActions[]` + +Sérialiser dans `GetChargingSchedules` / `ChargingSchedulesChanged` un **champ additif** +(rétro-compatible, ne touche pas la structure EV `ChargingAction`) : + +```jsonc +"loadActions": [ + { "loadId": "uuid-ecs", "setpointW": 1200, "currentPowerW": 1180, "reason": "Surplus PV 1.3 kW — ECS rang 2" }, + { "loadId": "uuid-pac", "state": 3, "reason": "Surplus PV — PAC en état 3" } +] +``` + +- Couvre **toutes** les charges, y compris la PAC. `setpointW`/`currentPowerW` **optionnels** + (absents pour une charge à états) ; `loadId` + `reason` **toujours** présents. +- Nécessite que l'arbitre **retienne le dernier plan** (aujourd'hui loggé puis jeté, + `energyarbitrator.cpp:140-153`) — petite addition d'état. +- C'est le canal que consomme la **decision card** de l'app : « pour chaque charge, le pourquoi ». + +--- + +## 8. PAC SG-Ready — modèle à états (conservé) + +Hors `etmvariableload`. Le `SgReadyAdapter` existant (états 1–4, combos K1/K2, hystérésis, +`minStateHold`) **n'est pas réécrit**. L'arbitre lui envoie un **état** (kind §6), pas un setpoint W. +Repli L2 : état 2 (normal, mains off), jamais état 1 (blocage) — comportement actuel conservé. + +> Une PAC pilotée par Modbus qui exposerait une vraie puissance pilotable pourra, *plus tard*, +> implémenter `etmvariableload`. Tant qu'on pilote par signal SG-Ready, c'est un modèle à états. + +--- + +## 9. Sécurité (déjà en place) + +- **Watchdog L2** (`evaluateMeterFreshness`, 90 s, `applyDegradedMode`) existant. En dégradé, + repli charge pilotée = **`setPowerSetpoint(0)` `force=true`** (remplace l'ECS stage-0 actuel) ; + PAC → état 2. Conserver l'ordre `update()` (sécurité avant planif) intact. +- `enabled:false` → rôle déclaré mais **exclu** de l'arbitrage (aucune action envoyée). + +--- + +## 10. Dépendances liées (à coder en même temps, côté plugin) + +- Handler `nymeaenergyjsonhandler` : `Get/SetLoadConfig` + persistance. +- `loadActions[]` dans `GetChargingSchedules` / `ChargingSchedulesChanged`. +- Câbler l'arbitre pour construire ses adapters depuis `LoadConfig` au lieu du registre en dur + (`energypluginnymea.cpp:58-80` — le « 3g »). diff --git a/docs/DASHBOARD_SPEC.md b/docs/DASHBOARD_SPEC.md new file mode 100644 index 0000000..ee4520a --- /dev/null +++ b/docs/DASHBOARD_SPEC.md @@ -0,0 +1,252 @@ +# Dashboard ETM-PowerSync — Brief d'implémentation Flutter + +> Spec pour Claude Code. Objectif : recréer l'écran **Dashboard** de l'app `app.etm-powersync.fr` (Flutter), tel que validé en maquette. Les fichiers HTML de référence (`etm-powersync-dashboard-v4.html`, `etm-powersync-flux-drilldown.html`) sont la **source de vérité visuelle** — ce document en est la transcription technique. + +--- + +## 1. Contexte + +ETM-PowerSync est un HEMS (Home Energy Management System). Le cœur intelligent s'appelle **Héos** (optimiseur prédictif MILP, horizon 24–48 h). Le Dashboard doit faire deux choses : montrer l'état énergétique **en direct**, et rendre **lisible et explicable** ce que Héos décide — c'est le différenciateur produit. Public : clients résidentiels (langage clair, zéro jargon) + installateurs. + +--- + +## 2. Principes directeurs (ne pas dévier) + +1. **Chaque information à un seul endroit.** Pas de doublon entre les blocs. L'autoconsommation est en KPI (haut) → elle n'apparaît nulle part ailleurs sur le Dashboard. +2. **Lisibilité avant densité.** Lecture rapide en haut, détail optionnel en bas. Le client pressé s'arrête à la décision Héos ; le curieux scrolle. +3. **Expliquer = créer la confiance.** Toute action automatique de Héos est accompagnée d'un *pourquoi* en langage courant. +4. **Cohérence des flux = physique réelle.** Héos est au centre. Le solaire et le réseau alimentent (→ vers le centre) ; le centre répartit vers batterie et maison. Jamais « maison → batterie ». +5. **Passé plein, futur voilé.** Sur tout graphe temporel : réalisé en couleur pleine, prévu en hachuré + fond grisé, ligne « maintenant » qui traverse. +6. **Fluide = rien ne saute.** Chaque valeur live s'anime (interpolation), jamais de flash. +7. **Quality floor non négociable.** Responsive, dark mode, focus clavier, `prefers-reduced-motion` respecté, contraste AA. + +--- + +## 3. Design tokens (`etm_tokens.dart`) + +Compléter le fichier existant avec ces valeurs. Typo : **IBM Plex Sans** (UI) + **IBM Plex Mono** (toutes les valeurs chiffrées / données). + +### Couleurs de marque (identiques light/dark sauf note) +| Token | Hex | Usage | +|---|---|---| +| `brand` | `#31A3DD` | bleu ETM, accents, navigation active | +| `solar` | `#FEC113` (dark `#FFCB33`) | production solaire | +| `eco` | `#28A06A` (dark `#33B87A`) | Héos, éco, autonomie, batterie | +| `heat` | `#EF8B2A` | chauffage / PAC | +| `water` | `#31A3DD` | eau chaude (ECS) | +| `grid` | `#8A98A3` | réseau | +| `import` | `#E8806F` | import réseau | + +### Thème clair +| Token | Valeur | +|---|---| +| `bg` | `#EEF2F5` | +| `bg2` | `#E4EAEE` | +| `surface` | `#FFFFFF` | +| `ink` | `#0D2B3B` | +| `muted` | `#5D6F7B` | +| `faint` | `#8B9AA4` | +| `line` | `rgba(13,43,59,.10)` | +| `lineStrong` | `rgba(13,43,59,.16)` | + +### Thème sombre +| Token | Valeur | +|---|---| +| `bg` | `#06141D` | +| `bg2` | `#0A1F2B` | +| `surface` | `#0D2B3B` (la couleur de marque devient la surface) | +| `ink` | `#EAF3F7` | +| `muted` | `#9BB0BC` | +| `faint` | `#6C8493` | +| `line` | `rgba(255,255,255,.09)` | +| `lineStrong` | `rgba(255,255,255,.16)` | + +### Couleurs des flux (graphe « plan de la journée ») +`solToHouse #B8C34D` · `solToEcs #31A3DD` · `solToVe #28A06A` · `solToBatt #7FCF72` · `solToGrid #FEC113` · `battToHouse #2F6FB0` · `gridToHouse #E8806F` + +### Formes & profondeur +- Rayons : cartes **20**, contrôles internes **13–14**, pills/badges **30** (stadium). +- **Parti pris assumé** : bordure hairline 1 px (`line`) + rayon large. Ombres quasi nulles en clair (`0 1px 2px rgba(13,43,59,.04)`), aucune en sombre. **Ne pas** revenir aux cartes blanches à ombre portée Material par défaut. +- Espacement entre cartes : 14. Padding interne carte : 14–16. + +--- + +## 4. Architecture de l'écran + +`DashboardScreen` = `Scaffold` + `SingleChildScrollView` (colonne), bottom nav fixe à 5 onglets. Ordre vertical des blocs : + +``` +[ TopBar : wordmark + toggle thème clair/sombre ] +[ 1. EnergyFlowCard ] ← flux en croix, temps réel, drill-down +[ 2. KpiRow ] ← 4 tuiles : autoconso, autonomie, vers/depuis réseau +[ 3. HeosDecisionCard ] ← décision en cours + pourquoi +[ 4. DayPlanCard ] ← météo + barres horaires (réalisé/prévu) +[ BottomNav : Dashboard·Énergie·Things·A/C·Favoris ] +``` + +Onglets : `Dashboard` actif (couleur `brand`), les autres en `faint`. + +--- + +## 5. Composants + +### 5.1 EnergyFlowCard — flux en croix + drill-down + +**Layout** : carte carrée (aspect 1:1, max 320). `Stack` : +- Couche basse : `CustomPaint` (lignes hairline entre hub↔nœuds + **particules animées**). +- Couche haute : nœuds en `Positioned` (Stack), `GestureDetector` sur les nœuds tappables. + +**Vue d'ensemble (`overview`)** — positions cardinales : +| Position | Nœud | Valeur (ex.) | Direction flux | Tap | +|---|---|---|---|---| +| centre (hub) | **Héos** (icône HEMS, anneau eco pulsant) | — | — | — | +| haut | Solaire | `3.8 kW` | entrant (nœud→hub) | → `prod` | +| droite | Batterie | `87 %` | sortant (hub→nœud) | — | +| gauche | Réseau | `0.2 kW` | entrant | — | +| bas | Maison | `2.4 kW` | sortant | → `conso` | + +**Drill-down `conso`** (depuis Maison) — hub = Maison, autour : +PAC (haut, `heat`), Eau chaude (droite, `water`), Voiture (bas, `eco`), **Autres (estimé)** (gauche, bordure **dashed**, `grid`). +> Le nœud « Autres (estimé) » est **obligatoire** : il absorbe le non-mesuré pour que le bilan boucle (conso totale = somme des postes). Sans lui, l'addition ne tombe pas juste et le client se méfie. + +**Drill-down `prod`** (depuis Solaire) — hub = Solaire, autour : +Onduleur 1 (haut), Onduleur 2 (bas), chacun avec **point d'état** (vert OK / orange défaut). Sens : onduleur → hub. + +**Particules** : `CustomPainter` + `AnimationController` en boucle. N points par segment circulant de la source vers la destination. **Vitesse et densité ∝ puissance** (flux fort = plus de points, plus rapides ; flux faible = 1 point lent). Couleur = couleur de la source. + +**Transitions drill-down** : sortie = fade + scale 0.8 (~170 ms) ; entrée = « éclatement radial », chaque nœud apparaît en `scale .25→1` avec overshoot (`Curves.easeOutBack`) et **stagger** (~60 ms entre nœuds). Détail intégral du sens/positions dans `etm-powersync-flux-drilldown.html`. + +**Affordance tap** : badge `+` discret sur les nœuds tappables (Héos n'est pas tappable ; Solaire et Maison le sont). Profondeur **max 2 niveaux** — au-delà, écran dédié. + +**Icône HEMS** : utiliser `HemsIcon` (déjà livré, `hems_icon.dart`), couleur `eco`. + +### 5.2 KpiRow + +Grille 2×2. +- **Tuile autoconsommation** : anneau de progression (`CustomPaint`, couleur `solar`) + `%` en mono. S'anime au chargement (anneau qui se remplit + count-up). +- **Tuile autonomie** : idem, couleur `eco`. +- **Tuile « Vers réseau »** : icône flèche ←, valeur `kWh` du jour, badge fond `eco` léger. +- **Tuile « Depuis réseau »** : icône flèche →, valeur `kWh`, badge fond `import` léger. + +> Ces deux métriques (autoconso/autonomie) sont les seules occurrences sur le Dashboard. Ne pas les répéter ailleurs. + +### 5.3 HeosDecisionCard + +Carte bordée `eco` (liseré subtil). Contenu : +- **En-tête** : icône étincelle (mark Héos) + titre « Héos pilote en ce moment » + sous-titre mono « optimise sur 24 h · maj HH:MM » + point eco pulsant. +- **Résumé** : 1 phrase en langage client, segment clé surligné `eco` (ex. « Le surplus part dans l'eau chaude et la voiture plutôt que d'être revendu à bas prix »). +- **Liste d'actions** (1 par asset piloté) : icône + titre court + **le pourquoi** (1 ligne, `muted`) + puissance (`kW`, mono, `eco`), séparées par hairline. +- **Pied** : lien « Voir le plan de la journée » → ouvre l'écran plein **Plan de la journée** (séparé, voir `etm-powersync-plan-journee.html` ; c'est là que vivent les pistes appareils détaillées + la ligne gains €). + +### 5.4 DayPlanCard — météo + barres horaires + +`CustomPaint` unique (préférer à fl_chart : contrôle fin du voile futur + bande météo intégrée). **Une seule colonne temporelle, axe horaire partagé**, de haut en bas : +1. **Bande météo** : icône (soleil / soleil-nuage / lune) + température, à intervalles (~toutes les 4 h), posée sur l'axe. +2. **Barres empilées horaires** (kWh) : segments positifs vers le haut (`solToHouse`, `solToEcs`, `solToVe`, `solToBatt`, `solToGrid`), négatifs vers le bas (`battToHouse`, `gridToHouse`). Axe Y `0/2/4`. +3. **Axe X** : `0h 6h 12h 18h 24h`. + +**Traitement passé/futur** : tout ce qui est à droite de la ligne « maintenant » = **fond grisé + voile hachuré** (lignes diagonales couleur surface, opacité ~.5) ; ligne « maintenant » verticale + tab `HH:MM`. + +**Légende** sous le graphe : pastilles maison/eau/voiture/batterie/réseau/batt.→maison. + +> **NE PAS mettre sur le Dashboard** (retirés volontairement, ils vivent dans l'écran plein « Plan de la journée ») : +> - les **pistes appareils** (timelines ECS / batterie charge-décharge / VE) ; +> - la **ligne gains** (autoconso prévue / réseau ce soir / +€). + +### 5.5 Toggle thème + +Switch clair/sombre dans la TopBar, knob animé (overshoot). Persister le choix (provider de thème). + +--- + +## 6. Animations & widgets + +| Effet | Approche Flutter | +|---|---| +| Valeurs live (kW, %) | `TweenAnimationBuilder` (count-up, easeOutCubic ~900 ms) | +| Particules de flux | `CustomPainter` + `AnimationController` répété ; position = `(t + offset) % 1` mappée sur le segment | +| Anneaux KPI | `CustomPaint`, `Tween` sur l'angle balayé | +| Toggles / switch | `AnimatedAlign` ou `AnimatedPositioned`, courbe overshoot (`Curves.easeOutBack`) | +| Segmented (pill qui glisse) | `Stack` + `AnimatedPositioned` du « glider » | +| Cartes expandables (A/C) | `AnimatedSize` | +| Drill-down croix | `AnimationController` + `Interval` staggered (scale + opacity) | +| Anneau Héos (hub) | pulsation lente en boucle (opacité 0.25↔0.6) | + +**Reduced motion** : si `MediaQuery.of(context).disableAnimations`, court-circuiter les animations (valeurs finales directes, pas de particules en boucle). + +--- + +## 7. Modèles de données (esquisse) + +```dart +class LiveFlow { // alimente EnergyFlowCard (overview) + final double solarKw, gridKw, houseKw, batteryKw; // batteryKw signé + final int batteryPct; +} + +class FlowNode { // générique, réutilisé à chaque niveau + final String label, valueText, iconKey; + final FlowDirection direction; // inbound | outbound + final bool tappable, estimated; // estimated → bordure dashed + final NodeState? state; // ok | warn (onduleurs) + final String? drillTo; // 'conso' | 'prod' +} + +class HeosDecision { + final String summary; // langage client + final List actions; + final DateTime updatedAt; +} +class HeosAction { final String assetIconKey, title, why; final double powerKw; } + +class Kpi { final int autoconsumptionPct, autonomyPct; final double toGridKwh, fromGridKwh; } + +class DayPlan { + final List hours; // 0..23 + final List weather; + final double nowHour; // ex. 14.5 +} +class HourlyFlow { // tous en kWh, signés selon sens + final int hour; + final double solToHouse, solToEcs, solToVe, solToBatt, solToGrid; + final double battToHouse, gridToHouse; +} +class WeatherPoint { final int hour; final WeatherKind kind; final int tempC; } +``` + +Toutes les valeurs affichées proviennent de ces modèles (les chiffres des maquettes sont des exemples). Prévoir des états **loading** (skeleton) et **vide** (« en attente de données du compteur… », jamais d'écran blanc). + +--- + +## 8. Assets fournis +- `hems_icon.dart` — `HemsIcon(size, color)`, `CustomPainter` natif sans dépendance. À utiliser pour le hub central. +- `hems_icon.svg` — équivalent SVG (`currentColor`) si passage par `flutter_svg`. + +--- + +## 9. Arborescence suggérée + +``` +lib/features/dashboard/ + dashboard_screen.dart + widgets/energy_flow_card.dart + painters/flow_painter.dart + widgets/kpi_row.dart + painters/ring_painter.dart + widgets/heos_decision_card.dart + widgets/day_plan_card.dart + painters/day_plan_painter.dart + models/dashboard_models.dart +lib/shared/widgets/hems_icon.dart +lib/theme/etm_tokens.dart (compléter) +``` + +## 10. Ordre de construction recommandé +1. Compléter `etm_tokens.dart` (couleurs light/dark, typo, radius). +2. `KpiRow` + `RingPainter` (le plus simple, valide les tokens). +3. `HeosDecisionCard` (statique, valide la typo/hairlines). +4. `EnergyFlowCard` overview + `FlowPainter` (lignes + particules), **puis** drill-down. +5. `DayPlanCard` + `DayPlanPainter` (barres + voile futur + bande météo). +6. Assemblage `DashboardScreen` + bottom nav + toggle thème. +7. Passe quality floor : reduced motion, focus, contraste AA en clair **et** sombre. + +--- + +*Réfs visuelles : `etm-powersync-dashboard-v4.html` (écran complet) et `etm-powersync-flux-drilldown.html` (interaction croix). En cas de doute sur un espacement ou une couleur, ces fichiers font foi.* diff --git a/docs/archive/BRIEF_agent_app.md b/docs/archive/BRIEF_agent_app.md new file mode 100644 index 0000000..972286d --- /dev/null +++ b/docs/archive/BRIEF_agent_app.md @@ -0,0 +1,68 @@ +# BRIEF — Agent App (`etm-powersync-app`) + +Écran **Rôles & appareils** + écran **Configurer une charge pilotée**. + +## Fichiers de référence (joints) + +1. **`INTERFACE_etmvariableload.md`** — le **contrat**. Source de vérité. +2. **`roles_appareils_mockup.html`** — écran 1 : liste, deux zones, drag-priorité, tri-état. +3. **`config_ecs_mockup.html`** — écran 2 : config Dynamique/Fixe + assistant résistances. + +> **Règle d'or : le contrat (`.md`) PRIME sur les maquettes.** Les `.html` sont l'intention +> visuelle (look, structure, interactions). En cas de conflit entre une maquette et le `.md`, +> **le `.md` gagne.** Ne reproduis pas un pixel au détriment d'une décision du contrat. + +## ⚠️ La maquette écran 1 est partiellement périmée + +Elle a été produite avant plusieurs décisions. **Ne la suis pas aveuglément** sur ces 3 points — +applique la version ci-dessous : + +1. **Paliers ≠ config matérielle.** L'écran 1 affiche les paliers comme une propriété « matériel » + de l'ECS. **Faux.** Ce sont une **déclaration** (`powerLevels`), éditée dans l'écran 2. Sur la + carte de liste, ne montre qu'un résumé (ex. « 5 paliers · max 2400 W »), pas un éditeur. +2. **Auto-détection solaire/batterie.** Les rôles **inférés** par interface (production solaire, + batterie) apparaissent **directement en zone définitive** avec un badge « détecté » — ils ne + passent **pas** par « À configurer ». La batterie garde sa carte (priorité + `needs`), mais + n'est jamais « à configurer » au sens bloquant. +3. **Compteur `X / 6`.** Comptage : inférés (solaire, batterie) = configurés d'office ; + pickés (réseau, EV, ECS, PAC) = comptés quand **assignés** *ou* actés **« Pas d'appareil »**. + « Complet » = aucun rôle en non-configuré bloquant. + +## Décisions verrouillées (ne pas re-débattre) + +- **Tri-état par rôle** : `present(thingId)` / `absent({status:"absent"})` / non-configuré + (clé absente). Jamais `thingId:null`. +- **Trois destinations** : Compteurs (réseau→rootMeter, solaire→détecté) · Charges pilotables + (EV/ECS/PAC/batterie, priorisables) · Absent. +- **Cycle de vie** : « À configurer » → assigné (remonte dans Compteurs *ou* Charges pilotables + selon le rôle) **ou** « Pas d'appareil » (acté absent). Trois états d'écran : vierge (tout à + configurer, zones du haut vides + invite) / en cours / complet. +- **Drag = priorité.** Réordonner les cartes de charges pilotables écrit `priority` (rang 1 = + servi en premier). Les cartes compteur ne sont **pas** draggables. L'ordre est **indicatif** + (le scheduler le bouscule sur Tempo rouge / deadline) — le signaler dans l'UI, pas le présenter + comme rigide. +- **Config charge pilotée** (écran 2) émet un `LoadDescriptor` au format du contrat §3 : + `mode` (dynamic|fixed), `powerLevels[]` **ou** `maxPowerW`, `priority`, `enabled`, `needs`. +- **Assistant résistances = UI-only.** Il additionne les unités et pré-remplit `powerLevels`, + puis disparaît. **Aucune résistance n'est stockée ni envoyée.** Ne calcule la combinatoire + **nulle part ailleurs**. + +## Plomberie / état du repo + +- Base de départ fournie : `energy_setup_provider.dart` (modèle tri-état + routage des sinks) + est une **intention**, à adapter aux signatures réelles du repo — pas à coller tel quel. +- **Persistance = côté plugin**, pas SharedPreferences. L'app appelle `NymeaEnergy.GetLoadConfig` + / `SetLoadConfig`. **Ces méthodes n'existent pas encore** → **stub** : logger le JSON du + `LoadDescriptor` qui partira, ne rien casser. Le câblage réel arrive quand l'agent energymanager + les expose. +- `gridMeter` → `Energy.SetRootMeter` (natif, testable contre `hems` maintenant). +- **Bug à corriger au passage** : `nymea_service.dart` appelle `EnergyPlugin.SetChargingInfo` → + doit être `NymeaEnergy.SetChargingInfo` ; et les champs `ChargingInfo` sont faux + (`mode`→`chargingMode`, `targetSoc`→`targetPercentage`, `endTime`→`endDateTime`, + `minCurrent` n'existe pas). Réf : introspect `jsonRpc.txt`. + +## Périmètre de CE brief + +Les écrans Rôles & appareils + Configurer charge pilotée **uniquement**. Pas le wizard Things +(autre lot), pas Système/Réseau/ModbusRTU (autre lot), pas la decision card. Lis `jsonRpc.txt` +(l'introspect) avant tout appel nymea — ne devine pas les signatures. diff --git a/docs/archive/BRIEF_agent_app_connexion.md b/docs/archive/BRIEF_agent_app_connexion.md new file mode 100644 index 0000000..598eca7 --- /dev/null +++ b/docs/archive/BRIEF_agent_app_connexion.md @@ -0,0 +1,80 @@ +# BRIEF — Agent App · lot **Connexions multi-HEMS** (`etm-powersync-app`) + +Gestionnaire d'installations : découverte mDNS, liste persistée, bascule, auth par box. + +> **À lancer APRÈS le lot Rôles & appareils, pas en parallèle.** Ce lot retouche +> `nymea_service.dart`, la persistance des tokens et le chargement au switch — les fichiers que +> le lot rôles vient de toucher. Deux agents dessus en même temps = collision. + +## Fichiers de référence (joints) + +1. **`installations_mockup.html`** — écrans Installations + Connexion (intention visuelle). +2. `jsonRpc.txt` — introspect (namespaces `Authentication.*`, mDNS, `System.GetServerUuid`/About). + +## Modèle (décisions verrouillées) + +- **Identité stable d'une installation = Server UUID**, jamais l'IP (DHCP → l'IP change). + Une installation enregistrée = `{ uuid (clé), nom, host, port, token, lastSeen }`. +- **Une seule connexion active à la fois.** `nymea_service` reste mono-connexion ; un + **`ConnectionManager`** au-dessus gère la liste + le switch (déconnecte l'active, connecte la + cible). **Pas** de N sockets parallèles. +- **Token par UUID.** La persistance actuelle stocke *un* token → passer à un token **par UUID** + (clé = uuid de la box). En basculant, réutiliser le token de la box cible. C'est le piège + mono→multi : ne pas réutiliser le token de la box précédente. +- **Découverte mDNS** (`_nymea._tcp`) **+ ajout manuel** (host/port) en repli. Au scan, matcher + par **UUID** : box connue → réutiliser son token ; nouvelle → proposer de l'ajouter. +- **Auth à deux branches**, détectées au handshake : box neuve (pas d'admin) → **créer** un + utilisateur (`Authentication.CreateUser`) ; box initialisée → **login** + (`Authentication.Authenticate`). Le segmenteur UI n'est qu'un repli ; la détection est auto. + +## Transport — attention + +- En LAN c'est **`ws://IP:4444`** (clair). Le code actuel ne fait **pas** de TLS (`Socket.connect` + nu, `ws://`). Ne pas coder un champ `wss://` qui ne marche pas encore — le TLS (port 2222 + `nymeas://`) est une dette séparée. Champ « port » par défaut **4444**. + +## Routage / gate + +- Condition du gate = **« pas de connexion active »** (≠ « liste vide »). + - Pas de connexion active au démarrage → **Installations en racine** (plein écran). + - Connexion active → **dashboard** ; Installations reste accessible. +- **Réentrée** : le **nom de la box active dans l'en-tête du drawer** (le « Site démo » déjà présent + sous le logo) devient **cliquable → ouvre Installations** pour basculer. Pas d'entrée de menu + dédiée à enfouir : l'en-tête du drawer EST l'accès. + +## Trois états de l'écran Installations + +1. **Vierge** (liste vide, 1ʳᵉ fois) → découverte mDNS + « Ajouter manuellement » au premier plan. +2. **Liste sans active** (box connues, aucune connectée) → liste en « hors-ligne », tap = reconnecter. +3. **Liste avec active** (ouvert depuis le drawer) → une box « actif », les autres pour basculer. + +Mêmes composants, trois configurations. + +## Niveaux d'accès (client vs installateur) + +- **Client / général** : lister + **basculer** entre installations. Pas de déverrouillage requis. +- **Installateur** (gated) : **ajout manuel**, **créer l'admin**, **supprimer** une installation. + Mêmes écran ; ces actions grisées/masquées hors mode installateur. + +## Bascule (switch) — invalidation + +- Switcher = déconnecter l'active → connecter la cible (token par UUID) → **ré-déclencher le + chargement** (rôles, things, powerbalance) pour la nouvelle box. +- **Vider les caches** des écrans (dashboard, rôles, things) au switch : aucune donnée de la box + précédente ne doit subsister. C'est le vrai risque d'intégration. +- Transition courte avec le **nom de la box cible** (« Connexion à Client Kutzenhausen… ») avant + d'atterrir sur le dashboard, pour que l'installateur soit sûr d'être sur la bonne installation. + +## Hors lot (séparé, plus tard) + +- **Wizard de commissioning d'une box neuve** (réseau filaire/wifi de nymea:core, façon nymea-app + écrans 2-3). C'est l'installation d'un système, distinct de « connecter l'app à un HEMS + existant ». Pas dans ce lot. + +## Avant de coder + +Explore le repo (`nymea_service.dart`, `etm_tokens.dart`, `nymea_user.dart`, le drawer, le routeur), +`flutter analyze`, et **propose un plan ordonné** (modèle installation + persistance par UUID → +`ConnectionManager` + switch → mDNS → écran Installations 3 états → auth 2 branches → gate/routage → +en-tête drawer cliquable) **avant** d'écrire. Lis `jsonRpc.txt` pour les signatures `Authentication.*`. +Ne devine pas. diff --git a/docs/mockups/config_ecs_mockup.html b/docs/mockups/config_ecs_mockup.html new file mode 100644 index 0000000..31df179 --- /dev/null +++ b/docs/mockups/config_ecs_mockup.html @@ -0,0 +1,249 @@ + + + + + +ETM PowerSync — Configurer charge pilotée (ECS) + + + + + + +
+

Configurer une charge pilotée — ECS

+

Mode Dynamique (consigne continue) ou Fixe (paliers). Le champ sauvé est toujours la liste de paliers en W — jamais les résistances. L'assistant n'est qu'un générateur de saisie côté UI : il additionne les résistances et pré-remplit les paliers, puis disparaît. L'energymanager ne reçoit que powerLevels: [0,600,1200,1800,2400] et envoie un setpoint W ; le thing ECS décide la combinaison.

+
+ +
+ + +
+
+

Configurer · Chauffe-eau

+
+ +
+ +
+
Relay-ECS
multipallier · 4 sorties
+
etmvariableload
+
+ +
+ +
+ + +
+
Fixe : l'energymanager arrondit le surplus au palier atteignable ≤ surplus, puis l'envoie. Le thing choisit quelles résistances composent ce palier.
+
+ +
+ +
+
0 W off
+
600 W×
+
1200 W×
+
1800 W×
+
2400 W×
+ +
+ + +
+

Assistant résistances

+

Entrez la puissance de chaque résistance. L'UI calcule les combinaisons et remplit les paliers ci-dessus. Rien de tout ça n'est transmis — seuls les paliers le sont.

+
+ +
+
4 résistances → paliers atteignables : 0 · 600 · 1200 · 1800 · 2400 W
+ +
+
+ +
+ +
Rang de servicedéfini au glisser-déposer
2
+
Inclure dans l'arbitrage
+
+ +
+ +
Eau chaude prête àdailyDeadline
06:00
+
Énergie min. / jourminEnergyWhPerDay
4 kWh
+
+ +
Tester
Enregistrer
+
+
+
Mode Fixe · paliers + assistant
+
+ + +
+
+

Configurer · Routeur solaire

+
+ +
+ +
+
Routeur PV
triac · modulation continue
+
etmvariableload
+
+ +
+ +
+ + +
+
Dynamique : l'energymanager envoie n'importe quelle valeur entre 0 et la puissance nominale. Pas de paliers.
+
+ +
+ +
Résistance ECSplafond de modulation
3000 W
+
+ +
+ +
Rang de servicedéfini au glisser-déposer
2
+
Inclure dans l'arbitrage
+
+ +
+ +
Eau chaude prête àdailyDeadline
06:00
+
Énergie min. / jourminEnergyWhPerDay
4 kWh
+
+ +
Tester
Enregistrer
+
+
+
Mode Dynamique · puissance max seule
+
+ +
+ +
+
+ Frontière. Aucune notion de résistance ne franchit l'app. En Fixe, le contrat est powerLevels:[…] ; en Dynamique, maxPowerW. Dans les deux cas, l'energymanager raisonne en W et le thing décide du matériel. +
+
+ + + + diff --git a/docs/mockups/etm-powersync-dashboard-v4.html b/docs/mockups/etm-powersync-dashboard-v4.html new file mode 100644 index 0000000..a7c5978 --- /dev/null +++ b/docs/mockups/etm-powersync-dashboard-v4.html @@ -0,0 +1,239 @@ + + + + + +ETM PowerSync — dashboard v4 + + + + + + +
+
+
ETM PowerSyncDashboard
+ +
+
+ + +
+

Flux énergétique

en direct
+
+ + + + + + + +
0.0 kW
Solaire
+
87 %
+0.4 kW
+
0.0 kW
Réseau
+
0.0 kW
Pilotés
+
0.0 kW
Maison
+
+
+ + +
+
0 %
Autoconsommation
+
0 %
Autonomie
+
6.2 kWh
Vers réseau · aujourd'hui
+
1.1 kWh
Depuis réseau · aujourd'hui
+
+ + +
+
Héos pilote en ce momentoptimise sur 24 h · maj 22:54
+
Le soleil couvre toute la maison. Le surplus part dans l'eau chaude et la voiture plutôt que d'être revendu à bas prix.
+
+
Eau chaude — chauffe maintenant1.2 kW
Le surplus baisse après 17 h. Mieux vaut monter le ballon à 60 °C tant que c'est gratuit.
+
Voiture — charge sur surplus0.9 kW
Énergie solaire gratuite. La charge s'ajuste seule si un nuage passe.
+
Batterie — se réserve pour ce soir+0.4 kW
Charge lente jusqu'à 87 %, pour alimenter la maison après 18 h sans toucher au réseau.
+
+
Voir le plan de la journée
+
+ + +
+
Plan de la journéemétéo · flux · appareils
+
+
+
maison
+
eau
+
voiture
+
batterie
+
réseau
+
batt.→maison
+
+
+ +
+ + +
+ + + + diff --git a/docs/mockups/etm-powersync-flux-drilldown.html b/docs/mockups/etm-powersync-flux-drilldown.html new file mode 100644 index 0000000..6c268b6 --- /dev/null +++ b/docs/mockups/etm-powersync-flux-drilldown.html @@ -0,0 +1,182 @@ + + + + + +ETM PowerSync — flux drill-down + + + + + + +
+
+
ETM PowerSyncFlux énergétique
+ +
+
+
+ +
+
Touchez Maison ou Solaire pour détailler
+
+
+
+ + + + diff --git a/docs/mockups/installations_mockup.html b/docs/mockups/installations_mockup.html new file mode 100644 index 0000000..268eede --- /dev/null +++ b/docs/mockups/installations_mockup.html @@ -0,0 +1,232 @@ + + + + + +ETM PowerSync — Installations (multi-HEMS) + + + + + + +
+

Installations — multi-HEMS

+

Identité stable = Server UUID (pas l'IP, qui change en DHCP). Découverte mDNS en haut, installations enregistrées en dessous (token stocké par UUID), ajout manuel en repli. Une seule connexion active à la fois ; basculer = reconnecter. À droite, l'auth à deux branches : créer l'admin si la box est neuve, se connecter sinon.

+
+ +
+ + +
+
+

Installations

+
+ +

Détectées sur le réseau

recherche…
+
+
📡
+
+
nymea
+
192.168.1.75 : 4444
+
+
+ Ajouter
+
+ +

Mes installations

+ +
+
+
+
Site démo actif
+
nymea://192.168.1.75 : 4444
+
3943203a-dc47-4d40-8a00-ff16cff1f46c
+
+
+ +
+
+
+
Client Kutzenhausen disponible
+
nymea://192.168.10.20 : 4444
+
a1b2c3d4-…-9f8e
+
+
+
+ +
+
+
+
Atelier ETM hors-ligne
+
nymea://192.168.1.40 : 4444
+
7c6b5a49-…-1d2e
+
+
+
+ + + ou continuer en mode démo + +
+
+
Liste · découverte · bascule
+
+ + +
+
+

Connexion

+
+ +
+
🔌
+
+
nymea
+
192.168.1.75 : 4444
+
3943203a-dc47-4d40-8a00-ff16cff1f46c
+
+
+ +
+ + +
+
Box neuve : aucun administrateur n'existe encore. Crée le compte qui pilotera cette installation.
+ + +
+
+
installateur@etm-schurig.eu
+
+
🔒••••••••
+
+
🔒••••••••
+ +
+ + +
+
+
installateur@etm-schurig.eu
+
+
🔒••••••••
+ +
+ +
Détection auto. L'app interroge la box au handshake : si un administrateur existe déjà, elle ouvre directement « Existante ». Le segmenteur ci-dessus n'est qu'un repli manuel. Le token obtenu est stocké sous l'UUID de cette box.
+ +
+
+
Auth · créer ou se connecter
+
+ +
+ + + + diff --git a/docs/mockups/roles_appareils_mockup.html b/docs/mockups/roles_appareils_mockup.html new file mode 100644 index 0000000..2cb950a --- /dev/null +++ b/docs/mockups/roles_appareils_mockup.html @@ -0,0 +1,400 @@ + + + + + +ETM PowerSync — Rôles & appareils · maquette + + + + + + +
+

Rôles & appareils — maquette de validation

+

Deux zones distinctes : les compteurs (mesure, jamais priorisés) et les charges pilotables (réordonnables par glisser-déposer → écrit LoadDescriptor.priority). Tri-état présent / absent / non configuré. À droite, l'éditeur qu'ouvre « Configurer » : les champs declared / limits / needs du protocole §5. Essayez de glisser les cartes de la 2ᵉ zone.

+
+ +
+ + +
+
+
+
+

Rôles & appareils

+
?
+
+
+ +
+
+
+ 3 / 6 rôles assignés + 1 détecté automatiquement · 1 reste à configurer +
+
+ + +

Compteurs

Mesure — hors priorité
+ +
+
+
+
+
Compteur réseau
+
GRID · Eastron SDM630
+
+
rootMeter
+
+
+ Souscrit 12 kVA + Limite 63 A/phase +
+
+ +
+
+
☀️
+
+
Production solaire
+
Fronius Primo GEN24 10.0
+
+
+
3.3 kW
+
auto · lecture seule
+
+
+
+ + +

Charges pilotables

Glissez pour l'ordre de service du surplus
+ +
+ +
+
1
+
+
+
🔋
+
+
Batterie
+
BYD HVS 10.2 · détecté
+
+
+
+
+ 10.2 kWh + réserve 10 % + charge 5 kW +
+
+
+ +
+
2
+
+
+
🌡️
+
+
Chauffe-eau
+
Relay3 · C3 — relay-stages
+
+
+
+
+ paliers 0 / 1200 / 2400 W +
+
+
+ +
+
3
+
+
+
🚗
+
+
EV Charger
+
Terra AC (TCP)
+
+
+
+
+ 6–32 A + + cible 80 % @ 18:00 +
+
+
+ +
+ + +

À configurer

+
+
+
♨️
+
+
Pompe à chaleur
+
Aucun appareil configuré
+
+
+
+
+ Configurer
+
Pas d'appareil
+
+
+ +
+ Ordre indicatif. Il fixe le service par défaut du surplus. Le pilote peut le bousculer automatiquement les jours Tempo rouge ou à l'approche d'une échéance de recharge. +
+ +
+
+
Écran 1 · liste + priorité
+
+ + +
+
+
+
+

Configurer · Chauffe-eau

+
+
+
+ +
+ +
+
+
Relay3
C3 · GPIO 5
+
relay-stages
+
+
+
+
Relay4
C4 · GPIO 6
+
+
+ +
+ +
+
0 W off
+
1200 W
+
2400 W
+ +
+
+ +
+ +
+
Rang de servicedéfini par glisser-déposer
+
2
+
+
+
Inclure dans l'arbitrage
+
+
+
+ +
+ +
+
Durée minimale ONminOnS
+
120 s
+
+
+
Durée minimale OFFminOffS
+
180 s
+
+
+ +
+ +
+
Échéance quotidiennedailyDeadline · eau chaude prête
+
06:00
+
+
+
Énergie min. / jourminEnergyWhPerDay
+
4 kWh
+
+
+ +
+
Tester
+
Enregistrer
+
+ +
+
+
Écran 2 · « Configurer » (declared / limits / needs)
+
+ +
+ + + + diff --git a/docs/reference/jsonRPC.txt b/docs/reference/jsonRPC.txt new file mode 100644 index 0000000..0772906 --- /dev/null +++ b/docs/reference/jsonRPC.txt @@ -0,0 +1,4228 @@ +{ + "id": 2, + "params": { + "enums": { + "AirConditioningError": [ + "AirConditioningErrorNoError", + "AirConditioningErrorZoneNotFound", + "AirConditioningErrorInvalidTimeSpec", + "AirConditioningErrorThingNotFound", + "AirConditioningErrorInvalidThingType" + ], + "BasicType": [ + "Uuid", + "String", + "StringList", + "Int", + "Uint", + "Double", + "Bool", + "Variant", + "Color", + "Time", + "Object" + ], + "BrowserIcon": [ + "BrowserIconNone", + "BrowserIconFolder", + "BrowserIconFile", + "BrowserIconMusic", + "BrowserIconVideo", + "BrowserIconPictures", + "BrowserIconApplication", + "BrowserIconDocument", + "BrowserIconPackage", + "BrowserIconFavorites" + ], + "ChargingActionIssuer": [ + "ChargingActionIssuerUnknown", + "ChargingActionIssuerSurplusCharging", + "ChargingActionIssuerSpotMarketCharging", + "ChargingActionIssuerTimeRequirement", + "ChargingActionIssuerOverloadProtection" + ], + "ChargingMode": [ + "ChargingModeNormal", + "ChargingModeEco", + "ChargingModeEcoWithTargetTime", + "ChargingModeEcoWithMinCurrent", + "ChargingModeEcoMinWithTargetTime" + ], + "ChargingState": [ + "ChargingStateIdle", + "ChargingStateSurplusCharging", + "ChargingStateSpotMarketCharging", + "ChargingStateTimeRequirement" + ], + "ConfigurationError": [ + "ConfigurationErrorNoError", + "ConfigurationErrorInvalidTimeZone", + "ConfigurationErrorInvalidStationName", + "ConfigurationErrorInvalidId", + "ConfigurationErrorInvalidPort", + "ConfigurationErrorInvalidHostAddress", + "ConfigurationErrorInvalidDestinationDir", + "ConfigurationErrorInvalidFileName", + "ConfigurationErrorBluetoothHardwareNotAvailable", + "ConfigurationErrorInvalidCertificate", + "ConfigurationErrorUnsupported", + "ConfigurationErrorBackupFailed" + ], + "CreateMethod": [ + "CreateMethodUser", + "CreateMethodAuto", + "CreateMethodDiscovery" + ], + "DebugError": [ + "DebugErrorNoError" + ], + "DiscoveryType": [ + "DiscoveryTypePrecise", + "DiscoveryTypeWeak" + ], + "EnergyError": [ + "EnergyErrorNoError", + "EnergyErrorMissingParameter", + "EnergyErrorInvalidParameter" + ], + "IOType": [ + "IOTypeNone", + "IOTypeDigitalInput", + "IOTypeDigitalOutput", + "IOTypeAnalogInput", + "IOTypeAnalogOutput" + ], + "InputType": [ + "InputTypeNone", + "InputTypeTextLine", + "InputTypeTextArea", + "InputTypePassword", + "InputTypeSearch", + "InputTypeMail", + "InputTypeIPv4Address", + "InputTypeIPv6Address", + "InputTypeUrl", + "InputTypeMacAddress" + ], + "LoggingCategoryType": [ + "LoggingCategoryTypeSystem", + "LoggingCategoryTypePlugin", + "LoggingCategoryTypeCustom" + ], + "LoggingLevel": [ + "LoggingLevelCritical", + "LoggingLevelWarning", + "LoggingLevelInfo", + "LoggingLevelDebug" + ], + "MediaBrowserIcon": [ + "MediaBrowserIconNone", + "MediaBrowserIconPlaylist", + "MediaBrowserIconRecentlyPlayed", + "MediaBrowserIconLibrary", + "MediaBrowserIconMusicLibrary", + "MediaBrowserIconVideoLibrary", + "MediaBrowserIconPictureLibrary", + "MediaBrowserIconDisk", + "MediaBrowserIconUSB", + "MediaBrowserIconNetwork", + "MediaBrowserIconAux", + "MediaBrowserIconBluetooth", + "MediaBrowserIconSpotify", + "MediaBrowserIconAmazon", + "MediaBrowserIconTuneIn", + "MediaBrowserIconSiriusXM", + "MediaBrowserIconVTuner", + "MediaBrowserIconTidal", + "MediaBrowserIconAirable", + "MediaBrowserIconDeezer", + "MediaBrowserIconNapster", + "MediaBrowserIconSoundCloud", + "MediaBrowserIconRadioParadise" + ], + "ModbusRtuError": [ + "ModbusRtuErrorNoError", + "ModbusRtuErrorNotAvailable", + "ModbusRtuErrorUuidNotFound", + "ModbusRtuErrorHardwareNotFound", + "ModbusRtuErrorResourceBusy", + "ModbusRtuErrorNotSupported", + "ModbusRtuErrorInvalidTimeoutValue", + "ModbusRtuErrorConnectionFailed" + ], + "NetworkDeviceState": [ + "NetworkDeviceStateUnknown", + "NetworkDeviceStateUnmanaged", + "NetworkDeviceStateUnavailable", + "NetworkDeviceStateDisconnected", + "NetworkDeviceStatePrepare", + "NetworkDeviceStateConfig", + "NetworkDeviceStateNeedAuth", + "NetworkDeviceStateIpConfig", + "NetworkDeviceStateIpCheck", + "NetworkDeviceStateSecondaries", + "NetworkDeviceStateActivated", + "NetworkDeviceStateDeactivating", + "NetworkDeviceStateFailed" + ], + "NetworkManagerError": [ + "NetworkManagerErrorNoError", + "NetworkManagerErrorUnknownError", + "NetworkManagerErrorWirelessNotAvailable", + "NetworkManagerErrorAccessPointNotFound", + "NetworkManagerErrorNetworkInterfaceNotFound", + "NetworkManagerErrorInvalidNetworkDeviceType", + "NetworkManagerErrorWirelessNetworkingDisabled", + "NetworkManagerErrorWirelessConnectionFailed", + "NetworkManagerErrorNetworkingDisabled", + "NetworkManagerErrorNetworkManagerNotAvailable", + "NetworkManagerErrorInvalidConfiguration", + "NetworkManagerErrorUnsupportedFeature" + ], + "NetworkManagerState": [ + "NetworkManagerStateUnknown", + "NetworkManagerStateAsleep", + "NetworkManagerStateDisconnected", + "NetworkManagerStateDisconnecting", + "NetworkManagerStateConnecting", + "NetworkManagerStateConnectedLocal", + "NetworkManagerStateConnectedSite", + "NetworkManagerStateConnectedGlobal" + ], + "PermissionScope": [ + "PermissionScopeNone", + "PermissionScopeControlThings", + "PermissionScopeConfigureThings", + "PermissionScopeAccessAllThings", + "PermissionScopeExecuteRules", + "PermissionScopeConfigureRules", + "PermissionScopeAdmin" + ], + "RepeatingMode": [ + "RepeatingModeNone", + "RepeatingModeHourly", + "RepeatingModeDaily", + "RepeatingModeWeekly", + "RepeatingModeMonthly", + "RepeatingModeYearly" + ], + "RuleError": [ + "RuleErrorNoError", + "RuleErrorInvalidRuleId", + "RuleErrorRuleNotFound", + "RuleErrorThingNotFound", + "RuleErrorEventTypeNotFound", + "RuleErrorStateTypeNotFound", + "RuleErrorActionTypeNotFound", + "RuleErrorInvalidParameter", + "RuleErrorInvalidRuleFormat", + "RuleErrorMissingParameter", + "RuleErrorInvalidRuleActionParameter", + "RuleErrorInvalidStateEvaluatorValue", + "RuleErrorTypesNotMatching", + "RuleErrorNotExecutable", + "RuleErrorInvalidTimeDescriptor", + "RuleErrorInvalidRepeatingOption", + "RuleErrorInvalidCalendarItem", + "RuleErrorInvalidTimeEventItem", + "RuleErrorContainsEventBasesAction", + "RuleErrorNoExitActions", + "RuleErrorInterfaceNotFound" + ], + "SampleRate": [ + "SampleRateAny", + "SampleRate1Min", + "SampleRate15Mins", + "SampleRate1Hour", + "SampleRate3Hours", + "SampleRate1Day", + "SampleRate1Week", + "SampleRate1Month", + "SampleRate1Year" + ], + "ScriptError": [ + "ScriptErrorNoError", + "ScriptErrorScriptNotFound", + "ScriptErrorInvalidScript", + "ScriptErrorHardwareFailure" + ], + "ScriptMessageType": [ + "ScriptMessageTypeLog", + "ScriptMessageTypeWarning" + ], + "SerialPortDataBits": [ + "SerialPortDataBitsData5", + "SerialPortDataBitsData6", + "SerialPortDataBitsData7", + "SerialPortDataBitsData8", + "SerialPortDataBitsUnknownDataBits" + ], + "SerialPortParity": [ + "SerialPortParityNoParity", + "SerialPortParityEvenParity", + "SerialPortParityOddParity", + "SerialPortParitySpaceParity", + "SerialPortParityMarkParity", + "SerialPortParityUnknownParity" + ], + "SerialPortStopBits": [ + "SerialPortStopBitsOneStop", + "SerialPortStopBitsOneAndHalfStop", + "SerialPortStopBitsTwoStop", + "SerialPortStopBitsUnknownStopBits" + ], + "SetpointOverrideMode": [ + "SetpointOverrideModeNone", + "SetpointOverrideModeTimed", + "SetpointOverrideModeUnlimited", + "SetpointOverrideModeEventual" + ], + "SetupMethod": [ + "SetupMethodJustAdd", + "SetupMethodDisplayPin", + "SetupMethodEnterPin", + "SetupMethodPushButton", + "SetupMethodUserAndPassword", + "SetupMethodOAuth" + ], + "SortOrder": [ + "AscendingOrder", + "DescendingOrder" + ], + "StateOperator": [ + "StateOperatorAnd", + "StateOperatorOr" + ], + "StateValueFilter": [ + "StateValueFilterNone", + "StateValueFilterAdaptive" + ], + "TagError": [ + "TagErrorNoError", + "TagErrorThingNotFound", + "TagErrorRuleNotFound", + "TagErrorTagNotFound" + ], + "ThingError": [ + "ThingErrorNoError", + "ThingErrorPluginNotFound", + "ThingErrorVendorNotFound", + "ThingErrorThingNotFound", + "ThingErrorThingClassNotFound", + "ThingErrorActionTypeNotFound", + "ThingErrorStateTypeNotFound", + "ThingErrorEventTypeNotFound", + "ThingErrorThingDescriptorNotFound", + "ThingErrorMissingParameter", + "ThingErrorInvalidParameter", + "ThingErrorSetupFailed", + "ThingErrorDuplicateUuid", + "ThingErrorCreationMethodNotSupported", + "ThingErrorSetupMethodNotSupported", + "ThingErrorHardwareNotAvailable", + "ThingErrorHardwareFailure", + "ThingErrorAuthenticationFailure", + "ThingErrorThingInUse", + "ThingErrorThingInRule", + "ThingErrorThingIsChild", + "ThingErrorPairingTransactionIdNotFound", + "ThingErrorParameterNotWritable", + "ThingErrorItemNotFound", + "ThingErrorItemNotExecutable", + "ThingErrorUnsupportedFeature", + "ThingErrorTimeout" + ], + "ThingSetupStatus": [ + "ThingSetupStatusNone", + "ThingSetupStatusInProgress", + "ThingSetupStatusComplete", + "ThingSetupStatusFailed" + ], + "Unit": [ + "UnitNone", + "UnitMilliSeconds", + "UnitSeconds", + "UnitMinutes", + "UnitHours", + "UnitUnixTime", + "UnitMeterPerSecond", + "UnitKiloMeterPerHour", + "UnitDegree", + "UnitRadiant", + "UnitDegreeCelsius", + "UnitDegreeKelvin", + "UnitMired", + "UnitMilliBar", + "UnitBar", + "UnitPascal", + "UnitHectoPascal", + "UnitAtmosphere", + "UnitLumen", + "UnitLux", + "UnitCandela", + "UnitMilliMeter", + "UnitCentiMeter", + "UnitMeter", + "UnitKiloMeter", + "UnitGram", + "UnitKiloGram", + "UnitDezibel", + "UnitBpm", + "UnitKiloByte", + "UnitMegaByte", + "UnitGigaByte", + "UnitTeraByte", + "UnitMilliWatt", + "UnitWatt", + "UnitKiloWatt", + "UnitKiloWattHour", + "UnitEuroPerMegaWattHour", + "UnitEuroCentPerKiloWattHour", + "UnitPercentage", + "UnitPartsPerMillion", + "UnitPartsPerBillion", + "UnitEuro", + "UnitDollar", + "UnitHertz", + "UnitAmpere", + "UnitMilliAmpere", + "UnitVolt", + "UnitMilliVolt", + "UnitVoltAmpere", + "UnitVoltAmpereReactive", + "UnitAmpereHour", + "UnitOhm", + "UnitMicroSiemensPerCentimeter", + "UnitDuration", + "UnitNewton", + "UnitNewtonMeter", + "UnitRpm", + "UnitMilligramPerLiter", + "UnitLiter", + "UnitMicroGrammPerCubicalMeter" + ], + "UpdateType": [ + "UpdateTypeNone", + "UpdateTypeSystem", + "UpdateTypePackageManager" + ], + "UserError": [ + "UserErrorNoError", + "UserErrorBackendError", + "UserErrorInvalidUserId", + "UserErrorDuplicateUserId", + "UserErrorBadPassword", + "UserErrorTokenNotFound", + "UserErrorPermissionDenied", + "UserErrorInconsistantScopes" + ], + "ValueOperator": [ + "ValueOperatorEquals", + "ValueOperatorNotEquals", + "ValueOperatorLess", + "ValueOperatorGreater", + "ValueOperatorLessOrEqual", + "ValueOperatorGreaterOrEqual" + ], + "WiredNetworkConnectionType": [ + "WiredNetworkConnectionTypeDHCP", + "WiredNetworkConnectionTypeManual", + "WiredNetworkConnectionTypeShared" + ], + "WirelessCapability": [ + "WirelessCapabilityNone", + "WirelessCapabilityCipherWEP40", + "WirelessCapabilityCipherWEP104", + "WirelessCapabilityCipherTKIP", + "WirelessCapabilityCipherCCMP", + "WirelessCapabilityWPA", + "WirelessCapabilityRSN", + "WirelessCapabilityAP", + "WirelessCapabilityAdHoc", + "WirelessCapabilityFreqValid", + "WirelessCapability2Ghz", + "WirelessCapability5Ghz" + ], + "WirelessMode": [ + "WirelessModeUnknown", + "WirelessModeAdhoc", + "WirelessModeInfrastructure", + "WirelessModeAccessPoint" + ], + "ZWaveDeviceType": [ + "ZWaveDeviceTypeUnknown", + "ZWaveDeviceTypeCentralController", + "ZWaveDeviceTypeDisplaySimple", + "ZWaveDeviceTypeDoorLockKeypad", + "ZWaveDeviceTypeFanSwitch", + "ZWaveDeviceTypeGateway", + "ZWaveDeviceTypeLightDimmerSwitch", + "ZWaveDeviceTypeOnOffPowerSwitch", + "ZWaveDeviceTypePowerStrip", + "ZWaveDeviceTypeRemoteControlAV", + "ZWaveDeviceTypeRemoteControlMultiPurpose", + "ZWaveDeviceTypeRemoteControlSimple", + "ZWaveDeviceTypeKeyFob", + "ZWaveDeviceTypeSensorNotification", + "ZWaveDeviceTypeSmokeAlarmSensor", + "ZWaveDeviceTypeCOAlarmSensor", + "ZWaveDeviceTypeCO2AlarmSensor", + "ZWaveDeviceTypeHeatAlarmSensor", + "ZWaveDeviceTypeWaterAlarmSensor", + "ZWaveDeviceTypeAccessControlSensor", + "ZWaveDeviceTypeHomeSecuritySensor", + "ZWaveDeviceTypePowerManagementSensor", + "ZWaveDeviceTypeSystemSensor", + "ZWaveDeviceTypeEmergencyAlarmSensor", + "ZWaveDeviceTypeClockSensor", + "ZWaveDeviceTypeMultiDeviceAlarmSensor", + "ZWaveDeviceTypeMultilevelSensor", + "ZWaveDeviceTypeAirTemperatureSensor", + "ZWaveDeviceTypeGeneralPurposeSensor", + "ZWaveDeviceTypeLuminanceSensor", + "ZWaveDeviceTypePowerSensor", + "ZWaveDeviceTypeHumiditySensor", + "ZWaveDeviceTypeVelocitySensor", + "ZWaveDeviceTypeDirectionSensor", + "ZWaveDeviceTypeAtmosphericPressureSensor", + "ZWaveDeviceTypeBarometricPressureSensor", + "ZWaveDeviceTypeSolarRadiationSensor", + "ZWaveDeviceTypeDewPointSensor", + "ZWaveDeviceTypeRainRateSensor", + "ZWaveDeviceTypeTideLevelSensor", + "ZWaveDeviceTypeWeightSensor", + "ZWaveDeviceTypeVoltageSensor", + "ZWaveDeviceTypeCurrentSensor", + "ZWaveDeviceTypeCO2LevelSensor", + "ZWaveDeviceTypeAirFlowSensor", + "ZWaveDeviceTypeTankCapacitySensor", + "ZWaveDeviceTypeDistanceSensor", + "ZWaveDeviceTypeAnglePositionSensor", + "ZWaveDeviceTypeRotationSensor", + "ZWaveDeviceTypeWaterTemperatureSensor", + "ZWaveDeviceTypeSoilTemperatureSensor", + "ZWaveDeviceTypeSeismicIntensitySensor", + "ZWaveDeviceTypeSeismicMagnitudeSensor", + "ZWaveDeviceTypeUltraVioletSensor", + "ZWaveDeviceTypeElectricalResistivitySensor", + "ZWaveDeviceTypeElectricalConductivitySensor", + "ZWaveDeviceTypeLoudnessSensor", + "ZWaveDeviceTypeMoistureSensor", + "ZWaveDeviceTypeFrequencySensor", + "ZWaveDeviceTypeTimeSensor", + "ZWaveDeviceTypeTargetTemperatureSensor", + "ZWaveDeviceTypeMultiDeviceSensor", + "ZWaveDeviceTypeSetTopBox", + "ZWaveDeviceTypeSiren", + "ZWaveDeviceTypeSubEnergyMeter", + "ZWaveDeviceTypeSubSystemController", + "ZWaveDeviceTypeThermostatHVAC", + "ZWaveDeviceTypeThermostatSetback", + "ZWaveDeviceTypeTV", + "ZWaveDeviceTypeValveOpenClose", + "ZWaveDeviceTypeWallController", + "ZWaveDeviceTypeWholeHomeMeterSimple", + "ZWaveDeviceTypeWindowCoveringNoPosEndpoint", + "ZWaveDeviceTypeWindowCoveringEndpointAware", + "ZWaveDeviceTypeWindowCoveringPositionEndpointAware" + ], + "ZWaveError": [ + "ZWaveErrorNoError", + "ZWaveErrorInUse", + "ZWaveErrorNetworkUuidNotFound", + "ZWaveErrorNodeIdNotFound", + "ZWaveErrorTimeout", + "ZWaveErrorBackendError" + ], + "ZWaveNetworkState": [ + "ZWaveNetworkStateOffline", + "ZWaveNetworkStateStarting", + "ZWaveNetworkStateOnline", + "ZWaveNetworkStateError" + ], + "ZWaveNodeRole": [ + "ZWaveNodeRoleUnknown", + "ZWaveNodeRoleCentralController", + "ZWaveNodeRoleSubController", + "ZWaveNodeRolePortableController", + "ZWaveNodeRolePortableReportingController", + "ZWaveNodeRolePortableSlave", + "ZWaveNodeRoleAlwaysOnSlabe", + "ZWaveNodeRoleReportingSleepingSlave", + "ZWaveNodeRoleListeningSleepingSlave" + ], + "ZWaveNodeType": [ + "ZWaveNodeTypeUnknown", + "ZWaveNodeTypeController", + "ZWaveNodeTypeStaticController", + "ZWaveNodeTypeSlave", + "ZWaveNodeTypeRoutingSlave" + ], + "ZigbeeClusterDirection": [ + "ZigbeeClusterDirectionServer", + "ZigbeeClusterDirectionClient" + ], + "ZigbeeError": [ + "ZigbeeErrorNoError", + "ZigbeeErrorAdapterNotAvailable", + "ZigbeeErrorAdapterAlreadyInUse", + "ZigbeeErrorNetworkUuidNotFound", + "ZigbeeErrorDurationOutOfRange", + "ZigbeeErrorNetworkOffline", + "ZigbeeErrorUnknownBackend", + "ZigbeeErrorNodeNotFound", + "ZigbeeErrorForbidden", + "ZigbeeErrorInvalidChannel", + "ZigbeeErrorNetworkError", + "ZigbeeErrorTimeoutError", + "ZigbeeErrorNotSupported" + ], + "ZigbeeNetworkState": [ + "ZigbeeNetworkStateOffline", + "ZigbeeNetworkStateStarting", + "ZigbeeNetworkStateUpdating", + "ZigbeeNetworkStateOnline", + "ZigbeeNetworkStateError" + ], + "ZigbeeNodeRelationship": [ + "ZigbeeNodeRelationshipParent", + "ZigbeeNodeRelationshipChild", + "ZigbeeNodeRelationshipSibling", + "ZigbeeNodeRelationshipNone", + "ZigbeeNodeRelationshipPreviousChild" + ], + "ZigbeeNodeRouteStatus": [ + "ZigbeeNodeRouteStatusActive", + "ZigbeeNodeRouteStatusDiscoveryUnderway", + "ZigbeeNodeRouteStatusDiscoveryFailed", + "ZigbeeNodeRouteStatusInactive", + "ZigbeeNodeRouteStatusValidationUnderway" + ], + "ZigbeeNodeState": [ + "ZigbeeNodeStateUninitialized", + "ZigbeeNodeStateInitializing", + "ZigbeeNodeStateInitialized", + "ZigbeeNodeStateHandled" + ], + "ZigbeeNodeType": [ + "ZigbeeNodeTypeCoordinator", + "ZigbeeNodeTypeRouter", + "ZigbeeNodeTypeEndDevice" + ], + "ZoneStatusFlag": [ + "ZoneStatusFlagNone", + "ZoneStatusFlagTimeScheduleActive", + "ZoneStatusFlagSetpointOverrideActive", + "ZoneStatusFlagWindowOpen", + "ZoneStatusFlagBadAir", + "ZoneStatusFlagHighHumidity" + ] + }, + "flags": { + "CreateMethods": [ + "$ref:CreateMethod" + ], + "PermissionScopes": [ + "$ref:PermissionScope" + ], + "WirelessCapabilities": [ + "$ref:WirelessCapability" + ], + "ZoneStatus": [ + "$ref:ZoneStatusFlag" + ] + }, + "methods": { + "AirConditioning.AddZone": { + "description": "Create a zones.", + "params": { + "name": "String", + "o:indoorSensors": [ + "Uuid" + ], + "o:notifications": [ + "Uuid" + ], + "o:outdoorSensors": [ + "Uuid" + ], + "o:thermostats": [ + "Uuid" + ], + "o:valves": [ + "Uuid" + ], + "o:windowSensors": [ + "Uuid" + ] + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "airConditioningError": "$ref:AirConditioningError", + "o:zone": "$ref:ZoneInfo" + } + }, + "AirConditioning.GetZones": { + "description": "Get all Zones.", + "params": { + "o:zoneId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "airConditioningError": "$ref:AirConditioningError", + "zones": "$ref:ZoneInfos" + } + }, + "AirConditioning.RemoveZone": { + "description": "Remove a zone.", + "params": { + "zoneId": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "airConditioningError": "$ref:AirConditioningError" + } + }, + "AirConditioning.SetZoneName": { + "description": "Set zone name.", + "params": { + "name": "String", + "zoneId": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "airConditioningError": "$ref:AirConditioningError" + } + }, + "AirConditioning.SetZoneSetpointOverride": { + "description": "Set zone setpoint override temperature. Parameter minutes gives the minutes until the setpoint should return to the standby/schedule.", + "params": { + "mode": "$ref:SetpointOverrideMode", + "o:minutes": "Int", + "setpointOverride": "Double", + "zoneId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "airConditioningError": "$ref:AirConditioningError" + } + }, + "AirConditioning.SetZoneStandbySetpoint": { + "description": "Set zone standby setpoint temperature.", + "params": { + "standbySetpoint": "Double", + "zoneId": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "airConditioningError": "$ref:AirConditioningError" + } + }, + "AirConditioning.SetZoneThings": { + "description": "Set Zone things", + "params": { + "o:indoorSensors": [ + "Uuid" + ], + "o:notifications": [ + "Uuid" + ], + "o:outdoorSensors": [ + "Uuid" + ], + "o:thermostats": [ + "Uuid" + ], + "o:valves": [ + "Uuid" + ], + "o:windowSensors": [ + "Uuid" + ], + "zoneId": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "airConditioningError": "$ref:AirConditioningError" + } + }, + "AirConditioning.SetZoneWeekSchedule": { + "description": "Set the time schedule for a zone.", + "params": { + "weekSchedule": "$ref:TemperatureWeekSchedule", + "zoneId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "airConditioningError": "$ref:AirConditioningError" + } + }, + "AppData.Load": { + "description": "Retrieve an app data storage value that has previously been set with Store(). If no value had been set for this appId/key combination before, an empty value will be returned.", + "params": { + "appId": "String", + "key": "String", + "o:group": "String" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "value": "String" + } + }, + "AppData.Store": { + "description": "Store an app data entry to the server. App data can be used by the client application to store configuration values. The app data storage is a key-value pair storage. Each entry value is identified by an appId, a key and optionally a group. The value data is a bytearray and can contain arbitrary data, such as a JSON map or image data, however, be aware of the maximum packet size for the used transport.\nThis might be useful to a client application to sync settings across multiple instances of the same application.\nThe group parameter might be used to create groups for this application.\nIMPORTANT: Currently no verification of the appId is done. The appid is merely a mechanism to prevent different different client apps from colliding by using the same key for data entries. This implies that the app data storage may not be suited for sensitive data given that anyone with a valid server token can read it.\n ", + "params": { + "appId": "String", + "key": "String", + "o:group": "String", + "value": "String" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": {} + }, + "Configuration.CreateAndDownloadBackup": { + "description": "Create a backup of the current configuration and generate a download entry for the dedicated transfer connection.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError", + "downloadId": "String", + "fileName": "String", + "size": "Int" + } + }, + "Configuration.CreateBackup": { + "description": "Create a backup of the current configuration. It will be stored in the configured destination directory. Also the maxCout configuration will be considered.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DeleteBackupFile": { + "description": "Delete an existing configuration backup file.", + "params": { + "fileName": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DeleteMqttPolicy": { + "description": "Delete a MQTT policy from the broker.", + "params": { + "clientId": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DeleteMqttServerConfiguration": { + "description": "Delete a MQTT Server interface of the server.", + "params": { + "id": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DeleteTcpServerConfiguration": { + "description": "Delete a TCP interface of the server. Note: if you are deleting the configuration for the interface you are currently connected to, the connection will be dropped.", + "params": { + "id": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DeleteTunnelProxyServerConfiguration": { + "description": "Delete a Tunnel Proxy Server interface of the server. Note: if you are deleting the configuration for the interface you are currently connected to, the connection will be dropped.", + "params": { + "id": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DeleteWebServerConfiguration": { + "description": "Delete a WebServer interface of the server.", + "params": { + "id": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DeleteWebSocketServerConfiguration": { + "description": "Delete a WebSocket Server interface of the server. Note: if you are deleting the configuration for the interface you are currently connected to, the connection will be dropped.", + "params": { + "id": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.DownloadBackupFile": { + "description": "Generate a download entry for an existing configuration backup file.", + "params": { + "fileName": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError", + "o:downloadId": "String", + "o:fileName": "String", + "o:size": "Int" + } + }, + "Configuration.GetAvailableLanguages": { + "deprecated": "Use the locale property in the Handshake message instead.", + "description": "Returns a list of locale codes available for the server. i.e. en_US, de_AT", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "languages": [ + "String" + ] + } + }, + "Configuration.GetBackupFiles": { + "description": "Get the list of configuration backup files from the configured destination directory.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "backupFiles": [ + "$ref:BackupFile" + ] + } + }, + "Configuration.GetConfigurations": { + "description": "Get all configuration parameters of the server.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "backupConfigurations": { + "autoBackupEnabled": "Bool", + "autoBackupInterval": "Int", + "destinationDirectory": "String", + "maxCount": "Uint" + }, + "basicConfiguration": { + "d:language": "String", + "d:location": { + "latitude": "Double", + "longitude": "Double", + "name": "String" + }, + "d:serverTime": "Uint", + "d:timeZone": "String", + "debugServerEnabled": "Bool", + "serverName": "String", + "serverUuid": "Uuid" + }, + "mqttServerConfigurations": [ + "$ref:ServerConfiguration" + ], + "tcpServerConfigurations": [ + "$ref:ServerConfiguration" + ], + "tunnelProxyServerConfigurations": [ + "$ref:TunnelProxyServerConfiguration" + ], + "webServerConfigurations": [ + "$ref:WebServerConfiguration" + ], + "webSocketServerConfigurations": [ + "$ref:ServerConfiguration" + ] + } + }, + "Configuration.GetMqttPolicies": { + "description": "Get all MQTT broker policies.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "mqttPolicies": [ + "$ref:MqttPolicy" + ] + } + }, + "Configuration.GetMqttServerConfigurations": { + "description": "Get all MQTT Server configurations.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "mqttServerConfigurations": [ + "$ref:ServerConfiguration" + ] + } + }, + "Configuration.GetTimeZones": { + "deprecated": "Use System.GetTimeZones instead.", + "description": "Get the list of available timezones.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "timeZones": [ + "String" + ] + } + }, + "Configuration.RestoreBackupFile": { + "description": "Restore an existing configuration backup file. Clients should warn the user before calling this method because the current configuration data will be wiped, the server will restart immediately afterwards and it will come back up using the restored backup.", + "params": { + "fileName": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetBackupConfiguration": { + "description": "Set the backup configuration. The destination directory is the location where the archives will be saved, the maxCount is the number of backups which will be kept. If maxCount is 0, all backups will be kept. The autoBackupEnabled property controls periodic configuration backups and autoBackupInterval defines the interval in hours.", + "params": { + "autoBackupEnabled": "Bool", + "autoBackupInterval": "Int", + "destinationDirectory": "String", + "maxCount": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetDebugServerEnabled": { + "description": "Enable or disable the debug server.", + "params": { + "enabled": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetLanguage": { + "deprecated": "Use the locale property in the Handshake message instead.", + "description": "Sets the server language to the given language. See also: \"GetAvailableLanguages\"", + "params": { + "language": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetLocation": { + "description": "Sets the server location.", + "params": { + "location": { + "latitude": "Double", + "longitude": "Double", + "name": "String" + } + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetMqttPolicy": { + "description": "Configure a MQTT broker policy. If the ID is an existing one, the existing policy will be modified, otherwise a new one will be added.", + "params": { + "policy": "$ref:MqttPolicy" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetMqttServerConfiguration": { + "description": "Configure a MQTT Server interface on the MQTT broker. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Setting authenticationEnabled to true will require MQTT clients to use credentials set in the MQTT broker policies.", + "params": { + "configuration": "$ref:ServerConfiguration" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetServerName": { + "description": "Set the name of the server. Default is nymea.", + "params": { + "serverName": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetTcpServerConfiguration": { + "description": "Configure a TCP interface of the server. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Note: if you are changing the configuration for the interface you are currently connected to, the connection will be dropped.", + "params": { + "configuration": "$ref:ServerConfiguration" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetTimeZone": { + "deprecated": "Use System.SetTimeZone instead.", + "description": "Set the time zone of the server. See also: \"GetTimeZones\"", + "params": { + "timeZone": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetTunnelProxyServerConfiguration": { + "description": "Configure a Tunnel Proxy Server interface of the server. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Note: if you are changing the configuration for the interface you are currently connected to, the connection will be dropped.", + "params": { + "configuration": "$ref:TunnelProxyServerConfiguration" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetWebServerConfiguration": { + "description": "Configure a WebServer interface of the server. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added.", + "params": { + "configuration": "$ref:WebServerConfiguration" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.SetWebSocketServerConfiguration": { + "description": "Configure a WebSocket Server interface of the server. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Note: if you are changing the configuration for the interface you are currently connected to, the connection will be dropped.", + "params": { + "configuration": "$ref:ServerConfiguration" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, + "Configuration.UploadAndRestoreBackup": { + "description": "Create an upload session for a configuration backup archive. The uploaded file will be stored temporarily under /tmp, the current configuration will be wiped after the upload finishes and the server will restart immediately using the restored backup. Clients should warn the user before calling this method because all current configuration data will be lost.", + "params": { + "fileName": "String", + "size": "Int" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError", + "o:fileName": "String", + "o:size": "Int", + "o:transferId": "String", + "o:transferToken": "String" + } + }, + "Debug.GetLoggingCategories": { + "description": "Get all available logging categories.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "loggingCategories": [ + "$ref:LoggingCategory" + ] + } + }, + "Debug.SetLoggingCategoryLevel": { + "description": "Set the logging category with the given name to the given logging level.", + "params": { + "level": "$ref:LoggingLevel", + "name": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "debugError": "$ref:DebugError" + } + }, + "Energy.GetPowerBalance": { + "description": "Get the current power balance. That is, production, consumption and acquisition.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "currentPowerAcquisition": "Double", + "currentPowerConsumption": "Double", + "currentPowerProduction": "Double", + "currentPowerStorage": "Double", + "totalAcquisition": "Double", + "totalConsumption": "Double", + "totalProduction": "Double", + "totalReturn": "Double" + } + }, + "Energy.GetPowerBalanceLogs": { + "description": "Get logs for the power balance. If from is not give, the log will start at the beginning of recording. If to is not given, the logs will and at the last sample for this sample rate before now.", + "params": { + "o:from": "Uint", + "o:to": "Uint", + "sampleRate": "$ref:SampleRate" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "powerBalanceLogEntries": "$ref:PowerBalanceLogEntries" + } + }, + "Energy.GetRootMeter": { + "description": "Get the root meter ID. If there is no root meter set, the params will be empty.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:rootMeterThingId": "Uuid" + } + }, + "Energy.GetThingPowerLogs": { + "description": "Get logs for one or more things power values. If thingIds is not given, logs for all energy related things will be returned. If from is not given, the log will start at the beginning of recording. If to is not given, the logs will and at the last sample for this sample rate before now. If the parameter \"includeCurrent\" is set to true, the result will contain the newest log entries available, regardless of the sample rate (that is, 1 minute). This may be useful to calculate the difference to the newest entry of the fetched sample rate and the current values to display the live value until the current sample is completed.", + "params": { + "o:from": "Uint", + "o:includeCurrent": "Bool", + "o:thingIds": [ + "Uuid" + ], + "o:to": "Uint", + "sampleRate": "$ref:SampleRate" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:currentEntries": "$ref:ThingPowerLogEntries", + "thingPowerLogEntries": "$ref:ThingPowerLogEntries" + } + }, + "Energy.SetRootMeter": { + "description": "Set the root meter.", + "params": { + "rootMeterThingId": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "energyError": "$ref:EnergyError" + } + }, + "Integrations.AddThing": { + "description": "Add a new thing to the system. Only things with a setupMethod of SetupMethodJustAdd can be added this way. For things with a setupMethod different than SetupMethodJustAdd, use PairThing. Things with CreateMethodJustAdd require all parameters to be supplied here. Things with CreateMethodDiscovery require the use of a thingDescriptorId. For discovered things, params are not required and will be taken from the ThingDescriptor, however, they may be overridden by supplying thingParams.", + "params": { + "name": "String", + "o:thingClassId": "Uuid", + "o:thingDescriptorId": "Uuid", + "o:thingParams": "$ref:ParamList" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "o:displayMessage": "String", + "o:thingId": "Uuid", + "thingError": "$ref:ThingError" + } + }, + "Integrations.BrowseThing": { + "description": "Browse a thing. If a ThingClass indicates a thing is browsable, this method will return the BrowserItems. If no parameter besides the thingId is used, the root node of this thingwill be returned. Any returned item which is browsable can be passed as node. Results will be children of the given node.\nIn case of an error during browsing, the error will be indicated and the displayMessage may contain additional information for the user. The displayMessage will be translated. A client UI showing this message to the user should be prepared for empty, but also longer strings.", + "params": { + "o:itemId": "String", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:displayMessage": "String", + "o:items": [ + "$ref:BrowserItem" + ], + "thingError": "$ref:ThingError" + } + }, + "Integrations.ConfirmPairing": { + "description": "Confirm an ongoing pairing. For SetupMethodUserAndPassword, provide the username in the \"username\" field and the password in the \"secret\" field. For SetupMethodEnterPin and provide the PIN in the \"secret\" field. In case of SetupMethodOAuth, the previously opened web view will eventually be redirected to http://128.0.0.1:8888 and the OAuth code as query parameters to this url. Provide the entire unmodified URL in the secret field.", + "params": { + "o:secret": "String", + "o:username": "String", + "pairingTransactionId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "o:displayMessage": "String", + "o:thingId": "Uuid", + "thingError": "$ref:ThingError" + } + }, + "Integrations.ConnectIO": { + "description": "Connect two generic IO states. Input and output need to be compatible, that is, either a digital input and a digital output, or an analog input and an analog output. If successful, the connectionId will be returned.", + "params": { + "inputStateTypeId": "Uuid", + "inputThingId": "Uuid", + "o:inverted": "Bool", + "outputStateTypeId": "Uuid", + "outputThingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "o:ioConnectionId": "Uuid", + "thingError": "$ref:ThingError" + } + }, + "Integrations.DisconnectIO": { + "description": "Disconnect an existing IO connection.", + "params": { + "ioConnectionId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.DiscoverThings": { + "description": "Performs a thing discovery for things of the given thingClassId and returns the results. This function may take a while to return. Note that this method will include all the found things, that is, including things that may already have been added. Those things will have thingId set to the id of the already added thing. Such results may be used to reconfigure existing things and might be filtered in cases where only unknown things are of interest.", + "params": { + "o:discoveryParams": "$ref:ParamList", + "thingClassId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "o:displayMessage": "String", + "o:thingDescriptors": "$ref:ThingDescriptors", + "thingError": "$ref:ThingError" + } + }, + "Integrations.EditThing": { + "description": "Edit the name of a thing.", + "params": { + "name": "String", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.ExecuteAction": { + "description": "Execute a single action.", + "params": { + "actionTypeId": "Uuid", + "o:params": "$ref:ParamList", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "o:displayMessage": "String", + "thingError": "$ref:ThingError" + } + }, + "Integrations.ExecuteBrowserItem": { + "description": "Execute the item identified by itemId on the given thing.\nIn case of an error during execution, the error will be indicated and the displayMessage may contain additional information for the user. The displayMessage will be translated. A client UI showing this message to the user should be prepared for empty, but also longer strings.", + "params": { + "itemId": "String", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "o:displayMessage": "String", + "thingError": "$ref:ThingError" + } + }, + "Integrations.ExecuteBrowserItemAction": { + "description": "Execute the action for the browser item identified by actionTypeId and the itemId on the given thing.\nIn case of an error during execution, the error will be indicated and the displayMessage may contain additional information for the user. The displayMessage will be translated. A client UI showing this message to the user should be prepared for empty, but also longer strings.", + "params": { + "actionTypeId": "Uuid", + "itemId": "String", + "o:params": "$ref:ParamList", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "o:displayMessage": "String", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetActionTypes": { + "description": "Get action types for a specified thingClassId.", + "params": { + "thingClassId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "actionTypes": "$ref:ActionTypes" + } + }, + "Integrations.GetBrowserItem": { + "description": "Get a single item from the browser. This won't give any more info on an item than a regular BrowseThing call, but it allows to fetch details of an item if only the ID is known.\nIn case of an error during browsing, the error will be indicated and the displayMessage may contain additional information for the user. The displayMessage will be translated. A client UI showing this message to the user should be prepared for empty, but also longer strings.", + "params": { + "o:itemId": "String", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:displayMessage": "String", + "o:item": "$ref:BrowserItem", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetEventTypes": { + "description": "Get event types for a specified thingClassId.", + "params": { + "thingClassId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "eventTypes": "$ref:EventTypes" + } + }, + "Integrations.GetIOConnections": { + "description": "Fetch IO connections. Optionally filtered by thingId and stateTypeId.", + "params": { + "o:thingId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:ioConnections": "$ref:IOConnections", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetPluginConfiguration": { + "description": "Get a plugin's params.", + "params": { + "pluginId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "o:configuration": "$ref:ParamList", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetPlugins": { + "description": "Returns a list of loaded plugins.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "plugins": "$ref:IntegrationPlugins" + } + }, + "Integrations.GetStateTypes": { + "description": "Get state types for a specified thingClassId.", + "params": { + "thingClassId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "stateTypes": "$ref:StateTypes" + } + }, + "Integrations.GetStateValue": { + "description": "Get the value of the given thing and the given stateType", + "params": { + "stateTypeId": "Uuid", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:value": "Variant", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetStateValues": { + "description": "Get all the state values of the given thing.", + "params": { + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:values": "$ref:States", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetThingClasses": { + "description": "Returns a list of supported thing classes, optionally filtered by vendorId or by a list of thing class ids.", + "params": { + "o:thingClassIds": [ + "Uuid" + ], + "o:vendorId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:thingClasses": "$ref:ThingClasses", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetThings": { + "description": "Returns a list of configured things, optionally filtered by thingId.", + "params": { + "o:thingId": "Uuid" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:things": "$ref:Things", + "thingError": "$ref:ThingError" + } + }, + "Integrations.GetVendors": { + "description": "Returns a list of supported Vendors.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "vendors": "$ref:Vendors" + } + }, + "Integrations.PairThing": { + "description": "Pair a new thing. Use this to set up or reconfigure things for ThingClasses with a setupMethod different than SetupMethodJustAdd. Depending on the CreateMethod and whether a new thing is set up or an existing one is reconfigured, different parameters are required:\nCreateMethodJustAdd takes the thingClassId and the parameters you want to have with that thing. If an existing thing should be reconfigured, the thingId of said thing should be given additionally.\nCreateMethodDiscovery requires the use of a thingDescriptorId, previously obtained with DiscoverThings. Optionally, parameters can be overridden with the give thingParams. ThingDescriptors containing a thingId will reconfigure an existing thing, descriptors without a thingId will add a new thing to the system.\nIf success is true, the return values will contain a pairingTransactionId, a displayMessage and the setupMethod. Depending on the setupMethod, the application should present the use an appropriate login mask, that is, For SetupMethodDisplayPin the user should enter a pin that is displayed on the device or online service, for SetupMethodEnterPin the application should present the given PIN so the user can enter it on the device or online service. For SetupMethodPushButton, the displayMessage shall be presented to the user as informational hints to press a button on the device. For SetupMethodUserAndPassword a login mask for a user and password login should be presented to the user. In case of SetupMethodOAuth, an OAuth URL will be returned which shall be opened in a web view to allow the user logging in.\nOnce the login procedure has completed, the application shall proceed with ConfirmPairing, providing the results of the pairing procedure.", + "params": { + "o:name": "String", + "o:thingClassId": "Uuid", + "o:thingDescriptorId": "Uuid", + "o:thingId": "Uuid", + "o:thingParams": "$ref:ParamList" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "o:displayMessage": "String", + "o:oAuthUrl": "String", + "o:pairingTransactionId": "Uuid", + "o:pin": "String", + "o:setupMethod": "$ref:SetupMethod", + "thingError": "$ref:ThingError" + } + }, + "Integrations.ReconfigureThing": { + "description": "Reconfigure a thing. This comes down to removing and recreating a thing with new parameters but keeping its thing id the same (and with that keeping rules, tags etc). For things with create method CreateMethodDiscovery, a discovery (DiscoverThings) shall be performed first and this method is to be called with a thingDescriptorId of the re-discovered thing instead of the thingId directly. Thing parameters will be taken from the discovery, but can be overridden individually here by providing them in the thingParams parameter. Only writable parameters can be changed.", + "params": { + "o:thingDescriptorId": "Uuid", + "o:thingId": "Uuid", + "o:thingParams": "$ref:ParamList" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "o:displayMessage": "String", + "thingError": "$ref:ThingError" + } + }, + "Integrations.RemoveThing": { + "description": "Remove a thing and all its childs from the system. RemovePolicy is deprecated and has no effect any more.", + "params": { + "d:o:removePolicy": "String", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.SetActionLogging": { + "description": "Enable/disable logging for the given action type on the given thing.", + "params": { + "actionTypeId": "Uuid", + "enabled": "Bool", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.SetEventLogging": { + "description": "Enable/disable logging for the given event type on the given thing.", + "params": { + "enabled": "Bool", + "eventTypeId": "Uuid", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.SetPluginConfiguration": { + "description": "Set a plugin's params.", + "params": { + "configuration": "$ref:ParamList", + "pluginId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.SetStateFilter": { + "description": "Set the filter for the given state on the given thing.", + "params": { + "filter": "$ref:StateValueFilter", + "stateTypeId": "Uuid", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.SetStateLogging": { + "description": "Enable/disable logging for the given state type on the given thing.", + "params": { + "enabled": "Bool", + "stateTypeId": "Uuid", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "Integrations.SetThingSettings": { + "description": "Change the settings of a thing.", + "params": { + "settings": "$ref:ParamList", + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "thingError": "$ref:ThingError" + } + }, + "JSONRPC.Authenticate": { + "description": "Authenticate a client to the api via user & password challenge. Provide a device name which allows the user to identify the client and revoke the token in case the device is lost or stolen. This will return a new token to be used to authorize a client at the API.", + "params": { + "deviceName": "String", + "password": "String", + "username": "String" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "o:scopes": "$ref:PermissionScopes", + "o:token": "String", + "o:username": "String", + "success": "Bool" + } + }, + "JSONRPC.CreateUser": { + "description": "Create a new user in the API. This is only allowed to be called when the initial setup is required. To create additional users, use Users.CreateUser instead. Call Authenticate after this to obtain a device token for the newly created user.", + "params": { + "o:displayName": "String", + "o:email": "String", + "password": "String", + "username": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "JSONRPC.Hello": { + "description": "Initiates a connection. Use this method to perform an initial handshake of the connection. Optionally, a parameter \"locale\" is can be passed to set up the used locale for this connection. Strings such as ThingClass displayNames etc will be localized to this locale. If this parameter is omitted, the default system locale (depending on the configuration) is used. The reply of this method contains information about this core instance such as version information, uuid and its name. The locale valueindicates the locale used for this connection. Note: This method can be called multiple times. The locale used in the last call for this connection will be used. Other values, like initialSetupRequired might change if the setup has been performed in the meantime.\n The field cacheHashes may contain a map of methods and MD5 hashes. As long as the hash for a method does not change, a client may use a previously cached copy of the call instead of fetching the content again. While the Hello call doesn't necessarily require a token, this can be called with a token. If a token is provided, it will be verified and the reply contains information about the tokens validity and the user and permissions for the given token.", + "params": { + "o:locale": "String" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "authenticationRequired": "Bool", + "initialSetupRequired": "Bool", + "language": "String", + "locale": "String", + "name": "String", + "o:authenticated": "Bool", + "o:cacheHashes": [ + "$ref:CacheHash" + ], + "o:experiences": [ + "$ref:Experience" + ], + "o:permissionScopes": "$ref:PermissionScopes", + "o:username": "String", + "protocol version": "String", + "pushButtonAuthAvailable": "Bool", + "server": "String", + "uuid": "Uuid", + "version": "String" + } + }, + "JSONRPC.Introspect": { + "description": "Introspect this API.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "methods": "Object", + "notifications": "Object", + "types": "Object" + } + }, + "JSONRPC.KeepAlive": { + "description": "This is basically a Ping/Pong mechanism a client app may use to check server connectivity. Currently, the server does not actually do anything with this information and will return the call providing the given sessionId back to the caller. It is up to the client whether to use this or not and not required by the server to keep the connection alive.", + "params": { + "sessionId": "String" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "sessionId": "String", + "success": "Bool" + } + }, + "JSONRPC.RequestPushButtonAuth": { + "description": "Authenticate a client to the api via Push Button method. Provide a device name which allows the user to identify the client and revoke the token in case the device is lost or stolen. If push button hardware is available, this will return with success and start listening for push button presses. When the push button is pressed, the PushButtonAuthFinished notification will be sent to the requesting client. The procedure will be cancelled when the connection is interrupted. If another client requests push button authentication while a procedure is still going on, the second call will take over and the first one will be notified by the PushButtonAuthFinished signal about the error. The application should make it clear to the user to not press the button when the procedure fails as this can happen for 2 reasons: a) a second user is trying to auth at the same time and only the currently active user should press the button or b) it might indicate an attacker trying to take over and snooping in for tokens.", + "params": { + "deviceName": "String" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "success": "Bool", + "transactionId": "Int" + } + }, + "JSONRPC.SetNotificationStatus": { + "description": "Enable/Disable notifications for this connections. Either \"enabled\" or \"namespaces\" needs to be given but not both of them. The boolean based \"enabled\" parameter will enable/disable all notifications at once. If instead the list-based \"namespaces\" parameter is provided, all given namespaceswill be enabled, the others will be disabled. The return value of \"success\" will indicate success of the operation. The \"enabled\" property in the return value is deprecated and used for legacy compatibilty only. It will be set to true if at least one namespace has been enabled.", + "params": { + "d:o:enabled": "Bool", + "o:namespaces": "StringList" + }, + "permissionScope": "PermissionScopeNone", + "returns": { + "d:enabled": "Bool", + "namespaces": "StringList" + } + }, + "JSONRPC.Version": { + "description": "Version of this nymea/JSONRPC interface.", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "protocol version": "String", + "qtBuildVersion": "String", + "qtVersion": "String", + "version": "String" + } + }, + "Logging.GetLogEntries": { + "description": "Get the LogEntries matching the given filter. \n\"sources\": Builtin sources are: \"core\", \"rules\", \"scripts\", \"integrations\". May be extended by experience plugins.\n\"columns\": Columns to be returned.\n\"filter\": A map of column:value entries. Only = is supported currently.\n\"startTime\": The datetime of the oldest entry, in ms.\n\"endTime\": The datetime of the newest entry, in ms.\n\"sampleRate\": If given, returns a sampled series of the values, filling in gaps with the previous value.\n\"sortOrder\": Sort order of results. Note that this impacts the filling of gaps when resampling.\n\"limit\": Maximum amount of entries to be returned.\n\"offset\": Offset to be skipped before returning entries.", + "params": { + "o:columns": [ + "String" + ], + "o:endTime": "Uint", + "o:filter": "Variant", + "o:limit": "Int", + "o:offset": "Int", + "o:sampleRate": "$ref:SampleRate", + "o:sortOrder": "$ref:SortOrder", + "o:startTime": "Uint", + "sources": [ + "String" + ] + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "count": "Int", + "o:logEntries": "$ref:LogEntries", + "offset": "Int" + } + }, + "ModbusRtu.AddModbusRtuMaster": { + "description": "Add a new modbus RTU master with the given configuration. The timeout value is in milli seconds and the minimum value is 10 ms.", + "params": { + "baudrate": "Uint", + "dataBits": "$ref:SerialPortDataBits", + "numberOfRetries": "Uint", + "parity": "$ref:SerialPortParity", + "serialPort": "String", + "stopBits": "$ref:SerialPortStopBits", + "timeout": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "modbusError": "$ref:ModbusRtuError", + "o:modbusUuid": "Uuid" + } + }, + "ModbusRtu.GetModbusRtuMasters": { + "description": "Get the list of configured modbus RTU masters.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "modbusError": "$ref:ModbusRtuError", + "o:modbusRtuMasters": [ + "$ref:ModbusRtuMaster" + ] + } + }, + "ModbusRtu.GetSerialPorts": { + "description": "Get the list of available serial ports from the host system.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "serialPorts": "$ref:SerialPorts" + } + }, + "ModbusRtu.ReconfigureModbusRtuMaster": { + "description": "Reconfigure the modbus RTU master with the given UUID and configuration.", + "params": { + "baudrate": "Uint", + "dataBits": "$ref:SerialPortDataBits", + "modbusUuid": "Uuid", + "numberOfRetries": "Uint", + "parity": "$ref:SerialPortParity", + "serialPort": "String", + "stopBits": "$ref:SerialPortStopBits", + "timeout": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "modbusError": "$ref:ModbusRtuError" + } + }, + "ModbusRtu.RemoveModbusRtuMaster": { + "description": "Remove the modbus RTU master with the given modbus UUID.", + "params": { + "modbusUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "modbusError": "$ref:ModbusRtuError" + } + }, + "NetworkManager.ConnectWifiNetwork": { + "description": "Connect to the wifi network with the given ssid and password.", + "params": { + "interface": "String", + "o:password": "String", + "ssid": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError" + } + }, + "NetworkManager.CreateWiredConnection": { + "description": "Create a wired connection.", + "params": { + "interface": "String", + "o:dns": "String", + "o:gateway": "String", + "o:ip": "String", + "o:prefix": "Uint", + "type": "$ref:WiredNetworkConnectionType" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError" + } + }, + "NetworkManager.DisconnectInterface": { + "description": "Disconnect the given network interface. The interface will remain disconnected until the user connect it again.", + "params": { + "interface": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError" + } + }, + "NetworkManager.EnableNetworking": { + "description": "Enable or disable networking in the NetworkManager.", + "params": { + "enable": "Bool" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError" + } + }, + "NetworkManager.EnableWirelessNetworking": { + "description": "Enable or disable wireless networking in the NetworkManager.", + "params": { + "enable": "Bool" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError" + } + }, + "NetworkManager.GetNetworkDevices": { + "description": "Get the list of current network devices.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError", + "o:wiredNetworkDevices": [ + "$ref:WiredNetworkDevice" + ], + "o:wirelessNetworkDevices": [ + "$ref:WirelessNetworkDevice" + ] + } + }, + "NetworkManager.GetNetworkStatus": { + "description": "Get the current network manager status.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError", + "o:status": { + "networkingEnabled": "Bool", + "state": "$ref:NetworkManagerState", + "wirelessNetworkingEnabled": "Bool" + } + } + }, + "NetworkManager.GetWirelessAccessPoints": { + "description": "Get the current list of wireless network access points for the given interface. The interface has to be a WirelessNetworkDevice.", + "params": { + "interface": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError", + "o:wirelessAccessPoints": [ + "$ref:WirelessAccessPoint" + ] + } + }, + "NetworkManager.ScanWifiNetworks": { + "description": "Start a wifi scan for searching new networks.", + "params": { + "interface": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError" + } + }, + "NetworkManager.StartAccessPoint": { + "description": "Start a WiFi Access point on the given interface with the given SSID and password. Use DisconnectInterface to stop it again.", + "params": { + "interface": "String", + "password": "String", + "ssid": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networkManagerError": "$ref:NetworkManagerError" + } + }, + "NymeaEnergy.GetAcquisitionTolerance": { + "description": "Get the acquisition tolerance. This value will control how much solar surplus is required to start the charging.", + "params": {}, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "acquisitionTolerance": "Double" + } + }, + "NymeaEnergy.GetAvailableSpotMarketProviders": { + "description": "Get the list of available spot market data providers.", + "params": {}, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "providers": [ + "$ref:SpotMarketProviderInfo" + ] + } + }, + "NymeaEnergy.GetBatteryLevelConsideration": { + "description": "Get the battery level consideration. This value will control how much the energy storage is taking in account", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "batteryLevelConsideration": "Double" + } + }, + "NymeaEnergy.GetChargingInfos": { + "description": "Get the charging info for all or a single EV charger", + "params": { + "o:evChargerId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "chargingInfos": [ + "$ref:ChargingInfo" + ] + } + }, + "NymeaEnergy.GetChargingSchedules": { + "description": "Get the planed charging schedules.", + "params": {}, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "chargingSchedules": [ + "$ref:ChargingSchedule" + ] + } + }, + "NymeaEnergy.GetLockOnUnplug": { + "description": "Get the lock on unplug setting.", + "params": {}, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "lockOnUnplug": "Bool" + } + }, + "NymeaEnergy.GetPhasePowerLimit": { + "description": "Get the phase power consumption limit. 0 if unset. This needs to be set in order for the smart charging to do anything.", + "params": {}, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "phasePowerLimit": "Uint" + } + }, + "NymeaEnergy.GetSpotMarketConfiguration": { + "description": "Get the current spotmarket configuration.", + "params": {}, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "available": "Bool", + "enabled": "Bool", + "o:providerId": "Uuid" + } + }, + "NymeaEnergy.GetSpotMarketScoreEntries": { + "description": "Get the current score entries from the current spot market. If spot market is not enabled or not available, the list will be empty. The weighting of the available score entries goes from 0 (worst) to 1.0 (best).", + "params": {}, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "spotMarketScoreEntries": [ + "$ref:ScoreEntry" + ] + } + }, + "NymeaEnergy.SetAcquisitionTolerance": { + "description": "Set the acquisition tolerance for the charging.", + "params": { + "acquisitionTolerance": "Double" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "energyError": "$ref:EnergyError" + } + }, + "NymeaEnergy.SetBatteryLevelConsideration": { + "description": "Set the battery level consideration for the charging.", + "params": { + "batteryLevelConsideration": "Double" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "energyError": "$ref:EnergyError" + } + }, + "NymeaEnergy.SetChargingInfo": { + "description": "Set the charging info for an EV charger. Only given properties will be set, others will be untouched.", + "params": { + "chargingInfo": "$ref:ChargingInfo" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "energyError": "$ref:EnergyError" + } + }, + "NymeaEnergy.SetLockOnUnplug": { + "description": "Set the lock on unplug setting.", + "params": { + "lockOnUnplug": "Bool" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "energyError": "$ref:EnergyError" + } + }, + "NymeaEnergy.SetPhasePowerLimit": { + "description": "Set the phase power consumption limit. This is the maximum allowed Ampere per phase. A value of 0 means unset. All smart charging will be disabled.", + "params": { + "phasePowerLimit": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "energyError": "$ref:EnergyError" + } + }, + "NymeaEnergy.SetSpotMarketConfiguration": { + "description": "Set the current spotmarket configuration. If enabled, the provideId must be valid. You can get the available providers using GetAvailableSpotMarketProviders.", + "params": { + "enabled": "Bool", + "o:providerId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "energyError": "$ref:EnergyError" + } + }, + "Rules.AddRule": { + "description": "Add a rule. You can describe rules by one or many EventDesciptors and a StateEvaluator. Note that only one of either eventDescriptor or eventDescriptorList may be passed at a time. A rule can be created but left disabled, meaning it won't actually be executed until set to enabled. If not given, enabled defaults to true. A rule can have a list of actions and exitActions. It must have at least one Action. For state based rules, actions will be executed when the system enters a state matching the stateDescriptor. The exitActions will be executed when the system leaves the described state again. For event based rules, actions will be executed when a matching event happens and if the stateEvaluator matches the system's state. ExitActions for such rules will be executed when a matching event happens and the stateEvaluator is not matching the system's state. A rule marked as executable can be executed via the API using Rules.ExecuteRule, that means, its actions will be executed regardless of the eventDescriptor and stateEvaluators.", + "params": { + "actions": [ + "$ref:RuleAction" + ], + "name": "String", + "o:enabled": "Bool", + "o:eventDescriptors": [ + "$ref:EventDescriptor" + ], + "o:executable": "Bool", + "o:exitActions": [ + "$ref:RuleAction" + ], + "o:stateEvaluator": "$ref:StateEvaluator", + "o:timeDescriptor": "$ref:TimeDescriptor" + }, + "permissionScope": "PermissionScopeConfigureRules", + "returns": { + "o:ruleId": "Uuid", + "ruleError": "$ref:RuleError" + } + }, + "Rules.DisableRule": { + "description": "Disable a rule. The rule won't be triggered by it's events or state changes while it is disabled. If successful, the notification \"Rule.RuleConfigurationChanged\" will be emitted.", + "params": { + "ruleId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureRules", + "returns": { + "ruleError": "$ref:RuleError" + } + }, + "Rules.EditRule": { + "description": "Edit the parameters of a rule. The configuration of the rule with the given ruleId will be replaced with the new given configuration. In ordert to enable or disable a Rule, please use the methods \"Rules.EnableRule\" and \"Rules.DisableRule\". If successful, the notification \"Rule.RuleConfigurationChanged\" will be emitted.", + "params": { + "actions": [ + "$ref:RuleAction" + ], + "name": "String", + "o:enabled": "Bool", + "o:eventDescriptors": [ + "$ref:EventDescriptor" + ], + "o:executable": "Bool", + "o:exitActions": [ + "$ref:RuleAction" + ], + "o:stateEvaluator": "$ref:StateEvaluator", + "o:timeDescriptor": "$ref:TimeDescriptor", + "ruleId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureRules", + "returns": { + "o:rule": "$ref:Rule", + "ruleError": "$ref:RuleError" + } + }, + "Rules.EnableRule": { + "description": "Enabled a rule that has previously been disabled.If successful, the notification \"Rule.RuleConfigurationChanged\" will be emitted.", + "params": { + "ruleId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureRules", + "returns": { + "ruleError": "$ref:RuleError" + } + }, + "Rules.ExecuteActions": { + "description": "Execute the action list of the rule with the given ruleId.", + "params": { + "ruleId": "Uuid" + }, + "permissionScope": "PermissionScopeExecuteRules", + "returns": { + "ruleError": "$ref:RuleError" + } + }, + "Rules.ExecuteExitActions": { + "description": "Execute the exit action list of the rule with the given ruleId.", + "params": { + "ruleId": "Uuid" + }, + "permissionScope": "PermissionScopeExecuteRules", + "returns": { + "ruleError": "$ref:RuleError" + } + }, + "Rules.FindRules": { + "description": "Find a list of rules containing any of the given parameters.", + "params": { + "thingId": "Uuid" + }, + "permissionScope": "PermissionScopeExecuteRules", + "returns": { + "ruleIds": [ + "Uuid" + ] + } + }, + "Rules.GetRuleDetails": { + "description": "Get details for the rule identified by ruleId", + "params": { + "ruleId": "Uuid" + }, + "permissionScope": "PermissionScopeExecuteRules", + "returns": { + "o:rule": "$ref:Rule", + "ruleError": "$ref:RuleError" + } + }, + "Rules.GetRules": { + "description": "Get the descriptions of all configured rules. If you need more information about a specific rule use the method Rules.GetRuleDetails.", + "params": {}, + "permissionScope": "PermissionScopeExecuteRules", + "returns": { + "ruleDescriptions": [ + "$ref:RuleDescription" + ] + } + }, + "Rules.RemoveRule": { + "description": "Remove a rule", + "params": { + "ruleId": "Uuid" + }, + "permissionScope": "PermissionScopeConfigureRules", + "returns": { + "ruleError": "$ref:RuleError" + } + }, + "Scripts.AddScript": { + "description": "Add a script", + "params": { + "content": "String", + "name": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "o:errors": "StringList", + "o:script": "$ref:Script", + "scriptError": "$ref:ScriptError" + } + }, + "Scripts.EditScript": { + "description": "Edit a script", + "params": { + "id": "Uuid", + "o:content": "String", + "o:name": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "o:errors": "StringList", + "scriptError": "$ref:ScriptError" + } + }, + "Scripts.GetScriptContent": { + "description": "Get a scripts content.", + "params": { + "id": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "o:content": "String", + "scriptError": "$ref:ScriptError" + } + }, + "Scripts.GetScripts": { + "description": "Get all script, that is, their names and properties, but no content.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "scripts": "$ref:Scripts" + } + }, + "Scripts.RemoveScript": { + "description": "remove a script", + "params": { + "id": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "scriptError": "$ref:ScriptError" + } + }, + "System.CheckForUpdates": { + "description": "Instruct the system to poll the server for updates. Normally the system should automatically do this in regular intervals, however, if the client wants to allow the user to manually check for new updates now, this can be called. Returns true if the operation has been started successfully and the update manager will become busy. In order to know whether there are updates available, clients should walk through the list of packages retrieved from GetPackages and check whether there are packages with the updateAvailable flag set to true.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.EnableRepository": { + "description": "Enable or disable a repository.", + "params": { + "enabled": "Bool", + "repositoryId": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.FactoryReset": { + "description": "Reset nymea to factory defaults. Clients should warn the user before calling this method because all current configuration data will be lost, the server will restart immediately afterwards and it will come back up using the factory defaults if any are available.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.GetCapabilities": { + "description": "Get the list of capabilites on this system. The property \"powerManagement\" indicates whether restarting nymea and rebooting or shutting down is supported on this system. The property \"updateManagement\" indicates whether system update features are available in this system. The \"updateManagementType\" indicates which kind of update is supported on this platform. The property \"timeManagement\" indicates whether the system time can be configured on this system. Note that GetTime will be available in any case.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "powerManagement": "Bool", + "timeManagement": "Bool", + "updateManagement": "Bool", + "updateManagementType": "$ref:UpdateType" + } + }, + "System.GetPackages": { + "description": "Get the list of packages currently available to the system. This might include installed available but not installed packages. Installed packages will have the installedVersion set to a non-empty value.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "packages": "$ref:Packages" + } + }, + "System.GetRepositories": { + "description": "Get the list of repositories currently available to the system.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "repositories": "$ref:Repositories" + } + }, + "System.GetSystemInfo": { + "description": "Returns information about the system nymea is running on.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "deviceSerialNumber": "String" + } + }, + "System.GetTime": { + "description": "Get the system time and configuraton. The \"time\" and \"timeZone\" properties give the current server time and time zone. \"automaticTimeAvailable\" indicates whether this system supports automatically setting the clock (e.g. using NTP). \"automaticTime\" will be true if the system is configured to automatically update the clock.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "automaticTime": "Bool", + "automaticTimeAvailable": "Bool", + "time": "Uint", + "timeZone": "String" + } + }, + "System.GetTimeZones": { + "description": "Returns the list of IANA specified time zone IDs which can be used to select a time zone. It is not required to use this method if the client toolkit already provides means to obtain a list of IANA time zone ids.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "timeZones": "StringList" + } + }, + "System.GetUpdateStatus": { + "description": "Get the current status of the update system. \"busy\" indicates that the system is current busy with an operation regarding updates. This does not necessarily mean an actual update is running. When this is true, update related functions on the client should be marked as busy and no interaction with update components shall be allowed. An example for such a state is when the system queries the server if there are updates available, typically after a call to CheckForUpdates. \"updateRunning\" on the other hand indicates an actual update process is ongoing. The user should be informed about it, the system also might restart at any point while an update is running. The \"updateProgress\" property is optional, if the backend supports it, a progress >= 0 indicated the update progress in percentage.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "busy": "Bool", + "o:updateProgress": "Int", + "updateRunning": "Bool" + } + }, + "System.Reboot": { + "description": "Initiate a reboot of the system. The return value will indicate whether the procedure has been initiated successfully.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.RemovePackages": { + "description": "Starts removing a package. Returns true if the removal has been started successfully. Before calling this method, clients should check whether the package can be removed (canRemove set to true).", + "params": { + "packageIds": [ + "String" + ] + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.Restart": { + "description": "Initiate a restart of the nymea service. The return value will indicate whether the procedure has been initiated successfully.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.RollbackPackages": { + "description": "Starts a rollback. Returns true if the rollback has been started successfully. Before calling this method, clients should check whether the package can be rolled back (canRollback set to true).", + "params": { + "packageIds": [ + "String" + ] + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.SetTime": { + "description": "Set the system time configuraton. The system can be configured to update the time automatically by setting \"automaticTime\" to true. This will only work if the \"timeManagement\" capability is available on this system and \"GetTime\" indicates the availability of automatic time settings. If any of those requirements are not met, this method will return \"false\" in the \"success\" property. In order to manually configure the time, \"automaticTime\" should be set to false and \"time\" should be set. Note that if \"automaticTime\" is set to true and a manual \"time\" is still passed, the system will attempt to configure automatic time updates and only set the manual time if automatic mode fails. A time zone can always be passed optionally to change the system time zone and should be a IANA time zone id.", + "params": { + "o:automaticTime": "Bool", + "o:time": "Uint", + "o:timeZone": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.Shutdown": { + "description": "Initiate a shutdown of the system. The return value will indicate whether the procedure has been initiated successfully.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "System.UpdatePackages": { + "description": "Starts updating/installing packages with the given ids. Returns true if the upgrade has been started successfully. Note that it might still fail later. Before calling this method, clients should check the packages whether they are in a state where they can either be installed (no installedVersion set) or upgraded (updateAvailable set to true).", + "params": { + "o:packageIds": [ + "String" + ] + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "success": "Bool" + } + }, + "Tags.AddTag": { + "description": "Add a Tag. A Tag must have a thingId OR a ruleId (call this method twice if you want to attach the same tag to a thing and a rule), an appId (Use the appId of your app), a tagId (e.g. \"favorites\") and a value. Upon success, a TagAdded notification will be emitted. Calling this method twice for the same ids (thing/rule, appId and tagId) but with a different value will update the tag's value and the TagValueChanged notification will be emitted.", + "params": { + "tag": "$ref:Tag" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "tagError": "$ref:TagError" + } + }, + "Tags.GetTags": { + "description": "Get the Tags matching the given filter. Tags can be filtered by a thingID, a ruleId, an appId, a tagId or a combination of any (however, combining thingId and ruleId will return an empty result set).", + "params": { + "o:appId": "String", + "o:ruleId": "Uuid", + "o:tagId": "String", + "o:thingId": "Uuid" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "o:tags": "$ref:Tags", + "tagError": "$ref:TagError" + } + }, + "Tags.RemoveTag": { + "description": "Remove a Tag. Tag value is optional and will be disregarded. If the ids match, the tag will be deleted and a TagRemoved notification will be emitted.", + "params": { + "tag": "$ref:Tag" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "tagError": "$ref:TagError" + } + }, + "Transfers.CreateUpload": { + "description": "Create an upload session on the dedicated transfer connection.", + "params": { + "fileName": "String", + "size": "Int" + }, + "permissionScope": "PermissionScopeConfigureThings", + "returns": { + "fileName": "String", + "size": "Int", + "transferId": "String", + "transferToken": "String" + } + }, + "Transfers.StartDownload": { + "description": "Create a download session for a previously announced download.", + "params": { + "downloadId": "String" + }, + "permissionScope": "PermissionScopeControlThings", + "returns": { + "fileName": "String", + "size": "Int", + "transferId": "String", + "transferToken": "String" + } + }, + "Users.ChangePassword": { + "description": "Change the password for the currently logged in user.", + "params": { + "newPassword": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "Users.ChangeUserPassword": { + "description": "Change the password for the given user. All tokens for this user will be removed in order to force all clients to log in again.", + "params": { + "newPassword": "String", + "username": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "Users.CreateUser": { + "description": "Create a new user in the API with the given username and password. Use scopes to define the permissions for the new user. If the user has not the permission \"PermissionScopeAccessAllThings\", the list of things this user has access to can be defined in the \"allowedThingIds\" property. If no scopes are given, this user will be an admin user. Call Authenticate after this to obtain a device token for this user.", + "params": { + "o:allowedThingIds": [ + "Uuid" + ], + "o:displayName": "String", + "o:email": "String", + "o:scopes": "$ref:PermissionScopes", + "password": "String", + "username": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "Users.GetTokens": { + "description": "Get all the tokens for the current user.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError", + "o:tokenInfoList": "$ref:TokenInfoList" + } + }, + "Users.GetUserInfo": { + "description": "Get info about the current token (the currently logged in user).", + "params": {}, + "permissionScope": "PermissionScopeNone", + "returns": { + "error": "$ref:UserError", + "o:userInfo": "$ref:UserInfo" + } + }, + "Users.GetUserTokens": { + "description": "Get all the tokens for the given username.", + "params": { + "username": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError", + "o:tokenInfoList": "$ref:TokenInfoList" + } + }, + "Users.GetUsers": { + "description": "Return a list of all users in the system.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "users": "$ref:UserInfoList" + } + }, + "Users.RemoveToken": { + "description": "Revoke access for a given token. Depending on the logged in user only the own tokens can be removed. If you are logged in as admin, any token can be removed.", + "params": { + "tokenId": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "Users.RemoveUser": { + "description": "Remove a user from the system.", + "params": { + "username": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "Users.SetUserInfo": { + "description": "Change user info. If username is given, info for the respective user is changed, otherwise the current user info is edited. Requires admin permissions to edit user info other than the own.", + "params": { + "o:displayName": "String", + "o:email": "String", + "o:username": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "Users.SetUserScopes": { + "description": "Set the permissions (scopes) for a given user. If the user has not the permission \"PermissionScopeAccessAllThings\" the list of thing IDs this user has access to can be defined in the \"allowedThingIds\" property.", + "params": { + "o:allowedThingIds": [ + "Uuid" + ], + "scopes": "$ref:PermissionScopes", + "username": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "error": "$ref:UserError" + } + }, + "ZWave.AddNetwork": { + "description": "Add a new Z-Wave network with the given serial port.", + "params": { + "serialPort": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "o:networkUuid": "Uuid", + "zwaveError": "$ref:ZWaveError" + } + }, + "ZWave.AddNode": { + "description": "Start the node inclusion procedure for the given Z-Wave network.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zwaveError": "$ref:ZWaveError" + } + }, + "ZWave.CancelPendingOperation": { + "description": "Cancel any running node inclusion or removal procedure for the given Z-Wave network.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zwaveError": "$ref:ZWaveError" + } + }, + "ZWave.FactoryResetNetwork": { + "description": "Factory reset the controller for the given Z-Wave network.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zwaveError": "$ref:ZWaveError" + } + }, + "ZWave.GetNetworks": { + "description": "Get all the Z-Wave networks in the system.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "networks": [ + "$ref:ZWaveNetwork" + ] + } + }, + "ZWave.GetNodes": { + "description": "Get the list of nodes in a network", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "o:nodes": [ + "$ref:ZWaveNode" + ], + "zwaveError": "$ref:ZWaveError" + } + }, + "ZWave.GetSerialPorts": { + "description": "Get the list of available serial ports from the host system.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "serialPorts": "$ref:SerialPorts" + } + }, + "ZWave.IsZWaveAvailable": { + "description": "Query if the Z-Wave subsystem is available at all.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "available": "Bool" + } + }, + "ZWave.RemoveFailedNode": { + "description": "Remove the given failed node from the given Z-Wave network. This will not work if node is not marked as failed.", + "params": { + "networkUuid": "Uuid", + "nodeId": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zwaveError": "$ref:ZWaveError" + } + }, + "ZWave.RemoveNetwork": { + "description": "Remove the given Z-Wave network from the system.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zwaveError": "$ref:ZWaveError" + } + }, + "ZWave.RemoveNode": { + "description": "Start the node removal procedure for the given Z-Wave network.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zwaveError": "$ref:ZWaveError" + } + }, + "Zigbee.AddNetwork": { + "description": "Create a new ZigBee network for the given 'serialPort', 'baudRate' and 'backend'. The serial ports can be fetched from the available adapters. See 'GetAdapters' for more information. The available backends can be fetched using the 'GetAvailableBackends' method.", + "params": { + "backend": "String", + "baudRate": "Uint", + "o:channelMask": "Uint", + "serialPort": "String" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "o:networkUuid": "Uuid", + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.CreateBinding": { + "description": "Create a binding. Use destinationAddress and destinationEndpointId to create a node to node binding, or use destinationGroupAddress to create a group binding.", + "params": { + "clusterId": "Uint", + "networkUuid": "Uuid", + "o:destinationAddress": "String", + "o:destinationEndpointId": "Uint", + "o:destinationGroupAddress": "Uint", + "sourceAddress": "String", + "sourceEndpointId": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.FactoryResetNetwork": { + "description": "Factory reset the network with the given 'networkUuid'. The network does not have to be online for this procedure, and all associated nodes and things will be removed permanently.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.GetAdapters": { + "description": "Get the list of available ZigBee adapters and serial ports in order to set up the ZigBee network on the desired interface. The 'serialPort' property can be used as unique identifier for an adapter. If an adapter hardware has been recognized as a well known ZigBee adapter, the 'hardwareRecognized' property will be true and the 'baudRate' and 'backend' configurations can be used as they where given, otherwise the user might set the backend and baud rate manually. The available backends can be fetched using the GetAvailableBackends method.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "adapters": "$ref:ZigbeeAdapters" + } + }, + "Zigbee.GetAvailableBackends": { + "description": "Get the list of available ZigBee backends.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "backends": [ + "String" + ] + } + }, + "Zigbee.GetNetworks": { + "description": "Returns the list of configured ZigBee networks in the system.", + "params": {}, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeNetworks": [ + "$ref:ZigbeeNetwork" + ] + } + }, + "Zigbee.GetNodes": { + "description": "Returns the list of ZigBee nodes from the network the given 'networkUuid' in the system.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "o:zigbeeNodes": [ + "$ref:ZigbeeNode" + ], + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.RefreshBindings": { + "description": "Refresh the binding table for the given node.", + "params": { + "ieeeAddress": "String", + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.RefreshNeighborTables": { + "description": "Refresh the neighbor table for all nodes. Note that calling this may cause a lot of traffic in the ZigBee network.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.RemoveBinding": { + "description": "Remove a binding.", + "params": { + "clusterId": "Uint", + "networkUuid": "Uuid", + "o:destinationAddress": "String", + "o:destinationEndpointId": "Uint", + "o:destinationGroupAddress": "Uint", + "sourceAddress": "String", + "sourceEndpointId": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.RemoveNetwork": { + "description": "Remove the ZigBee network with the given network uuid.", + "params": { + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.RemoveNode": { + "description": "Remove a ZigBee node with the given 'ieeeAddress' from the network with the given 'networkUuid'. If there is a thing configured for this node, also the thing will be removed from the system. The coordinator node cannot be removed.", + "params": { + "ieeeAddress": "String", + "networkUuid": "Uuid" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + }, + "Zigbee.SetPermitJoin": { + "description": "Allow or deny nodes to join the network with the given 'networkUuid' for a specific 'duration' in seconds. The duration value has to be between 0 and 255 seconds. The 'permitJoinDuration' property of ZigBee network object indicates how long permit has been enabled and the 'permitJoiningRemaining' indicates the rest of the time. Those values can be used to show a countdown or progressbar. This method can be recalled for resetting the timeout. If the duration is set to 0 seconds, joining will be disabled immediatly for the entire network. The 'shortAddress' is optional and defaults to the broadcast address 0xfffc for all routers in the network. If the short address matches the address of a router node in the network, only that specific router will be able to allow new nodes to join the network. A new node will join to the router with the best link quality index (LQI).", + "params": { + "duration": "Uint", + "networkUuid": "Uuid", + "o:shortAddress": "Uint" + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "zigbeeError": "$ref:ZigbeeError" + } + } + }, + "notifications": { + "AirConditioning.ZoneAdded": { + "description": "Emitted whenever a zone is added", + "params": { + "zone": "$ref:ZoneInfo" + } + }, + "AirConditioning.ZoneChanged": { + "description": "Emitted whenever a zone changes", + "params": { + "zone": "$ref:ZoneInfo" + } + }, + "AirConditioning.ZoneRemoved": { + "description": "Emitted whenever a zone is removed", + "params": { + "zoneId": "Uuid" + } + }, + "AppData.Changed": { + "description": "Emitted whenever the app data is changed on the server.", + "params": { + "appId": "String", + "key": "String", + "o:group": "String", + "value": "String" + } + }, + "Configuration.BackupConfigurationChanged": { + "description": "Emitted whenever the backup configuration changes.", + "params": { + "autoBackupEnabled": "Bool", + "autoBackupInterval": "Int", + "destinationDirectory": "String", + "maxCount": "Uint" + } + }, + "Configuration.BackupFilesChanged": { + "description": "Emitted whenever the list of backup files changes.", + "params": { + "backupFiles": [ + "$ref:BackupFile" + ] + } + }, + "Configuration.BasicConfigurationChanged": { + "description": "Emitted whenever the basic configuration of this server changes.", + "params": { + "basicConfiguration": { + "d:language": "String", + "d:location": { + "latitude": "Double", + "longitude": "Double", + "name": "String" + }, + "d:serverTime": "Uint", + "d:timeZone": "String", + "debugServerEnabled": "Bool", + "serverName": "String", + "serverUuid": "Uuid" + } + } + }, + "Configuration.MqttPolicyChanged": { + "description": "Emitted whenever a MQTT broker policy is changed.", + "params": { + "policy": "$ref:MqttPolicy" + } + }, + "Configuration.MqttPolicyRemoved": { + "description": "Emitted whenever a MQTT broker policy is removed.", + "params": { + "clientId": "String" + } + }, + "Configuration.MqttServerConfigurationChanged": { + "description": "Emitted whenever the MQTT broker configuration is changed.", + "params": { + "mqttServerConfiguration": "$ref:ServerConfiguration" + } + }, + "Configuration.MqttServerConfigurationRemoved": { + "description": "Emitted whenever a MQTT server configuration is removed.", + "params": { + "id": "String" + } + }, + "Configuration.TcpServerConfigurationChanged": { + "description": "Emitted whenever the TCP server configuration changes.", + "params": { + "tcpServerConfiguration": "$ref:ServerConfiguration" + } + }, + "Configuration.TcpServerConfigurationRemoved": { + "description": "Emitted whenever a TCP server configuration is removed.", + "params": { + "id": "String" + } + }, + "Configuration.TunnelProxyServerConfigurationChanged": { + "description": "Emitted whenever the tunnel proxy server configuration changes.", + "params": { + "tunnelProxyServerConfiguration": "$ref:TunnelProxyServerConfiguration" + } + }, + "Configuration.TunnelProxyServerConfigurationRemoved": { + "description": "Emitted whenever a tunnel proxy server configuration is removed.", + "params": { + "id": "String" + } + }, + "Configuration.WebServerConfigurationChanged": { + "description": "Emitted whenever the web server configuration changes.", + "params": { + "webServerConfiguration": "$ref:WebServerConfiguration" + } + }, + "Configuration.WebServerConfigurationRemoved": { + "description": "Emitted whenever a Web server configuration is removed.", + "params": { + "id": "String" + } + }, + "Configuration.WebSocketServerConfigurationChanged": { + "description": "Emitted whenever the web socket server configuration changes.", + "params": { + "webSocketServerConfiguration": "$ref:ServerConfiguration" + } + }, + "Configuration.WebSocketServerConfigurationRemoved": { + "description": "Emitted whenever a WebSocket server configuration is removed.", + "params": { + "id": "String" + } + }, + "Debug.LoggingCategoryLevelChanged": { + "description": "Emitted whenever a logging category has changed the logging level.", + "params": { + "level": "$ref:LoggingLevel", + "name": "String" + } + }, + "Energy.PowerBalanceChanged": { + "description": "Emitted whenever the energy balance changes. That is, when the current consumption, production or acquisition changes. Typically they will all change at the same time.", + "params": { + "currentPowerAcquisition": "Double", + "currentPowerConsumption": "Double", + "currentPowerProduction": "Double", + "currentPowerStorage": "Double", + "totalAcquisition": "Double", + "totalConsumption": "Double", + "totalProduction": "Double", + "totalReturn": "Double" + } + }, + "Energy.PowerBalanceLogEntryAdded": { + "description": "Emitted whenever an entry is added to the power balance log.", + "params": { + "powerBalanceLogEntry": "$ref:PowerBalanceLogEntry", + "sampleRate": "$ref:SampleRate" + } + }, + "Energy.RootMeterChanged": { + "description": "Emitted whenever the root meter id changes. If the root meter has been unset, the params will be empty.", + "params": { + "o:rootMeterThingId": "Uuid" + } + }, + "Energy.ThingPowerLogEntryAdded": { + "description": "Emitted whenever an entry is added to the thing power log.", + "params": { + "sampleRate": "$ref:SampleRate", + "thingPowerLogEntry": "$ref:ThingPowerLogEntry" + } + }, + "Integrations.EventTriggered": { + "description": "Emitted whenever an Event is triggered.", + "params": { + "event": "$ref:Event" + } + }, + "Integrations.IOConnectionAdded": { + "description": "Emitted whenever an IO connection has been added.", + "params": { + "ioConnection": "$ref:IOConnection" + } + }, + "Integrations.IOConnectionRemoved": { + "description": "Emitted whenever an IO connection has been removed.", + "params": { + "ioConnectionId": "Uuid" + } + }, + "Integrations.PluginConfigurationChanged": { + "description": "Emitted whenever a plugin's configuration is changed.", + "params": { + "configuration": "$ref:ParamList", + "pluginId": "Uuid" + } + }, + "Integrations.StateChanged": { + "description": "Emitted whenever a state of a thing changes.", + "params": { + "maxValue": "Variant", + "minValue": "Variant", + "possibleValues": [ + "Variant" + ], + "stateTypeId": "Uuid", + "thingId": "Uuid", + "value": "Variant" + } + }, + "Integrations.ThingAdded": { + "description": "Emitted whenever a thing was added.", + "params": { + "thing": "$ref:Thing" + } + }, + "Integrations.ThingChanged": { + "description": "Emitted whenever the params or name of a thing are changed (by EditThing or ReconfigureThing).", + "params": { + "thing": "$ref:Thing" + } + }, + "Integrations.ThingRemoved": { + "description": "Emitted whenever a thing was removed.", + "params": { + "thingId": "Uuid" + } + }, + "Integrations.ThingSettingChanged": { + "description": "Emitted whenever the setting of a thing is changed.", + "params": { + "paramTypeId": "Uuid", + "thingId": "Uuid", + "value": "Variant" + } + }, + "JSONRPC.PushButtonAuthFinished": { + "description": "Emitted when a push button authentication reaches final state. NOTE: This notification is special. It will only be emitted to connections that did actively request a push button authentication, but also it will be emitted regardless of the notification settings. ", + "params": { + "o:token": "String", + "success": "Bool", + "transactionId": "Int" + } + }, + "Logging.LogEntryAdded": { + "description": "Emitted when a log entry is added. This will only be emitted for discrete series, not for resampled entries", + "params": { + "logEntry": "$ref:LogEntry" + } + }, + "ModbusRtu.ModbusRtuMasterAdded": { + "description": "Emitted whenever a new modbus RTU master has been added to the system.", + "params": { + "modbusRtuMaster": "$ref:ModbusRtuMaster" + } + }, + "ModbusRtu.ModbusRtuMasterChanged": { + "description": "Emitted whenever a modbus RTU master has been changed in the system.", + "params": { + "modbusRtuMaster": "$ref:ModbusRtuMaster" + } + }, + "ModbusRtu.ModbusRtuMasterRemoved": { + "description": "Emitted whenever a modbus RTU master has been removed from the system.", + "params": { + "modbusUuid": "Uuid" + } + }, + "ModbusRtu.SerialPortAdded": { + "description": "Emitted whenever a serial port has been added to the system.", + "params": { + "serialPort": "$ref:SerialPort" + } + }, + "ModbusRtu.SerialPortRemoved": { + "description": "Emitted whenever a serial port has been removed from the system.", + "params": { + "serialPort": "$ref:SerialPort" + } + }, + "NetworkManager.NetworkStatusChanged": { + "description": "Emitted whenever a status of a NetworkManager changes.", + "params": { + "status": { + "networkingEnabled": "Bool", + "state": "$ref:NetworkManagerState", + "wirelessNetworkingEnabled": "Bool" + } + } + }, + "NetworkManager.WiredNetworkDeviceAdded": { + "description": "Emitted whenever a new WiredNetworkDevice was added.", + "params": { + "wiredNetworkDevice": "$ref:WiredNetworkDevice" + } + }, + "NetworkManager.WiredNetworkDeviceChanged": { + "description": "Emitted whenever the given WiredNetworkDevice has changed.", + "params": { + "wiredNetworkDevice": "$ref:WiredNetworkDevice" + } + }, + "NetworkManager.WiredNetworkDeviceRemoved": { + "description": "Emitted whenever a WiredNetworkDevice was removed.", + "params": { + "interface": "String" + } + }, + "NetworkManager.WirelessNetworkDeviceAdded": { + "description": "Emitted whenever a new WirelessNetworkDevice was added.", + "params": { + "wirelessNetworkDevice": "$ref:WirelessNetworkDevice" + } + }, + "NetworkManager.WirelessNetworkDeviceChanged": { + "description": "Emitted whenever the given WirelessNetworkDevice has changed.", + "params": { + "wirelessNetworkDevice": "$ref:WirelessNetworkDevice" + } + }, + "NetworkManager.WirelessNetworkDeviceRemoved": { + "description": "Emitted whenever a WirelessNetworkDevice was removed.", + "params": { + "interface": "String" + } + }, + "NymeaEnergy.AcquisitionToleranceChanged": { + "description": "Emitted whenever the acquisition tolerance changes.", + "params": { + "acquisitionTolerance": "Double" + } + }, + "NymeaEnergy.BatteryLevelConsiderationChanged": { + "description": "Emitted whenever the battery level consideration changes.", + "params": { + "batteryLevelConsideration": "Double" + } + }, + "NymeaEnergy.ChargingInfoAdded": { + "description": "Emitted whenever a charging info is added.", + "params": { + "chargingInfo": "$ref:ChargingInfo" + } + }, + "NymeaEnergy.ChargingInfoChanged": { + "description": "Emitted whenever a charging info changes.", + "params": { + "chargingInfo": "$ref:ChargingInfo" + } + }, + "NymeaEnergy.ChargingInfoRemoved": { + "description": "Emitted whenever a charging info is removed.", + "params": { + "evChargerThingId": "Uuid" + } + }, + "NymeaEnergy.ChargingSchedulesChanged": { + "description": "Emitted whenever the planed charging schedules have changed.", + "params": { + "chargingSchedules": [ + "$ref:ChargingSchedule" + ], + "o:degradedMode": "Bool" + } + }, + "NymeaEnergy.LockOnUnplugChanged": { + "description": "Emitted whenever the lock on unplug setting changes.", + "params": { + "lockOnUnplug": "Bool" + } + }, + "NymeaEnergy.PhasePowerLimitChanged": { + "description": "Emitted whenever the phase power limit configuration changes.", + "params": { + "phasePowerLimit": "Uint" + } + }, + "NymeaEnergy.SpotMarketConfigurationChanged": { + "description": "Emitted whenever a spot market configuration has changed.", + "params": { + "available": "Bool", + "enabled": "Bool", + "o:providerId": "Uuid" + } + }, + "NymeaEnergy.SpotMarketScoreEntriesChanged": { + "description": "Emitted whenever the score entries of the current spot market provider changed. The weighting of the available score entries goes from 0 (worst) to 1.0 (best).", + "params": { + "spotMarketScoreEntries": [ + "$ref:ScoreEntry" + ] + } + }, + "NymeaEnergy.SpotMarketStatusChanged": { + "description": "Emitted whenever the spot market manager status changed.", + "params": { + "available": "Bool", + "enabled": "Bool" + } + }, + "Rules.RuleActiveChanged": { + "description": "Emitted whenever the active state of a Rule changed.", + "params": { + "active": "Bool", + "ruleId": "Uuid" + } + }, + "Rules.RuleAdded": { + "description": "Emitted whenever a Rule was added.", + "params": { + "rule": "$ref:Rule" + } + }, + "Rules.RuleConfigurationChanged": { + "description": "Emitted whenever the configuration of a Rule changed.", + "params": { + "rule": "$ref:Rule" + } + }, + "Rules.RuleRemoved": { + "description": "Emitted whenever a Rule was removed.", + "params": { + "ruleId": "Uuid" + } + }, + "Scripts.ScriptAdded": { + "description": "Emitted when a script has been added to the system.", + "params": { + "script": "$ref:Script" + } + }, + "Scripts.ScriptChanged": { + "description": "Emitted when a script has been changed in the system (e.g. renamed).", + "params": { + "name": "String", + "scriptId": "Uuid" + } + }, + "Scripts.ScriptContentChanged": { + "description": "Emitted when a script's content has been changed in the system.", + "params": { + "scriptId": "Uuid" + } + }, + "Scripts.ScriptLogMessage": { + "description": "Emitted when a script produces a console message.", + "params": { + "message": "String", + "scriptId": "Uuid", + "type": "$ref:ScriptMessageType" + } + }, + "Scripts.ScriptRemoved": { + "description": "Emitted when a script has been removed from the system.", + "params": { + "id": "Uuid" + } + }, + "System.CapabilitiesChanged": { + "description": "Emitted whenever the system capabilities change.", + "params": { + "powerManagement": "Bool", + "updateManagement": "Bool", + "updateManagementType": "$ref:UpdateType" + } + }, + "System.PackageAdded": { + "description": "Emitted whenever a package is added to the list of packages.", + "params": { + "package": "$ref:Package" + } + }, + "System.PackageChanged": { + "description": "Emitted whenever a package in the list of packages changes.", + "params": { + "package": "$ref:Package" + } + }, + "System.PackageRemoved": { + "description": "Emitted whenever a package is removed from the list of packages.", + "params": { + "packageId": "String" + } + }, + "System.RepositoryAdded": { + "description": "Emitted whenever a repository is added to the list of repositories.", + "params": { + "repository": "$ref:Repository" + } + }, + "System.RepositoryChanged": { + "description": "Emitted whenever a repository in the list of repositories changes.", + "params": { + "repository": "$ref:Repository" + } + }, + "System.RepositoryRemoved": { + "description": "Emitted whenever a repository is removed from the list of repositories.", + "params": { + "repositoryId": "String" + } + }, + "System.TimeConfigurationChanged": { + "description": "Emitted whenever the time configuration is changed", + "params": { + "automaticTime": "Bool", + "automaticTimeAvailable": "Bool", + "time": "Uint", + "timeZone": "String" + } + }, + "System.UpdateStatusChanged": { + "description": "Emitted whenever the update status changes.", + "params": { + "busy": "Bool", + "o:updateProgress": "Int", + "updateRunning": "Bool" + } + }, + "Tags.TagAdded": { + "description": "Emitted whenever a tag is added to the system. ", + "params": { + "tag": "$ref:Tag" + } + }, + "Tags.TagRemoved": { + "description": "Emitted whenever a tag is removed from the system. ", + "params": { + "tag": "$ref:Tag" + } + }, + "Tags.TagValueChanged": { + "description": "Emitted whenever a tag's value is changed in the system. ", + "params": { + "tag": "$ref:Tag" + } + }, + "Transfers.DownloadAvailable": { + "description": "Emitted when a completed upload can be downloaded on the dedicated transfer connection.", + "params": { + "downloadId": "String", + "fileName": "String", + "size": "Int" + } + }, + "Users.PushButtonAuthFinished": { + "description": "Emitted when a push button authentication reaches final state. NOTE: This notification is special. It will only be emitted to connections that did actively request a push button authentication, but also it will be emitted regardless of the notification settings.", + "params": { + "o:token": "String", + "success": "Bool", + "transactionId": "Int" + } + }, + "Users.UserAdded": { + "description": "Emitted when a user is added to the system.", + "params": { + "userInfo": "$ref:UserInfo" + } + }, + "Users.UserChanged": { + "description": "Emitted whenever a user is changed.", + "params": { + "userInfo": "$ref:UserInfo" + } + }, + "Users.UserRemoved": { + "description": "Emitted when a user is removed from the system.", + "params": { + "username": "String" + } + }, + "ZWave.NetworkAdded": { + "description": "Emitted whenever a new Z-Wave network has been added to the system.", + "params": { + "network": "$ref:ZWaveNetwork" + } + }, + "ZWave.NetworkChanged": { + "description": "Emitted whenever a Z-Wave network changes.", + "params": { + "network": "$ref:ZWaveNetwork" + } + }, + "ZWave.NetworkRemoved": { + "description": "Emitted whenever a Z-Wave network has been removed from the system.", + "params": { + "networkUuid": "Uuid" + } + }, + "ZWave.NodeAdded": { + "description": "Emitted whenever a Z-Wave node is added.", + "params": { + "networkUuid": "Uuid", + "node": "$ref:ZWaveNode" + } + }, + "ZWave.NodeChanged": { + "description": "Emitted whenever a Z-Wave node has changed.", + "params": { + "networkUuid": "Uuid", + "node": "$ref:ZWaveNode" + } + }, + "ZWave.NodeRemoved": { + "description": "Emitted whenever a Z-Wave node is removed.", + "params": { + "networkUuid": "Uuid", + "nodeId": "Uint" + } + }, + "Zigbee.AdapterAdded": { + "description": "Emitted whenever a new ZigBee adapter or serial port has been detected in the system.", + "params": { + "adapter": "$ref:ZigbeeAdapter" + } + }, + "Zigbee.AdapterRemoved": { + "description": "Emitted whenever a ZigBee adapter or serial port has been removed from the system (i.e. unplugged).", + "params": { + "adapter": "$ref:ZigbeeAdapter" + } + }, + "Zigbee.NetworkAdded": { + "description": "Emitted whenever a new ZigBee network has been added.", + "params": { + "zigbeeNetwork": "$ref:ZigbeeNetwork" + } + }, + "Zigbee.NetworkChanged": { + "description": "Emitted whenever a new ZigBee network has changed.", + "params": { + "zigbeeNetwork": "$ref:ZigbeeNetwork" + } + }, + "Zigbee.NetworkRemoved": { + "description": "Emitted whenever a new ZigBee network has been removed.", + "params": { + "networkUuid": "Uuid" + } + }, + "Zigbee.NodeAdded": { + "description": "Emitted whenever a new ZigBee node has joined the network with the given 'networkUuid'.", + "params": { + "networkUuid": "Uuid", + "zigbeeNode": "$ref:ZigbeeNode" + } + }, + "Zigbee.NodeChanged": { + "description": "Emitted whenever a ZigBee node has changed.", + "params": { + "networkUuid": "Uuid", + "zigbeeNode": "$ref:ZigbeeNode" + } + }, + "Zigbee.NodeRemoved": { + "description": "Emitted whenever a ZigBee node has removed from the network with the given 'networkUuid'.", + "params": { + "networkUuid": "Uuid", + "zigbeeNode": "$ref:ZigbeeNode" + } + } + }, + "types": { + "Action": { + "actionTypeId": "Uuid", + "o:params": "$ref:ParamList", + "thingId": "Uuid" + }, + "ActionType": { + "displayName": "String", + "index": "Int", + "name": "String", + "paramTypes": "$ref:ParamTypes", + "r:id": "Uuid" + }, + "ActionTypes": [ + "$ref:ActionType" + ], + "BackupFile": { + "r:fileName": "String", + "r:serverVersion": "String", + "r:size": "Double", + "r:timestamp": "Uint" + }, + "BackupFiles": [ + "$ref:BackupFile" + ], + "BrowserItem": { + "actionTypeIds": [ + "Uuid" + ], + "browsable": "Bool", + "description": "String", + "disabled": "Bool", + "displayName": "String", + "executable": "Bool", + "icon": "$ref:BrowserIcon", + "id": "String", + "o:mediaIcon": "$ref:MediaBrowserIcon", + "thumbnail": "String" + }, + "CacheHash": { + "hash": "String", + "method": "String" + }, + "CalendarItem": { + "duration": "Uint", + "o:datetime": "Uint", + "o:repeating": "$ref:RepeatingOption", + "o:startTime": "Time" + }, + "CalendarItems": [ + "$ref:CalendarItem" + ], + "ChargingAction": { + "chargingEnabled": "Bool", + "desiredPhaseCount": "Uint", + "issuer": "$ref:ChargingActionIssuer", + "maxChargingCurrent": "Double" + }, + "ChargingInfo": { + "chargingMode": "$ref:ChargingMode", + "evChargerId": "Uuid", + "o:assignedCarId": "Uuid", + "o:dailySpotMarketPercentage": "Uint", + "o:endDateTime": "Uint", + "o:repeatDays": [ + "Int" + ], + "o:spotMarketChargingEnabled": "Bool", + "o:targetPercentage": "Uint", + "r:chargingState": "$ref:ChargingState" + }, + "ChargingInfos": [ + "$ref:ChargingInfo" + ], + "ChargingSchedule": { + "action": "$ref:ChargingAction", + "endDateTime": "Uint", + "evChargerId": "Uuid", + "startDateTime": "Uint" + }, + "ChargingSchedules": [ + "$ref:ChargingSchedule" + ], + "Event": { + "r:eventTypeId": "Uuid", + "r:params": "$ref:ParamList", + "r:thingId": "Uuid" + }, + "EventDescriptor": { + "o:eventTypeId": "Uuid", + "o:interface": "String", + "o:interfaceEvent": "String", + "o:paramDescriptors": "$ref:ParamDescriptors", + "o:thingId": "Uuid" + }, + "EventDescriptors": [ + "$ref:EventDescriptor" + ], + "EventType": { + "displayName": "String", + "name": "String", + "paramTypes": "$ref:ParamTypes", + "r:id": "Uuid", + "r:index": "Int" + }, + "EventTypes": [ + "$ref:EventType" + ], + "Experience": { + "name": "String", + "version": "String" + }, + "IOConnection": { + "r:id": "Uuid", + "r:inputStateTypeId": "Uuid", + "r:inputThingId": "Uuid", + "r:inverted": "Bool", + "r:outputStateTypeId": "Uuid", + "r:outputThingId": "Uuid" + }, + "IOConnections": [ + "$ref:IOConnection" + ], + "IntegrationPlugin": { + "r:displayName": "String", + "r:id": "Uuid", + "r:name": "String", + "r:paramTypes": "$ref:ParamTypes" + }, + "IntegrationPlugins": [ + "$ref:IntegrationPlugin" + ], + "LogEntries": [ + "$ref:LogEntry" + ], + "LogEntry": { + "r:source": "String", + "r:timestamp": "Uint", + "r:values": "Object" + }, + "LoggingCategory": { + "level": "$ref:LoggingLevel", + "name": "String", + "type": "$ref:LoggingCategoryType" + }, + "ModbusRtuMaster": { + "baudrate": "Uint", + "connected": "Bool", + "dataBits": "$ref:SerialPortDataBits", + "modbusUuid": "Uuid", + "numberOfRetries": "Uint", + "parity": "$ref:SerialPortParity", + "serialPort": "String", + "stopBits": "$ref:SerialPortStopBits", + "timeout": "Uint" + }, + "MqttPolicy": { + "allowedPublishTopicFilters": "StringList", + "allowedSubscribeTopicFilters": "StringList", + "clientId": "String", + "password": "String", + "username": "String" + }, + "Package": { + "r:canRemove": "Bool", + "r:candidateVersion": "String", + "r:changelog": "String", + "r:displayName": "String", + "r:id": "String", + "r:installedVersion": "String", + "r:rollbackAvailable": "Bool", + "r:summary": "String", + "r:updateAvailable": "Bool" + }, + "Packages": [ + "$ref:Package" + ], + "Param": { + "o:paramTypeId": "Uuid", + "value": "Variant" + }, + "ParamDescriptor": { + "o:paramName": "String", + "o:paramTypeId": "Uuid", + "operator": "$ref:ValueOperator", + "value": "Variant" + }, + "ParamDescriptors": [ + "$ref:ParamDescriptor" + ], + "ParamList": [ + "$ref:Param" + ], + "ParamType": { + "displayName": "String", + "index": "Int", + "name": "String", + "o:allowedValues": [ + "Variant" + ], + "o:defaultValue": "Variant", + "o:inputType": "$ref:InputType", + "o:maxValue": "Variant", + "o:minValue": "Variant", + "o:readOnly": "Bool", + "o:stepSize": "Double", + "o:unit": "$ref:Unit", + "r:id": "Uuid", + "type": "$ref:BasicType" + }, + "ParamTypes": [ + "$ref:ParamType" + ], + "PowerBalanceLogEntries": [ + "$ref:PowerBalanceLogEntry" + ], + "PowerBalanceLogEntry": { + "r:acquisition": "Double", + "r:consumption": "Double", + "r:production": "Double", + "r:storage": "Double", + "r:timestamp": "Uint", + "r:totalAcquisition": "Double", + "r:totalConsumption": "Double", + "r:totalProduction": "Double", + "r:totalReturn": "Double" + }, + "RepeatingOption": { + "mode": "$ref:RepeatingMode", + "o:monthDays": [ + "Int" + ], + "o:weekDays": [ + "Int" + ] + }, + "Repositories": [ + "$ref:Repository" + ], + "Repository": { + "enabled": "Bool", + "r:displayName": "String", + "r:id": "String" + }, + "Rule": { + "actions": "$ref:RuleActions", + "name": "String", + "o:enabled": "Bool", + "o:eventDescriptors": "$ref:EventDescriptors", + "o:executable": "Bool", + "o:exitActions": "$ref:RuleActions", + "o:stateEvaluator": "$ref:StateEvaluator", + "o:timeDescriptor": "$ref:TimeDescriptor", + "r:active": "Bool", + "r:id": "Uuid" + }, + "RuleAction": { + "o:actionTypeId": "Uuid", + "o:browserItemId": "String", + "o:interface": "String", + "o:interfaceAction": "String", + "o:ruleActionParams": "$ref:RuleActionParams", + "o:thingId": "Uuid" + }, + "RuleActionParam": { + "o:eventParamTypeId": "Uuid", + "o:eventTypeId": "Uuid", + "o:paramName": "String", + "o:paramTypeId": "Uuid", + "o:stateThingId": "Uuid", + "o:stateTypeId": "Uuid", + "o:value": "Variant" + }, + "RuleActionParams": [ + "$ref:RuleActionParam" + ], + "RuleActions": [ + "$ref:RuleAction" + ], + "RuleDescription": { + "active": "Bool", + "enabled": "Bool", + "executable": "Bool", + "id": "Uuid", + "name": "String" + }, + "Rules": [ + "$ref:Rule" + ], + "ScoreEntries": [ + "$ref:ScoreEntry" + ], + "ScoreEntry": { + "endDateTime": "Uint", + "startDateTime": "Uint", + "value": "Variant", + "weighting": "Variant" + }, + "Script": { + "name": "String", + "r:id": "Uuid" + }, + "Scripts": [ + "$ref:Script" + ], + "SerialPort": { + "r:description": "String", + "r:manufacturer": "String", + "r:serialNumber": "String", + "r:systemLocation": "String" + }, + "SerialPorts": [ + "$ref:SerialPort" + ], + "ServerConfiguration": { + "address": "String", + "authenticationEnabled": "Bool", + "id": "String", + "port": "Uint", + "sslEnabled": "Bool" + }, + "SpotMarketProviderInfo": { + "r:country": "Uint", + "r:name": "String", + "r:providerId": "Uuid", + "r:website": "Variant" + }, + "SpotMarketProviderInfos": [ + "$ref:SpotMarketProviderInfo" + ], + "State": { + "r:filter": "$ref:StateValueFilter", + "r:o:maxValue": "Variant", + "r:o:minValue": "Variant", + "r:o:possibleValues": [ + "Variant" + ], + "r:stateTypeId": "Uuid", + "r:value": "Variant" + }, + "StateDescriptor": { + "o:interface": "String", + "o:interfaceState": "String", + "o:stateTypeId": "Uuid", + "o:thingId": "Uuid", + "o:value": "Variant", + "o:valueStateTypeId": "Uuid", + "o:valueThingId": "Uuid", + "operator": "$ref:ValueOperator" + }, + "StateEvaluator": { + "o:childEvaluators": "$ref:StateEvaluators", + "o:operator": "$ref:StateOperator", + "o:stateDescriptor": "$ref:StateDescriptor" + }, + "StateEvaluators": [ + "$ref:StateEvaluator" + ], + "StateType": { + "defaultValue": "Variant", + "displayName": "String", + "index": "Int", + "name": "String", + "o:ioType": "$ref:IOType", + "o:maxValue": "Variant", + "o:minValue": "Variant", + "o:possibleValues": [ + "Variant" + ], + "o:possibleValuesDisplayNames": "StringList", + "o:stepSize": "Double", + "o:unit": "$ref:Unit", + "r:id": "Uuid", + "type": "$ref:BasicType" + }, + "StateTypes": [ + "$ref:StateType" + ], + "States": [ + "$ref:State" + ], + "Tag": { + "appId": "String", + "o:ruleId": "Uuid", + "o:thingId": "Uuid", + "o:value": "String", + "tagId": "String" + }, + "Tags": [ + "$ref:Tag" + ], + "TemperatureDaySchedule": [ + "$ref:TemperatureSchedule" + ], + "TemperatureSchedule": { + "endTime": "Time", + "startTime": "Time", + "temperature": "Double" + }, + "TemperatureWeekSchedule": [ + "$ref:TemperatureDaySchedule" + ], + "Thing": { + "d:r:setupComplete": "Bool", + "o:name": "String", + "o:settings": "$ref:ParamList", + "r:id": "Uuid", + "r:o:loggedActionTypeIds": [ + "Uuid" + ], + "r:o:loggedEventTypeIds": [ + "Uuid" + ], + "r:o:loggedStateTypeIds": [ + "Uuid" + ], + "r:o:parentId": "Uuid", + "r:o:setupDisplayMessage": "String", + "r:params": "$ref:ParamList", + "r:setupError": "$ref:ThingError", + "r:setupStatus": "$ref:ThingSetupStatus", + "r:states": "$ref:States", + "r:thingClassId": "Uuid" + }, + "ThingClass": { + "r:actionTypes": "$ref:ActionTypes", + "r:browsable": "Bool", + "r:browserItemActionTypes": "$ref:ActionTypes", + "r:createMethods": "$ref:CreateMethods", + "r:discoveryParamTypes": "$ref:ParamTypes", + "r:discoveryType": "$ref:DiscoveryType", + "r:displayName": "String", + "r:eventTypes": "$ref:EventTypes", + "r:id": "Uuid", + "r:interfaces": "StringList", + "r:name": "String", + "r:paramTypes": "$ref:ParamTypes", + "r:pluginId": "Uuid", + "r:providedInterfaces": "StringList", + "r:settingsTypes": "$ref:ParamTypes", + "r:setupMethod": "$ref:SetupMethod", + "r:stateTypes": "$ref:StateTypes", + "r:vendorId": "Uuid" + }, + "ThingClasses": [ + "$ref:ThingClass" + ], + "ThingDescriptor": { + "r:description": "String", + "r:id": "Uuid", + "r:o:thingId": "Uuid", + "r:params": "$ref:ParamList", + "r:thingClassId": "Uuid", + "r:title": "String" + }, + "ThingDescriptors": [ + "$ref:ThingDescriptor" + ], + "ThingPowerLogEntries": [ + "$ref:ThingPowerLogEntry" + ], + "ThingPowerLogEntry": { + "r:currentPower": "Double", + "r:thingId": "Uuid", + "r:timestamp": "Uint", + "r:totalConsumption": "Double", + "r:totalProduction": "Double" + }, + "Things": [ + "$ref:Thing" + ], + "TimeDescriptor": { + "o:calendarItems": "$ref:CalendarItems", + "o:timeEventItems": "$ref:TimeEventItems" + }, + "TimeEventItem": { + "o:datetime": "Uint", + "o:repeating": "$ref:RepeatingOption", + "o:time": "Time" + }, + "TimeEventItems": [ + "$ref:TimeEventItem" + ], + "TokenInfo": { + "r:creationTime": "Uint", + "r:deviceName": "String", + "r:id": "Uuid", + "r:username": "String" + }, + "TokenInfoList": [ + "$ref:TokenInfo" + ], + "TunnelProxyServerConfiguration": { + "address": "String", + "authenticationEnabled": "Bool", + "id": "String", + "ignoreSslErrors": "Bool", + "port": "Uint", + "sslEnabled": "Bool" + }, + "UserInfo": { + "r:allowedThingIds": [ + "Uuid" + ], + "r:displayName": "String", + "r:email": "String", + "r:scopes": "$ref:PermissionScopes", + "r:username": "String" + }, + "UserInfoList": [ + "$ref:UserInfo" + ], + "Vendor": { + "displayName": "String", + "id": "Uuid", + "name": "String" + }, + "Vendors": [ + "$ref:Vendor" + ], + "WebServerConfiguration": { + "address": "String", + "authenticationEnabled": "Bool", + "id": "String", + "port": "Uint", + "publicFolder": "String", + "sslEnabled": "Bool" + }, + "WiredNetworkDevice": { + "r:bitRate": "String", + "r:interface": "String", + "r:ipv4Addresses": "StringList", + "r:ipv6Addresses": "StringList", + "r:macAddress": "String", + "r:pluggedIn": "Bool", + "r:state": "$ref:NetworkDeviceState" + }, + "WirelessAccessPoint": { + "r:frequency": "Double", + "r:macAddress": "String", + "r:protected": "Bool", + "r:signalStrength": "Int", + "r:ssid": "String" + }, + "WirelessNetworkDevice": { + "r:bitRate": "String", + "r:capabilities": "$ref:WirelessCapabilities", + "r:interface": "String", + "r:ipv4Addresses": "StringList", + "r:ipv6Addresses": "StringList", + "r:macAddress": "String", + "r:mode": "$ref:WirelessMode", + "r:o:currentAccessPoint": "$ref:WirelessAccessPoint", + "r:state": "$ref:NetworkDeviceState" + }, + "ZWaveNetwork": { + "homeId": "Uint", + "isBridgeController": "Bool", + "isPrimaryController": "Bool", + "isStaticUpdateController": "Bool", + "isZWavePlus": "Bool", + "networkState": "$ref:ZWaveNetworkState", + "networkUuid": "Uuid", + "serialPort": "String", + "waitingForNodeAddition": "Bool", + "waitingForNodeRemoval": "Bool" + }, + "ZWaveNode": { + "deviceType": "$ref:ZWaveDeviceType", + "failed": "Bool", + "initialized": "Bool", + "isBeamingDevice": "Bool", + "isSecurityDevice": "Bool", + "isZWavePlusDevice": "Bool", + "linkQuality": "Uint", + "manufacturerId": "Uint", + "manufacturerName": "String", + "networkUuid": "Uuid", + "nodeId": "Uint", + "nodeType": "$ref:ZWaveNodeType", + "productId": "Uint", + "productName": "String", + "productType": "Uint", + "reachable": "Bool", + "role": "$ref:ZWaveNodeRole", + "securityMode": "Uint", + "sleeping": "Bool", + "version": "String" + }, + "ZigbeeAdapter": { + "r:backend": "String", + "r:baudRate": "Int", + "r:description": "String", + "r:hardwareRecognized": "Bool", + "r:name": "String", + "r:serialNumber": "String", + "r:serialPort": "String" + }, + "ZigbeeAdapters": [ + "$ref:ZigbeeAdapter" + ], + "ZigbeeBindingTableRecord": { + "clusterId": "Uint", + "o:destinationAddress": "String", + "o:destinationEndpointId": "Uint", + "o:destinationGroupAddress": "Uint", + "sourceAddress": "String", + "sourceEndpointId": "Uint" + }, + "ZigbeeCluster": { + "clusterId": "Uint", + "direction": "$ref:ZigbeeClusterDirection" + }, + "ZigbeeNeighborTableRecord": { + "depth": "Uint", + "lqi": "Uint", + "networkAddress": "Uint", + "permitJoining": "Bool", + "relationship": "$ref:ZigbeeNodeRelationship" + }, + "ZigbeeNetwork": { + "backend": "String", + "baudRate": "Uint", + "channel": "Uint", + "channelMask": "Uint", + "enabled": "Bool", + "firmwareVersion": "String", + "macAddress": "String", + "networkState": "$ref:ZigbeeNetworkState", + "networkUuid": "Uuid", + "panId": "Uint", + "permitJoiningDuration": "Uint", + "permitJoiningEnabled": "Bool", + "permitJoiningRemaining": "Uint", + "serialPort": "String" + }, + "ZigbeeNode": { + "bindingTableRecords": [ + "$ref:ZigbeeBindingTableRecord" + ], + "endpoints": [ + "$ref:ZigbeeNodeEndpoint" + ], + "ieeeAddress": "String", + "lastSeen": "Uint", + "lqi": "Uint", + "manufacturer": "String", + "model": "String", + "neighborTableRecords": [ + "$ref:ZigbeeNeighborTableRecord" + ], + "networkAddress": "Uint", + "networkUuid": "Uuid", + "reachable": "Bool", + "receiverOnWhileIdle": "Bool", + "routingTableRecords": [ + "$ref:ZigbeeRoutingTableRecord" + ], + "state": "$ref:ZigbeeNodeState", + "type": "$ref:ZigbeeNodeType", + "version": "String" + }, + "ZigbeeNodeEndpoint": { + "endpointId": "Uint", + "inputClusters": [ + "$ref:ZigbeeCluster" + ], + "outputClusters": [ + "$ref:ZigbeeCluster" + ] + }, + "ZigbeeRoutingTableRecord": { + "destinationAddress": "Uint", + "manyToOne": "Bool", + "memoryConstrained": "Bool", + "nextHopAddress": "Uint", + "status": "$ref:ZigbeeNodeRouteStatus" + }, + "ZoneInfo": { + "r:currentSetpoint": "Double", + "r:humidity": "Double", + "r:id": "Uuid", + "r:indoorSensors": [ + "Uuid" + ], + "r:name": "String", + "r:notifications": [ + "Uuid" + ], + "r:outdoorSensors": [ + "Uuid" + ], + "r:pm25": "Double", + "r:setpointOverride": "Double", + "r:setpointOverrideEnd": "Uint", + "r:setpointOverrideMode": "$ref:SetpointOverrideMode", + "r:standbySetpoint": "Double", + "r:temperature": "Double", + "r:thermostats": [ + "Uuid" + ], + "r:valves": [ + "Uuid" + ], + "r:voc": "Uint", + "r:weekSchedule": "$ref:TemperatureWeekSchedule", + "r:windowSensors": [ + "Uuid" + ], + "r:zoneStatus": "$ref:ZoneStatus" + }, + "ZoneInfos": [ + "$ref:ZoneInfo" + ] + } + }, + "status": "success" +}