UNPKG

homebridge-pentair-intellicenter-ai

Version:

Homebridge plugin for the Pentair IntelliCenter pool control system (maintained with AI assistance)

348 lines 13 kB
import { API, Characteristic, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig, Service } from 'homebridge'; import { BaseCircuit, Body, Circuit, Heater, IntelliCenterParams, IntelliCenterRequest, IntelliCenterResponse, Module, Panel, Pump, PumpCircuit, Sensor } from './types'; import { HeaterAccessory } from './heaterAccessory'; import { CircuitBreakerState } from './errorHandling'; import { PentairConfig } from './configValidation'; /** * HomebridgePlatform * This class is the main constructor for your plugin, this is where you should * parse the user config and discover/register accessories with Homebridge. */ export declare class PentairPlatform implements DynamicPlatformPlugin { readonly log: Logger; readonly config: PlatformConfig; readonly api: API; readonly Service: typeof Service; readonly Characteristic: typeof Characteristic; readonly accessoryMap: Map<string, PlatformAccessory>; readonly heaters: Map<string, PlatformAccessory>; readonly heaterInstances: Map<string, HeaterAccessory>; private connection; private maxBufferSize; private discoverCommandsSent; private discoverCommandsFailed; private discoveryBuffer; private discoveryTimeout; private buffer; private pumpIdToCircuitMap; private pumpToCircuitsMap; private circuitToPumpMap; private pumpCircuitToPumpMap; private activePumpCircuits; private static shutdownHandlersSetup; private temperatureReadings; private temperatureUnitValidated; private temperatureValidationInterval; private lastMessageReceived; private isSocketAlive; private reconnecting; private lastReconnectTime; private parseErrorCount; private parseErrorResetTime; private commandQueue; private processingQueue; private heartbeatInterval; private circuitBreaker; private healthMonitor; private rateLimiter; private deadLetterQueue; private validatedConfig; constructor(log: Logger, config: PlatformConfig, api: API); private validateConfiguration; private initializeComponents; private initializeDataStructures; private setupApiEventHandlers; private setupHeartbeatMonitoring; /** * Validate network connectivity to IntelliCenter before attempting Telnet connection */ private validateNetworkConnectivity; private createNetworkCheckContext; private setupNetworkCheckHandlers; private initiateNetworkConnection; connectToIntellicenter(): Promise<void>; private buildTelnetParams; private validateNetworkConnectivityIfNeeded; private attemptConnection; private handleConnectionError; setupSocketEventHandlers(): void; private handleDataReceived; private isCompleteMessage; private processCompleteMessage; private processMessageLine; private isValidJsonStructure; private bufferIncompleteData; private handleConnectionEstablished; private resetDiscoveryState; private startDeviceDiscovery; private handleConnectionReady; private handleLoginFailed; private handleConnectionClosed; private handleSocketError; private handleConnectionEnded; private handleResponseReady; /** * This function is invoked when homebridge restores cached accessories from disk at startup. * It should be used to setup event handlers for characteristics and update respective values. */ configureAccessory(accessory: PlatformAccessory): void; private logPumpCircuitUpdate; private logStandalonePumpUpdate; private handlePumpCircuitUpdate; private handleExistingAccessoryUpdate; private handleStandalonePumpUpdate; private handleUnregisteredDevice; private processChange; private handleParseError; private handleErrorResponse; private handleNotifyListResponse; handleUpdate(response: IntelliCenterResponse): Promise<void>; private logPumpUpdateStart; private updatePumpCircuitProperties; private logPumpUpdateComplete; updatePump(accessory: PlatformAccessory, params: IntelliCenterParams): void; updateCircuit(accessory: PlatformAccessory, params: IntelliCenterParams): void; private logCircuitUpdate; private performCircuitUpdate; private updateBodyCircuit; private updateAccessoryAndCreateCircuit; private handlePumpSensorUpdates; private handlePumpControlledCircuitUpdate; private handleNonPumpControlledCircuitUpdate; private handleBodyCircuitHeaterUpdate; updateSensor(accessory: PlatformAccessory, params: IntelliCenterParams): void; updateFeatureRpmSensorForPumpCircuit(pumpCircuit: PumpCircuit): void; private findFeatureRpmAccessory; private searchForMatchingRpmSensor; private isMatchingRpmSensor; private updateFeatureRpmAccessory; private logRpmSensorNotFound; updateFeatureRpmSensorForCircuit(circuit: Circuit): void; updateHeaterStatuses(body: Body): void; updateHeaterRpmSensor(heater: Heater, body: Body): void; updateHeaterRpmSensorsForPumpCircuit(pumpCircuit: PumpCircuit): void; /** * Validate speed value for standalone pump */ private validateStandalonePumpSpeed; /** * Check if accessory is a heater RPM sensor */ private isHeaterRpmSensor; /** * Check if speed is in heater range */ private isSpeedInHeaterRange; /** * Update a single heater RPM sensor */ private updateSingleHeaterRpmSensor; updateHeaterRpmSensorsForStandalonePump(pumpId: string, speed: string, speedType: string): void; /** * This is an example method showing how to register discovered accessories. * Accessories must only be registered once, previously created accessories * must not be registered again to prevent "duplicate UUID" errors. */ discoverDevices(): void; discoverDeviceType(deviceType: string): void; /** * Handle discovery command timeout */ private handleDiscoveryTimeout; /** * Complete discovery even with partial data from failed commands */ private completeDiscoveryWithPartialData; handleDiscoveryResponse(response: IntelliCenterResponse): void; private clearDiscoveryTimeout; private mergeDiscoveryResponse; private getDiscoveryCommandCounts; private shouldContinueDiscovery; private sendNextDiscoveryCommand; private shouldRetryFailedCommands; private shouldRetryCommand; private retryFailedCommand; private completeDiscovery; private initializeDiscoveryState; private processPanelSensors; private processPumpCircuits; private createPumpSensors; private processPanelPumps; /** * Register discovered accessories with HomeKit */ private registerDiscoveredAccessories; private createDiscoveryContext; private processAllPanels; private processSinglePanel; private finalizeDiscovery; private processModuleBodies; private associateBodyWithPump; private processModuleFeatures; private processPanelFeatures; private collectModuleHeaters; private processHeaters; private calculateHeaterPumpPriority; private isValidHeaterPumpCircuit; private findHeaterPumpCircuit; private getExpectedAccessoryId; private handlePumpAccessoryId; private handlePumpGpmSensor; private removeOrphanedAccessory; cleanupOrphanedAccessories(discoveredAccessoryIds: Set<string>): void; discoverHeater(heater: Heater, bodyMap: ReadonlyMap<string, Body>): void; discoverCircuit(panel: Panel, module: Module | null, circuit: Circuit, pumpCircuit: PumpCircuit | undefined): void; discoverTemperatureSensor(panel: Panel, module: Module | null, sensor: Sensor): void; discoverFeatureRpmSensor(panel: Panel, feature: Circuit, pumpCircuit: PumpCircuit): void; discoverBodyRpmSensor(panel: Panel, body: Body, pumpCircuit: PumpCircuit): void; discoverHeaterRpmSensor(panel: Panel, heater: Heater, body: Body, pumpCircuit: PumpCircuit): void; discoverPumpGpmSensor(panel: Panel, pump: Pump): void; discoverPumpRpmSensor(panel: Panel, pump: Pump): void; discoverPumpWattsSensor(panel: Panel, pump: Pump): void; updatePumpSensors(pumpCircuit: PumpCircuit): void; /** * Update all pump sensors when any circuit changes for that pump */ updateAllPumpSensorsForChangedCircuit(pumpCircuit: PumpCircuit): Promise<void>; /** * Find pump object by ID in discovered accessories */ private findPumpObjectById; /** * Process a single pump circuit for RPM calculation */ private processPumpCircuitForRpm; /** * Get the highest RPM among all enabled circuits for a given pump */ getHighestRpmForPump(pumpId: string): number | null; /** * Check circuit context for activity status */ private checkCircuitContext; /** * Check feature context for activity status */ private checkFeatureContext; /** * Check body context for activity status */ private checkBodyContext; /** * Check if a pump circuit is currently active by looking for corresponding feature/circuit status * (Same logic as WATTS sensor) */ private isPumpCircuitActive; /** * Update all pump sensors (RPM, GPM, WATTS) with the specified RPM value */ updatePumpSensorsWithRpm(pumpId: string, rpm: number): void; updatePumpSensorsForStandalonePump(pumpId: string, speed: string, speedType: string): void; subscribeForUpdates(circuit: BaseCircuit, keys: ReadonlyArray<string>): void; getConfig(): PentairConfig; json(data: unknown): string; private jsonSeenObjects?; /** * Get system health and status information */ getSystemHealth(): { isHealthy: boolean; lastSuccessfulOperation: Date; consecutiveFailures: number; lastError: string | undefined; averageResponseTime: number | undefined; circuitBreaker: { state: CircuitBreakerState; failureCount: number; lastFailureTime: Date | null; }; rateLimiter: { currentRequests: number; maxRequests: number; windowMs: number; canMakeRequest: boolean; }; connection: { isSocketAlive: boolean; lastMessageReceived: Date; reconnecting: boolean; commandQueueLength: number; }; }; /** * Reset error handling components (useful for testing or manual recovery) */ resetErrorHandling(): void; sendCommandNoWait(command: IntelliCenterRequest): void; private sanitizeCommand; private processCommandQueue; delay(ms: number): Promise<unknown>; private maybeReconnect; /** * Build pump-circuit associations for proper device management * Maps pumps to their controlled circuits and vice versa */ private buildPumpCircuitAssociations; /** * Get the pump ID that controls a specific circuit */ getPumpForCircuit(circuitId: string): string | undefined; /** * Get all circuit IDs controlled by a specific pump */ getCircuitsForPump(pumpId: string): Set<string> | undefined; /** * Get the pump ID for a specific pump circuit */ getPumpForPumpCircuit(pumpCircuitId: string): string | undefined; /** * Find the pump circuit ID that controls a specific circuit */ findPumpCircuitForCircuit(circuitId: string): string | undefined; /** * Log detailed pump discovery mapping in requested format */ logPumpDiscoveryMapping(pump: Pump, panel: Panel): void; /** * Log current pump-circuit associations for debugging */ logPumpCircuitAssociations(): void; /** * Update all pump sensors when heater status changes */ private updateAllPumpSensorsForHeaterChange; /** * Directly update pump sensors by pump ID (used for heater changes) */ private updatePumpSensorsDirectly; /** * Update pump object circuits array when standalone pump circuit changes */ private updatePumpObjectCircuits; /** * Start temperature unit validation monitoring */ private startTemperatureUnitValidation; /** * Collect temperature reading for validation */ private collectTemperatureReading; /** * Validate temperature unit consistency with IntelliCenter readings */ private validateTemperatureUnits; /** * Setup graceful shutdown handlers for SIGTERM and SIGINT signals */ private setupGracefulShutdown; private clearTimersAndIntervals; private cleanupConnection; private clearDataStructures; private resetState; /** * Cleanup method for tests and graceful shutdown * Clears intervals, closes connections, and removes event listeners */ cleanup(): Promise<void>; } //# sourceMappingURL=platform.d.ts.map