homebridge-nest-accfactory 0.2.11 → 0.3.1

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.
Files changed (43) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +14 -7
  3. package/config.schema.json +118 -0
  4. package/dist/HomeKitDevice.js +203 -77
  5. package/dist/HomeKitHistory.js +1 -1
  6. package/dist/config.js +207 -0
  7. package/dist/devices.js +118 -0
  8. package/dist/index.js +2 -1
  9. package/dist/nexustalk.js +46 -48
  10. package/dist/{camera.js → plugins/camera.js} +216 -241
  11. package/dist/{doorbell.js → plugins/doorbell.js} +32 -30
  12. package/dist/plugins/floodlight.js +91 -0
  13. package/dist/plugins/heatlink.js +17 -0
  14. package/dist/{protect.js → plugins/protect.js} +26 -43
  15. package/dist/{tempsensor.js → plugins/tempsensor.js} +15 -19
  16. package/dist/{thermostat.js → plugins/thermostat.js} +426 -383
  17. package/dist/{weather.js → plugins/weather.js} +26 -60
  18. package/dist/protobuf/nest/services/apigateway.proto +31 -1
  19. package/dist/protobuf/nest/trait/firmware.proto +207 -89
  20. package/dist/protobuf/nest/trait/hvac.proto +1052 -312
  21. package/dist/protobuf/nest/trait/located.proto +51 -8
  22. package/dist/protobuf/nest/trait/network.proto +366 -36
  23. package/dist/protobuf/nest/trait/occupancy.proto +145 -17
  24. package/dist/protobuf/nest/trait/product/protect.proto +57 -43
  25. package/dist/protobuf/nest/trait/resourcedirectory.proto +8 -0
  26. package/dist/protobuf/nest/trait/sensor.proto +7 -1
  27. package/dist/protobuf/nest/trait/service.proto +3 -1
  28. package/dist/protobuf/nest/trait/structure.proto +60 -14
  29. package/dist/protobuf/nest/trait/ui.proto +41 -1
  30. package/dist/protobuf/nest/trait/user.proto +6 -1
  31. package/dist/protobuf/nest/trait/voiceassistant.proto +2 -1
  32. package/dist/protobuf/nestlabs/eventingapi/v1.proto +20 -1
  33. package/dist/protobuf/root.proto +1 -0
  34. package/dist/protobuf/wdl.proto +18 -2
  35. package/dist/protobuf/weave/common.proto +2 -1
  36. package/dist/protobuf/weave/trait/heartbeat.proto +41 -1
  37. package/dist/protobuf/weave/trait/power.proto +1 -0
  38. package/dist/protobuf/weave/trait/security.proto +10 -1
  39. package/dist/streamer.js +74 -78
  40. package/dist/system.js +1213 -1264
  41. package/dist/webrtc.js +39 -34
  42. package/package.json +11 -11
  43. package/dist/floodlight.js +0 -97
@@ -1,14 +1,16 @@
1
1
  // Nest 'virtual' weather station
2
2
  // Part of homebridge-nest-accfactory
3
3
  //
4
- // Code version 28/8/2024
5
4
  // Mark Hulskamp
6
5
  'use strict';
7
6
 
8
7
  // Define our modules
9
- import HomeKitDevice from './HomeKitDevice.js';
8
+ import HomeKitDevice from '../HomeKitDevice.js';
10
9
 
