@m1kad0/hannah-proto 0.3.3 → 0.3.5

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/dist/hannah.d.ts CHANGED
@@ -1 +1,1161 @@
1
+ import { type CallOptions, type ChannelCredentials, Client, type ClientDuplexStream, type ClientOptions, type ClientReadableStream, type ClientUnaryCall, type handleBidiStreamingCall, type handleServerStreamingCall, type handleUnaryCall, type Metadata, type ServiceError, type UntypedServiceImplementation } from "@grpc/grpc-js";
2
+ import { AgentCommand, AgentMessage, AgentNotification } from "./agent";
3
+ import { CarStateResponse, GetAllCarStatesResponse } from "./car_state";
4
+ import { AnnounceRequest, CreateAlarmRequest, CreateAlarmResponse, CreateBleTagRequest, CreateBleTagResponse, CreateCarRequest, CreateCarResponse, CreateGroupRequest, CreateRoutineRequest, CreateRoutineResponse, CreateTriggerRequest, DeleteAlarmRequest, DeleteBleTagRequest, DeleteCarRequest, DeleteGroupRequest, DeleteRoutineRequest, DeleteSatelliteRequest, DeleteTriggerRequest, GetAlarmsResponse, GetBleTagsResponse, GetCarsResponse, GetGroupsResponse, GetRoomsResponse, GetRoutinesResponse, GetSatellitesResponse, GetSettingsResponse, GetTriggersResponse, SetGroupRoomsRequest, SetSatelliteDisplayNameRequest, SetSatelliteOwnerRequest, SetSatelliteRoomRequest, SubmitTextRequest, SubmitTextResponse, SubmitVoiceRequest, SubmitVoiceResponse, UpdateAlarmRequest, UpdateBleTagRequest, UpdateCarRequest, UpdateConfigRequest, UpdateGroupRequest, UpdateRoutineRequest, UpdateTriggerRequest } from "./control";
5
+ import { ControlDeviceRequest, GetDevicesResponse } from "./device_control_menu";
6
+ import { EventFilter, HannahEvent, TriggerFirmwareUpdateRequest } from "./event_stream";
7
+ import { ProvisionSatelliteRequest } from "./satellite_provisioning";
8
+ import { ProxyCommand, ProxyHeartbeat, SatelliteRegistration, SubmitSatelliteAudioRequest, SubmitSatelliteAudioResponse } from "./satellite_proxy";
9
+ import { Empty, StatusResponse } from "./shared";
10
+ import { EnrollVoiceprintRequest } from "./speaker_enrollment";
11
+ import { TimerCommand, TimerMessage } from "./timer_service";
12
+ import { CreateUserRequest, CreateUserResponse, DeleteUserRequest, GetResidentsResponse, GetUserRequest, GetUsersRequest, GetUsersResponse, LinkAccountRequest, LoginRequest, SetSystemMessagesRequest, SetTrustLevelRequest, UnlinkAccountRequest, UpdateUserRequest, UserResponse } from "./user_registry";
13
+ import { SatelliteAudioChunk, SatelliteCaptureRequest, SatelliteCaptureResponse, TriggerPlinkRequest } from "./wakeword_capture";
1
14
  export declare const protobufPackage = "hannah";
