@mhome/app-facade-protocol 1.57.0 → 1.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/contract/pod-directory-v1.md +51 -0
- package/fixtures/presentation/cases.json +578 -8
- package/manifest/app-facade.v1.json +1 -1
- package/manifest/authorization.v1.json +431 -0
- package/manifest/host-provision-targets.v1.json +1 -1
- package/manifest/hub-targets.v1.json +1 -1
- package/manifest/pod-targets.v1.json +1 -1
- package/manifest/routing.v1.json +1 -1
- package/manifest/targets.v1.json +1 -1
- package/package.json +1 -1
- package/protocol.json +1 -1
- package/schema/client-appearance.v1.schema.json +55 -0
- package/schema/client-page.v1.schema.json +153 -0
- package/schema/delegated-call.v1.schema.json +87 -0
- package/schema/host-management.v1.schema.json +206 -0
- package/schema/plugin-catalog.v1.schema.json +93 -0
- package/schema/user-profile.v1.schema.json +66 -0
package/README.md
CHANGED
|
@@ -53,8 +53,12 @@ and MCP public results use essential; internal workflow reads use full. The CLI
|
|
|
53
53
|
uses `--response-detail full|essential`, and the bundled external Skill requests
|
|
54
54
|
essential. Dashboard essential projection keeps card identity, title, type,
|
|
55
55
|
layouts and view choices, excluding renderer configuration and resource payloads.
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
Device brief-list essential retains identity, room, capability IDs, Integration and
|
|
57
|
+
availability, omitting `connectId`, `manufacturerId` and `manufacturerName`.
|
|
58
|
+
Selected Device detail, history, recent activity and mutation outcomes keep their
|
|
59
|
+
public business fields. Device bulk list remains a CLI-only surface.
|
|
60
|
+
Targets without a dedicated projection retain their business fields in YAML;
|
|
61
|
+
essential does not promise a smaller field set for every domain. Targets own that selection.
|
|
58
62
|
|
|
59
63
|
The [response schema](schema/facade-response.v1.schema.json) and shared
|
|
60
64
|
[presentation fixtures](fixtures/presentation/cases.json) define the wire
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Pod directory
|
|
2
|
+
|
|
3
|
+
`/app/pod/list` is a Space-mode-routed, direct, read-only Facade call with empty
|
|
4
|
+
input. It requires a personal User and read access to the current Space. It combines
|
|
5
|
+
all completed personal Pod registrations owned by that User with registered
|
|
6
|
+
Space-owned Pods in that Space. Another User's personal Pods and other Spaces'
|
|
7
|
+
Pods are excluded. Offline registrations remain; incomplete commissioning attempts
|
|
8
|
+
and nearby discovery candidates are not registrations.
|
|
9
|
+
|
|
10
|
+
A local Space composes this result in Core, reading its own Space inventory and
|
|
11
|
+
obtaining personal registrations through the authenticated private cloud control
|
|
12
|
+
bridge. A cloud Space composes it in cloud. LLM placement does not change this
|
|
13
|
+
owner. Cloud entrypoints forward local-Space business to Core; only an unavailable
|
|
14
|
+
Hub transport permits the explicit read-only registration fallback below.
|
|
15
|
+
|
|
16
|
+
The result contains `pods`, `scopeId`, `observedAtMs`, and `sourceErrors`.
|
|
17
|
+
Every row contains `registrationId`, `clientMode` (`user` or `space`), `registered`
|
|
18
|
+
(true), and `connection` with `scopeId`, `state` (`connected`, `disconnected`, or
|
|
19
|
+
`unknown`), and `source` (`hub`, `cloud`, or `unavailable`). Space rows also contain
|
|
20
|
+
`scopeId` and `appClientId`. Personal rows contain the saved `name`, `deviceId`,
|
|
21
|
+
`model`, `platform`, `firmwareVersion`, `issuedAt`, and `activatedAt`.
|
|
22
|
+
No tokens, enrollment grants, credential IDs or private keys are returned.
|
|
23
|
+
|
|
24
|
+
Connection is an observation in the indicated Space, not global power state.
|
|
25
|
+
Personal registration IDs are keyed by User and device public-key fingerprint;
|
|
26
|
+
personal connection IDs do not carry that fingerprint. The directory does not
|
|
27
|
+
join them by name or hardware ID. Personal connection state is therefore unknown.
|
|
28
|
+
Space registration IDs are their authenticated appClientId and can be correlated.
|
|
29
|
+
When a local Hub cannot be queried, the cloud's persisted Space registrations
|
|
30
|
+
remain visible with unknown connection state and `sourceErrors.space`. The cache
|
|
31
|
+
may omit registrations not yet synchronized; it must not imply a complete live
|
|
32
|
+
snapshot. Cloud presence lookup failures likewise retain saved Space records
|
|
33
|
+
as unknown, with an explicit source error. A successful empty presence lookup
|
|
34
|
+
can establish disconnection. Registration read failures fail the call instead
|
|
35
|
+
of fabricating an empty inventory; authorization and request failures remain errors.
|
|
36
|
+
|
|
37
|
+
`/app/pod/space/list` is an internal composition target, not a separate Agent,
|
|
38
|
+
MCP or CLI operation. Scope-mode routing reads the Hub for a local Space or cloud
|
|
39
|
+
inventory for a cloud Space. It returns only Space-owned Pod registrations.
|
|
40
|
+
UI, Agent, MCP and CLI all use `/app/pod/list`; UI groups by clientMode.
|
|
41
|
+
|
|
42
|
+
`/app/pod/rename` is a direct, idempotent write with exactly `registrationId` and
|
|
43
|
+
`name` (trimmed, 1–64 characters). The authenticated User is the owner; request
|
|
44
|
+
input cannot select a User. It updates only that personal registration's display
|
|
45
|
+
name and returns `{registrationId,name}`. It works while the Pod is offline and
|
|
46
|
+
does not change credentials, ownership, networking or the Pod's local settings.
|
|
47
|
+
It has no prepare/commit or HITL requirement. Space Pod rename is not provided.
|
|
48
|
+
The CLI is `meow pod rename <registrationId> <name>`; Agent/MCP use `pod_rename`.
|
|
49
|
+
|
|
50
|
+
Personal login approve/redeem and Space commissioning retain their existing
|
|
51
|
+
protocols. Factory reset is available only on the Pod itself, not remotely.
|
|
@@ -61,14 +61,6 @@
|
|
|
61
61
|
"cardId": "card-1",
|
|
62
62
|
"type": "widget",
|
|
63
63
|
"title": "Power",
|
|
64
|
-
"layouts": {
|
|
65
|
-
"sm": {
|
|
66
|
-
"x": 0,
|
|
67
|
-
"y": 0,
|
|
68
|
-
"width": 2,
|
|
69
|
-
"height": 2
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
64
|
"primaryViewId": "power",
|
|
73
65
|
"views": [
|
|
74
66
|
{
|
|
@@ -504,5 +496,583 @@
|
|
|
504
496
|
}
|
|
505
497
|
]
|
|
506
498
|
}
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
"name": "dashboard card list retains canvas layout",
|
|
502
|
+
"target": "/app/dashboard/card/brief/list",
|
|
503
|
+
"status": "success",
|
|
504
|
+
"data": {
|
|
505
|
+
"canvasId": "canvas",
|
|
506
|
+
"cards": [
|
|
507
|
+
{
|
|
508
|
+
"cardId": "card-1",
|
|
509
|
+
"type": "widget",
|
|
510
|
+
"title": "Power",
|
|
511
|
+
"layouts": {
|
|
512
|
+
"sm": {
|
|
513
|
+
"x": 0,
|
|
514
|
+
"y": 0,
|
|
515
|
+
"width": 2,
|
|
516
|
+
"height": 2
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
"views": [
|
|
520
|
+
{
|
|
521
|
+
"id": "power",
|
|
522
|
+
"name": "Power",
|
|
523
|
+
"source": {
|
|
524
|
+
"type": "widget",
|
|
525
|
+
"baseId": "automation-1",
|
|
526
|
+
"widgetId": "widget-1"
|
|
527
|
+
},
|
|
528
|
+
"pattern": "default"
|
|
529
|
+
}
|
|
530
|
+
],
|
|
531
|
+
"primaryViewId": "power",
|
|
532
|
+
"widgets": [
|
|
533
|
+
{
|
|
534
|
+
"widgetId": "widget-1",
|
|
535
|
+
"name": "Power",
|
|
536
|
+
"widgetType": "DATA",
|
|
537
|
+
"dataType": "NUMBER"
|
|
538
|
+
}
|
|
539
|
+
]
|
|
540
|
+
}
|
|
541
|
+
]
|
|
542
|
+
},
|
|
543
|
+
"essential": {
|
|
544
|
+
"canvasId": "canvas",
|
|
545
|
+
"cards": [
|
|
546
|
+
{
|
|
547
|
+
"cardId": "card-1",
|
|
548
|
+
"type": "widget",
|
|
549
|
+
"title": "Power",
|
|
550
|
+
"primaryViewId": "power",
|
|
551
|
+
"views": [
|
|
552
|
+
{
|
|
553
|
+
"id": "power",
|
|
554
|
+
"name": "Power"
|
|
555
|
+
}
|
|
556
|
+
],
|
|
557
|
+
"viewCount": 1,
|
|
558
|
+
"layouts": {
|
|
559
|
+
"sm": {
|
|
560
|
+
"x": 0,
|
|
561
|
+
"y": 0,
|
|
562
|
+
"width": 2,
|
|
563
|
+
"height": 2
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
]
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
"name": "device-briefs-keep-discovery-and-unknown-state",
|
|
572
|
+
"target": "/app/device/brief/list",
|
|
573
|
+
"data": {
|
|
574
|
+
"devices": [
|
|
575
|
+
{
|
|
576
|
+
"entityId": "d1",
|
|
577
|
+
"name": "Lamp",
|
|
578
|
+
"active": false,
|
|
579
|
+
"roomId": "r1",
|
|
580
|
+
"roomName": "Living room",
|
|
581
|
+
"capabilities": [
|
|
582
|
+
"state.onOff",
|
|
583
|
+
"command.onOff"
|
|
584
|
+
],
|
|
585
|
+
"group": false,
|
|
586
|
+
"integration": "demo.device",
|
|
587
|
+
"connectId": "connection-1",
|
|
588
|
+
"manufacturerId": "demo",
|
|
589
|
+
"manufacturerName": "Example maker",
|
|
590
|
+
"online": false,
|
|
591
|
+
"availabilityStatus": "unavailable",
|
|
592
|
+
"twinTags": [
|
|
593
|
+
"light"
|
|
594
|
+
]
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"entityId": "g:1",
|
|
598
|
+
"name": "Lights",
|
|
599
|
+
"active": true,
|
|
600
|
+
"roomId": "",
|
|
601
|
+
"roomName": "",
|
|
602
|
+
"capabilities": [
|
|
603
|
+
"command.onOff"
|
|
604
|
+
],
|
|
605
|
+
"group": true,
|
|
606
|
+
"integration": "demo.device"
|
|
607
|
+
}
|
|
608
|
+
]
|
|
609
|
+
},
|
|
610
|
+
"status": "success",
|
|
611
|
+
"essential": {
|
|
612
|
+
"devices": [
|
|
613
|
+
{
|
|
614
|
+
"entityId": "d1",
|
|
615
|
+
"name": "Lamp",
|
|
616
|
+
"active": false,
|
|
617
|
+
"roomId": "r1",
|
|
618
|
+
"roomName": "Living room",
|
|
619
|
+
"capabilities": [
|
|
620
|
+
"state.onOff",
|
|
621
|
+
"command.onOff"
|
|
622
|
+
],
|
|
623
|
+
"group": false,
|
|
624
|
+
"integration": "demo.device",
|
|
625
|
+
"online": false,
|
|
626
|
+
"availabilityStatus": "unavailable",
|
|
627
|
+
"twinTags": [
|
|
628
|
+
"light"
|
|
629
|
+
]
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"entityId": "g:1",
|
|
633
|
+
"name": "Lights",
|
|
634
|
+
"active": true,
|
|
635
|
+
"roomId": "",
|
|
636
|
+
"roomName": "",
|
|
637
|
+
"capabilities": [
|
|
638
|
+
"command.onOff"
|
|
639
|
+
],
|
|
640
|
+
"group": true,
|
|
641
|
+
"integration": "demo.device"
|
|
642
|
+
}
|
|
643
|
+
]
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"name": "device-empty-briefs",
|
|
648
|
+
"target": "/app/device/brief/list",
|
|
649
|
+
"data": {
|
|
650
|
+
"devices": []
|
|
651
|
+
},
|
|
652
|
+
"status": "success",
|
|
653
|
+
"essential": {
|
|
654
|
+
"devices": []
|
|
655
|
+
}
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
"name": "device-detail-retains-identity-state-and-missing-items",
|
|
659
|
+
"target": "/app/device/detail/get",
|
|
660
|
+
"data": {
|
|
661
|
+
"items": [
|
|
662
|
+
{
|
|
663
|
+
"requestedId": "d1",
|
|
664
|
+
"found": true,
|
|
665
|
+
"device": {
|
|
666
|
+
"entityId": "d1",
|
|
667
|
+
"name": "Lamp",
|
|
668
|
+
"active": false,
|
|
669
|
+
"roomId": "r1",
|
|
670
|
+
"roomName": "Living room",
|
|
671
|
+
"capabilities": [
|
|
672
|
+
"state.onOff",
|
|
673
|
+
"command.onOff"
|
|
674
|
+
],
|
|
675
|
+
"group": false,
|
|
676
|
+
"integration": "demo.device",
|
|
677
|
+
"connectId": "connection-1",
|
|
678
|
+
"manufacturerId": "demo",
|
|
679
|
+
"manufacturerName": "Example maker",
|
|
680
|
+
"online": false,
|
|
681
|
+
"availabilityStatus": "unavailable",
|
|
682
|
+
"twinTags": [
|
|
683
|
+
"light"
|
|
684
|
+
],
|
|
685
|
+
"states": [
|
|
686
|
+
{
|
|
687
|
+
"capabilityId": "state.onOff",
|
|
688
|
+
"value": "off"
|
|
689
|
+
}
|
|
690
|
+
],
|
|
691
|
+
"memberIds": []
|
|
692
|
+
}
|
|
693
|
+
},
|
|
694
|
+
{
|
|
695
|
+
"requestedId": "g:1",
|
|
696
|
+
"found": true,
|
|
697
|
+
"device": {
|
|
698
|
+
"entityId": "g:1",
|
|
699
|
+
"name": "Lights",
|
|
700
|
+
"active": true,
|
|
701
|
+
"roomId": "",
|
|
702
|
+
"roomName": "",
|
|
703
|
+
"capabilities": [
|
|
704
|
+
"command.onOff"
|
|
705
|
+
],
|
|
706
|
+
"group": true,
|
|
707
|
+
"integration": "demo.device",
|
|
708
|
+
"states": [],
|
|
709
|
+
"memberIds": [
|
|
710
|
+
"d1"
|
|
711
|
+
]
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
"requestedId": "gone",
|
|
716
|
+
"found": false,
|
|
717
|
+
"reason": "not_found"
|
|
718
|
+
}
|
|
719
|
+
]
|
|
720
|
+
},
|
|
721
|
+
"status": "success",
|
|
722
|
+
"essential": {
|
|
723
|
+
"items": [
|
|
724
|
+
{
|
|
725
|
+
"requestedId": "d1",
|
|
726
|
+
"found": true,
|
|
727
|
+
"device": {
|
|
728
|
+
"entityId": "d1",
|
|
729
|
+
"name": "Lamp",
|
|
730
|
+
"active": false,
|
|
731
|
+
"roomId": "r1",
|
|
732
|
+
"roomName": "Living room",
|
|
733
|
+
"capabilities": [
|
|
734
|
+
"state.onOff",
|
|
735
|
+
"command.onOff"
|
|
736
|
+
],
|
|
737
|
+
"group": false,
|
|
738
|
+
"integration": "demo.device",
|
|
739
|
+
"connectId": "connection-1",
|
|
740
|
+
"manufacturerId": "demo",
|
|
741
|
+
"manufacturerName": "Example maker",
|
|
742
|
+
"online": false,
|
|
743
|
+
"availabilityStatus": "unavailable",
|
|
744
|
+
"twinTags": [
|
|
745
|
+
"light"
|
|
746
|
+
],
|
|
747
|
+
"states": [
|
|
748
|
+
{
|
|
749
|
+
"capabilityId": "state.onOff",
|
|
750
|
+
"value": "off"
|
|
751
|
+
}
|
|
752
|
+
],
|
|
753
|
+
"memberIds": []
|
|
754
|
+
}
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"requestedId": "g:1",
|
|
758
|
+
"found": true,
|
|
759
|
+
"device": {
|
|
760
|
+
"entityId": "g:1",
|
|
761
|
+
"name": "Lights",
|
|
762
|
+
"active": true,
|
|
763
|
+
"roomId": "",
|
|
764
|
+
"roomName": "",
|
|
765
|
+
"capabilities": [
|
|
766
|
+
"command.onOff"
|
|
767
|
+
],
|
|
768
|
+
"group": true,
|
|
769
|
+
"integration": "demo.device",
|
|
770
|
+
"states": [],
|
|
771
|
+
"memberIds": [
|
|
772
|
+
"d1"
|
|
773
|
+
]
|
|
774
|
+
}
|
|
775
|
+
},
|
|
776
|
+
{
|
|
777
|
+
"requestedId": "gone",
|
|
778
|
+
"found": false,
|
|
779
|
+
"reason": "not_found"
|
|
780
|
+
}
|
|
781
|
+
]
|
|
782
|
+
}
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
"name": "device-cli-full-list-keeps-details",
|
|
786
|
+
"target": "/app/device/list",
|
|
787
|
+
"data": {
|
|
788
|
+
"devices": [
|
|
789
|
+
{
|
|
790
|
+
"entityId": "d1",
|
|
791
|
+
"name": "Lamp",
|
|
792
|
+
"active": false,
|
|
793
|
+
"roomId": "r1",
|
|
794
|
+
"roomName": "Living room",
|
|
795
|
+
"capabilities": [
|
|
796
|
+
"state.onOff",
|
|
797
|
+
"command.onOff"
|
|
798
|
+
],
|
|
799
|
+
"group": false,
|
|
800
|
+
"integration": "demo.device",
|
|
801
|
+
"connectId": "connection-1",
|
|
802
|
+
"manufacturerId": "demo",
|
|
803
|
+
"manufacturerName": "Example maker",
|
|
804
|
+
"online": false,
|
|
805
|
+
"availabilityStatus": "unavailable",
|
|
806
|
+
"twinTags": [
|
|
807
|
+
"light"
|
|
808
|
+
],
|
|
809
|
+
"states": [
|
|
810
|
+
{
|
|
811
|
+
"capabilityId": "state.onOff",
|
|
812
|
+
"value": "off"
|
|
813
|
+
}
|
|
814
|
+
],
|
|
815
|
+
"memberIds": []
|
|
816
|
+
}
|
|
817
|
+
]
|
|
818
|
+
},
|
|
819
|
+
"status": "success",
|
|
820
|
+
"essential": {
|
|
821
|
+
"devices": [
|
|
822
|
+
{
|
|
823
|
+
"entityId": "d1",
|
|
824
|
+
"name": "Lamp",
|
|
825
|
+
"active": false,
|
|
826
|
+
"roomId": "r1",
|
|
827
|
+
"roomName": "Living room",
|
|
828
|
+
"capabilities": [
|
|
829
|
+
"state.onOff",
|
|
830
|
+
"command.onOff"
|
|
831
|
+
],
|
|
832
|
+
"group": false,
|
|
833
|
+
"integration": "demo.device",
|
|
834
|
+
"connectId": "connection-1",
|
|
835
|
+
"manufacturerId": "demo",
|
|
836
|
+
"manufacturerName": "Example maker",
|
|
837
|
+
"online": false,
|
|
838
|
+
"availabilityStatus": "unavailable",
|
|
839
|
+
"twinTags": [
|
|
840
|
+
"light"
|
|
841
|
+
],
|
|
842
|
+
"states": [
|
|
843
|
+
{
|
|
844
|
+
"capabilityId": "state.onOff",
|
|
845
|
+
"value": "off"
|
|
846
|
+
}
|
|
847
|
+
],
|
|
848
|
+
"memberIds": []
|
|
849
|
+
}
|
|
850
|
+
]
|
|
851
|
+
}
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
"name": "device-history-preserves-evidence",
|
|
855
|
+
"target": "/app/device/history/list",
|
|
856
|
+
"data": {
|
|
857
|
+
"deviceId": "d1",
|
|
858
|
+
"timeline": [
|
|
859
|
+
{
|
|
860
|
+
"time": "2026-10-27 10:00:00",
|
|
861
|
+
"type": "command",
|
|
862
|
+
"entityId": "d1",
|
|
863
|
+
"capabilityId": "command.onOff",
|
|
864
|
+
"data": {
|
|
865
|
+
"value": false,
|
|
866
|
+
"level": 0,
|
|
867
|
+
"optional": null
|
|
868
|
+
},
|
|
869
|
+
"traceSteps": [
|
|
870
|
+
{
|
|
871
|
+
"type": "Automation",
|
|
872
|
+
"value": "automation-1"
|
|
873
|
+
}
|
|
874
|
+
]
|
|
875
|
+
}
|
|
876
|
+
]
|
|
877
|
+
},
|
|
878
|
+
"status": "success",
|
|
879
|
+
"essential": {
|
|
880
|
+
"deviceId": "d1",
|
|
881
|
+
"timeline": [
|
|
882
|
+
{
|
|
883
|
+
"time": "2026-10-27 10:00:00",
|
|
884
|
+
"type": "command",
|
|
885
|
+
"entityId": "d1",
|
|
886
|
+
"capabilityId": "command.onOff",
|
|
887
|
+
"data": {
|
|
888
|
+
"value": false,
|
|
889
|
+
"level": 0,
|
|
890
|
+
"optional": null
|
|
891
|
+
},
|
|
892
|
+
"traceSteps": [
|
|
893
|
+
{
|
|
894
|
+
"type": "Automation",
|
|
895
|
+
"value": "automation-1"
|
|
896
|
+
}
|
|
897
|
+
]
|
|
898
|
+
}
|
|
899
|
+
]
|
|
900
|
+
}
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
"name": "device-recent-preserves-window-truncation-and-values",
|
|
904
|
+
"target": "/app/device/activity/recent/list",
|
|
905
|
+
"data": {
|
|
906
|
+
"since": "10min",
|
|
907
|
+
"from": 1793065800000,
|
|
908
|
+
"until": 1793066400000,
|
|
909
|
+
"truncated": true,
|
|
910
|
+
"updates": [
|
|
911
|
+
{
|
|
912
|
+
"deviceId": "d1",
|
|
913
|
+
"deviceName": "Lamp",
|
|
914
|
+
"capabilityId": "state.onOff",
|
|
915
|
+
"changedAt": 1793066400000,
|
|
916
|
+
"state": false
|
|
917
|
+
},
|
|
918
|
+
{
|
|
919
|
+
"deviceId": "d2",
|
|
920
|
+
"deviceName": "Dimmer",
|
|
921
|
+
"capabilityId": "state.level",
|
|
922
|
+
"changedAt": 1793066399000,
|
|
923
|
+
"state": 0
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
"deviceId": "d3",
|
|
927
|
+
"deviceName": "Button",
|
|
928
|
+
"capabilityId": "event.click",
|
|
929
|
+
"changedAt": 1793066398000,
|
|
930
|
+
"event": {
|
|
931
|
+
"value": null
|
|
932
|
+
}
|
|
933
|
+
},
|
|
934
|
+
{
|
|
935
|
+
"deviceId": "d4",
|
|
936
|
+
"deviceName": "Lamp",
|
|
937
|
+
"capabilityId": "command.onOff",
|
|
938
|
+
"changedAt": 1793066397000,
|
|
939
|
+
"log": {
|
|
940
|
+
"source": "Automation",
|
|
941
|
+
"data": {
|
|
942
|
+
"onOff": false
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
]
|
|
947
|
+
},
|
|
948
|
+
"status": "success",
|
|
949
|
+
"essential": {
|
|
950
|
+
"since": "10min",
|
|
951
|
+
"from": 1793065800000,
|
|
952
|
+
"until": 1793066400000,
|
|
953
|
+
"truncated": true,
|
|
954
|
+
"updates": [
|
|
955
|
+
{
|
|
956
|
+
"deviceId": "d1",
|
|
957
|
+
"deviceName": "Lamp",
|
|
958
|
+
"capabilityId": "state.onOff",
|
|
959
|
+
"changedAt": 1793066400000,
|
|
960
|
+
"state": false
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
"deviceId": "d2",
|
|
964
|
+
"deviceName": "Dimmer",
|
|
965
|
+
"capabilityId": "state.level",
|
|
966
|
+
"changedAt": 1793066399000,
|
|
967
|
+
"state": 0
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
"deviceId": "d3",
|
|
971
|
+
"deviceName": "Button",
|
|
972
|
+
"capabilityId": "event.click",
|
|
973
|
+
"changedAt": 1793066398000,
|
|
974
|
+
"event": {
|
|
975
|
+
"value": null
|
|
976
|
+
}
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
"deviceId": "d4",
|
|
980
|
+
"deviceName": "Lamp",
|
|
981
|
+
"capabilityId": "command.onOff",
|
|
982
|
+
"changedAt": 1793066397000,
|
|
983
|
+
"log": {
|
|
984
|
+
"source": "Automation",
|
|
985
|
+
"data": {
|
|
986
|
+
"onOff": false
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
]
|
|
991
|
+
}
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
"name": "device-enable-retains-pending",
|
|
995
|
+
"target": "/app/device/enable",
|
|
996
|
+
"data": {
|
|
997
|
+
"requestedIds": [
|
|
998
|
+
"d1",
|
|
999
|
+
"d2",
|
|
1000
|
+
"d3"
|
|
1001
|
+
],
|
|
1002
|
+
"enabledIds": [
|
|
1003
|
+
"d1"
|
|
1004
|
+
],
|
|
1005
|
+
"alreadyEnabledIds": [
|
|
1006
|
+
"d2"
|
|
1007
|
+
],
|
|
1008
|
+
"pendingIds": [
|
|
1009
|
+
"d3"
|
|
1010
|
+
]
|
|
1011
|
+
},
|
|
1012
|
+
"status": "partial",
|
|
1013
|
+
"essential": {
|
|
1014
|
+
"requestedIds": [
|
|
1015
|
+
"d1",
|
|
1016
|
+
"d2",
|
|
1017
|
+
"d3"
|
|
1018
|
+
],
|
|
1019
|
+
"enabledIds": [
|
|
1020
|
+
"d1"
|
|
1021
|
+
],
|
|
1022
|
+
"alreadyEnabledIds": [
|
|
1023
|
+
"d2"
|
|
1024
|
+
],
|
|
1025
|
+
"pendingIds": [
|
|
1026
|
+
"d3"
|
|
1027
|
+
]
|
|
1028
|
+
}
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"name": "device-disable-retains-pending",
|
|
1032
|
+
"target": "/app/device/disable",
|
|
1033
|
+
"data": {
|
|
1034
|
+
"requestedIds": [
|
|
1035
|
+
"d1",
|
|
1036
|
+
"d2",
|
|
1037
|
+
"d3"
|
|
1038
|
+
],
|
|
1039
|
+
"disabledIds": [
|
|
1040
|
+
"d1"
|
|
1041
|
+
],
|
|
1042
|
+
"alreadyDisabledIds": [
|
|
1043
|
+
"d2"
|
|
1044
|
+
],
|
|
1045
|
+
"pendingIds": [
|
|
1046
|
+
"d3"
|
|
1047
|
+
]
|
|
1048
|
+
},
|
|
1049
|
+
"status": "partial",
|
|
1050
|
+
"essential": {
|
|
1051
|
+
"requestedIds": [
|
|
1052
|
+
"d1",
|
|
1053
|
+
"d2",
|
|
1054
|
+
"d3"
|
|
1055
|
+
],
|
|
1056
|
+
"disabledIds": [
|
|
1057
|
+
"d1"
|
|
1058
|
+
],
|
|
1059
|
+
"alreadyDisabledIds": [
|
|
1060
|
+
"d2"
|
|
1061
|
+
],
|
|
1062
|
+
"pendingIds": [
|
|
1063
|
+
"d3"
|
|
1064
|
+
]
|
|
1065
|
+
}
|
|
1066
|
+
},
|
|
1067
|
+
{
|
|
1068
|
+
"name": "device-refresh-not-applicable-is-resource-status",
|
|
1069
|
+
"target": "/app/device/refresh",
|
|
1070
|
+
"data": {
|
|
1071
|
+
"status": "notApplicable"
|
|
1072
|
+
},
|
|
1073
|
+
"status": "success",
|
|
1074
|
+
"essential": {
|
|
1075
|
+
"status": "notApplicable"
|
|
1076
|
+
}
|
|
507
1077
|
}
|
|
508
1078
|
]
|