UNPKG

homebridge-hilo

Version:

Plugin Homebridge (non officiel) pour la passerelle et les appareils Hilo de Hydro-Québec | Unofficial Homebridge plugin for Hydro-Québec Hilo bridge and devices

175 lines (168 loc) 3.94 kB
import { getLogger } from "./logger"; import { getAccessToken } from "./hiloApi"; import { Device } from "./graphql/graphql"; import { createClient } from "graphql-ws"; import { SUPPORTED_DEVICES } from "./devices/types"; import { graphql } from "./graphql/gql"; import WebSocket from "ws"; const SUBSCRIPTION_QUERY = graphql(/* GraphQL */ ` subscription onAnyDeviceUpdated($locationHiloId: String!) { onAnyDeviceUpdated(locationHiloId: $locationHiloId) { deviceType locationHiloId transmissionTime operationId status device { __typename ... on BasicSwitch { deviceType hiloId physicalAddress connectionStatus state power { value kind } } ... on BasicLight { deviceType hiloId physicalAddress connectionStatus state hue level saturation colorTemperature lightType } ... on HeatingFloorThermostat { deviceType hiloId physicalAddress connectionStatus ambientHumidity gDState version zigbeeVersion thermostatType physicalAddress floorMode power { value kind } ambientTemperature { value kind } ambientTempSetpoint { value kind } maxAmbientTempSetpoint { value kind } minAmbientTempSetpoint { value kind } floorLimit { value } } ... on BasicDimmer { deviceType hiloId physicalAddress connectionStatus state level power { value kind } } ... on BasicThermostat { deviceType hiloId physicalAddress connectionStatus ambientHumidity gDState version zigbeeVersion ambientTemperature { value kind } ambientTempSetpoint { value kind } maxAmbientTempSetpoint { value kind } minAmbientTempSetpoint { value kind } maxAmbientTempSetpointLimit { value kind } minAmbientTempSetpointLimit { value kind } heatDemand power { value kind } mode allowedModes } } } } `); export const setupSubscription = async ( locationHiloId: string, onUpdate: (device: Device) => void, ) => { const logger = getLogger(); try { logger.debug("Setting up subscription"); const client = createClient({ url: `wss://platform.hiloenergie.com/api/digital-twin/v3/graphql?access_token=${getAccessToken()}`, retryAttempts: Infinity, webSocketImpl: WebSocket, }); const subscription = client.iterate<{ onAnyDeviceUpdated: { device: Device }; }>({ query: SUBSCRIPTION_QUERY.toString(), variables: { locationHiloId }, }); for await (const event of subscription) { logger.debug("GraphQL subscription event: ", event); if (event.data?.onAnyDeviceUpdated) { if ( SUPPORTED_DEVICES.includes( event.data.onAnyDeviceUpdated.device.__typename!, ) ) { onUpdate(event.data.onAnyDeviceUpdated.device); } } } return subscription; } catch (error) { logger.error("Error setting up subscription:", error); } };