15
+ export type HannahServiceService = typeof HannahServiceService;
16
+ export declare const HannahServiceService: {
17
+ /** --- User Registry --- */
18
+ readonly getUsers: {
19
+ readonly path: "/hannah.HannahService/GetUsers";
20
+ readonly requestStream: false;
21
+ readonly responseStream: false;
22
+ readonly requestSerialize: (value: GetUsersRequest) => Buffer;
23
+ readonly requestDeserialize: (value: Buffer) => GetUsersRequest;
24
+ readonly responseSerialize: (value: GetUsersResponse) => Buffer;
25
+ readonly responseDeserialize: (value: Buffer) => GetUsersResponse;
26
+ };
27
+ readonly getUser: {
28
+ readonly path: "/hannah.HannahService/GetUser";
29
+ readonly requestStream: false;
30
+ readonly responseStream: false;
31
+ readonly requestSerialize: (value: GetUserRequest) => Buffer;
32
+ readonly requestDeserialize: (value: Buffer) => GetUserRequest;
33
+ readonly responseSerialize: (value: UserResponse) => Buffer;
34
+ readonly responseDeserialize: (value: Buffer) => UserResponse;
35
+ };
36
+ readonly linkAccount: {
37
+ readonly path: "/hannah.HannahService/LinkAccount";
38
+ readonly requestStream: false;
39
+ readonly responseStream: false;
40
+ readonly requestSerialize: (value: LinkAccountRequest) => Buffer;
41
+ readonly requestDeserialize: (value: Buffer) => LinkAccountRequest;
42
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
43
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
44
+ };
45
+ readonly unlinkAccount: {
46
+ readonly path: "/hannah.HannahService/UnlinkAccount";
47
+ readonly requestStream: false;
48
+ readonly responseStream: false;
49
+ readonly requestSerialize: (value: UnlinkAccountRequest) => Buffer;
50
+ readonly requestDeserialize: (value: Buffer) => UnlinkAccountRequest;
51
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
52
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
53
+ };
54
+ readonly setTrustLevel: {
55
+ readonly path: "/hannah.HannahService/SetTrustLevel";
56
+ readonly requestStream: false;
57
+ readonly responseStream: false;
58
+ readonly requestSerialize: (value: SetTrustLevelRequest) => Buffer;
59
+ readonly requestDeserialize: (value: Buffer) => SetTrustLevelRequest;
60
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
61
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
62
+ };
63
+ readonly setSystemMessages: {
64
+ readonly path: "/hannah.HannahService/SetSystemMessages";
65
+ readonly requestStream: false;
66
+ readonly responseStream: false;
67
+ readonly requestSerialize: (value: SetSystemMessagesRequest) => Buffer;
68
+ readonly requestDeserialize: (value: Buffer) => SetSystemMessagesRequest;
69
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
70
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
71
+ };
72
+ readonly login: {
73
+ readonly path: "/hannah.HannahService/Login";
74
+ readonly requestStream: false;
75
+ readonly responseStream: false;
76
+ readonly requestSerialize: (value: LoginRequest) => Buffer;
77
+ readonly requestDeserialize: (value: Buffer) => LoginRequest;
78
+ readonly responseSerialize: (value: UserResponse) => Buffer;
79
+ readonly responseDeserialize: (value: Buffer) => UserResponse;
80
+ };
81
+ /** --- User-Verwaltung (Admin-UI, #27 Phase 6) --- */
82
+ readonly createUser: {
83
+ readonly path: "/hannah.HannahService/CreateUser";
84
+ readonly requestStream: false;
85
+ readonly responseStream: false;
86
+ readonly requestSerialize: (value: CreateUserRequest) => Buffer;
87
+ readonly requestDeserialize: (value: Buffer) => CreateUserRequest;
88
+ readonly responseSerialize: (value: CreateUserResponse) => Buffer;
89
+ readonly responseDeserialize: (value: Buffer) => CreateUserResponse;
90
+ };
91
+ readonly updateUser: {
92
+ readonly path: "/hannah.HannahService/UpdateUser";
93
+ readonly requestStream: false;
94
+ readonly responseStream: false;
95
+ readonly requestSerialize: (value: UpdateUserRequest) => Buffer;
96
+ readonly requestDeserialize: (value: Buffer) => UpdateUserRequest;
97
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
98
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
99
+ };
100
+ readonly deleteUser: {
101
+ readonly path: "/hannah.HannahService/DeleteUser";
102
+ readonly requestStream: false;
103
+ readonly responseStream: false;
104
+ readonly requestSerialize: (value: DeleteUserRequest) => Buffer;
105
+ readonly requestDeserialize: (value: Buffer) => DeleteUserRequest;
106
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
107
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
108
+ };
109
+ /** Residents (Roomies/Guests/Pets) aus dem ioBroker-Adapter-Cache — fürs "Resident verknüpfen"-Dropdown. */
110
+ readonly getResidents: {
111
+ readonly path: "/hannah.HannahService/GetResidents";
112
+ readonly requestStream: false;
113
+ readonly responseStream: false;
114
+ readonly requestSerialize: (value: Empty) => Buffer;
115
+ readonly requestDeserialize: (value: Buffer) => Empty;
116
+ readonly responseSerialize: (value: GetResidentsResponse) => Buffer;
117
+ readonly responseDeserialize: (value: Buffer) => GetResidentsResponse;
118
+ };
119
+ /**
120
+ * --- Device Control Menu ---
121
+ * Returns all rooms and devices with current state — for building control menus.
122
+ */
123
+ readonly getDevices: {
124
+ readonly path: "/hannah.HannahService/GetDevices";
125
+ readonly requestStream: false;
126
+ readonly responseStream: false;
127
+ readonly requestSerialize: (value: Empty) => Buffer;
128
+ readonly requestDeserialize: (value: Buffer) => Empty;
129
+ readonly responseSerialize: (value: GetDevicesResponse) => Buffer;
130
+ readonly responseDeserialize: (value: Buffer) => GetDevicesResponse;
131
+ };
132
+ /** Directly set a device state (bypasses NLU). Trust level check is done by the caller. */
133
+ readonly controlDevice: {
134
+ readonly path: "/hannah.HannahService/ControlDevice";
135
+ readonly requestStream: false;
136
+ readonly responseStream: false;
137
+ readonly requestSerialize: (value: ControlDeviceRequest) => Buffer;
138
+ readonly requestDeserialize: (value: Buffer) => ControlDeviceRequest;
139
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
140
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
141
+ };
142
+ /**
143
+ * --- Control ---
144
+ * Submit a plain-text command; Hannah processes it through NLU and returns the answer.
145
+ */
146
+ readonly submitText: {
147
+ readonly path: "/hannah.HannahService/SubmitText";
148
+ readonly requestStream: false;
149
+ readonly responseStream: false;
150
+ readonly requestSerialize: (value: SubmitTextRequest) => Buffer;
151
+ readonly requestDeserialize: (value: Buffer) => SubmitTextRequest;
152
+ readonly responseSerialize: (value: SubmitTextResponse) => Buffer;
153
+ readonly responseDeserialize: (value: Buffer) => SubmitTextResponse;
154
+ };
155
+ /** Submit a voice message (OGG/Opus bytes); Hannah does STT → NLU → TTS and returns the result. */
156
+ readonly submitVoice: {
157
+ readonly path: "/hannah.HannahService/SubmitVoice";
158
+ readonly requestStream: false;
159
+ readonly responseStream: false;
160
+ readonly requestSerialize: (value: SubmitVoiceRequest) => Buffer;
161
+ readonly requestDeserialize: (value: Buffer) => SubmitVoiceRequest;
162
+ readonly responseSerialize: (value: SubmitVoiceResponse) => Buffer;
163
+ readonly responseDeserialize: (value: Buffer) => SubmitVoiceResponse;
164
+ };
165
+ /** Send a TTS announcement to one satellite or all ("all"). */
166
+ readonly announce: {
167
+ readonly path: "/hannah.HannahService/Announce";
168
+ readonly requestStream: false;
169
+ readonly responseStream: false;
170
+ readonly requestSerialize: (value: AnnounceRequest) => Buffer;
171
+ readonly requestDeserialize: (value: Buffer) => AnnounceRequest;
172
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
173
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
174
+ };
175
+ /**
176
+ * Send a notification from ioBroker to Hannah. Returns ok=true when queued.
177
+ * direct=true: skip LLM reformulation. severity: "alert"|"notify"|"info".
178
+ */
179
+ readonly notify: {
180
+ readonly path: "/hannah.HannahService/Notify";
181
+ readonly requestStream: false;
182
+ readonly responseStream: false;
183
+ readonly requestSerialize: (value: AgentNotification) => Buffer;
184
+ readonly requestDeserialize: (value: Buffer) => AgentNotification;
185
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
186
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
187
+ };
188
+ /** List all known satellites (DB + live status merged). */
189
+ readonly getSatellites: {
190
+ readonly path: "/hannah.HannahService/GetSatellites";
191
+ readonly requestStream: false;
192
+ readonly responseStream: false;
193
+ readonly requestSerialize: (value: Empty) => Buffer;
194
+ readonly requestDeserialize: (value: Buffer) => Empty;
195
+ readonly responseSerialize: (value: GetSatellitesResponse) => Buffer;
196
+ readonly responseDeserialize: (value: Buffer) => GetSatellitesResponse;
197
+ };
198
+ /** --- Satellites (Admin-UI, #27 Phase 2) --- */
199
+ readonly setSatelliteRoom: {
200
+ readonly path: "/hannah.HannahService/SetSatelliteRoom";
201
+ readonly requestStream: false;
202
+ readonly responseStream: false;
203
+ readonly requestSerialize: (value: SetSatelliteRoomRequest) => Buffer;
204
+ readonly requestDeserialize: (value: Buffer) => SetSatelliteRoomRequest;
205
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
206
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
207
+ };
208
+ readonly setSatelliteDisplayName: {
209
+ readonly path: "/hannah.HannahService/SetSatelliteDisplayName";
210
+ readonly requestStream: false;
211
+ readonly responseStream: false;
212
+ readonly requestSerialize: (value: SetSatelliteDisplayNameRequest) => Buffer;
213
+ readonly requestDeserialize: (value: Buffer) => SetSatelliteDisplayNameRequest;
214
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
215
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
216
+ };
217
+ /** Assign a satellite to a Person (User), independent of its room. #31 */
218
+ readonly setSatelliteOwner: {
219
+ readonly path: "/hannah.HannahService/SetSatelliteOwner";
220
+ readonly requestStream: false;
221
+ readonly responseStream: false;
222
+ readonly requestSerialize: (value: SetSatelliteOwnerRequest) => Buffer;
223
+ readonly requestDeserialize: (value: Buffer) => SetSatelliteOwnerRequest;
224
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
225
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
226
+ };
227
+ /** Delete existing satellite */
228
+ readonly deleteSatellite: {
229
+ readonly path: "/hannah.HannahService/DeleteSatellite";
230
+ readonly requestStream: false;
231
+ readonly responseStream: false;
232
+ readonly requestSerialize: (value: DeleteSatelliteRequest) => Buffer;
233
+ readonly requestDeserialize: (value: Buffer) => DeleteSatelliteRequest;
234
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
235
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
236
+ };
237
+ /** --- Rooms/Groups (Admin-UI, #27 Phase 1) --- */
238
+ readonly getRooms: {
239
+ readonly path: "/hannah.HannahService/GetRooms";
240
+ readonly requestStream: false;
241
+ readonly responseStream: false;
242
+ readonly requestSerialize: (value: Empty) => Buffer;
243
+ readonly requestDeserialize: (value: Buffer) => Empty;
244
+ readonly responseSerialize: (value: GetRoomsResponse) => Buffer;
245
+ readonly responseDeserialize: (value: Buffer) => GetRoomsResponse;
246
+ };
247
+ readonly getGroups: {
248
+ readonly path: "/hannah.HannahService/GetGroups";
249
+ readonly requestStream: false;
250
+ readonly responseStream: false;
251
+ readonly requestSerialize: (value: Empty) => Buffer;
252
+ readonly requestDeserialize: (value: Buffer) => Empty;
253
+ readonly responseSerialize: (value: GetGroupsResponse) => Buffer;
254
+ readonly responseDeserialize: (value: Buffer) => GetGroupsResponse;
255
+ };
256
+ readonly createGroup: {
257
+ readonly path: "/hannah.HannahService/CreateGroup";
258
+ readonly requestStream: false;
259
+ readonly responseStream: false;
260
+ readonly requestSerialize: (value: CreateGroupRequest) => Buffer;
261
+ readonly requestDeserialize: (value: Buffer) => CreateGroupRequest;
262
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
263
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
264
+ };
265
+ readonly updateGroup: {
266
+ readonly path: "/hannah.HannahService/UpdateGroup";
267
+ readonly requestStream: false;
268
+ readonly responseStream: false;
269
+ readonly requestSerialize: (value: UpdateGroupRequest) => Buffer;
270
+ readonly requestDeserialize: (value: Buffer) => UpdateGroupRequest;
271
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
272
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
273
+ };
274
+ readonly deleteGroup: {
275
+ readonly path: "/hannah.HannahService/DeleteGroup";
276
+ readonly requestStream: false;
277
+ readonly responseStream: false;
278
+ readonly requestSerialize: (value: DeleteGroupRequest) => Buffer;
279
+ readonly requestDeserialize: (value: Buffer) => DeleteGroupRequest;
280
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
281
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
282
+ };
283
+ readonly setGroupRooms: {
284
+ readonly path: "/hannah.HannahService/SetGroupRooms";
285
+ readonly requestStream: false;
286
+ readonly responseStream: false;
287
+ readonly requestSerialize: (value: SetGroupRoomsRequest) => Buffer;
288
+ readonly requestDeserialize: (value: Buffer) => SetGroupRoomsRequest;
289
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
290
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
291
+ };
292
+ /** --- Routines/Triggers (Admin-UI, #27 Phase 4) --- */
293
+ readonly getRoutines: {
294
+ readonly path: "/hannah.HannahService/GetRoutines";
295
+ readonly requestStream: false;
296
+ readonly responseStream: false;
297
+ readonly requestSerialize: (value: Empty) => Buffer;
298
+ readonly requestDeserialize: (value: Buffer) => Empty;
299
+ readonly responseSerialize: (value: GetRoutinesResponse) => Buffer;
300
+ readonly responseDeserialize: (value: Buffer) => GetRoutinesResponse;
301
+ };
302
+ readonly createRoutine: {
303
+ readonly path: "/hannah.HannahService/CreateRoutine";
304
+ readonly requestStream: false;
305
+ readonly responseStream: false;
306
+ readonly requestSerialize: (value: CreateRoutineRequest) => Buffer;
307
+ readonly requestDeserialize: (value: Buffer) => CreateRoutineRequest;
308
+ readonly responseSerialize: (value: CreateRoutineResponse) => Buffer;
309
+ readonly responseDeserialize: (value: Buffer) => CreateRoutineResponse;
310
+ };
311
+ readonly updateRoutine: {
312
+ readonly path: "/hannah.HannahService/UpdateRoutine";
313
+ readonly requestStream: false;
314
+ readonly responseStream: false;
315
+ readonly requestSerialize: (value: UpdateRoutineRequest) => Buffer;
316
+ readonly requestDeserialize: (value: Buffer) => UpdateRoutineRequest;
317
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
318
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
319
+ };
320
+ readonly deleteRoutine: {
321
+ readonly path: "/hannah.HannahService/DeleteRoutine";
322
+ readonly requestStream: false;
323
+ readonly responseStream: false;
324
+ readonly requestSerialize: (value: DeleteRoutineRequest) => Buffer;
325
+ readonly requestDeserialize: (value: Buffer) => DeleteRoutineRequest;
326
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
327
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
328
+ };
329
+ readonly getTriggers: {
330
+ readonly path: "/hannah.HannahService/GetTriggers";
331
+ readonly requestStream: false;
332
+ readonly responseStream: false;
333
+ readonly requestSerialize: (value: Empty) => Buffer;
334
+ readonly requestDeserialize: (value: Buffer) => Empty;
335
+ readonly responseSerialize: (value: GetTriggersResponse) => Buffer;
336
+ readonly responseDeserialize: (value: Buffer) => GetTriggersResponse;
337
+ };
338
+ readonly createTrigger: {
339
+ readonly path: "/hannah.HannahService/CreateTrigger";
340
+ readonly requestStream: false;
341
+ readonly responseStream: false;
342
+ readonly requestSerialize: (value: CreateTriggerRequest) => Buffer;
343
+ readonly requestDeserialize: (value: Buffer) => CreateTriggerRequest;
344
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
345
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
346
+ };
347
+ readonly updateTrigger: {
348
+ readonly path: "/hannah.HannahService/UpdateTrigger";
349
+ readonly requestStream: false;
350
+ readonly responseStream: false;
351
+ readonly requestSerialize: (value: UpdateTriggerRequest) => Buffer;
352
+ readonly requestDeserialize: (value: Buffer) => UpdateTriggerRequest;
353
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
354
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
355
+ };
356
+ readonly deleteTrigger: {
357
+ readonly path: "/hannah.HannahService/DeleteTrigger";
358
+ readonly requestStream: false;
359
+ readonly responseStream: false;
360
+ readonly requestSerialize: (value: DeleteTriggerRequest) => Buffer;
361
+ readonly requestDeserialize: (value: Buffer) => DeleteTriggerRequest;
362
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
363
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
364
+ };
365
+ /** --- Alarms (Wecker, #4) --- */
366
+ readonly getAlarms: {
367
+ readonly path: "/hannah.HannahService/GetAlarms";
368
+ readonly requestStream: false;
369
+ readonly responseStream: false;
370
+ readonly requestSerialize: (value: Empty) => Buffer;
371
+ readonly requestDeserialize: (value: Buffer) => Empty;
372
+ readonly responseSerialize: (value: GetAlarmsResponse) => Buffer;
373
+ readonly responseDeserialize: (value: Buffer) => GetAlarmsResponse;
374
+ };
375
+ readonly createAlarm: {
376
+ readonly path: "/hannah.HannahService/CreateAlarm";
377
+ readonly requestStream: false;
378
+ readonly responseStream: false;
379
+ readonly requestSerialize: (value: CreateAlarmRequest) => Buffer;
380
+ readonly requestDeserialize: (value: Buffer) => CreateAlarmRequest;
381
+ readonly responseSerialize: (value: CreateAlarmResponse) => Buffer;
382
+ readonly responseDeserialize: (value: Buffer) => CreateAlarmResponse;
383
+ };
384
+ readonly updateAlarm: {
385
+ readonly path: "/hannah.HannahService/UpdateAlarm";
386
+ readonly requestStream: false;
387
+ readonly responseStream: false;
388
+ readonly requestSerialize: (value: UpdateAlarmRequest) => Buffer;
389
+ readonly requestDeserialize: (value: Buffer) => UpdateAlarmRequest;
390
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
391
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
392
+ };
393
+ readonly deleteAlarm: {
394
+ readonly path: "/hannah.HannahService/DeleteAlarm";
395
+ readonly requestStream: false;
396
+ readonly responseStream: false;
397
+ readonly requestSerialize: (value: DeleteAlarmRequest) => Buffer;
398
+ readonly requestDeserialize: (value: Buffer) => DeleteAlarmRequest;
399
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
400
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
401
+ };
402
+ /**
403
+ * --- Settings (Admin-UI, #27 Phase 5) ---
404
+ * CreateSetting/DeleteSetting wurden mit #115 entfernt: ble.tags/cars haben jetzt
405
+ * eigene Modelle+CRUD (unten), nlu/iobroker.state_names/llm.system_prompt sind immer
406
+ * vorab bekannt/geseedet — es gibt keinen verbleibenden Bedarf, neue Settings anzulegen.
407
+ */
408
+ readonly getSettings: {
409
+ readonly path: "/hannah.HannahService/GetSettings";
410
+ readonly requestStream: false;
411
+ readonly responseStream: false;
412
+ readonly requestSerialize: (value: Empty) => Buffer;
413
+ readonly requestDeserialize: (value: Buffer) => Empty;
414
+ readonly responseSerialize: (value: GetSettingsResponse) => Buffer;
415
+ readonly responseDeserialize: (value: Buffer) => GetSettingsResponse;
416
+ };
417
+ readonly updateConfig: {
418
+ readonly path: "/hannah.HannahService/UpdateConfig";
419
+ readonly requestStream: false;
420
+ readonly responseStream: false;
421
+ readonly requestSerialize: (value: UpdateConfigRequest) => Buffer;
422
+ readonly requestDeserialize: (value: Buffer) => UpdateConfigRequest;
423
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
424
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
425
+ };
426
+ /** --- BLE Tags (Admin-UI, #115 — eigenes Modell statt Settings-JSON-Blob) --- */
427
+ readonly getBleTags: {
428
+ readonly path: "/hannah.HannahService/GetBleTags";
429
+ readonly requestStream: false;
430
+ readonly responseStream: false;
431
+ readonly requestSerialize: (value: Empty) => Buffer;
432
+ readonly requestDeserialize: (value: Buffer) => Empty;
433
+ readonly responseSerialize: (value: GetBleTagsResponse) => Buffer;
434
+ readonly responseDeserialize: (value: Buffer) => GetBleTagsResponse;
435
+ };
436
+ readonly createBleTag: {
437
+ readonly path: "/hannah.HannahService/CreateBleTag";
438
+ readonly requestStream: false;
439
+ readonly responseStream: false;
440
+ readonly requestSerialize: (value: CreateBleTagRequest) => Buffer;
441
+ readonly requestDeserialize: (value: Buffer) => CreateBleTagRequest;
442
+ readonly responseSerialize: (value: CreateBleTagResponse) => Buffer;
443
+ readonly responseDeserialize: (value: Buffer) => CreateBleTagResponse;
444
+ };
445
+ readonly updateBleTag: {
446
+ readonly path: "/hannah.HannahService/UpdateBleTag";
447
+ readonly requestStream: false;
448
+ readonly responseStream: false;
449
+ readonly requestSerialize: (value: UpdateBleTagRequest) => Buffer;
450
+ readonly requestDeserialize: (value: Buffer) => UpdateBleTagRequest;
451
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
452
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
453
+ };
454
+ readonly deleteBleTag: {
455
+ readonly path: "/hannah.HannahService/DeleteBleTag";
456
+ readonly requestStream: false;
457
+ readonly responseStream: false;
458
+ readonly requestSerialize: (value: DeleteBleTagRequest) => Buffer;
459
+ readonly requestDeserialize: (value: Buffer) => DeleteBleTagRequest;
460
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
461
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
462
+ };
463
+ /** --- Cars (Admin-UI, #115 — eigenes Modell + user_to_car-Pivot statt Settings-JSON-Blob) --- */
464
+ readonly getCars: {
465
+ readonly path: "/hannah.HannahService/GetCars";
466
+ readonly requestStream: false;
467
+ readonly responseStream: false;
468
+ readonly requestSerialize: (value: Empty) => Buffer;
469
+ readonly requestDeserialize: (value: Buffer) => Empty;
470
+ readonly responseSerialize: (value: GetCarsResponse) => Buffer;
471
+ readonly responseDeserialize: (value: Buffer) => GetCarsResponse;
472
+ };
473
+ readonly createCar: {
474
+ readonly path: "/hannah.HannahService/CreateCar";
475
+ readonly requestStream: false;
476
+ readonly responseStream: false;
477
+ readonly requestSerialize: (value: CreateCarRequest) => Buffer;
478
+ readonly requestDeserialize: (value: Buffer) => CreateCarRequest;
479
+ readonly responseSerialize: (value: CreateCarResponse) => Buffer;
480
+ readonly responseDeserialize: (value: Buffer) => CreateCarResponse;
481
+ };
482
+ readonly updateCar: {
483
+ readonly path: "/hannah.HannahService/UpdateCar";
484
+ readonly requestStream: false;
485
+ readonly responseStream: false;
486
+ readonly requestSerialize: (value: UpdateCarRequest) => Buffer;
487
+ readonly requestDeserialize: (value: Buffer) => UpdateCarRequest;
488
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
489
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
490
+ };
491
+ readonly deleteCar: {
492
+ readonly path: "/hannah.HannahService/DeleteCar";
493
+ readonly requestStream: false;
494
+ readonly responseStream: false;
495
+ readonly requestSerialize: (value: DeleteCarRequest) => Buffer;
496
+ readonly requestDeserialize: (value: Buffer) => DeleteCarRequest;
497
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
498
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
499
+ };
500
+ /**
501
+ * --- Car state (Live-VW-Connect-Status, unabhängig von der Car-Konfiguration oben) ---
502
+ * Returns the current cached car state (available=false if no data received yet).
503
+ */
504
+ readonly getCarState: {
505
+ readonly path: "/hannah.HannahService/GetCarState";
506
+ readonly requestStream: false;
507
+ readonly responseStream: false;
508
+ readonly requestSerialize: (value: Empty) => Buffer;
509
+ readonly requestDeserialize: (value: Buffer) => Empty;
510
+ readonly responseSerialize: (value: CarStateResponse) => Buffer;
511
+ readonly responseDeserialize: (value: Buffer) => CarStateResponse;
512
+ };
513
+ /** Returns all tracked car states (one per configured car). */
514
+ readonly getAllCarStates: {
515
+ readonly path: "/hannah.HannahService/GetAllCarStates";
516
+ readonly requestStream: false;
517
+ readonly responseStream: false;
518
+ readonly requestSerialize: (value: Empty) => Buffer;
519
+ readonly requestDeserialize: (value: Buffer) => Empty;
520
+ readonly responseSerialize: (value: GetAllCarStatesResponse) => Buffer;
521
+ readonly responseDeserialize: (value: Buffer) => GetAllCarStatesResponse;
522
+ };
523
+ /**
524
+ * --- Event stream ---
525
+ * Opens a server-side stream; Hannah pushes events as they occur.
526
+ * Pass event_types to filter (empty = all events).
527
+ * Known event types: "car.parked", "resident.arrived", "resident.departed", "satellite.firmware"
528
+ */
529
+ readonly subscribeEvents: {
530
+ readonly path: "/hannah.HannahService/SubscribeEvents";
531
+ readonly requestStream: false;
532
+ readonly responseStream: true;
533
+ readonly requestSerialize: (value: EventFilter) => Buffer;
534
+ readonly requestDeserialize: (value: Buffer) => EventFilter;
535
+ readonly responseSerialize: (value: HannahEvent) => Buffer;
536
+ readonly responseDeserialize: (value: Buffer) => HannahEvent;
537
+ };
538
+ /**
539
+ * --- Firmware Manager ---
540
+ * Trigger an immediate OTA update for a satellite (bypasses residents check).
541
+ */
542
+ readonly triggerFirmwareUpdate: {
543
+ readonly path: "/hannah.HannahService/TriggerFirmwareUpdate";
544
+ readonly requestStream: false;
545
+ readonly responseStream: false;
546
+ readonly requestSerialize: (value: TriggerFirmwareUpdateRequest) => Buffer;
547
+ readonly requestDeserialize: (value: Buffer) => TriggerFirmwareUpdateRequest;
548
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
549
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
550
+ };
551
+ /**
552
+ * --- Wakeword Capture ---
553
+ * Put a satellite in audio-capture mode for wakeword training data collection.
554
+ * While captured: wakeword detection is suspended, speaker is muted, DND is active.
555
+ * Hannah relays raw PCM chunks from the satellite to the collector via StreamSatelliteAudio.
556
+ * The stream stays open until the collector disconnects; Hannah then auto-releases the satellite.
557
+ */
558
+ readonly requestSatelliteCapture: {
559
+ readonly path: "/hannah.HannahService/RequestSatelliteCapture";
560
+ readonly requestStream: false;
561
+ readonly responseStream: false;
562
+ readonly requestSerialize: (value: SatelliteCaptureRequest) => Buffer;
563
+ readonly requestDeserialize: (value: Buffer) => SatelliteCaptureRequest;
564
+ readonly responseSerialize: (value: SatelliteCaptureResponse) => Buffer;
565
+ readonly responseDeserialize: (value: Buffer) => SatelliteCaptureResponse;
566
+ };
567
+ readonly releaseSatelliteCapture: {
568
+ readonly path: "/hannah.HannahService/ReleaseSatelliteCapture";
569
+ readonly requestStream: false;
570
+ readonly responseStream: false;
571
+ readonly requestSerialize: (value: SatelliteCaptureRequest) => Buffer;
572
+ readonly requestDeserialize: (value: Buffer) => SatelliteCaptureRequest;
573
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
574
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
575
+ };
576
+ readonly streamSatelliteAudio: {
577
+ readonly path: "/hannah.HannahService/StreamSatelliteAudio";
578
+ readonly requestStream: false;
579
+ readonly responseStream: true;
580
+ readonly requestSerialize: (value: SatelliteCaptureRequest) => Buffer;
581
+ readonly requestDeserialize: (value: Buffer) => SatelliteCaptureRequest;
582
+ readonly responseSerialize: (value: SatelliteAudioChunk) => Buffer;
583
+ readonly responseDeserialize: (value: Buffer) => SatelliteAudioChunk;
584
+ };
585
+ /**
586
+ * Play a plink sound on the satellite, then hold virtual PTT for record_duration seconds.
587
+ * Returns after PTT is released — Collector calls this in a loop for guided hey-hannah collection.
588
+ */
589
+ readonly triggerPlink: {
590
+ readonly path: "/hannah.HannahService/TriggerPlink";
591
+ readonly requestStream: false;
592
+ readonly responseStream: false;
593
+ readonly requestSerialize: (value: TriggerPlinkRequest) => Buffer;
594
+ readonly requestDeserialize: (value: Buffer) => TriggerPlinkRequest;
595
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
596
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
597
+ };
598
+ /**
599
+ * --- Satellite Proxy (Go gRPC proxy) ---
600
+ * Bidirectional keepalive stream. Proxy sends heartbeats; Hannah sends TTS
601
+ * audio commands back (for announcements). While this stream is open, Hannah
602
+ * disables its own UDP server. If the stream drops, Hannah re-enables UDP.
603
+ */
604
+ readonly registerProxy: {
605
+ readonly path: "/hannah.HannahService/RegisterProxy";
606
+ readonly requestStream: true;
607
+ readonly responseStream: true;
608
+ readonly requestSerialize: (value: ProxyHeartbeat) => Buffer;
609
+ readonly requestDeserialize: (value: Buffer) => ProxyHeartbeat;
610
+ readonly responseSerialize: (value: ProxyCommand) => Buffer;
611
+ readonly responseDeserialize: (value: Buffer) => ProxyCommand;
612
+ };
613
+ /**
614
+ * Submit a complete satellite audio session for processing.
615
+ * Hannah runs the full pipeline (STT → NLU → TTS → MQTT status) and returns
616
+ * the result so the proxy can play TTS audio back to the satellite.
617
+ */
618
+ readonly submitSatelliteAudio: {
619
+ readonly path: "/hannah.HannahService/SubmitSatelliteAudio";
620
+ readonly requestStream: false;
621
+ readonly responseStream: false;
622
+ readonly requestSerialize: (value: SubmitSatelliteAudioRequest) => Buffer;
623
+ readonly requestDeserialize: (value: Buffer) => SubmitSatelliteAudioRequest;
624
+ readonly responseSerialize: (value: SubmitSatelliteAudioResponse) => Buffer;
625
+ readonly responseDeserialize: (value: Buffer) => SubmitSatelliteAudioResponse;
626
+ };
627
+ /**
628
+ * Notify Hannah that a satellite registered or disconnected via the proxy.
629
+ * Hannah updates its room registry (hannah/rooms MQTT) immediately.
630
+ */
631
+ readonly notifySatelliteRegistered: {
632
+ readonly path: "/hannah.HannahService/NotifySatelliteRegistered";
633
+ readonly requestStream: false;
634
+ readonly responseStream: false;
635
+ readonly requestSerialize: (value: SatelliteRegistration) => Buffer;
636
+ readonly requestDeserialize: (value: Buffer) => SatelliteRegistration;
637
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
638
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
639
+ };
640
+ readonly notifySatelliteGone: {
641
+ readonly path: "/hannah.HannahService/NotifySatelliteGone";
642
+ readonly requestStream: false;
643
+ readonly responseStream: false;
644
+ readonly requestSerialize: (value: SatelliteRegistration) => Buffer;
645
+ readonly requestDeserialize: (value: Buffer) => SatelliteRegistration;
646
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
647
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
648
+ };
649
+ /**
650
+ * --- Satellite Provisioning ---
651
+ * Called by the ioBroker adapter before WebFlash to pre-register a seed + display name + room.
652
+ * When the satellite first connects with that seed, Hannah links serial → pre-config and clears the seed.
653
+ */
654
+ readonly provisionSatellite: {
655
+ readonly path: "/hannah.HannahService/ProvisionSatellite";
656
+ readonly requestStream: false;
657
+ readonly responseStream: false;
658
+ readonly requestSerialize: (value: ProvisionSatelliteRequest) => Buffer;
659
+ readonly requestDeserialize: (value: Buffer) => ProvisionSatelliteRequest;
660
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
661
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
662
+ };
663
+ /** --- Speaker Enrollment --- */
664
+ readonly enrollVoiceprint: {
665
+ readonly path: "/hannah.HannahService/EnrollVoiceprint";
666
+ readonly requestStream: false;
667
+ readonly responseStream: false;
668
+ readonly requestSerialize: (value: EnrollVoiceprintRequest) => Buffer;
669
+ readonly requestDeserialize: (value: Buffer) => EnrollVoiceprintRequest;
670
+ readonly responseSerialize: (value: StatusResponse) => Buffer;
671
+ readonly responseDeserialize: (value: Buffer) => StatusResponse;
672
+ };
673
+ /**
674
+ * --- Timer Service ---
675
+ * Bidirectional stream between the Hannah Timer Service and Hannah Core.
676
+ * The Timer Service initiates the connection; if Hannah restarts, the service reconnects.
677
+ * Hannah sends timer commands (create, cancel, list); the service fires events when timers expire.
678
+ */
679
+ readonly timerConnect: {
680
+ readonly path: "/hannah.HannahService/TimerConnect";
681
+ readonly requestStream: true;
682
+ readonly responseStream: true;
683
+ readonly requestSerialize: (value: TimerMessage) => Buffer;
684
+ readonly requestDeserialize: (value: Buffer) => TimerMessage;
685
+ readonly responseSerialize: (value: TimerCommand) => Buffer;
686
+ readonly responseDeserialize: (value: Buffer) => TimerCommand;
687
+ };
688
+ /**
689
+ * --- ioBroker Agent ---
690
+ * Single bidirectional stream between the HannahAgent ioBroker adapter and Hannah Core.
691
+ * The adapter pushes state updates (device states, presence, text commands);
692
+ * Hannah pushes device-control commands and on-demand state-subscription requests back.
693
+ * The adapter initiates the connection; if Hannah restarts, the adapter reconnects.
694
+ */
695
+ readonly agentConnect: {
696
+ readonly path: "/hannah.HannahService/AgentConnect";
697
+ readonly requestStream: true;
698
+ readonly responseStream: true;
699
+ readonly requestSerialize: (value: AgentMessage) => Buffer;
700
+ readonly requestDeserialize: (value: Buffer) => AgentMessage;
701
+ readonly responseSerialize: (value: AgentCommand) => Buffer;
702
+ readonly responseDeserialize: (value: Buffer) => AgentCommand;
703
+ };
704
+ };
705
+ export interface HannahServiceServer extends UntypedServiceImplementation {
706
+ /** --- User Registry --- */
707
+ getUsers: handleUnaryCall<GetUsersRequest, GetUsersResponse>;
708
+ getUser: handleUnaryCall<GetUserRequest, UserResponse>;
709
+ linkAccount: handleUnaryCall<LinkAccountRequest, StatusResponse>;
710
+ unlinkAccount: handleUnaryCall<UnlinkAccountRequest, StatusResponse>;
711
+ setTrustLevel: handleUnaryCall<SetTrustLevelRequest, StatusResponse>;
712
+ setSystemMessages: handleUnaryCall<SetSystemMessagesRequest, StatusResponse>;
713
+ login: handleUnaryCall<LoginRequest, UserResponse>;
714
+ /** --- User-Verwaltung (Admin-UI, #27 Phase 6) --- */
715
+ createUser: handleUnaryCall<CreateUserRequest, CreateUserResponse>;
716
+ updateUser: handleUnaryCall<UpdateUserRequest, StatusResponse>;
717
+ deleteUser: handleUnaryCall<DeleteUserRequest, StatusResponse>;
718
+ /** Residents (Roomies/Guests/Pets) aus dem ioBroker-Adapter-Cache — fürs "Resident verknüpfen"-Dropdown. */
719
+ getResidents: handleUnaryCall<Empty, GetResidentsResponse>;
720
+ /**
721
+ * --- Device Control Menu ---
722
+ * Returns all rooms and devices with current state — for building control menus.
723
+ */
724
+ getDevices: handleUnaryCall<Empty, GetDevicesResponse>;
725
+ /** Directly set a device state (bypasses NLU). Trust level check is done by the caller. */
726
+ controlDevice: handleUnaryCall<ControlDeviceRequest, StatusResponse>;
727
+ /**
728
+ * --- Control ---
729
+ * Submit a plain-text command; Hannah processes it through NLU and returns the answer.
730
+ */
731
+ submitText: handleUnaryCall<SubmitTextRequest, SubmitTextResponse>;
732
+ /** Submit a voice message (OGG/Opus bytes); Hannah does STT → NLU → TTS and returns the result. */
733
+ submitVoice: handleUnaryCall<SubmitVoiceRequest, SubmitVoiceResponse>;
734
+ /** Send a TTS announcement to one satellite or all ("all"). */
735
+ announce: handleUnaryCall<AnnounceRequest, StatusResponse>;
736
+ /**
737
+ * Send a notification from ioBroker to Hannah. Returns ok=true when queued.
738
+ * direct=true: skip LLM reformulation. severity: "alert"|"notify"|"info".
739
+ */
740
+ notify: handleUnaryCall<AgentNotification, StatusResponse>;
741
+ /** List all known satellites (DB + live status merged). */
742
+ getSatellites: handleUnaryCall<Empty, GetSatellitesResponse>;
743
+ /** --- Satellites (Admin-UI, #27 Phase 2) --- */
744
+ setSatelliteRoom: handleUnaryCall<SetSatelliteRoomRequest, StatusResponse>;
745
+ setSatelliteDisplayName: handleUnaryCall<SetSatelliteDisplayNameRequest, StatusResponse>;
746
+ /** Assign a satellite to a Person (User), independent of its room. #31 */
747
+ setSatelliteOwner: handleUnaryCall<SetSatelliteOwnerRequest, StatusResponse>;
748
+ /** Delete existing satellite */
749
+ deleteSatellite: handleUnaryCall<DeleteSatelliteRequest, StatusResponse>;
750
+ /** --- Rooms/Groups (Admin-UI, #27 Phase 1) --- */
751
+ getRooms: handleUnaryCall<Empty, GetRoomsResponse>;
752
+ getGroups: handleUnaryCall<Empty, GetGroupsResponse>;
753
+ createGroup: handleUnaryCall<CreateGroupRequest, StatusResponse>;
754
+ updateGroup: handleUnaryCall<UpdateGroupRequest, StatusResponse>;
755
+ deleteGroup: handleUnaryCall<DeleteGroupRequest, StatusResponse>;
756
+ setGroupRooms: handleUnaryCall<SetGroupRoomsRequest, StatusResponse>;
757
+ /** --- Routines/Triggers (Admin-UI, #27 Phase 4) --- */
758
+ getRoutines: handleUnaryCall<Empty, GetRoutinesResponse>;
759
+ createRoutine: handleUnaryCall<CreateRoutineRequest, CreateRoutineResponse>;
760
+ updateRoutine: handleUnaryCall<UpdateRoutineRequest, StatusResponse>;
761
+ deleteRoutine: handleUnaryCall<DeleteRoutineRequest, StatusResponse>;
762
+ getTriggers: handleUnaryCall<Empty, GetTriggersResponse>;
763
+ createTrigger: handleUnaryCall<CreateTriggerRequest, StatusResponse>;
764
+ updateTrigger: handleUnaryCall<UpdateTriggerRequest, StatusResponse>;
765
+ deleteTrigger: handleUnaryCall<DeleteTriggerRequest, StatusResponse>;
766
+ /** --- Alarms (Wecker, #4) --- */
767
+ getAlarms: handleUnaryCall<Empty, GetAlarmsResponse>;
768
+ createAlarm: handleUnaryCall<CreateAlarmRequest, CreateAlarmResponse>;
769
+ updateAlarm: handleUnaryCall<UpdateAlarmRequest, StatusResponse>;
770
+ deleteAlarm: handleUnaryCall<DeleteAlarmRequest, StatusResponse>;
771
+ /**
772
+ * --- Settings (Admin-UI, #27 Phase 5) ---
773
+ * CreateSetting/DeleteSetting wurden mit #115 entfernt: ble.tags/cars haben jetzt
774
+ * eigene Modelle+CRUD (unten), nlu/iobroker.state_names/llm.system_prompt sind immer
775
+ * vorab bekannt/geseedet — es gibt keinen verbleibenden Bedarf, neue Settings anzulegen.
776
+ */
777
+ getSettings: handleUnaryCall<Empty, GetSettingsResponse>;
778
+ updateConfig: handleUnaryCall<UpdateConfigRequest, StatusResponse>;
779
+ /** --- BLE Tags (Admin-UI, #115 — eigenes Modell statt Settings-JSON-Blob) --- */
780
+ getBleTags: handleUnaryCall<Empty, GetBleTagsResponse>;
781
+ createBleTag: handleUnaryCall<CreateBleTagRequest, CreateBleTagResponse>;
782
+ updateBleTag: handleUnaryCall<UpdateBleTagRequest, StatusResponse>;
783
+ deleteBleTag: handleUnaryCall<DeleteBleTagRequest, StatusResponse>;
784
+ /** --- Cars (Admin-UI, #115 — eigenes Modell + user_to_car-Pivot statt Settings-JSON-Blob) --- */
785
+ getCars: handleUnaryCall<Empty, GetCarsResponse>;
786
+ createCar: handleUnaryCall<CreateCarRequest, CreateCarResponse>;
787
+ updateCar: handleUnaryCall<UpdateCarRequest, StatusResponse>;
788
+ deleteCar: handleUnaryCall<DeleteCarRequest, StatusResponse>;
789
+ /**
790
+ * --- Car state (Live-VW-Connect-Status, unabhängig von der Car-Konfiguration oben) ---
791
+ * Returns the current cached car state (available=false if no data received yet).
792
+ */
793
+ getCarState: handleUnaryCall<Empty, CarStateResponse>;
794
+ /** Returns all tracked car states (one per configured car). */
795
+ getAllCarStates: handleUnaryCall<Empty, GetAllCarStatesResponse>;
796
+ /**
797
+ * --- Event stream ---
798
+ * Opens a server-side stream; Hannah pushes events as they occur.
799
+ * Pass event_types to filter (empty = all events).
800
+ * Known event types: "car.parked", "resident.arrived", "resident.departed", "satellite.firmware"
801
+ */
802
+ subscribeEvents: handleServerStreamingCall<EventFilter, HannahEvent>;
803
+ /**
804
+ * --- Firmware Manager ---
805
+ * Trigger an immediate OTA update for a satellite (bypasses residents check).
806
+ */
807
+ triggerFirmwareUpdate: handleUnaryCall<TriggerFirmwareUpdateRequest, StatusResponse>;
808
+ /**
809
+ * --- Wakeword Capture ---
810
+ * Put a satellite in audio-capture mode for wakeword training data collection.
811
+ * While captured: wakeword detection is suspended, speaker is muted, DND is active.
812
+ * Hannah relays raw PCM chunks from the satellite to the collector via StreamSatelliteAudio.
813
+ * The stream stays open until the collector disconnects; Hannah then auto-releases the satellite.
814
+ */
815
+ requestSatelliteCapture: handleUnaryCall<SatelliteCaptureRequest, SatelliteCaptureResponse>;
816
+ releaseSatelliteCapture: handleUnaryCall<SatelliteCaptureRequest, StatusResponse>;
817
+ streamSatelliteAudio: handleServerStreamingCall<SatelliteCaptureRequest, SatelliteAudioChunk>;
818
+ /**
819
+ * Play a plink sound on the satellite, then hold virtual PTT for record_duration seconds.
820
+ * Returns after PTT is released — Collector calls this in a loop for guided hey-hannah collection.
821
+ */
822
+ triggerPlink: handleUnaryCall<TriggerPlinkRequest, StatusResponse>;
823
+ /**
824
+ * --- Satellite Proxy (Go gRPC proxy) ---
825
+ * Bidirectional keepalive stream. Proxy sends heartbeats; Hannah sends TTS
826
+ * audio commands back (for announcements). While this stream is open, Hannah
827
+ * disables its own UDP server. If the stream drops, Hannah re-enables UDP.
828
+ */
829
+ registerProxy: handleBidiStreamingCall<ProxyHeartbeat, ProxyCommand>;
830
+ /**
831
+ * Submit a complete satellite audio session for processing.
832
+ * Hannah runs the full pipeline (STT → NLU → TTS → MQTT status) and returns
833
+ * the result so the proxy can play TTS audio back to the satellite.
834
+ */
835
+ submitSatelliteAudio: handleUnaryCall<SubmitSatelliteAudioRequest, SubmitSatelliteAudioResponse>;
836
+ /**
837
+ * Notify Hannah that a satellite registered or disconnected via the proxy.
838
+ * Hannah updates its room registry (hannah/rooms MQTT) immediately.
839
+ */
840
+ notifySatelliteRegistered: handleUnaryCall<SatelliteRegistration, StatusResponse>;
841
+ notifySatelliteGone: handleUnaryCall<SatelliteRegistration, StatusResponse>;
842
+ /**
843
+ * --- Satellite Provisioning ---
844
+ * Called by the ioBroker adapter before WebFlash to pre-register a seed + display name + room.
845
+ * When the satellite first connects with that seed, Hannah links serial → pre-config and clears the seed.
846
+ */
847
+ provisionSatellite: handleUnaryCall<ProvisionSatelliteRequest, StatusResponse>;
848
+ /** --- Speaker Enrollment --- */
849
+ enrollVoiceprint: handleUnaryCall<EnrollVoiceprintRequest, StatusResponse>;
850
+ /**
851
+ * --- Timer Service ---
852
+ * Bidirectional stream between the Hannah Timer Service and Hannah Core.
853
+ * The Timer Service initiates the connection; if Hannah restarts, the service reconnects.
854
+ * Hannah sends timer commands (create, cancel, list); the service fires events when timers expire.
855
+ */
856
+ timerConnect: handleBidiStreamingCall<TimerMessage, TimerCommand>;
857
+ /**
858
+ * --- ioBroker Agent ---
859
+ * Single bidirectional stream between the HannahAgent ioBroker adapter and Hannah Core.
860
+ * The adapter pushes state updates (device states, presence, text commands);
861
+ * Hannah pushes device-control commands and on-demand state-subscription requests back.
862
+ * The adapter initiates the connection; if Hannah restarts, the adapter reconnects.
863
+ */
864
+ agentConnect: handleBidiStreamingCall<AgentMessage, AgentCommand>;
865
+ }
866
+ export interface HannahServiceClient extends Client {
867
+ /** --- User Registry --- */
868
+ getUsers(request: GetUsersRequest, callback: (error: ServiceError | null, response: GetUsersResponse) => void): ClientUnaryCall;
869
+ getUsers(request: GetUsersRequest, metadata: Metadata, callback: (error: ServiceError | null, response: GetUsersResponse) => void): ClientUnaryCall;
870
+ getUsers(request: GetUsersRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetUsersResponse) => void): ClientUnaryCall;
871
+ getUser(request: GetUserRequest, callback: (error: ServiceError | null, response: UserResponse) => void): ClientUnaryCall;
872
+ getUser(request: GetUserRequest, metadata: Metadata, callback: (error: ServiceError | null, response: UserResponse) => void): ClientUnaryCall;
873
+ getUser(request: GetUserRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: UserResponse) => void): ClientUnaryCall;
874
+ linkAccount(request: LinkAccountRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
875
+ linkAccount(request: LinkAccountRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
876
+ linkAccount(request: LinkAccountRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
877
+ unlinkAccount(request: UnlinkAccountRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
878
+ unlinkAccount(request: UnlinkAccountRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
879
+ unlinkAccount(request: UnlinkAccountRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
880
+ setTrustLevel(request: SetTrustLevelRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
881
+ setTrustLevel(request: SetTrustLevelRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
882
+ setTrustLevel(request: SetTrustLevelRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
883
+ setSystemMessages(request: SetSystemMessagesRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
884
+ setSystemMessages(request: SetSystemMessagesRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
885
+ setSystemMessages(request: SetSystemMessagesRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
886
+ login(request: LoginRequest, callback: (error: ServiceError | null, response: UserResponse) => void): ClientUnaryCall;
887
+ login(request: LoginRequest, metadata: Metadata, callback: (error: ServiceError | null, response: UserResponse) => void): ClientUnaryCall;
888
+ login(request: LoginRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: UserResponse) => void): ClientUnaryCall;
889
+ /** --- User-Verwaltung (Admin-UI, #27 Phase 6) --- */
890
+ createUser(request: CreateUserRequest, callback: (error: ServiceError | null, response: CreateUserResponse) => void): ClientUnaryCall;
891
+ createUser(request: CreateUserRequest, metadata: Metadata, callback: (error: ServiceError | null, response: CreateUserResponse) => void): ClientUnaryCall;
892
+ createUser(request: CreateUserRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: CreateUserResponse) => void): ClientUnaryCall;
893
+ updateUser(request: UpdateUserRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
894
+ updateUser(request: UpdateUserRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
895
+ updateUser(request: UpdateUserRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
896
+ deleteUser(request: DeleteUserRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
897
+ deleteUser(request: DeleteUserRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
898
+ deleteUser(request: DeleteUserRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
899
+ /** Residents (Roomies/Guests/Pets) aus dem ioBroker-Adapter-Cache — fürs "Resident verknüpfen"-Dropdown. */
900
+ getResidents(request: Empty, callback: (error: ServiceError | null, response: GetResidentsResponse) => void): ClientUnaryCall;
901
+ getResidents(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetResidentsResponse) => void): ClientUnaryCall;
902
+ getResidents(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetResidentsResponse) => void): ClientUnaryCall;
903
+ /**
904
+ * --- Device Control Menu ---
905
+ * Returns all rooms and devices with current state — for building control menus.
906
+ */
907
+ getDevices(request: Empty, callback: (error: ServiceError | null, response: GetDevicesResponse) => void): ClientUnaryCall;
908
+ getDevices(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetDevicesResponse) => void): ClientUnaryCall;
909
+ getDevices(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetDevicesResponse) => void): ClientUnaryCall;
910
+ /** Directly set a device state (bypasses NLU). Trust level check is done by the caller. */
911
+ controlDevice(request: ControlDeviceRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
912
+ controlDevice(request: ControlDeviceRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
913
+ controlDevice(request: ControlDeviceRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
914
+ /**
915
+ * --- Control ---
916
+ * Submit a plain-text command; Hannah processes it through NLU and returns the answer.
917
+ */
918
+ submitText(request: SubmitTextRequest, callback: (error: ServiceError | null, response: SubmitTextResponse) => void): ClientUnaryCall;
919
+ submitText(request: SubmitTextRequest, metadata: Metadata, callback: (error: ServiceError | null, response: SubmitTextResponse) => void): ClientUnaryCall;
920
+ submitText(request: SubmitTextRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: SubmitTextResponse) => void): ClientUnaryCall;
921
+ /** Submit a voice message (OGG/Opus bytes); Hannah does STT → NLU → TTS and returns the result. */
922
+ submitVoice(request: SubmitVoiceRequest, callback: (error: ServiceError | null, response: SubmitVoiceResponse) => void): ClientUnaryCall;
923
+ submitVoice(request: SubmitVoiceRequest, metadata: Metadata, callback: (error: ServiceError | null, response: SubmitVoiceResponse) => void): ClientUnaryCall;
924
+ submitVoice(request: SubmitVoiceRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: SubmitVoiceResponse) => void): ClientUnaryCall;
925
+ /** Send a TTS announcement to one satellite or all ("all"). */
926
+ announce(request: AnnounceRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
927
+ announce(request: AnnounceRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
928
+ announce(request: AnnounceRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
929
+ /**
930
+ * Send a notification from ioBroker to Hannah. Returns ok=true when queued.
931
+ * direct=true: skip LLM reformulation. severity: "alert"|"notify"|"info".
932
+ */
933
+ notify(request: AgentNotification, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
934
+ notify(request: AgentNotification, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
935
+ notify(request: AgentNotification, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
936
+ /** List all known satellites (DB + live status merged). */
937
+ getSatellites(request: Empty, callback: (error: ServiceError | null, response: GetSatellitesResponse) => void): ClientUnaryCall;
938
+ getSatellites(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetSatellitesResponse) => void): ClientUnaryCall;
939
+ getSatellites(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetSatellitesResponse) => void): ClientUnaryCall;
940
+ /** --- Satellites (Admin-UI, #27 Phase 2) --- */
941
+ setSatelliteRoom(request: SetSatelliteRoomRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
942
+ setSatelliteRoom(request: SetSatelliteRoomRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
943
+ setSatelliteRoom(request: SetSatelliteRoomRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
944
+ setSatelliteDisplayName(request: SetSatelliteDisplayNameRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
945
+ setSatelliteDisplayName(request: SetSatelliteDisplayNameRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
946
+ setSatelliteDisplayName(request: SetSatelliteDisplayNameRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
947
+ /** Assign a satellite to a Person (User), independent of its room. #31 */
948
+ setSatelliteOwner(request: SetSatelliteOwnerRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
949
+ setSatelliteOwner(request: SetSatelliteOwnerRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
950
+ setSatelliteOwner(request: SetSatelliteOwnerRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
951
+ /** Delete existing satellite */
952
+ deleteSatellite(request: DeleteSatelliteRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
953
+ deleteSatellite(request: DeleteSatelliteRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
954
+ deleteSatellite(request: DeleteSatelliteRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
955
+ /** --- Rooms/Groups (Admin-UI, #27 Phase 1) --- */
956
+ getRooms(request: Empty, callback: (error: ServiceError | null, response: GetRoomsResponse) => void): ClientUnaryCall;
957
+ getRooms(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetRoomsResponse) => void): ClientUnaryCall;
958
+ getRooms(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetRoomsResponse) => void): ClientUnaryCall;
959
+ getGroups(request: Empty, callback: (error: ServiceError | null, response: GetGroupsResponse) => void): ClientUnaryCall;
960
+ getGroups(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetGroupsResponse) => void): ClientUnaryCall;
961
+ getGroups(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetGroupsResponse) => void): ClientUnaryCall;
962
+ createGroup(request: CreateGroupRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
963
+ createGroup(request: CreateGroupRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
964
+ createGroup(request: CreateGroupRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
965
+ updateGroup(request: UpdateGroupRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
966
+ updateGroup(request: UpdateGroupRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
967
+ updateGroup(request: UpdateGroupRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
968
+ deleteGroup(request: DeleteGroupRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
969
+ deleteGroup(request: DeleteGroupRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
970
+ deleteGroup(request: DeleteGroupRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
971
+ setGroupRooms(request: SetGroupRoomsRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
972
+ setGroupRooms(request: SetGroupRoomsRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
973
+ setGroupRooms(request: SetGroupRoomsRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
974
+ /** --- Routines/Triggers (Admin-UI, #27 Phase 4) --- */
975
+ getRoutines(request: Empty, callback: (error: ServiceError | null, response: GetRoutinesResponse) => void): ClientUnaryCall;
976
+ getRoutines(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetRoutinesResponse) => void): ClientUnaryCall;
977
+ getRoutines(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetRoutinesResponse) => void): ClientUnaryCall;
978
+ createRoutine(request: CreateRoutineRequest, callback: (error: ServiceError | null, response: CreateRoutineResponse) => void): ClientUnaryCall;
979
+ createRoutine(request: CreateRoutineRequest, metadata: Metadata, callback: (error: ServiceError | null, response: CreateRoutineResponse) => void): ClientUnaryCall;
980
+ createRoutine(request: CreateRoutineRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: CreateRoutineResponse) => void): ClientUnaryCall;
981
+ updateRoutine(request: UpdateRoutineRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
982
+ updateRoutine(request: UpdateRoutineRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
983
+ updateRoutine(request: UpdateRoutineRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
984
+ deleteRoutine(request: DeleteRoutineRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
985
+ deleteRoutine(request: DeleteRoutineRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
986
+ deleteRoutine(request: DeleteRoutineRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
987
+ getTriggers(request: Empty, callback: (error: ServiceError | null, response: GetTriggersResponse) => void): ClientUnaryCall;
988
+ getTriggers(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetTriggersResponse) => void): ClientUnaryCall;
989
+ getTriggers(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetTriggersResponse) => void): ClientUnaryCall;
990
+ createTrigger(request: CreateTriggerRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
991
+ createTrigger(request: CreateTriggerRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
992
+ createTrigger(request: CreateTriggerRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
993
+ updateTrigger(request: UpdateTriggerRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
994
+ updateTrigger(request: UpdateTriggerRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
995
+ updateTrigger(request: UpdateTriggerRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
996
+ deleteTrigger(request: DeleteTriggerRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
997
+ deleteTrigger(request: DeleteTriggerRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
998
+ deleteTrigger(request: DeleteTriggerRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
999
+ /** --- Alarms (Wecker, #4) --- */
1000
+ getAlarms(request: Empty, callback: (error: ServiceError | null, response: GetAlarmsResponse) => void): ClientUnaryCall;
1001
+ getAlarms(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetAlarmsResponse) => void): ClientUnaryCall;
1002
+ getAlarms(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetAlarmsResponse) => void): ClientUnaryCall;
1003
+ createAlarm(request: CreateAlarmRequest, callback: (error: ServiceError | null, response: CreateAlarmResponse) => void): ClientUnaryCall;
1004
+ createAlarm(request: CreateAlarmRequest, metadata: Metadata, callback: (error: ServiceError | null, response: CreateAlarmResponse) => void): ClientUnaryCall;
1005
+ createAlarm(request: CreateAlarmRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: CreateAlarmResponse) => void): ClientUnaryCall;
1006
+ updateAlarm(request: UpdateAlarmRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1007
+ updateAlarm(request: UpdateAlarmRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1008
+ updateAlarm(request: UpdateAlarmRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1009
+ deleteAlarm(request: DeleteAlarmRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1010
+ deleteAlarm(request: DeleteAlarmRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1011
+ deleteAlarm(request: DeleteAlarmRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1012
+ /**
1013
+ * --- Settings (Admin-UI, #27 Phase 5) ---
1014
+ * CreateSetting/DeleteSetting wurden mit #115 entfernt: ble.tags/cars haben jetzt
1015
+ * eigene Modelle+CRUD (unten), nlu/iobroker.state_names/llm.system_prompt sind immer
1016
+ * vorab bekannt/geseedet — es gibt keinen verbleibenden Bedarf, neue Settings anzulegen.
1017
+ */
1018
+ getSettings(request: Empty, callback: (error: ServiceError | null, response: GetSettingsResponse) => void): ClientUnaryCall;
1019
+ getSettings(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetSettingsResponse) => void): ClientUnaryCall;
1020
+ getSettings(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetSettingsResponse) => void): ClientUnaryCall;
1021
+ updateConfig(request: UpdateConfigRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1022
+ updateConfig(request: UpdateConfigRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1023
+ updateConfig(request: UpdateConfigRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1024
+ /** --- BLE Tags (Admin-UI, #115 — eigenes Modell statt Settings-JSON-Blob) --- */
1025
+ getBleTags(request: Empty, callback: (error: ServiceError | null, response: GetBleTagsResponse) => void): ClientUnaryCall;
1026
+ getBleTags(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetBleTagsResponse) => void): ClientUnaryCall;
1027
+ getBleTags(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetBleTagsResponse) => void): ClientUnaryCall;
1028
+ createBleTag(request: CreateBleTagRequest, callback: (error: ServiceError | null, response: CreateBleTagResponse) => void): ClientUnaryCall;
1029
+ createBleTag(request: CreateBleTagRequest, metadata: Metadata, callback: (error: ServiceError | null, response: CreateBleTagResponse) => void): ClientUnaryCall;
1030
+ createBleTag(request: CreateBleTagRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: CreateBleTagResponse) => void): ClientUnaryCall;
1031
+ updateBleTag(request: UpdateBleTagRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1032
+ updateBleTag(request: UpdateBleTagRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1033
+ updateBleTag(request: UpdateBleTagRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1034
+ deleteBleTag(request: DeleteBleTagRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1035
+ deleteBleTag(request: DeleteBleTagRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1036
+ deleteBleTag(request: DeleteBleTagRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1037
+ /** --- Cars (Admin-UI, #115 — eigenes Modell + user_to_car-Pivot statt Settings-JSON-Blob) --- */
1038
+ getCars(request: Empty, callback: (error: ServiceError | null, response: GetCarsResponse) => void): ClientUnaryCall;
1039
+ getCars(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetCarsResponse) => void): ClientUnaryCall;
1040
+ getCars(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetCarsResponse) => void): ClientUnaryCall;
1041
+ createCar(request: CreateCarRequest, callback: (error: ServiceError | null, response: CreateCarResponse) => void): ClientUnaryCall;
1042
+ createCar(request: CreateCarRequest, metadata: Metadata, callback: (error: ServiceError | null, response: CreateCarResponse) => void): ClientUnaryCall;
1043
+ createCar(request: CreateCarRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: CreateCarResponse) => void): ClientUnaryCall;
1044
+ updateCar(request: UpdateCarRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1045
+ updateCar(request: UpdateCarRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1046
+ updateCar(request: UpdateCarRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1047
+ deleteCar(request: DeleteCarRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1048
+ deleteCar(request: DeleteCarRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1049
+ deleteCar(request: DeleteCarRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1050
+ /**
1051
+ * --- Car state (Live-VW-Connect-Status, unabhängig von der Car-Konfiguration oben) ---
1052
+ * Returns the current cached car state (available=false if no data received yet).
1053
+ */
1054
+ getCarState(request: Empty, callback: (error: ServiceError | null, response: CarStateResponse) => void): ClientUnaryCall;
1055
+ getCarState(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: CarStateResponse) => void): ClientUnaryCall;
1056
+ getCarState(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: CarStateResponse) => void): ClientUnaryCall;
1057
+ /** Returns all tracked car states (one per configured car). */
1058
+ getAllCarStates(request: Empty, callback: (error: ServiceError | null, response: GetAllCarStatesResponse) => void): ClientUnaryCall;
1059
+ getAllCarStates(request: Empty, metadata: Metadata, callback: (error: ServiceError | null, response: GetAllCarStatesResponse) => void): ClientUnaryCall;
1060
+ getAllCarStates(request: Empty, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: GetAllCarStatesResponse) => void): ClientUnaryCall;
1061
+ /**
1062
+ * --- Event stream ---
1063
+ * Opens a server-side stream; Hannah pushes events as they occur.
1064
+ * Pass event_types to filter (empty = all events).
1065
+ * Known event types: "car.parked", "resident.arrived", "resident.departed", "satellite.firmware"
1066
+ */
1067
+ subscribeEvents(request: EventFilter, options?: Partial<CallOptions>): ClientReadableStream<HannahEvent>;
1068
+ subscribeEvents(request: EventFilter, metadata?: Metadata, options?: Partial<CallOptions>): ClientReadableStream<HannahEvent>;
1069
+ /**
1070
+ * --- Firmware Manager ---
1071
+ * Trigger an immediate OTA update for a satellite (bypasses residents check).
1072
+ */
1073
+ triggerFirmwareUpdate(request: TriggerFirmwareUpdateRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1074
+ triggerFirmwareUpdate(request: TriggerFirmwareUpdateRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1075
+ triggerFirmwareUpdate(request: TriggerFirmwareUpdateRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1076
+ /**
1077
+ * --- Wakeword Capture ---
1078
+ * Put a satellite in audio-capture mode for wakeword training data collection.
1079
+ * While captured: wakeword detection is suspended, speaker is muted, DND is active.
1080
+ * Hannah relays raw PCM chunks from the satellite to the collector via StreamSatelliteAudio.
1081
+ * The stream stays open until the collector disconnects; Hannah then auto-releases the satellite.
1082
+ */
1083
+ requestSatelliteCapture(request: SatelliteCaptureRequest, callback: (error: ServiceError | null, response: SatelliteCaptureResponse) => void): ClientUnaryCall;
1084
+ requestSatelliteCapture(request: SatelliteCaptureRequest, metadata: Metadata, callback: (error: ServiceError | null, response: SatelliteCaptureResponse) => void): ClientUnaryCall;
1085
+ requestSatelliteCapture(request: SatelliteCaptureRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: SatelliteCaptureResponse) => void): ClientUnaryCall;
1086
+ releaseSatelliteCapture(request: SatelliteCaptureRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1087
+ releaseSatelliteCapture(request: SatelliteCaptureRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1088
+ releaseSatelliteCapture(request: SatelliteCaptureRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1089
+ streamSatelliteAudio(request: SatelliteCaptureRequest, options?: Partial<CallOptions>): ClientReadableStream<SatelliteAudioChunk>;
1090
+ streamSatelliteAudio(request: SatelliteCaptureRequest, metadata?: Metadata, options?: Partial<CallOptions>): ClientReadableStream<SatelliteAudioChunk>;
1091
+ /**
1092
+ * Play a plink sound on the satellite, then hold virtual PTT for record_duration seconds.
1093
+ * Returns after PTT is released — Collector calls this in a loop for guided hey-hannah collection.
1094
+ */
1095
+ triggerPlink(request: TriggerPlinkRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1096
+ triggerPlink(request: TriggerPlinkRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1097
+ triggerPlink(request: TriggerPlinkRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1098
+ /**
1099
+ * --- Satellite Proxy (Go gRPC proxy) ---
1100
+ * Bidirectional keepalive stream. Proxy sends heartbeats; Hannah sends TTS
1101
+ * audio commands back (for announcements). While this stream is open, Hannah
1102
+ * disables its own UDP server. If the stream drops, Hannah re-enables UDP.
1103
+ */
1104
+ registerProxy(): ClientDuplexStream<ProxyHeartbeat, ProxyCommand>;
1105
+ registerProxy(options: Partial<CallOptions>): ClientDuplexStream<ProxyHeartbeat, ProxyCommand>;
1106
+ registerProxy(metadata: Metadata, options?: Partial<CallOptions>): ClientDuplexStream<ProxyHeartbeat, ProxyCommand>;
1107
+ /**
1108
+ * Submit a complete satellite audio session for processing.
1109
+ * Hannah runs the full pipeline (STT → NLU → TTS → MQTT status) and returns
1110
+ * the result so the proxy can play TTS audio back to the satellite.
1111
+ */
1112
+ submitSatelliteAudio(request: SubmitSatelliteAudioRequest, callback: (error: ServiceError | null, response: SubmitSatelliteAudioResponse) => void): ClientUnaryCall;
1113
+ submitSatelliteAudio(request: SubmitSatelliteAudioRequest, metadata: Metadata, callback: (error: ServiceError | null, response: SubmitSatelliteAudioResponse) => void): ClientUnaryCall;
1114
+ submitSatelliteAudio(request: SubmitSatelliteAudioRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: SubmitSatelliteAudioResponse) => void): ClientUnaryCall;
1115
+ /**
1116
+ * Notify Hannah that a satellite registered or disconnected via the proxy.
1117
+ * Hannah updates its room registry (hannah/rooms MQTT) immediately.
1118
+ */
1119
+ notifySatelliteRegistered(request: SatelliteRegistration, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1120
+ notifySatelliteRegistered(request: SatelliteRegistration, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1121
+ notifySatelliteRegistered(request: SatelliteRegistration, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1122
+ notifySatelliteGone(request: SatelliteRegistration, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1123
+ notifySatelliteGone(request: SatelliteRegistration, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1124
+ notifySatelliteGone(request: SatelliteRegistration, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1125
+ /**
1126
+ * --- Satellite Provisioning ---
1127
+ * Called by the ioBroker adapter before WebFlash to pre-register a seed + display name + room.
1128
+ * When the satellite first connects with that seed, Hannah links serial → pre-config and clears the seed.
1129
+ */
1130
+ provisionSatellite(request: ProvisionSatelliteRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1131
+ provisionSatellite(request: ProvisionSatelliteRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1132
+ provisionSatellite(request: ProvisionSatelliteRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1133
+ /** --- Speaker Enrollment --- */
1134
+ enrollVoiceprint(request: EnrollVoiceprintRequest, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1135
+ enrollVoiceprint(request: EnrollVoiceprintRequest, metadata: Metadata, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1136
+ enrollVoiceprint(request: EnrollVoiceprintRequest, metadata: Metadata, options: Partial<CallOptions>, callback: (error: ServiceError | null, response: StatusResponse) => void): ClientUnaryCall;
1137
+ /**
1138
+ * --- Timer Service ---
1139
+ * Bidirectional stream between the Hannah Timer Service and Hannah Core.
1140
+ * The Timer Service initiates the connection; if Hannah restarts, the service reconnects.
1141
+ * Hannah sends timer commands (create, cancel, list); the service fires events when timers expire.
1142
+ */
1143
+ timerConnect(): ClientDuplexStream<TimerMessage, TimerCommand>;
1144
+ timerConnect(options: Partial<CallOptions>): ClientDuplexStream<TimerMessage, TimerCommand>;
1145
+ timerConnect(metadata: Metadata, options?: Partial<CallOptions>): ClientDuplexStream<TimerMessage, TimerCommand>;
1146
+ /**
1147
+ * --- ioBroker Agent ---
1148
+ * Single bidirectional stream between the HannahAgent ioBroker adapter and Hannah Core.
1149
+ * The adapter pushes state updates (device states, presence, text commands);
1150
+ * Hannah pushes device-control commands and on-demand state-subscription requests back.
1151
+ * The adapter initiates the connection; if Hannah restarts, the adapter reconnects.
1152
+ */
1153
+ agentConnect(): ClientDuplexStream<AgentMessage, AgentCommand>;
1154
+ agentConnect(options: Partial<CallOptions>): ClientDuplexStream<AgentMessage, AgentCommand>;
1155
+ agentConnect(metadata: Metadata, options?: Partial<CallOptions>): ClientDuplexStream<AgentMessage, AgentCommand>;
1156
+ }
1157
+ export declare const HannahServiceClient: {
1158
+ new (address: string, credentials: ChannelCredentials, options?: Partial<ClientOptions>): HannahServiceClient;
1159
+ service: typeof HannahServiceService;
1160
+ serviceName: string;
1161
+ };