myio-js-library 0.1.185 → 0.1.187
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/index.cjs +25588 -19423
- package/dist/index.d.cts +554 -6
- package/dist/index.js +25583 -19423
- package/dist/myio-js-library.umd.js +18835 -12675
- package/dist/myio-js-library.umd.min.js +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -874,9 +874,12 @@ interface AnnotationFilterState {
|
|
|
874
874
|
};
|
|
875
875
|
status?: AnnotationStatus | 'all';
|
|
876
876
|
type?: AnnotationType | 'all';
|
|
877
|
+
importance?: ImportanceLevel | 'all';
|
|
878
|
+
statusList?: AnnotationStatus[];
|
|
879
|
+
typeList?: AnnotationType[];
|
|
880
|
+
importanceList?: ImportanceLevel[];
|
|
877
881
|
userId?: string | 'all';
|
|
878
882
|
searchText?: string;
|
|
879
|
-
importance?: ImportanceLevel | 'all';
|
|
880
883
|
showOverdueOnly?: boolean;
|
|
881
884
|
}
|
|
882
885
|
interface PaginationState {
|
|
@@ -3093,20 +3096,31 @@ interface CategorySummary {
|
|
|
3093
3096
|
percentage: number;
|
|
3094
3097
|
children?: CategorySummary[];
|
|
3095
3098
|
}
|
|
3096
|
-
interface
|
|
3099
|
+
interface DeviceInfo$1 {
|
|
3100
|
+
id: string;
|
|
3101
|
+
label: string;
|
|
3102
|
+
name?: string;
|
|
3103
|
+
}
|
|
3104
|
+
interface StatusSummary$1 {
|
|
3097
3105
|
normal: number;
|
|
3098
3106
|
alert: number;
|
|
3099
3107
|
failure: number;
|
|
3100
3108
|
standby: number;
|
|
3101
3109
|
offline: number;
|
|
3102
3110
|
noConsumption: number;
|
|
3111
|
+
normalDevices?: DeviceInfo$1[];
|
|
3112
|
+
alertDevices?: DeviceInfo$1[];
|
|
3113
|
+
failureDevices?: DeviceInfo$1[];
|
|
3114
|
+
standbyDevices?: DeviceInfo$1[];
|
|
3115
|
+
offlineDevices?: DeviceInfo$1[];
|
|
3116
|
+
noConsumptionDevices?: DeviceInfo$1[];
|
|
3103
3117
|
}
|
|
3104
3118
|
interface DashboardEnergySummary {
|
|
3105
3119
|
totalDevices: number;
|
|
3106
3120
|
totalConsumption: number;
|
|
3107
3121
|
unit: string;
|
|
3108
3122
|
byCategory: CategorySummary[];
|
|
3109
|
-
byStatus: StatusSummary;
|
|
3123
|
+
byStatus: StatusSummary$1;
|
|
3110
3124
|
lastUpdated: string;
|
|
3111
3125
|
}
|
|
3112
3126
|
declare const EnergySummaryTooltip: {
|
|
@@ -3120,9 +3134,9 @@ declare const EnergySummaryTooltip: {
|
|
|
3120
3134
|
*/
|
|
3121
3135
|
renderCategoryTree(categories: CategorySummary[], unit: string): string;
|
|
3122
3136
|
/**
|
|
3123
|
-
* Render status matrix
|
|
3137
|
+
* Render status matrix with expand buttons
|
|
3124
3138
|
*/
|
|
3125
|
-
renderStatusMatrix(status: StatusSummary): string;
|
|
3139
|
+
renderStatusMatrix(status: StatusSummary$1): string;
|
|
3126
3140
|
/**
|
|
3127
3141
|
* Render full tooltip HTML
|
|
3128
3142
|
*/
|
|
@@ -3139,6 +3153,8 @@ declare const EnergySummaryTooltip: {
|
|
|
3139
3153
|
left: string;
|
|
3140
3154
|
top: string;
|
|
3141
3155
|
} | null;
|
|
3156
|
+
_currentStatus: StatusSummary$1 | null;
|
|
3157
|
+
_devicePopupId: string;
|
|
3142
3158
|
/**
|
|
3143
3159
|
* Show tooltip for an element
|
|
3144
3160
|
*/
|
|
@@ -3151,6 +3167,39 @@ declare const EnergySummaryTooltip: {
|
|
|
3151
3167
|
* Setup drag listeners on the header
|
|
3152
3168
|
*/
|
|
3153
3169
|
_setupDragListeners(container: HTMLElement): void;
|
|
3170
|
+
/**
|
|
3171
|
+
* Setup expand button listeners for device list popup (hover behavior)
|
|
3172
|
+
*/
|
|
3173
|
+
_setupExpandButtonListeners(container: HTMLElement): void;
|
|
3174
|
+
_devicePopupHideTimer: ReturnType<typeof setTimeout> | null;
|
|
3175
|
+
/**
|
|
3176
|
+
* Start delayed hide for device popup
|
|
3177
|
+
*/
|
|
3178
|
+
_startDevicePopupDelayedHide(): void;
|
|
3179
|
+
/**
|
|
3180
|
+
* Cancel device popup delayed hide
|
|
3181
|
+
*/
|
|
3182
|
+
_cancelDevicePopupDelayedHide(): void;
|
|
3183
|
+
/**
|
|
3184
|
+
* Get devices for a given status key
|
|
3185
|
+
*/
|
|
3186
|
+
_getDevicesForStatus(statusKey: string): DeviceInfo$1[];
|
|
3187
|
+
/**
|
|
3188
|
+
* Get status icon based on status key
|
|
3189
|
+
*/
|
|
3190
|
+
_getStatusIcon(statusKey: string): string;
|
|
3191
|
+
/**
|
|
3192
|
+
* Build device list content HTML for InfoTooltip
|
|
3193
|
+
*/
|
|
3194
|
+
_buildDeviceListContent(statusKey: string, label: string, count: number): string;
|
|
3195
|
+
/**
|
|
3196
|
+
* Show device list popup using InfoTooltip
|
|
3197
|
+
*/
|
|
3198
|
+
showDeviceListPopup(triggerElement: HTMLElement, statusKey: string, label: string, count?: number): void;
|
|
3199
|
+
/**
|
|
3200
|
+
* Hide device list popup (uses InfoTooltip)
|
|
3201
|
+
*/
|
|
3202
|
+
hideDeviceListPopup(): void;
|
|
3154
3203
|
/**
|
|
3155
3204
|
* Counter for unique pinned clone IDs
|
|
3156
3205
|
*/
|
|
@@ -3203,6 +3252,505 @@ declare const EnergySummaryTooltip: {
|
|
|
3203
3252
|
buildSummaryFromState(state: any, receivedData: any): DashboardEnergySummary;
|
|
3204
3253
|
};
|
|
3205
3254
|
|
|
3255
|
+
/**
|
|
3256
|
+
* WaterSummaryTooltip - Dashboard Water Summary Tooltip Component
|
|
3257
|
+
* RFC-0105: Premium tooltip showing comprehensive water dashboard summary
|
|
3258
|
+
*
|
|
3259
|
+
* Shows:
|
|
3260
|
+
* - Total device count
|
|
3261
|
+
* - Device counts by category (tree view)
|
|
3262
|
+
* - Consumption totals by category
|
|
3263
|
+
* - Device status breakdown (normal, alert, failure, standby, offline)
|
|
3264
|
+
*
|
|
3265
|
+
* @example
|
|
3266
|
+
* // Attach to an element
|
|
3267
|
+
* const cleanup = WaterSummaryTooltip.attach(triggerElement, getDataFn);
|
|
3268
|
+
* // Later: cleanup();
|
|
3269
|
+
*
|
|
3270
|
+
* // Or manual control
|
|
3271
|
+
* WaterSummaryTooltip.show(element, summaryData, event);
|
|
3272
|
+
* WaterSummaryTooltip.hide();
|
|
3273
|
+
*/
|
|
3274
|
+
interface WaterCategorySummary {
|
|
3275
|
+
id: string;
|
|
3276
|
+
name: string;
|
|
3277
|
+
icon: string;
|
|
3278
|
+
deviceCount: number;
|
|
3279
|
+
consumption: number;
|
|
3280
|
+
percentage: number;
|
|
3281
|
+
children?: WaterCategorySummary[];
|
|
3282
|
+
}
|
|
3283
|
+
interface DeviceInfo {
|
|
3284
|
+
id: string;
|
|
3285
|
+
label: string;
|
|
3286
|
+
name?: string;
|
|
3287
|
+
}
|
|
3288
|
+
interface StatusSummary {
|
|
3289
|
+
normal: number;
|
|
3290
|
+
alert: number;
|
|
3291
|
+
failure: number;
|
|
3292
|
+
standby: number;
|
|
3293
|
+
offline: number;
|
|
3294
|
+
noConsumption: number;
|
|
3295
|
+
normalDevices?: DeviceInfo[];
|
|
3296
|
+
alertDevices?: DeviceInfo[];
|
|
3297
|
+
failureDevices?: DeviceInfo[];
|
|
3298
|
+
standbyDevices?: DeviceInfo[];
|
|
3299
|
+
offlineDevices?: DeviceInfo[];
|
|
3300
|
+
noConsumptionDevices?: DeviceInfo[];
|
|
3301
|
+
}
|
|
3302
|
+
interface DashboardWaterSummary {
|
|
3303
|
+
totalDevices: number;
|
|
3304
|
+
totalConsumption: number;
|
|
3305
|
+
unit: string;
|
|
3306
|
+
byCategory: WaterCategorySummary[];
|
|
3307
|
+
byStatus: StatusSummary;
|
|
3308
|
+
lastUpdated: string;
|
|
3309
|
+
includeBathrooms?: boolean;
|
|
3310
|
+
}
|
|
3311
|
+
declare const WaterSummaryTooltip: {
|
|
3312
|
+
containerId: string;
|
|
3313
|
+
/**
|
|
3314
|
+
* Create or get the tooltip container
|
|
3315
|
+
*/
|
|
3316
|
+
getContainer(): HTMLElement;
|
|
3317
|
+
/**
|
|
3318
|
+
* Render category tree rows
|
|
3319
|
+
*/
|
|
3320
|
+
renderCategoryTree(categories: WaterCategorySummary[], unit: string): string;
|
|
3321
|
+
/**
|
|
3322
|
+
* Render status matrix with expand buttons
|
|
3323
|
+
*/
|
|
3324
|
+
renderStatusMatrix(status: StatusSummary): string;
|
|
3325
|
+
/**
|
|
3326
|
+
* Render full tooltip HTML
|
|
3327
|
+
*/
|
|
3328
|
+
renderHTML(summary: DashboardWaterSummary): string;
|
|
3329
|
+
_hideTimer: ReturnType<typeof setTimeout> | null;
|
|
3330
|
+
_isMouseOverTooltip: boolean;
|
|
3331
|
+
_isMaximized: boolean;
|
|
3332
|
+
_isDragging: boolean;
|
|
3333
|
+
_dragOffset: {
|
|
3334
|
+
x: number;
|
|
3335
|
+
y: number;
|
|
3336
|
+
};
|
|
3337
|
+
_savedPosition: {
|
|
3338
|
+
left: string;
|
|
3339
|
+
top: string;
|
|
3340
|
+
} | null;
|
|
3341
|
+
_currentStatus: StatusSummary | null;
|
|
3342
|
+
_devicePopupId: string;
|
|
3343
|
+
/**
|
|
3344
|
+
* Show tooltip for an element
|
|
3345
|
+
*/
|
|
3346
|
+
show(triggerElement: HTMLElement, summary: DashboardWaterSummary, event?: MouseEvent): void;
|
|
3347
|
+
/**
|
|
3348
|
+
* Setup button click listeners (pin, maximize, close)
|
|
3349
|
+
*/
|
|
3350
|
+
_setupButtonListeners(container: HTMLElement): void;
|
|
3351
|
+
/**
|
|
3352
|
+
* Setup drag listeners on the header
|
|
3353
|
+
*/
|
|
3354
|
+
_setupDragListeners(container: HTMLElement): void;
|
|
3355
|
+
/**
|
|
3356
|
+
* Setup expand button listeners for device list popup (hover behavior)
|
|
3357
|
+
*/
|
|
3358
|
+
_setupExpandButtonListeners(container: HTMLElement): void;
|
|
3359
|
+
_devicePopupHideTimer: ReturnType<typeof setTimeout> | null;
|
|
3360
|
+
/**
|
|
3361
|
+
* Start delayed hide for device popup
|
|
3362
|
+
*/
|
|
3363
|
+
_startDevicePopupDelayedHide(): void;
|
|
3364
|
+
/**
|
|
3365
|
+
* Cancel device popup delayed hide
|
|
3366
|
+
*/
|
|
3367
|
+
_cancelDevicePopupDelayedHide(): void;
|
|
3368
|
+
/**
|
|
3369
|
+
* Get devices for a given status key
|
|
3370
|
+
*/
|
|
3371
|
+
_getDevicesForStatus(statusKey: string): DeviceInfo[];
|
|
3372
|
+
/**
|
|
3373
|
+
* Get status icon based on status key
|
|
3374
|
+
*/
|
|
3375
|
+
_getStatusIcon(statusKey: string): string;
|
|
3376
|
+
/**
|
|
3377
|
+
* Build device list content HTML for InfoTooltip
|
|
3378
|
+
*/
|
|
3379
|
+
_buildDeviceListContent(statusKey: string, label: string, count: number): string;
|
|
3380
|
+
/**
|
|
3381
|
+
* Show device list popup using InfoTooltip
|
|
3382
|
+
*/
|
|
3383
|
+
showDeviceListPopup(triggerElement: HTMLElement, statusKey: string, label: string, count?: number): void;
|
|
3384
|
+
/**
|
|
3385
|
+
* Hide device list popup (uses InfoTooltip)
|
|
3386
|
+
*/
|
|
3387
|
+
hideDeviceListPopup(): void;
|
|
3388
|
+
/**
|
|
3389
|
+
* Counter for unique pinned clone IDs
|
|
3390
|
+
*/
|
|
3391
|
+
_pinnedCounter: number;
|
|
3392
|
+
/**
|
|
3393
|
+
* Create a pinned clone of the tooltip that stays on screen independently
|
|
3394
|
+
*/
|
|
3395
|
+
togglePin(): void;
|
|
3396
|
+
/**
|
|
3397
|
+
* Setup event listeners for a pinned clone
|
|
3398
|
+
*/
|
|
3399
|
+
_setupPinnedCloneListeners(clone: HTMLElement, cloneId: string): void;
|
|
3400
|
+
/**
|
|
3401
|
+
* Close and remove a pinned clone
|
|
3402
|
+
*/
|
|
3403
|
+
_closePinnedClone(cloneId: string): void;
|
|
3404
|
+
/**
|
|
3405
|
+
* Toggle maximized state
|
|
3406
|
+
*/
|
|
3407
|
+
toggleMaximize(): void;
|
|
3408
|
+
/**
|
|
3409
|
+
* Close tooltip (reset all states)
|
|
3410
|
+
*/
|
|
3411
|
+
close(): void;
|
|
3412
|
+
/**
|
|
3413
|
+
* Setup hover listeners on the tooltip itself
|
|
3414
|
+
*/
|
|
3415
|
+
_setupTooltipHoverListeners(container: HTMLElement): void;
|
|
3416
|
+
/**
|
|
3417
|
+
* Start delayed hide with animation
|
|
3418
|
+
*/
|
|
3419
|
+
_startDelayedHide(): void;
|
|
3420
|
+
/**
|
|
3421
|
+
* Hide tooltip with fade animation
|
|
3422
|
+
*/
|
|
3423
|
+
hideWithAnimation(): void;
|
|
3424
|
+
/**
|
|
3425
|
+
* Hide tooltip immediately (for cleanup)
|
|
3426
|
+
*/
|
|
3427
|
+
hide(): void;
|
|
3428
|
+
/**
|
|
3429
|
+
* Attach tooltip to an element with automatic show/hide on hover
|
|
3430
|
+
* Returns cleanup function to remove event listeners
|
|
3431
|
+
*/
|
|
3432
|
+
attach(element: HTMLElement, getDataFn: () => DashboardWaterSummary): () => void;
|
|
3433
|
+
/**
|
|
3434
|
+
* Build summary data from TELEMETRY_INFO STATE_WATER
|
|
3435
|
+
* This is called by the widget controller to get data for the tooltip
|
|
3436
|
+
*/
|
|
3437
|
+
buildSummaryFromState(state: any, receivedData: any, includeBathrooms?: boolean): DashboardWaterSummary;
|
|
3438
|
+
};
|
|
3439
|
+
|
|
3440
|
+
/**
|
|
3441
|
+
* InfoTooltip - Standardized Premium Tooltip Component
|
|
3442
|
+
* RFC-0105: Draggable tooltip with PIN, maximize, close and delayed hide
|
|
3443
|
+
*
|
|
3444
|
+
* Features:
|
|
3445
|
+
* - Draggable header
|
|
3446
|
+
* - PIN button (creates independent clone)
|
|
3447
|
+
* - Maximize/restore button
|
|
3448
|
+
* - Close button
|
|
3449
|
+
* - Delayed hide (1.5s) with hover detection
|
|
3450
|
+
* - Smooth animations
|
|
3451
|
+
*
|
|
3452
|
+
* @example
|
|
3453
|
+
* // Create and show tooltip
|
|
3454
|
+
* InfoTooltip.show(triggerElement, {
|
|
3455
|
+
* icon: '❄️',
|
|
3456
|
+
* title: 'Climatização - Detalhes',
|
|
3457
|
+
* content: '<div>...</div>'
|
|
3458
|
+
* });
|
|
3459
|
+
*
|
|
3460
|
+
* // Hide tooltip
|
|
3461
|
+
* InfoTooltip.hide();
|
|
3462
|
+
*/
|
|
3463
|
+
interface InfoTooltipOptions {
|
|
3464
|
+
icon: string;
|
|
3465
|
+
title: string;
|
|
3466
|
+
content: string;
|
|
3467
|
+
containerId?: string;
|
|
3468
|
+
}
|
|
3469
|
+
declare const InfoTooltip: {
|
|
3470
|
+
containerId: string;
|
|
3471
|
+
/**
|
|
3472
|
+
* Get or create container
|
|
3473
|
+
*/
|
|
3474
|
+
getContainer(): HTMLElement;
|
|
3475
|
+
/**
|
|
3476
|
+
* Show tooltip
|
|
3477
|
+
*/
|
|
3478
|
+
show(triggerElement: HTMLElement, options: InfoTooltipOptions): void;
|
|
3479
|
+
/**
|
|
3480
|
+
* Start delayed hide
|
|
3481
|
+
*/
|
|
3482
|
+
startDelayedHide(): void;
|
|
3483
|
+
/**
|
|
3484
|
+
* Hide immediately
|
|
3485
|
+
*/
|
|
3486
|
+
hide(): void;
|
|
3487
|
+
/**
|
|
3488
|
+
* Close and reset all states
|
|
3489
|
+
*/
|
|
3490
|
+
close(): void;
|
|
3491
|
+
/**
|
|
3492
|
+
* Attach tooltip to trigger element with hover behavior
|
|
3493
|
+
*/
|
|
3494
|
+
attach(triggerElement: HTMLElement, getOptions: () => InfoTooltipOptions): () => void;
|
|
3495
|
+
};
|
|
3496
|
+
|
|
3497
|
+
/**
|
|
3498
|
+
* DeviceComparisonTooltip - Premium Device Comparison Tooltip Component
|
|
3499
|
+
* RFC-0110: Premium tooltip showing device consumption comparisons
|
|
3500
|
+
*
|
|
3501
|
+
* Features:
|
|
3502
|
+
* - Draggable header
|
|
3503
|
+
* - PIN button (creates independent clone)
|
|
3504
|
+
* - Maximize/restore button
|
|
3505
|
+
* - Close button
|
|
3506
|
+
* - Delayed hide (1.5s) with hover detection
|
|
3507
|
+
* - Smooth animations
|
|
3508
|
+
*
|
|
3509
|
+
* Shows:
|
|
3510
|
+
* - Device consumption and percentage
|
|
3511
|
+
* - Device vs Category group (e.g., Chiller 1 vs All Chillers)
|
|
3512
|
+
* - Device vs Widget scope (e.g., Chiller 1 vs Area Comum)
|
|
3513
|
+
* - Device vs Total (e.g., Chiller 1 vs Area Comum + Lojas)
|
|
3514
|
+
*
|
|
3515
|
+
* @example
|
|
3516
|
+
* // Attach to an element
|
|
3517
|
+
* const cleanup = DeviceComparisonTooltip.attach(triggerElement, getDataFn);
|
|
3518
|
+
* // Later: cleanup();
|
|
3519
|
+
*
|
|
3520
|
+
* // Or manual control
|
|
3521
|
+
* DeviceComparisonTooltip.show(element, data, event);
|
|
3522
|
+
* DeviceComparisonTooltip.hide();
|
|
3523
|
+
*/
|
|
3524
|
+
interface DeviceComparisonData {
|
|
3525
|
+
/** Device info */
|
|
3526
|
+
device: {
|
|
3527
|
+
id: string;
|
|
3528
|
+
name: string;
|
|
3529
|
+
type: string;
|
|
3530
|
+
consumption: number;
|
|
3531
|
+
percentage: number;
|
|
3532
|
+
unit?: string;
|
|
3533
|
+
};
|
|
3534
|
+
/** Category comparison (e.g., all Chillers) */
|
|
3535
|
+
categoryGroup: {
|
|
3536
|
+
name: string;
|
|
3537
|
+
totalConsumption: number;
|
|
3538
|
+
deviceCount: number;
|
|
3539
|
+
devicePercentage: number;
|
|
3540
|
+
};
|
|
3541
|
+
/** Widget scope comparison (e.g., Area Comum) */
|
|
3542
|
+
widgetScope: {
|
|
3543
|
+
name: string;
|
|
3544
|
+
totalConsumption: number;
|
|
3545
|
+
deviceCount: number;
|
|
3546
|
+
devicePercentage: number;
|
|
3547
|
+
};
|
|
3548
|
+
/** Grand total comparison (Area Comum + Lojas) */
|
|
3549
|
+
grandTotal: {
|
|
3550
|
+
name: string;
|
|
3551
|
+
totalConsumption: number;
|
|
3552
|
+
deviceCount: number;
|
|
3553
|
+
devicePercentage: number;
|
|
3554
|
+
};
|
|
3555
|
+
/** Last update timestamp */
|
|
3556
|
+
lastUpdated?: string;
|
|
3557
|
+
}
|
|
3558
|
+
declare const DeviceComparisonTooltip: {
|
|
3559
|
+
containerId: string;
|
|
3560
|
+
/**
|
|
3561
|
+
* Get or create container
|
|
3562
|
+
*/
|
|
3563
|
+
getContainer(): HTMLElement;
|
|
3564
|
+
/**
|
|
3565
|
+
* Show tooltip
|
|
3566
|
+
*/
|
|
3567
|
+
show(triggerElement: HTMLElement, data: DeviceComparisonData): void;
|
|
3568
|
+
/**
|
|
3569
|
+
* Start delayed hide
|
|
3570
|
+
*/
|
|
3571
|
+
startDelayedHide(): void;
|
|
3572
|
+
/**
|
|
3573
|
+
* Hide immediately
|
|
3574
|
+
*/
|
|
3575
|
+
hide(): void;
|
|
3576
|
+
/**
|
|
3577
|
+
* Close and reset all states
|
|
3578
|
+
*/
|
|
3579
|
+
close(): void;
|
|
3580
|
+
/**
|
|
3581
|
+
* Attach tooltip to trigger element with hover behavior
|
|
3582
|
+
*/
|
|
3583
|
+
attach(triggerElement: HTMLElement, getDataFn: () => DeviceComparisonData | null): () => void;
|
|
3584
|
+
/**
|
|
3585
|
+
* Build comparison data from entity and widget state
|
|
3586
|
+
* Helper method to build the data structure from widget controller data
|
|
3587
|
+
*/
|
|
3588
|
+
buildComparisonData(entity: {
|
|
3589
|
+
entityId: string;
|
|
3590
|
+
labelOrName: string;
|
|
3591
|
+
deviceType: string;
|
|
3592
|
+
val: number;
|
|
3593
|
+
perc: number;
|
|
3594
|
+
}, categoryData: {
|
|
3595
|
+
name: string;
|
|
3596
|
+
total: number;
|
|
3597
|
+
deviceCount: number;
|
|
3598
|
+
}, widgetData: {
|
|
3599
|
+
name: string;
|
|
3600
|
+
total: number;
|
|
3601
|
+
deviceCount: number;
|
|
3602
|
+
}, grandTotalData: {
|
|
3603
|
+
name: string;
|
|
3604
|
+
total: number;
|
|
3605
|
+
deviceCount: number;
|
|
3606
|
+
}): DeviceComparisonData;
|
|
3607
|
+
};
|
|
3608
|
+
|
|
3609
|
+
/**
|
|
3610
|
+
* TempComparisonTooltip - Premium Temperature Comparison Tooltip Component
|
|
3611
|
+
* RFC-0110: Premium tooltip showing temperature comparison with average
|
|
3612
|
+
*
|
|
3613
|
+
* Features:
|
|
3614
|
+
* - Draggable header
|
|
3615
|
+
* - PIN button (creates independent clone)
|
|
3616
|
+
* - Maximize/restore button
|
|
3617
|
+
* - Close button
|
|
3618
|
+
* - Delayed hide (1.5s) with hover detection
|
|
3619
|
+
* - Smooth animations
|
|
3620
|
+
*
|
|
3621
|
+
* Shows:
|
|
3622
|
+
* - Current temperature and deviation from average
|
|
3623
|
+
* - Device vs Average comparison with visual bar
|
|
3624
|
+
*
|
|
3625
|
+
* @example
|
|
3626
|
+
* // Attach to an element
|
|
3627
|
+
* const cleanup = TempComparisonTooltip.attach(triggerElement, getDataFn);
|
|
3628
|
+
* // Later: cleanup();
|
|
3629
|
+
*
|
|
3630
|
+
* // Or manual control
|
|
3631
|
+
* TempComparisonTooltip.show(element, data);
|
|
3632
|
+
* TempComparisonTooltip.hide();
|
|
3633
|
+
*/
|
|
3634
|
+
interface TempComparisonData {
|
|
3635
|
+
/** Device info */
|
|
3636
|
+
device: {
|
|
3637
|
+
id: string;
|
|
3638
|
+
name: string;
|
|
3639
|
+
currentTemp: number;
|
|
3640
|
+
minTemp: number;
|
|
3641
|
+
maxTemp: number;
|
|
3642
|
+
};
|
|
3643
|
+
/** Average comparison */
|
|
3644
|
+
average: {
|
|
3645
|
+
name: string;
|
|
3646
|
+
value: number;
|
|
3647
|
+
deviceCount: number;
|
|
3648
|
+
};
|
|
3649
|
+
/** Last update timestamp */
|
|
3650
|
+
lastUpdated?: string;
|
|
3651
|
+
}
|
|
3652
|
+
declare const TempComparisonTooltip: {
|
|
3653
|
+
containerId: string;
|
|
3654
|
+
/**
|
|
3655
|
+
* Get or create container
|
|
3656
|
+
*/
|
|
3657
|
+
getContainer(): HTMLElement;
|
|
3658
|
+
/**
|
|
3659
|
+
* Show tooltip
|
|
3660
|
+
*/
|
|
3661
|
+
show(triggerElement: HTMLElement, data: TempComparisonData): void;
|
|
3662
|
+
/**
|
|
3663
|
+
* Start delayed hide
|
|
3664
|
+
*/
|
|
3665
|
+
startDelayedHide(): void;
|
|
3666
|
+
/**
|
|
3667
|
+
* Hide immediately
|
|
3668
|
+
*/
|
|
3669
|
+
hide(): void;
|
|
3670
|
+
/**
|
|
3671
|
+
* Close and reset all states
|
|
3672
|
+
*/
|
|
3673
|
+
close(): void;
|
|
3674
|
+
/**
|
|
3675
|
+
* Attach tooltip to trigger element with hover behavior
|
|
3676
|
+
*/
|
|
3677
|
+
attach(triggerElement: HTMLElement, getDataFn: () => TempComparisonData | null): () => void;
|
|
3678
|
+
/**
|
|
3679
|
+
* Build comparison data from entity data
|
|
3680
|
+
* Helper method to build the data structure from widget controller data
|
|
3681
|
+
*/
|
|
3682
|
+
buildComparisonData(entity: {
|
|
3683
|
+
entityId: string;
|
|
3684
|
+
labelOrName: string;
|
|
3685
|
+
currentTemp: number;
|
|
3686
|
+
minTemp: number;
|
|
3687
|
+
maxTemp: number;
|
|
3688
|
+
}, averageData: {
|
|
3689
|
+
name: string;
|
|
3690
|
+
value: number;
|
|
3691
|
+
deviceCount: number;
|
|
3692
|
+
}): TempComparisonData;
|
|
3693
|
+
};
|
|
3694
|
+
|
|
3695
|
+
/**
|
|
3696
|
+
* TempSensorSummaryTooltip - Temperature Sensors Summary Tooltip
|
|
3697
|
+
* Premium draggable tooltip with PIN, maximize, close and delayed hide
|
|
3698
|
+
*
|
|
3699
|
+
* Features:
|
|
3700
|
+
* - Draggable header
|
|
3701
|
+
* - PIN button (creates independent clone)
|
|
3702
|
+
* - Maximize/restore button
|
|
3703
|
+
* - Close button
|
|
3704
|
+
* - Delayed hide (1.5s) with hover detection
|
|
3705
|
+
* - Smooth animations
|
|
3706
|
+
* - Orange theme for temperature
|
|
3707
|
+
*
|
|
3708
|
+
* @example
|
|
3709
|
+
* TempSensorSummaryTooltip.show(triggerElement, {
|
|
3710
|
+
* devices: [...],
|
|
3711
|
+
* temperatureMin: 20,
|
|
3712
|
+
* temperatureMax: 26
|
|
3713
|
+
* });
|
|
3714
|
+
*/
|
|
3715
|
+
interface TempSensorDevice {
|
|
3716
|
+
name: string;
|
|
3717
|
+
temp: number;
|
|
3718
|
+
status: 'ok' | 'warn' | 'unknown';
|
|
3719
|
+
}
|
|
3720
|
+
interface TempSensorSummaryData {
|
|
3721
|
+
devices: TempSensorDevice[];
|
|
3722
|
+
temperatureMin?: number;
|
|
3723
|
+
temperatureMax?: number;
|
|
3724
|
+
title?: string;
|
|
3725
|
+
}
|
|
3726
|
+
declare const TempSensorSummaryTooltip: {
|
|
3727
|
+
containerId: string;
|
|
3728
|
+
/**
|
|
3729
|
+
* Get or create container
|
|
3730
|
+
*/
|
|
3731
|
+
getContainer(): HTMLElement;
|
|
3732
|
+
/**
|
|
3733
|
+
* Show tooltip
|
|
3734
|
+
*/
|
|
3735
|
+
show(triggerElement: HTMLElement, data: TempSensorSummaryData): void;
|
|
3736
|
+
/**
|
|
3737
|
+
* Start delayed hide
|
|
3738
|
+
*/
|
|
3739
|
+
startDelayedHide(): void;
|
|
3740
|
+
/**
|
|
3741
|
+
* Hide immediately
|
|
3742
|
+
*/
|
|
3743
|
+
hide(): void;
|
|
3744
|
+
/**
|
|
3745
|
+
* Close and reset all states
|
|
3746
|
+
*/
|
|
3747
|
+
close(): void;
|
|
3748
|
+
/**
|
|
3749
|
+
* Attach tooltip to trigger element with hover behavior
|
|
3750
|
+
*/
|
|
3751
|
+
attach(triggerElement: HTMLElement, getData: () => TempSensorSummaryData): () => void;
|
|
3752
|
+
};
|
|
3753
|
+
|
|
3206
3754
|
/**
|
|
3207
3755
|
* MyIO Modal Header Component
|
|
3208
3756
|
*
|
|
@@ -4344,4 +4892,4 @@ declare function getThemeColors(theme: ThemeMode): DistributionThemeColors;
|
|
|
4344
4892
|
*/
|
|
4345
4893
|
declare function getHashColor(str: string): string;
|
|
4346
4894
|
|
|
4347
|
-
export { ANNOTATION_TYPE_COLORS, ANNOTATION_TYPE_LABELS, ANNOTATION_TYPE_LABELS_EN, type Annotation, type AnnotationFilterState, AnnotationIndicator, type AnnotationIndicatorConfig, type AnnotationIndicatorTheme, type AnnotationStatus, type AnnotationSummary, type AnnotationType, type AuditAction, type AuditEntry, type BuildTemplateExportParams, CHART_COLORS, DEFAULT_COLORS as CONSUMPTION_CHART_COLORS, DEFAULT_CONFIG as CONSUMPTION_CHART_DEFAULTS, THEME_COLORS as CONSUMPTION_THEME_COLORS, type CategorySummary, type ChartDomain, type ClampRange, ConnectionStatusType, type Consumption7DaysColors, type Consumption7DaysConfig, type Consumption7DaysData, type Consumption7DaysInstance, type ChartType as ConsumptionChartType, type ConsumptionDataPoint, type IdealRangeConfig as ConsumptionIdealRangeConfig, type ConsumptionModalConfig, type ConsumptionModalInstance, type TemperatureConfig as ConsumptionTemperatureConfig, type TemperatureReferenceLine as ConsumptionTemperatureReferenceLine, type ThemeColors as ConsumptionThemeColors, type ThemeMode$1 as ConsumptionThemeMode, type VizMode as ConsumptionVizMode, type ConsumptionWidgetConfig, type ConsumptionWidgetInstance, type CreateDateRangePickerOptions, type CreateInputDateRangePickerInsideDIVParams, DEFAULT_CLAMP_RANGE, DEFAULT_ENERGY_GROUP_COLORS, DEFAULT_GAS_GROUP_COLORS, DEFAULT_SHOPPING_COLORS, DEFAULT_WATER_GROUP_COLORS, type DashboardEnergySummary, type DateRangeControl, type DateRangeInputController, type DateRangeResult, type DemandModalInstance, type DemandModalParams, type DemandModalPdfConfig, type DemandModalStyles, type DeviceStatusName, DeviceStatusType, type DeviceTypeLimits, type DistributionChartConfig, type DistributionChartInstance, type DistributionData, type DistributionDomain, type DistributionMode, type DistributionThemeColors, EXPORT_DEFAULT_COLORS, EXPORT_DOMAIN_ICONS, EXPORT_DOMAIN_LABELS, EXPORT_DOMAIN_UNITS, type EnergyEntityData, type EnergyModalContext, type EnergyModalError, type EnergyModalI18n, type EnergyModalStyleOverrides, EnergyRangeTooltip, type EnergyStatus, type EnergyStatusResult, EnergySummaryTooltip, type ExportColorsPallet, type ExportComparisonData, type ExportConfigTemplate, type ExportCustomerData, type ExportCustomerInfo, type ExportData, type ExportDataInput, type ExportDataInstance, type ExportDataPoint, type ExportDeviceInfo, type ExportDomain, type ExportFormat, type ExportGroupData, type ExportOptions, type ExportProgressCallback, type ExportResult, type ExportStats, type ExportType, type GroupColors, IMPORTANCE_COLORS, IMPORTANCE_LABELS, IMPORTANCE_LABELS_EN, type ImportanceLevel, type InstantaneousPowerLimits, type LogAnnotationsAttribute, type ExportFormat$1 as ModalExportFormat, type ModalHeaderConfig, type ModalHeaderInstance, type ModalTheme, type MyIOAuthConfig, type MyIOAuthInstance, MyIOChartModal, MyIODraggableCard, MyIOSelectionStore, MyIOSelectionStoreClass, MyIOToast, type NewAnnotationData, type OpenDashboardPopupEnergyOptions, type OpenDashboardPopupSettingsParams, type OpenDashboardPopupWaterTankOptions, DEVICE_TYPES as POWER_LIMITS_DEVICE_TYPES, STATUS_CONFIG as POWER_LIMITS_STATUS_CONFIG, TELEMETRY_TYPES as POWER_LIMITS_TELEMETRY_TYPES, type PaginationState, type PermissionSet, type PersistResult, type PowerLimitsError, type PowerLimitsFormData, type PowerLimitsModalInstance, type PowerLimitsModalParams, type PowerLimitsModalStyles, type PowerRange, type PowerRanges, type RealTimeTelemetryInstance, type RealTimeTelemetryParams, STATUS_COLORS, STATUS_LABELS, STATUS_LABELS_EN, type SettingsError, type SettingsEvent, type ShoppingColors, type ShoppingDataPoint, type StatusLimits, type StatusSummary, type StoreRow, type TbScope, type TelemetryFetcher, type TelemetryTypeLimits, type TempEntityData, TempRangeTooltip, type TempStatus, type TempStatusResult, type TemperatureComparisonModalInstance, type TemperatureComparisonModalParams, type TemperatureDevice, type TemperatureGranularity, type TemperatureModalInstance, type TemperatureModalParams, type TemperatureSettingsInstance, type TemperatureSettingsParams, type TemperatureStats, type TemperatureTelemetry, type ThingsboardCustomerAttrsConfig, type TimedValue, type UserInfo, type WaterRow, type WaterTankDataPoint, type WaterTankModalContext, type WaterTankModalError, type WaterTankModalI18n, type WaterTankModalStyleOverrides, type WaterTankTelemetryData, addDetectionContext, addNamespace, aggregateByDay, assignShoppingColors, averageByDay, buildListItemsThingsboardByUniqueDatasource, buildMyioIngestionAuth, buildTemplateExport, buildWaterReportCSV, buildWaterStoresCSV, calcDeltaPercent, calculateDeviceStatus, calculateDeviceStatusWithRanges, calculateStats as calculateExportStats, calculateStats$1 as calculateStats, canModifyAnnotation, clampTemperature, classify, classifyWaterLabel, classifyWaterLabels, clearAllAuthCaches, connectionStatusIcons, createAnnotationIndicator, createConsumption7DaysChart, createConsumptionChartWidget, createConsumptionModal, createDateRangePicker, createDistributionChartWidget, createInputDateRangePickerInsideDIV, createModalHeader, decodePayload, decodePayloadBase64Xor, detectDeviceType, detectSuperAdminHolding, detectSuperAdminMyio, determineInterval, deviceStatusIcons, exportTemperatureCSV, exportToCSV, exportToCSVAll, extractMyIOCredentials, fetchCurrentUserInfo, fetchTemperatureData, fetchThingsboardCustomerAttrsFromStorage, fetchThingsboardCustomerServerScopeAttrs, findValue, findValueWithDefault, fmtPerc$1 as fmtPerc, fmtPerc as fmtPercLegacy, formatAllInSameUnit, formatAllInSameWaterUnit, formatDateForInput, formatDateToYMD, formatDateWithTimezoneOffset, formatDuration, formatEnergy, formatNumberReadable, formatRelativeTime, formatTankHeadFromCm, formatTemperature, formatWater, formatWaterByGroup, formatWaterVolumeM3, formatarDuracao, generateFilename as generateExportFilename, getAnnotationPermissions, getAuthCacheStats, getAvailableContexts, getConnectionStatusIcon, getDateRangeArray, getDefaultGroupColors, getDeviceStatusIcon, getDeviceStatusInfo, getThemeColors as getDistributionThemeColors, getGroupColor, getHashColor, getModalHeaderStyles, getSaoPauloISOString, getSaoPauloISOStringFixed, getShoppingColor, getValueByDatakey, getValueByDatakeyLegacy, getWaterCategories, groupByDay, interpolateTemperature, isDeviceOffline, isValidConnectionStatus, isValidDeviceStatus, isWaterCategory, mapConnectionStatus, mapDeviceStatusToCardStatus, mapDeviceToConnectionStatus, myioExportData, normalizeRecipients, numbers, openDashboardPopup, openDashboardPopupAllReport, openDashboardPopupEnergy, openDashboardPopupReport, openDashboardPopupSettings, openDashboardPopupWaterTank, openDemandModal, openGoalsPanel, openPowerLimitsSetupModal, openRealTimeTelemetryModal, openTemperatureComparisonModal, openTemperatureModal, openTemperatureSettingsModal, parseInputDateToDate, renderCardComponent$2 as renderCardComponent, renderCardComponent$1 as renderCardComponentEnhanced, renderCardComponentHeadOffice, renderCardComponentLegacy, renderCardComponentV2, renderCardComponent as renderCardComponentV5, renderCardComponentV5 as renderCardV5, shouldFlashIcon, strings, timeWindowFromInputYMD, toCSV, toFixedSafe, waterDeviceStatusIcons };
|
|
4895
|
+
export { ANNOTATION_TYPE_COLORS, ANNOTATION_TYPE_LABELS, ANNOTATION_TYPE_LABELS_EN, type Annotation, type AnnotationFilterState, AnnotationIndicator, type AnnotationIndicatorConfig, type AnnotationIndicatorTheme, type AnnotationStatus, type AnnotationSummary, type AnnotationType, type AuditAction, type AuditEntry, type BuildTemplateExportParams, CHART_COLORS, DEFAULT_COLORS as CONSUMPTION_CHART_COLORS, DEFAULT_CONFIG as CONSUMPTION_CHART_DEFAULTS, THEME_COLORS as CONSUMPTION_THEME_COLORS, type CategorySummary, type ChartDomain, type ClampRange, ConnectionStatusType, type Consumption7DaysColors, type Consumption7DaysConfig, type Consumption7DaysData, type Consumption7DaysInstance, type ChartType as ConsumptionChartType, type ConsumptionDataPoint, type IdealRangeConfig as ConsumptionIdealRangeConfig, type ConsumptionModalConfig, type ConsumptionModalInstance, type TemperatureConfig as ConsumptionTemperatureConfig, type TemperatureReferenceLine as ConsumptionTemperatureReferenceLine, type ThemeColors as ConsumptionThemeColors, type ThemeMode$1 as ConsumptionThemeMode, type VizMode as ConsumptionVizMode, type ConsumptionWidgetConfig, type ConsumptionWidgetInstance, type CreateDateRangePickerOptions, type CreateInputDateRangePickerInsideDIVParams, DEFAULT_CLAMP_RANGE, DEFAULT_ENERGY_GROUP_COLORS, DEFAULT_GAS_GROUP_COLORS, DEFAULT_SHOPPING_COLORS, DEFAULT_WATER_GROUP_COLORS, type DashboardEnergySummary, type DashboardWaterSummary, type DateRangeControl, type DateRangeInputController, type DateRangeResult, type DemandModalInstance, type DemandModalParams, type DemandModalPdfConfig, type DemandModalStyles, type DeviceComparisonData, DeviceComparisonTooltip, type DeviceInfo$1 as DeviceInfo, type DeviceStatusName, DeviceStatusType, type DeviceTypeLimits, type DistributionChartConfig, type DistributionChartInstance, type DistributionData, type DistributionDomain, type DistributionMode, type DistributionThemeColors, EXPORT_DEFAULT_COLORS, EXPORT_DOMAIN_ICONS, EXPORT_DOMAIN_LABELS, EXPORT_DOMAIN_UNITS, type EnergyEntityData, type EnergyModalContext, type EnergyModalError, type EnergyModalI18n, type EnergyModalStyleOverrides, EnergyRangeTooltip, type EnergyStatus, type EnergyStatusResult, EnergySummaryTooltip, type ExportColorsPallet, type ExportComparisonData, type ExportConfigTemplate, type ExportCustomerData, type ExportCustomerInfo, type ExportData, type ExportDataInput, type ExportDataInstance, type ExportDataPoint, type ExportDeviceInfo, type ExportDomain, type ExportFormat, type ExportGroupData, type ExportOptions, type ExportProgressCallback, type ExportResult, type ExportStats, type ExportType, type GroupColors, IMPORTANCE_COLORS, IMPORTANCE_LABELS, IMPORTANCE_LABELS_EN, type ImportanceLevel, InfoTooltip, type InstantaneousPowerLimits, type LogAnnotationsAttribute, type ExportFormat$1 as ModalExportFormat, type ModalHeaderConfig, type ModalHeaderInstance, type ModalTheme, type MyIOAuthConfig, type MyIOAuthInstance, MyIOChartModal, MyIODraggableCard, MyIOSelectionStore, MyIOSelectionStoreClass, MyIOToast, type NewAnnotationData, type OpenDashboardPopupEnergyOptions, type OpenDashboardPopupSettingsParams, type OpenDashboardPopupWaterTankOptions, DEVICE_TYPES as POWER_LIMITS_DEVICE_TYPES, STATUS_CONFIG as POWER_LIMITS_STATUS_CONFIG, TELEMETRY_TYPES as POWER_LIMITS_TELEMETRY_TYPES, type PaginationState, type PermissionSet, type PersistResult, type PowerLimitsError, type PowerLimitsFormData, type PowerLimitsModalInstance, type PowerLimitsModalParams, type PowerLimitsModalStyles, type PowerRange, type PowerRanges, type RealTimeTelemetryInstance, type RealTimeTelemetryParams, STATUS_COLORS, STATUS_LABELS, STATUS_LABELS_EN, type SettingsError, type SettingsEvent, type ShoppingColors, type ShoppingDataPoint, type StatusLimits, type StatusSummary$1 as StatusSummary, type StoreRow, type TbScope, type TelemetryFetcher, type TelemetryTypeLimits, type TempComparisonData, TempComparisonTooltip, type TempEntityData, TempRangeTooltip, type TempSensorDevice, type TempSensorSummaryData, TempSensorSummaryTooltip, type TempStatus, type TempStatusResult, type TemperatureComparisonModalInstance, type TemperatureComparisonModalParams, type TemperatureDevice, type TemperatureGranularity, type TemperatureModalInstance, type TemperatureModalParams, type TemperatureSettingsInstance, type TemperatureSettingsParams, type TemperatureStats, type TemperatureTelemetry, type ThingsboardCustomerAttrsConfig, type TimedValue, type UserInfo, type WaterCategorySummary, type WaterRow, WaterSummaryTooltip, type WaterTankDataPoint, type WaterTankModalContext, type WaterTankModalError, type WaterTankModalI18n, type WaterTankModalStyleOverrides, type WaterTankTelemetryData, addDetectionContext, addNamespace, aggregateByDay, assignShoppingColors, averageByDay, buildListItemsThingsboardByUniqueDatasource, buildMyioIngestionAuth, buildTemplateExport, buildWaterReportCSV, buildWaterStoresCSV, calcDeltaPercent, calculateDeviceStatus, calculateDeviceStatusWithRanges, calculateStats as calculateExportStats, calculateStats$1 as calculateStats, canModifyAnnotation, clampTemperature, classify, classifyWaterLabel, classifyWaterLabels, clearAllAuthCaches, connectionStatusIcons, createAnnotationIndicator, createConsumption7DaysChart, createConsumptionChartWidget, createConsumptionModal, createDateRangePicker, createDistributionChartWidget, createInputDateRangePickerInsideDIV, createModalHeader, decodePayload, decodePayloadBase64Xor, detectDeviceType, detectSuperAdminHolding, detectSuperAdminMyio, determineInterval, deviceStatusIcons, exportTemperatureCSV, exportToCSV, exportToCSVAll, extractMyIOCredentials, fetchCurrentUserInfo, fetchTemperatureData, fetchThingsboardCustomerAttrsFromStorage, fetchThingsboardCustomerServerScopeAttrs, findValue, findValueWithDefault, fmtPerc$1 as fmtPerc, fmtPerc as fmtPercLegacy, formatAllInSameUnit, formatAllInSameWaterUnit, formatDateForInput, formatDateToYMD, formatDateWithTimezoneOffset, formatDuration, formatEnergy, formatNumberReadable, formatRelativeTime, formatTankHeadFromCm, formatTemperature, formatWater, formatWaterByGroup, formatWaterVolumeM3, formatarDuracao, generateFilename as generateExportFilename, getAnnotationPermissions, getAuthCacheStats, getAvailableContexts, getConnectionStatusIcon, getDateRangeArray, getDefaultGroupColors, getDeviceStatusIcon, getDeviceStatusInfo, getThemeColors as getDistributionThemeColors, getGroupColor, getHashColor, getModalHeaderStyles, getSaoPauloISOString, getSaoPauloISOStringFixed, getShoppingColor, getValueByDatakey, getValueByDatakeyLegacy, getWaterCategories, groupByDay, interpolateTemperature, isDeviceOffline, isValidConnectionStatus, isValidDeviceStatus, isWaterCategory, mapConnectionStatus, mapDeviceStatusToCardStatus, mapDeviceToConnectionStatus, myioExportData, normalizeRecipients, numbers, openDashboardPopup, openDashboardPopupAllReport, openDashboardPopupEnergy, openDashboardPopupReport, openDashboardPopupSettings, openDashboardPopupWaterTank, openDemandModal, openGoalsPanel, openPowerLimitsSetupModal, openRealTimeTelemetryModal, openTemperatureComparisonModal, openTemperatureModal, openTemperatureSettingsModal, parseInputDateToDate, renderCardComponent$2 as renderCardComponent, renderCardComponent$1 as renderCardComponentEnhanced, renderCardComponentHeadOffice, renderCardComponentLegacy, renderCardComponentV2, renderCardComponent as renderCardComponentV5, renderCardComponentV5 as renderCardV5, shouldFlashIcon, strings, timeWindowFromInputYMD, toCSV, toFixedSafe, waterDeviceStatusIcons };
|