11
10
  export default class NestWeather extends HomeKitDevice {
11
+ static TYPE = 'Weather';
12
+ static VERSION = '2025.06.11';
13
+
12
14
  batteryService = undefined;
13
15
  airPressureService = undefined;
14
16
  temperatureService = undefined;
@@ -19,76 +21,43 @@ export default class NestWeather extends HomeKitDevice {
19
21
  }
20
22
 
21
23
  // Class functions
22
- addServices() {
24
+ setupDevice() {
23
25
  // Setup temperature service if not already present on the accessory
24
- this.temperatureService = this.accessory.getService(this.hap.Service.TemperatureSensor);
25
- if (this.temperatureService === undefined) {
26
- this.temperatureService = this.accessory.addService(this.hap.Service.TemperatureSensor, '', 1);
27
- }
26
+ this.temperatureService = this.addHKService(this.hap.Service.TemperatureSensor, '', 1);
28
27
  this.temperatureService.setPrimaryService();
29
28
 
30
29
  // Setup humidity service if not already present on the accessory
31
- this.humidityService = this.accessory.getService(this.hap.Service.HumiditySensor);
32
- if (this.humidityService === undefined) {
33
- this.humidityService = this.accessory.addService(this.hap.Service.HumiditySensor, '', 1);
34
- }
30
+ this.humidityService = this.addHKService(this.hap.Service.HumiditySensor, '', 1);
35
31
 
36
32
  // Setup battery service if not already present on the accessory
37
- this.batteryService = this.accessory.getService(this.hap.Service.Battery);
38
- if (this.batteryService === undefined) {
39
- this.batteryService = this.accessory.addService(this.hap.Service.Battery, '', 1);
40
- }
33
+ this.batteryService = this.addHKService(this.hap.Service.Battery, '', 1);
41
34
  this.batteryService.setHiddenService(true);
42
35
 
43
36
  // Add custom weather service and characteristics if they have been defined
44
37
  if (this.hap.Service?.EveAirPressureSensor !== undefined) {
45
- this.airPressureService = this.accessory.getService(this.hap.Service.EveAirPressureSensor);
46
- if (this.airPressureService === undefined) {
47
- this.airPressureService = this.accessory.addService(this.hap.Service.EveAirPressureSensor, '', 1);
48
- }
38
+ this.airPressureService = this.addHKService(this.hap.Service.EveAirPressureSensor, '', 1);
49
39
  }
50
40
 
51
- if (
52
- this.hap.Characteristic?.ForecastDay !== undefined &&
53
- this.temperatureService.testCharacteristic(this.hap.Characteristic.ForecastDay) === false
54
- ) {
55
- this.temperatureService.addCharacteristic(this.hap.Characteristic.ForecastDay);
41
+ if (this.hap.Characteristic?.ForecastDay !== undefined) {
42
+ this.addHKCharacteristic(this.temperatureService, this.hap.Characteristic.ForecastDay);
56
43
  }
57
- if (
58
- this.hap.Characteristic?.ObservationStation !== undefined &&
59
- this.temperatureService.testCharacteristic(this.hap.Characteristic.ObservationStation) === false
60
- ) {
61
- this.temperatureService.addCharacteristic(this.hap.Characteristic.ObservationStation);
44
+ if (this.hap.Characteristic?.ObservationStation !== undefined) {
45
+ this.addHKCharacteristic(this.temperatureService, this.hap.Characteristic.ObservationStation);
62
46
  }
63
- if (
64
- this.hap.Characteristic?.Condition !== undefined &&
65
- this.temperatureService.testCharacteristic(this.hap.Characteristic.Condition) === false
66
- ) {
67
- this.temperatureService.addCharacteristic(this.hap.Characteristic.Condition);
47
+ if (this.hap.Characteristic?.Condition !== undefined) {
48
+ this.addHKCharacteristic(this.temperatureService, this.hap.Characteristic.Condition);
68
49
  }
69
- if (
70
- this.hap.Characteristic?.WindDirection !== undefined &&
71
- this.temperatureService.testCharacteristic(this.hap.Characteristic.WindDirection) === false
72
- ) {
73
- this.temperatureService.addCharacteristic(this.hap.Characteristic.WindDirection);
50
+ if (this.hap.Characteristic?.WindDirection !== undefined) {
51
+ this.addHKCharacteristic(this.temperatureService, this.hap.Characteristic.WindDirection);
74
52
  }
75
- if (
76
- this.hap.Characteristic?.WindSpeed !== undefined &&
77
- this.temperatureService.testCharacteristic(this.hap.Characteristic.WindSpeed) === false
78
- ) {
79
- this.temperatureService.addCharacteristic(this.hap.Characteristic.WindSpeed);
53
+ if (this.hap.Characteristic?.WindSpeed !== undefined) {
54
+ this.addHKCharacteristic(this.temperatureService, this.hap.Characteristic.WindSpeed);
80
55
  }
81
- if (
82
- this.hap.Characteristic?.SunriseTime !== undefined &&
83
- this.temperatureService.testCharacteristic(this.hap.Characteristic.SunriseTime) === false
84
- ) {
85
- this.temperatureService.addCharacteristic(this.hap.Characteristic.SunriseTime);
56
+ if (this.hap.Characteristic?.SunriseTime !== undefined) {
57
+ this.addHKCharacteristic(this.temperatureService, this.hap.Characteristic.SunriseTime);
86
58
  }
87
- if (
88
- this.hap.Characteristic?.SunsetTime !== undefined &&
89
- this.temperatureService.testCharacteristic(this.hap.Characteristic.SunsetTime) === false
90
- ) {
91
- this.temperatureService.addCharacteristic(this.hap.Characteristic.SunsetTime);
59
+ if (this.hap.Characteristic?.SunsetTime !== undefined) {
60
+ this.addHKCharacteristic(this.temperatureService, this.hap.Characteristic.SunsetTime);
92
61
  }
93
62
 
94
63
  // Setup linkage to EveHome app if configured todo so
@@ -102,14 +71,11 @@ export default class NestWeather extends HomeKitDevice {
102
71
  });
103
72
  }
104
73
 
105
- // Create extra details for output
106
- let postSetupDetails = [];
107
- this.deviceData?.elevation !== undefined && postSetupDetails.push('Elevation of ' + this.deviceData.elevation + 'm');
108
-
109
- return postSetupDetails;
74
+ // Extra setup details for output
75
+ this.deviceData?.elevation !== undefined && this.postSetupDetail('Elevation of ' + this.deviceData.elevation + 'm');
110
76
  }
111
77
 
112
- updateServices(deviceData) {
78
+ updateDevice(deviceData) {
113
79
  if (
114
80
  typeof deviceData !== 'object' ||
115
81
  this.temperatureService === undefined ||
@@ -56,6 +56,36 @@ message PairingTokenResponse {
56
56
  string pairingToken = 1;
57
57
  }
58
58
 
59
+ message PairingRequestV2 {
60
+ uint64 weaveNodeId = 1;
61
+ string pairerId = 2;
62
+ PairerType pairerType = 3;
63
+ string userId = 4;
64
+ int32 weaveVendorId = 5;
65
+ int32 weaveProductId = 6;
66
+ string hardwareRevision = 7;
67
+ string softwareRevision = 8;
68
+ string pairingToken = 9;
69
+ uint64 fabricId = 10;
70
+ google.protobuf.Timestamp pairedAt = 11;
71
+ InitiatedBy initiatedBy = 12;
72
+ string serialNumber = 13;
73
+ string macAddress = 14;
74
+ string ipAddress = 15;
75
+ bool reconnectTunnel = 16;
76
+
77
+ enum PairerType {
78
+ PAIRER_TYPE_UNSPECIFIED = 0;
79
+ PAIRER_TYPE_STRUCTURE = 1;
80
+ PAIRER_TYPE_USER = 2;
81
+ }
82
+ }
83
+
84
+ message PairingResponse {
85
+ string resourceId = 1;
86
+ string resourceInstanceId = 2;
87
+ }
88
+
59
89
  message PairNFCTokenDeviceRequest {
60
90
  uint64 weaveNodeId = 1;
61
91
  string userId = 2;
@@ -104,4 +134,4 @@ service ResourceRelationshipService {
104
134
 
105
135
  service ProvisioningHelperService {
106
136
  rpc Unpair(UnpairingRequest) returns (UnpairingResponse);
107
- }
137
+ }
@@ -7,6 +7,188 @@ import "../../weave/common.proto";
7
7
 
8
8
  package nest.trait.firmware;
9
9
 
10
+ message SoftwareUpdateTrait {
11
+ google.protobuf.Timestamp lastUpdateTime = 1;
12
+ State state = 2;
13
+ UpdateType updateType = 3;
14
+ uint32 progressPercent = 4;
15
+ google.protobuf.Duration estimatedCompletionDuration = 5;
16
+ google.protobuf.Timestamp estimatedCompletionTime = 6;
17
+
18
+ enum State {
19
+ STATE_UNSPECIFIED = 0;
20
+ STATE_IDLE = 1;
21
+ STATE_QUERYING = 2;
22
+ STATE_DOWNLOADING = 3;
23
+ STATE_INSTALLING = 4;
24
+ STATE_ROLLING_BACK = 5;
25
+ }
26
+
27
+ enum StartTrigger {
28
+ START_TRIGGER_UNSPECIFIED = 0;
29
+ START_TRIGGER_USER_INITIATED = 1;
30
+ START_TRIGGER_SCHEDULED = 2;
31
+ START_TRIGGER_USB = 3;
32
+ START_TRIGGER_FROM_DFU = 4;
33
+ START_TRIGGER_BLE = 5;
34
+ START_TRIGGER_REMOTE_AGENT = 6;
35
+ START_TRIGGER_OTHER = 7;
36
+ }
37
+
38
+ enum UpdateType {
39
+ UPDATE_TYPE_UNSPECIFIED = 0;
40
+ UPDATE_TYPE_BLOCKING = 1;
41
+ UPDATE_TYPE_NON_BLOCKING = 2;
42
+ }
43
+
44
+ enum UpdateScheme {
45
+ UPDATE_SCHEME_UNSPECIFIED = 0;
46
+ UPDATE_SCHEME_HTTPS = 1;
47
+ }
48
+
49
+ enum UpdatePriority {
50
+ UPDATE_PRIORITY_UNSPECIFIED = 0;
51
+ UPDATE_PRIORITY_NORMAL = 1;
52
+ UPDATE_PRIORITY_CRITICAL = 2;
53
+ }
54
+
55
+ enum ResponseType {
56
+ RESPONSE_TYPE_UNSPECIFIED = 0;
57
+ RESPONSE_TYPE_AVAILABLE = 1;
58
+ RESPONSE_TYPE_NO_UPDATE = 2;
59
+ }
60
+
61
+ enum ProductNamespace {
62
+ PRODUCT_NAMESPACE_UNSPECIFIED = 0;
63
+ PRODUCT_NAMESPACE_WEAVE = 1;
64
+ }
65
+
66
+ message ProductInfo {
67
+ ProductNamespace productNamespace = 1;
68
+ uint32 vendorId = 2;
69
+ uint32 productId = 3;
70
+ }
71
+
72
+ message SoftwareVersion {
73
+ int64 softwareVersion = 1;
74
+ string displaySoftwareVersion = 2;
75
+ string softwareVersionLabel = 3;
76
+ }
77
+
78
+ message UpdateInfo {
79
+ string downloadUrl = 1;
80
+ SoftwareVersion updateSoftwareVersion = 2;
81
+ UpdateScheme updateScheme = 3;
82
+ }
83
+
84
+ message DeviceId {
85
+ string deviceSerialNumber = 1;
86
+ }
87
+
88
+ message DeviceInfo {
89
+ DeviceId deviceId = 1;
90
+ ProductInfo productInfo = 2;
91
+ SoftwareVersion currentSoftwareVersion = 3;
92
+ }
93
+
94
+ message SoftwareUpdateCheckRequest {
95
+ DeviceInfo deviceInfo = 1;
96
+ }
97
+
98
+ message SoftwareUpdateCheckResponse {
99
+ ResponseType responseType = 1;
100
+ UpdatePriority updatePriority = 2;
101
+ UpdateInfo updateInfo = 3;
102
+ string channelName = 4;
103
+ }
104
+
105
+ message SoftwareUpdateStartEvent {
106
+ StartTrigger trigger = 1;
107
+ DeviceInfo deviceInfo = 2;
108
+ }
109
+
110
+ message FailureEvent {
111
+ State state = 1;
112
+ uint32 platformReturnCode = 2;
113
+ weave.common.ProfileSpecificStatusCode primaryStatusCode = 3;
114
+ weave.common.ProfileSpecificStatusCode remoteStatusCode = 4;
115
+ string failtureDetail = 5;
116
+ DeviceInfo deviceInfo = 6;
117
+ }
118
+
119
+ message DownloadFailureEvent {
120
+ State state = 1;
121
+ uint32 platformReturnCode = 2;
122
+ weave.common.ProfileSpecificStatusCode primaryStatusCode = 3;
123
+ weave.common.ProfileSpecificStatusCode remoteStatusCode = 4;
124
+ string failtureDetail = 5;
125
+ DeviceInfo deviceInfo = 6;
126
+ string bytesDownloaded = 32;
127
+ }
128
+
129
+ message QueryBeginEvent {
130
+ google.protobuf.StringValue currentSwVersion = 2;
131
+ google.protobuf.UInt32Value vendorId = 3;
132
+ google.protobuf.UInt32Value vendorProductId = 4;
133
+ google.protobuf.UInt32Value productRevision = 5;
134
+ google.protobuf.StringValue locale = 6;
135
+ google.protobuf.StringValue queryServerAddr = 7;
136
+ weave.common.ResourceId queryServerId = 8;
137
+ DeviceInfo deviceInfo = 9;
138
+ }
139
+
140
+ message QueryFinishEvent {
141
+ google.protobuf.StringValue imageVersion = 1;
142
+ google.protobuf.StringValue imageUrl = 2;
143
+ DeviceInfo deviceInfo = 3;
144
+ SoftwareVersion imageSoftwareVersion = 4;
145
+ }
146
+
147
+ message DownloadStartEvent {
148
+ google.protobuf.StringValue imageVersion = 1;
149
+ google.protobuf.StringValue imageUrl = 2;
150
+ google.protobuf.StringValue subImageName = 3;
151
+ google.protobuf.UInt64Value offset = 4;
152
+ google.protobuf.StringValue destination = 5;
153
+ DeviceInfo deviceInfo = 6;
154
+ SoftwareVersion imageSoftwareVersion = 7;
155
+ }
156
+
157
+ message DownloadFinishEvent {
158
+ google.protobuf.StringValue imageVersion = 1;
159
+ google.protobuf.StringValue imageUrl = 2;
160
+ google.protobuf.StringValue subImageName = 3;
161
+ google.protobuf.StringValue destination = 4;
162
+ DeviceInfo deviceInfo = 5;
163
+ SoftwareVersion imageSoftwareVersion = 6;
164
+ }
165
+
166
+ message InstallStartEvent {
167
+ google.protobuf.StringValue imageVersion = 2;
168
+ google.protobuf.StringValue subImageName = 3;
169
+ google.protobuf.StringValue localSource = 4;
170
+ google.protobuf.StringValue destination = 5;
171
+ DeviceInfo deviceInfo = 6;
172
+ SoftwareVersion imageSoftwareVersion = 7;
173
+ }
174
+
175
+ message InstallFinishEvent {
176
+ google.protobuf.StringValue imageVersion = 2;
177
+ google.protobuf.StringValue subImageName = 3;
178
+ DeviceInfo deviceInfo = 4;
179
+ SoftwareVersion imageSoftwareVersion = 5;
180
+ }
181
+
182
+ message ImageRollbackEvent {
183
+ google.protobuf.StringValue imageVersion = 2;
184
+ google.protobuf.StringValue subImageName = 3;
185
+ google.protobuf.StringValue rollbackFrom = 4;
186
+ google.protobuf.StringValue rollbackTo = 5;
187
+ DeviceInfo deviceInfo = 6;
188
+ SoftwareVersion imageSoftwareVersion = 7;
189
+ }
190
+ }
191
+
10
192
  message FirmwareTrait {
11
193
  enum AssertType {
12
194
  ASSERT_TYPE_UNSPECIFIED = 0;
@@ -30,6 +212,13 @@ message FirmwareTrait {
30
212
  RESET_TYPE_LOW_BATTERY = 10;
31
213
  RESET_TYPE_DEBUG_BOARD = 11;
32
214
  RESET_TYPE_PMIC_RESET = 12;
215
+ RESET_TYPE_SENSOR = 13;
216
+ RESET_TYPE_NETWORK = 14;
217
+ RESET_TYPE_INTERACTION = 15;
218
+ RESET_TYPE_MCU_RESET = 16;
219
+ RESET_TYPE_VBUS = 17;
220
+ RESET_TYPE_TAMPER = 18;
221
+ RESET_TYPE_THERMAL_SHUTDOWN = 19;
33
222
  }
34
223
 
35
224
  message AssertTaskInfoStruct {
@@ -84,6 +273,11 @@ message FirmwareTrait {
84
273
  google.protobuf.Duration itemUsage = 2;
85
274
  }
86
275
 
276
+ message ItemCountStruct {
277
+ string itemName = 1;
278
+ uint32 count = 2;
279
+ }
280
+
87
281
  message RebootRequest {
88
282
  }
89
283
 
@@ -101,6 +295,7 @@ message FirmwareTrait {
101
295
  repeated IRQStruct irqInfo = 11;
102
296
  google.protobuf.UInt32Value availableRam = 12;
103
297
  repeated ItemTotalUsageStruct trackedItems = 13;
298
+ repeated ItemCountStruct countedItems = 14;
104
299
  }
105
300
 
106
301
  message FirmwareBootEvent {
@@ -126,96 +321,19 @@ message FirmwareTrait {
126
321
  int32 rngRequests = 4;
127
322
  int32 bootCount = 5;
128
323
  }
129
- }
130
-
131
- message SoftwareUpdateTrait {
132
- google.protobuf.Timestamp lastUpdateTime = 1;
133
-
134
- enum State {
135
- STATE_UNSPECIFIED = 0;
136
- STATE_IDLE = 1;
137
- STATE_QUERYING = 2;
138
- STATE_DOWNLOADING = 3;
139
- STATE_INSTALLING = 4;
140
- STATE_ROLLING_BACK = 5;
141
- }
142
-
143
- enum StartTrigger {
144
- START_TRIGGER_UNSPECIFIED = 0;
145
- START_TRIGGER_USER_INITIATED = 1;
146
- START_TRIGGER_SCHEDULED = 2;
147
- START_TRIGGER_USB = 3;
148
- START_TRIGGER_FROM_DFU = 4;
149
- START_TRIGGER_BLE = 5;
150
- START_TRIGGER_REMOTE_AGENT = 6;
151
- START_TRIGGER_OTHER = 7;
152
- }
153
-
154
- message SoftwareUpdateStartEvent {
155
- StartTrigger trigger = 1;
156
- }
157
-
158
- message FailureEvent {
159
- State state = 1;
160
- uint32 platformReturnCode = 2;
161
- weave.common.ProfileSpecificStatusCode primaryStatusCode = 3;
162
- weave.common.ProfileSpecificStatusCode remoteStatusCode = 4;
163
- }
164
-
165
- message DownloadFailureEvent {
166
- State state = 1;
167
- uint32 platformReturnCode = 2;
168
- weave.common.ProfileSpecificStatusCode primaryStatusCode = 3;
169
- weave.common.ProfileSpecificStatusCode remoteStatusCode = 4;
170
- string bytesDownloaded = 32;
171
- }
172
-
173
- message QueryBeginEvent {
174
- google.protobuf.StringValue currentSwVersion = 2;
175
- google.protobuf.UInt32Value vendorId = 3;
176
- google.protobuf.UInt32Value vendorProductId = 4;
177
- google.protobuf.UInt32Value productRevision = 5;
178
- google.protobuf.StringValue locale = 6;
179
- google.protobuf.StringValue queryServerAddr = 7;
180
- weave.common.ResourceId queryServerId = 8;
181
- }
182
-
183
- message QueryFinishEvent {
184
- google.protobuf.StringValue imageVersion = 1;
185
- google.protobuf.StringValue imageUrl = 2;
186
- }
187
-
188
- message DownloadStartEvent {
189
- google.protobuf.StringValue imageVersion = 1;
190
- google.protobuf.StringValue imageUrl = 2;
191
- google.protobuf.StringValue subImageName = 3;
192
- google.protobuf.UInt64Value offset = 4;
193
- google.protobuf.StringValue destination = 5;
194
- }
195
-
196
- message DownloadFinishEvent {
197
- google.protobuf.StringValue imageVersion = 1;
198
- google.protobuf.StringValue imageUrl = 2;
199
- google.protobuf.StringValue subImageName = 3;
200
- google.protobuf.StringValue destination = 4;
201
- }
202
-
203
- message InstallStartEvent {
204
- google.protobuf.StringValue imageVersion = 2;
205
- google.protobuf.StringValue subImageName = 3;
206
- google.protobuf.StringValue localSource = 4;
207
- google.protobuf.StringValue destination = 5;
208
- }
209
324
 
210
- message InstallFinishEvent {
211
- google.protobuf.StringValue imageVersion = 2;
212
- google.protobuf.StringValue subImageName = 3;
325
+ message EnvStatsEvent {
326
+ uint32 envWriteCount = 1;
327
+ uint32 envUsedBytes = 2;
328
+ uint32 entryCount = 3;
329
+ uint32 maxSectorEraseCount = 4;
330
+ uint32 avgSectorEraseCount = 5;
331
+ uint32 sectorCount = 6;
332
+ uint32 sectorSize = 7;
333
+ uint32 recoveryOperationCount = 8;
213
334
  }
214
335
 
215
- message ImageRollbackEvent {
216
- google.protobuf.StringValue imageVersion = 2;
217
- google.protobuf.StringValue subImageName = 3;
218
- google.protobuf.StringValue rollbackFrom = 4;
219
- google.protobuf.StringValue rollbackTo = 5;
336
+ message FirmwareBootEndEvent {
337
+ google.protobuf.Duration uptime = 1;
220
338
  }
221
- }
339
+ }