import {z} from 'zod' export type GetApiPresentationArgs = {presentationId: string, manufacturerName?: string | undefined, deviceId?: string | undefined, 'If-None-Match'?: unknown | undefined, 'Accept-Language'?: string | undefined, view?: ('dashboard' | 'detailView' | 'automation') | undefined}; export type GetApiPresentationOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const mnmn = z.string(); export const vid = z.string(); export const presentationDescription = z.string(); export const iconUrl = z.string(); export const value = z.string(); export const valueType = z.string(); export const operator = z.enum(["CONTAINS", "DOES_NOT_CONTAIN", "EQUALS", "DOES_NOT_EQUAL", "GREATER_THAN", "GREATER_THAN_OR_EQUALS", "LESS_THAN", "LESS_THAN_OR_EQUALS", "ONE_OF"]); export const component = z.string(); export const version = z.number().int(); export const visibleCondition = z.object({value: value, valueType: valueType.optional(), operator: operator, operand: z.string(), component: component, capability: z.string(), version: version.optional()}); export const icons = z.array(z.object({group: z.string().optional(), iconUrl: iconUrl.optional(), runningConditions: z.array(visibleCondition).optional(), badge: z.array(z.object({iconUrl: iconUrl, visibleConditions: z.array(visibleCondition).optional()})).optional(), productKeys: z.array(z.object({mnId: z.string(), setupId: z.string()})).optional()})); export const formattedLabel = z.string(); export const alternativeItem = z.object({key: z.string(), value: z.string(), type: z.enum(["inactive", "active"]).optional(), iconUrl: iconUrl.optional(), description: z.string().optional()}); export const alternatives = z.array(alternativeItem); export const visibleConditionForDashboardState = z.object({value: value, valueType: valueType.optional(), operator: operator, operand: z.string(), component: component, capability: z.string(), version: version.optional(), isOffline: z.boolean().optional()}); export const composite = z.boolean(); export const group = z.string(); export const timeFormat = z.string(); export const formatInfo = z.array(z.object({key: value, type: z.enum(["remainingTime", "time"]), remainingTime: z.object({timeFormat: timeFormat, frequency: z.number().int().optional()}).optional(), time: z.object({timeFormat: timeFormat}).optional()})); export const statesArrayItem = z.object({label: formattedLabel, alternatives: alternatives.optional(), capability: z.string(), version: version.optional(), component: component, visibleCondition: visibleConditionForDashboardState.optional(), composite: composite.optional(), group: group.optional(), formatInfo: formatInfo.optional(), transient: z.boolean().optional()}); export const argumentType = z.string(); export const pushButton = z.object({command: z.string(), argument: z.string().optional(), argumentType: argumentType.optional()}); export const toggleSwitchForDashboard = z.object({command: z.object({name: z.string().optional(), on: z.string(), off: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value.optional(), on: z.string(), off: z.string(), valueType: valueType.optional(), alternatives: alternatives.optional()}).optional()}); export const switchForDashboard = z.object({command: z.object({name: z.string().optional(), on: z.string(), off: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value.optional(), on: z.string(), off: z.string(), valueType: valueType.optional(), alternatives: alternatives.optional()}).optional()}); export const standbyPowerSwitchForDashboard = z.object({command: z.object({name: z.string().optional(), on: z.string(), off: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value, valueType: valueType.optional(), on: z.string(), off: z.string(), label: formattedLabel.optional(), alternatives: alternatives.optional()}).optional()}); export const statelessPowerToggleForDashboard = z.object({command: z.string(), argument: z.string().optional(), argumentType: argumentType.optional()}); export const playPause = z.object({command: z.object({name: z.string().optional(), play: z.string(), pause: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value, valueType: valueType.optional(), play: z.string(), pause: z.string(), alternatives: alternatives.optional()})}); export const playStop = z.object({command: z.object({name: z.string().optional(), play: z.string(), stop: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value, play: z.string(), stop: z.string(), alternatives: alternatives.optional(), valueType: valueType.optional()})}); export const actionsArrayItem = z.object({displayType: z.enum(["pushButton", "toggleSwitch", "switch", "standbyPowerSwitch", "statelessPowerToggle", "playPause", "playStop"]), pushButton: pushButton.optional(), toggleSwitch: toggleSwitchForDashboard.optional(), switch: switchForDashboard.optional(), standbyPowerSwitch: standbyPowerSwitchForDashboard.optional(), statelessPowerToggle: statelessPowerToggleForDashboard.optional(), playPause: playPause.optional(), playStop: playStop.optional(), group: group.optional(), capability: z.string(), version: version.optional(), component: component.optional(), visibleCondition: visibleCondition.optional()}); export const basicPlusCamera = z.object({image: z.object({capability: z.string(), version: version.optional(), component: component, value: value}), overlayIcons: z.array(z.object({iconUrl: z.string(), visibleCondition: visibleCondition.optional()})).optional()}); export const step = z.number(); export const range = z.array(z.number()); export const supportedValuesForNumericConstraints = z.string(); export const buttonForTv = z.object({capability: z.string(), version: version.optional(), component: component, command: z.string(), argument: z.string().optional(), iconUrl: z.string().optional()}); export const operatorForVisibleConditions = z.enum(["AND", "OR"]); export const hideDashboardActions = z.boolean(); export const basicPlusTv = z.object({volume: z.object({capability: z.string(), version: version.optional(), component: component, label: z.string().optional(), command: z.object({name: z.string().optional(), increase: z.string().optional(), decrease: z.string().optional()}), value: value.optional(), step: step.optional(), range: range.optional(), supportedValues: supportedValuesForNumericConstraints.optional()}).optional(), buttons: z.array(buttonForTv), channel: z.object({capability: z.string(), version: version.optional(), component: component, label: z.string().optional(), value: value.optional(), command: z.object({name: z.string().optional(), increase: z.string().optional(), decrease: z.string().optional()})}).optional(), directionalPad: z.object({capability: z.string(), version: version.optional(), component: component, command: z.object({name: z.string().optional(), up: z.string(), down: z.string(), left: z.string(), right: z.string(), ok: z.string()})}).optional(), operator: operatorForVisibleConditions.optional(), visibleConditions: z.array(visibleCondition).optional(), hideDashboardActions: hideDashboardActions.optional()}); export const unit = z.string(); export const sliderForLight = z.object({component: z.string(), capability: z.string(), version: version.optional(), range: range, step: step.optional(), unit: unit.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), command: z.string(), value: value, valueType: valueType.optional(), argumentType: argumentType.optional(), label: z.string()}); export const basicPlusLight = z.object({dimmer: sliderForLight, colorTemperature: sliderForLight.optional(), colorControl: z.object({component: z.string(), capability: z.string(), version: version.optional(), command: z.string(), value: value.optional(), color: z.object({hue: value.optional(), saturation: value.optional()})}).optional(), hideDashboardActions: hideDashboardActions.optional()}); export const basicPlusActions = z.array(z.object({command: z.string(), argument: z.string().optional(), argumentType: argumentType.optional(), iconUrl: z.string().optional(), component: z.string(), capability: z.string(), version: version.optional(), operator: operatorForVisibleConditions.optional(), visibleConditions: z.array(visibleCondition).optional()})); export const visibleConditionForColorItem = z.object({referTo: z.object({component: component, capability: z.string(), version: version.optional(), value: value, valueType: valueType.optional()}).optional(), operator: operator, operand: z.string()}); export const basicPlusStateBoardColors = z.object({color: z.string(), operator: operatorForVisibleConditions.optional(), visibleConditions: z.array(visibleConditionForColorItem).optional()}); export const basicPlusStateBoardItem = z.object({capability: z.string(), version: version.optional(), component: z.string(), value: value, valueType: valueType.optional(), label: z.string(), unit: unit.optional(), alternatives: alternatives.optional(), iconUrl: z.string().optional(), colors: z.array(basicPlusStateBoardColors).optional(), operator: operatorForVisibleConditions.optional(), visibleConditions: z.array(visibleCondition).optional()}); export const basicPlusStateBoard = z.array(basicPlusStateBoardItem); export const basicPlusProgressBarsStateItem = z.object({label: formattedLabel, alternatives: alternatives.optional(), capability: z.string(), version: version.optional(), component: component, formatInfo: formatInfo.optional(), iconUrl: z.string().optional(), placement: z.enum(["START", "END"]).optional()}); export const basicPlusProgressBarsBarItem = z.object({capability: z.string(), version: version.optional(), component: z.string(), value: value, valueType: valueType.optional(), range: z.array(z.number()).optional()}); export const basicPlusProgressBars = z.array(z.object({headers: z.array(basicPlusProgressBarsStateItem).optional(), bar: basicPlusProgressBarsBarItem.optional(), footers: z.array(basicPlusProgressBarsStateItem).optional(), operator: operatorForVisibleConditions.optional(), visibleConditions: z.array(visibleCondition).optional()})); export const stepperForPanelItem = z.object({command: z.object({name: z.string().optional(), increase: z.string().optional(), decrease: z.string().optional(), argumentType: argumentType.optional()}), step: step, range: range, supportedValues: supportedValuesForNumericConstraints.optional(), state: z.object({value: value, unit: unit.optional(), valueType: valueType.optional(), label: z.string().optional(), alternatives: alternatives.optional()}), size: z.enum(["2x1", "3x1", "4x1", "1x2", "2x2"])}); export const supportedValues = z.string(); export const listForPanelItem = z.object({command: z.object({name: z.string().optional(), description: z.string().optional(), alternatives: alternatives, argumentType: argumentType.optional(), supportedValues: supportedValues.optional()}), state: z.object({value: value, valueType: valueType.optional(), alternatives: alternatives}).optional(), size: z.enum(["2x1", "3x1", "4x1", "1/3x1", "2x2"])}); export const pushButtonForPanelItem = z.object({command: z.string(), argument: z.string().optional(), argumentType: argumentType.optional(), iconUrl: z.string().optional(), size: z.enum(["1x1", "2x1", "3x1", "4x1", "1/3x1", "2x2"])}); export const argumentName = z.string(); export const listForInvokeButtonArgument = z.object({alternatives: alternatives, supportedValues: supportedValues.optional(), label: z.string()}); export const stateInvokeButtonArgument = z.object({label: z.string(), alternatives: alternatives.optional()}); export const argumentsForInvokeButton = z.object({name: argumentName, value: z.string(), argumentType: argumentType.optional(), displayType: z.enum(["list", "state"]).optional(), list: listForInvokeButtonArgument.optional(), state: stateInvokeButtonArgument.optional()}); export const commandsForInvokeButton = z.object({state: z.string(), label: z.string().optional(), iconUrl: z.string().optional(), command: z.object({name: z.string(), argument: z.string().optional(), argumentType: argumentType.optional(), confirmation: z.object({label: z.string(), title: z.string().optional(), description: z.string().optional()}).optional(), arguments: z.array(argumentsForInvokeButton).optional(), supportedValues: z.string().optional()})}); export const invokeButtonForPanelItem = z.object({value: z.string(), valueType: valueType.optional(), refreshInterval: z.number().int().optional(), commands: z.array(commandsForInvokeButton), size: z.enum(["1x1", "2x1", "3x1", "4x1", "1/3x1", "2x2"])}); export const stateForPanelItem = z.object({label: formattedLabel, unit: unit.optional(), alternatives: alternatives.optional(), size: z.literal("2x1")}); export const sliderForPanelItem = z.object({range: range, step: step.optional(), unit: unit.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), alternatives: alternatives.optional(), command: z.string(), argumentType: argumentType.optional(), value: value.optional(), valueType: valueType.optional(), size: z.enum(["4x1", "4x2"])}); export const emptyForPanelItem = z.object({size: z.enum(["1x1", "2x1", "3x1", "4x1", "1/3x1", "1x2", "2x2"])}); export const hideOnUnmatchForVisibleCondition = z.boolean(); export const panelForDevicePresentation = z.object({items: z.array(z.object({capability: z.string(), version: version.optional(), component: component, label: z.string().optional(), displayType: z.enum(["stepper", "list", "pushButton", "invokeButton", "state", "slider", "empty"]), stepper: stepperForPanelItem.optional(), list: listForPanelItem.optional(), pushButton: pushButtonForPanelItem.optional(), invokeButton: invokeButtonForPanelItem.optional(), state: stateForPanelItem.optional(), slider: sliderForPanelItem.optional(), empty: emptyForPanelItem.optional(), operator: operatorForVisibleConditions.optional(), visibleConditions: z.array(visibleCondition).optional(), hideOnUnmatch: hideOnUnmatchForVisibleCondition.optional()})), operator: operatorForVisibleConditions.optional(), visibleConditions: z.array(visibleCondition).optional(), hideDashboardActions: hideDashboardActions.optional()}); export const basicPlusItemForPresentation = z.object({displayType: z.enum(["camera", "tv", "light", "panel", "actions", "stateBoard", "progressBars"]), camera: basicPlusCamera.optional(), tv: basicPlusTv.optional(), light: basicPlusLight.optional(), actions: basicPlusActions.optional(), stateBoard: basicPlusStateBoard.optional(), progressBars: basicPlusProgressBars.optional(), panel: panelForDevicePresentation.optional()}); export const groupVisibleConditions = z.object({value: value, valueType: valueType.optional(), operator: operator, operand: z.string(), component: component, capability: z.string(), version: version.optional()}); export const dashboard = z.object({states: z.array(statesArrayItem).optional(), actions: z.array(actionsArrayItem).optional(), basicPlus: z.array(basicPlusItemForPresentation).optional(), groupVisibleConditions: groupVisibleConditions.optional()}); export const toggleSwitch = z.object({command: z.object({name: z.string().optional(), on: z.string(), off: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value, valueType: valueType.optional(), on: z.string(), off: z.string(), label: formattedLabel.optional(), alternatives: alternatives.optional()}).optional()}); export const standbyPowerSwitch = z.object({command: z.object({name: z.string().optional(), on: z.string(), off: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value, valueType: valueType.optional(), on: z.string(), off: z.string(), label: formattedLabel.optional(), alternatives: alternatives.optional()}).optional()}); export const switch = z.object({command: z.object({name: z.string().optional(), on: z.string(), off: z.string(), argumentType: argumentType.optional()}), state: z.object({value: value, valueType: valueType.optional(), on: z.string(), off: z.string(), label: formattedLabel.optional(), alternatives: alternatives.optional()}).optional()}); export const sliderType = z.object({range: range, step: step.optional(), unit: unit.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), alternatives: alternatives.optional(), command: z.string().optional(), argumentType: argumentType.optional(), value: value.optional(), valueType: valueType.optional()}); export const textButton = z.object({command: z.string().optional(), value: value.optional(), buttons: z.array(z.object({key: z.string(), label: z.string(), state: z.string().optional()})), supportedValues: supportedValues.optional()}); export const listForDetailView = z.object({command: z.object({name: z.string().optional(), description: z.string().optional(), alternatives: alternatives, argumentType: argumentType.optional(), supportedValues: supportedValues.optional()}), state: z.object({value: value, valueType: valueType.optional(), alternatives: alternatives}).optional()}); export const textField = z.object({command: z.string(), argumentType: argumentType.optional(), value: value.optional(), valueType: valueType.optional(), range: range.optional()}); export const numberField = z.object({value: value.optional(), valueType: valueType.optional(), unit: unit.optional(), command: z.string(), argumentType: argumentType.optional(), range: range.optional(), supportedValues: supportedValuesForNumericConstraints.optional()}); export const stepper = z.object({command: z.object({name: z.string().optional(), increase: z.string().optional(), decrease: z.string().optional(), argumentType: argumentType.optional()}), step: step, range: range, supportedValues: supportedValuesForNumericConstraints.optional(), value: value.optional(), valueType: valueType.optional()}); export const state = z.object({label: formattedLabel, unit: unit.optional(), alternatives: alternatives.optional()}); export const sliderForArgument = z.object({range: range, step: step.optional(), unit: unit.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), name: argumentName, argumentType: argumentType.optional(), alternatives: alternatives.optional()}); export const listForArgument = z.object({alternatives: alternatives, supportedValues: supportedValues.optional(), name: argumentName, argumentType: argumentType.optional()}); export const textFieldForArgument = z.object({name: argumentName, argumentType: argumentType.optional(), range: range.optional()}); export const numberFieldForArgument = z.object({name: argumentName, unit: unit.optional(), argumentType: argumentType.optional(), range: range.optional(), supportedValues: supportedValuesForNumericConstraints.optional()}); export const multiArgCommand = z.object({command: z.string(), arguments: z.array(z.object({label: z.string(), displayType: z.enum(["slider", "list", "textField", "numberField"]), slider: sliderForArgument.optional(), list: listForArgument.optional(), textField: textFieldForArgument.optional(), numberField: numberFieldForArgument.optional()})), supportedValues: z.string().optional()}); export const visibleConditionForDetailView = z.object({value: value, valueType: valueType.optional(), operator: operator, operand: z.string(), component: component, capability: z.string(), version: version.optional(), hideOnUnmatch: hideOnUnmatchForVisibleCondition.optional()}); export const detailViewListItem = z.object({capability: z.string(), version: version.optional(), label: z.string(), displayType: z.enum(["toggleSwitch", "standbyPowerSwitch", "switch", "slider", "pushButton", "textButton", "playPause", "playStop", "list", "textField", "numberField", "stepper", "state", "multiArgCommand"]), toggleSwitch: toggleSwitch.optional(), standbyPowerSwitch: standbyPowerSwitch.optional(), switch: switch.optional(), slider: sliderType.optional(), pushButton: pushButton.optional(), textButton: textButton.optional(), playPause: playPause.optional(), playStop: playStop.optional(), list: listForDetailView.optional(), textField: textField.optional(), numberField: numberField.optional(), stepper: stepper.optional(), state: state.optional(), multiArgCommand: multiArgCommand.optional(), component: component.optional(), visibleCondition: visibleConditionForDetailView.optional()}); export const detailView = z.array(detailViewListItem); export const descriptionForAutomationItem = z.string(); export const descriptionForAutomatioDisplayType = z.string(); export const sliderForAutomationCondition = z.object({range: range, step: step.optional(), unit: unit.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), alternatives: alternatives.optional(), value: value, valueType: valueType.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const listForAutomationCondition = z.object({alternatives: alternatives, supportedValues: supportedValues.optional(), value: value, valueType: valueType.optional(), description: descriptionForAutomatioDisplayType.optional(), multiSelectable: z.boolean().optional()}); export const supportedValuesForDynamicList = z.object({value: z.string(), valueMap: z.object({key: z.string(), value: z.string()}).optional()}); export const alternativesForDynamicList = z.array(alternativeItem); export const dynamicListForAutomationCondition = z.object({value: value, valueType: z.string().optional(), supportedValues: supportedValuesForDynamicList, alternatives: alternativesForDynamicList.optional(), description: descriptionForAutomatioDisplayType.optional(), multiSelectable: z.boolean().optional()}); export const numberFieldForAutomationCondition = z.object({value: value, valueType: valueType.optional(), unit: unit.optional(), range: range.optional(), alternatives: alternatives.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const textFieldForAutomationCondition = z.object({value: value, valueType: valueType.optional(), range: range.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const enumSliderForAutomationCondition = z.object({alternatives: alternatives, value: value, supportedOperators: z.array(z.object({operator: z.enum(["EQUALS", "GREATER_THAN_OR_EQUALS", "LESS_THAN_OR_EQUALS"]), label: z.string()})).optional()}); export const unitWithoutPatternForPresentation = z.string(); export const numberPickerForAutomationCondition = z.object({value: value, valueType: valueType.optional(), unit: unitWithoutPatternForPresentation.optional(), range: range.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const excludeItemsAttributes = z.array(z.object({name: z.string(), excludedValues: z.array(z.string()).optional()})); export const excludedConditionItem = z.object({value: z.object({}).optional(), exclude: z.array(z.object({component: z.string().optional(), capability: z.string(), version: z.number().int().optional(), attributes: excludeItemsAttributes.optional()}))}); export const automationListItem = z.object({capability: z.string(), version: version.optional(), label: z.string(), description: descriptionForAutomationItem.optional(), displayType: z.enum(["slider", "list", "dynamicList", "numberField", "textField", "enumSlider", "numberPicker"]), slider: sliderForAutomationCondition.optional(), list: listForAutomationCondition.optional(), dynamicList: dynamicListForAutomationCondition.optional(), numberField: numberFieldForAutomationCondition.optional(), textField: textFieldForAutomationCondition.optional(), enumSlider: enumSliderForAutomationCondition.optional(), numberPicker: numberPickerForAutomationCondition.optional(), emphasis: z.boolean().optional(), exclusion: z.array(excludedConditionItem).optional(), component: component.optional(), visibleCondition: visibleCondition.optional()}); export const sliderForAutomationAction = z.object({range: range, step: step.optional(), unit: unit.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), alternatives: alternatives.optional(), command: z.string(), argumentType: argumentType.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const listForAutomationAction = z.object({alternatives: alternatives, supportedValues: supportedValues.optional(), command: z.string().optional(), argumentType: argumentType.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const dynamicListForAutomationAction = z.object({command: z.string().optional(), argumentType: z.string().optional(), supportedValues: supportedValuesForDynamicList, alternatives: alternativesForDynamicList.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const textFieldForAutomationAction = z.object({command: z.string(), argumentType: argumentType.optional(), range: range.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const numberFieldForAutomationAction = z.object({command: z.string(), argumentType: argumentType.optional(), unit: unit.optional(), range: range.optional(), alternatives: alternatives.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const numberPickerForAutomationAction = z.object({command: z.string(), argumentType: argumentType.optional(), unit: unitWithoutPatternForPresentation.optional(), range: range.optional(), supportedValues: supportedValuesForNumericConstraints.optional(), description: descriptionForAutomatioDisplayType.optional()}); export const excludeItemsCommands = z.array(z.object({name: z.string(), excludedValues: z.array(z.string()).optional()})); export const excludedActionItem = z.object({value: z.object({}).optional(), exclude: z.array(z.object({component: z.string().optional(), capability: z.string(), version: z.number().int().optional(), commands: excludeItemsCommands.optional()}))}); export const actionListItem = z.object({capability: z.string(), version: version.optional(), label: z.string(), description: descriptionForAutomationItem.optional(), displayType: z.enum(["slider", "list", "dynamicList", "textField", "numberField", "numberPicker", "multiArgCommand"]), slider: sliderForAutomationAction.optional(), list: listForAutomationAction.optional(), dynamicList: dynamicListForAutomationAction.optional(), textField: textFieldForAutomationAction.optional(), numberField: numberFieldForAutomationAction.optional(), numberPicker: numberPickerForAutomationAction.optional(), multiArgCommand: multiArgCommand.optional(), emphasis: z.boolean().optional(), component: component.optional(), visibleCondition: visibleCondition.optional(), exclusion: z.array(excludedActionItem).optional()}); export const descriptionItem = z.object({operator: operatorForVisibleConditions.optional(), label: z.string(), visibleConditions: z.array(visibleCondition).optional()}); export const descriptionsInAutomation = z.object({conditions: z.array(descriptionItem).optional(), actions: z.array(descriptionItem).optional()}); export const automation = z.object({conditions: z.array(automationListItem).optional(), actions: z.array(actionListItem).optional(), descriptions: descriptionsInAutomation.optional()}); export const dpInfo = z.array(z.object({os: z.enum(["android", "ios", "tizen", "web"]), dpUri: z.string(), serverDpUri: z.string().optional(), operatingMode: z.string().optional(), arguments: z.array(z.object({key: z.string(), value: z.string()})).optional()})); export const stPluginApiVersion = z.string(); export const dpInfos = z.array(z.object({stPluginApiVersion: stPluginApiVersion.optional(), dpInfo: dpInfo})); export const poCodes = z.object({label: z.string(), po: z.string()}); export const languageItem = z.object({locale: z.string(), poCodes: z.array(poCodes)}); export const language = z.array(languageItem); export const temperatureConversionsItemForDevicePresentation = z.object({capability: z.string(), version: version.optional(), value: value, unit: unit.optional()}); export const presentationSettingsForDevicePresentation = z.object({temperatureConversions: z.array(temperatureConversionsItemForDevicePresentation).optional()}); export const dossierDevicePresentation = z.object({manufacturerName: z.string().optional(), presentationId: z.string().optional(), mnmn: mnmn, vid: vid, version: z.string().optional(), iconUrl: z.string().optional(), description: presentationDescription.optional(), icons: icons.optional(), dashboard: dashboard.optional(), detailView: detailView.optional(), automation: automation.optional(), dpInfo: dpInfo.optional(), dpInfos: dpInfos.optional(), language: language.optional(), presentationSettings: presentationSettingsForDevicePresentation.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get a Device Presentation * * GET /presentation */ export const getApiPresentation = async (args: GetApiPresentationArgs, options?: GetApiPresentationOptions) => { const {baseUrl = "https://api.smartthings.com/v1", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.presentationId != null) query.append("presentationId", String(args.presentationId)) if (args.manufacturerName != null) query.append("manufacturerName", String(args.manufacturerName)) if (args.deviceId != null) query.append("deviceId", String(args.deviceId)) if (args['If-None-Match'] != null) headers.set("If-None-Match", String(args['If-None-Match'])) if (args['Accept-Language'] != null) headers.set("Accept-Language", String(args['Accept-Language'])) if (args.view != null) query.append("view", String(args.view)) if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/presentation${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(dossierDevicePresentation, await res.json()) };