iobroker.iot 4.1.2 → 4.1.3

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.
Files changed (40) hide show
  1. package/README.md +5 -3
  2. package/admin/assets/{index-6Itc0U48.js → index-CyfkYMpa.js} +85 -85
  3. package/admin/index_m.html +1 -1
  4. package/admin/rules/assets/{index-208Qrr3S.js → index-DBQ_ihVx.js} +83 -83
  5. package/admin/rules/customRuleBlocks.js +2 -2
  6. package/build/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js +7 -0
  7. package/build/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -1
  8. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +3 -1
  9. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -1
  10. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/SceneController.js +38 -0
  11. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/SceneController.js.map +1 -0
  12. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +2 -0
  13. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +1 -1
  14. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -1
  15. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +67 -14
  16. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -1
  17. package/build/lib/AlexaSmartHomeV3/Controls/Button.js +74 -0
  18. package/build/lib/AlexaSmartHomeV3/Controls/Button.js.map +1 -0
  19. package/build/lib/AlexaSmartHomeV3/Controls/Control.js +2 -0
  20. package/build/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -1
  21. package/build/lib/AlexaSmartHomeV3/Controls/Ct.js +1 -7
  22. package/build/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -1
  23. package/build/lib/AlexaSmartHomeV3/Controls/Hue.js +8 -5
  24. package/build/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -1
  25. package/build/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -1
  26. package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js +200 -0
  27. package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js.map +1 -0
  28. package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js +210 -0
  29. package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js.map +1 -0
  30. package/build/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -1
  31. package/build/lib/AlexaSmartHomeV3/Controls/index.js +15 -3
  32. package/build/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -1
  33. package/build/lib/AlexaSmartHomeV3/DeviceManager.js +9 -2
  34. package/build/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -1
  35. package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js +287 -0
  36. package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -1
  37. package/build/lib/alexaCustom.js +1 -1
  38. package/build/lib/alexaCustom.js.map +1 -1
  39. package/io-package.json +14 -14
  40. package/package.json +4 -1
@@ -1 +1 @@
1
- {"version":3,"file":"alexaCustom.js","sourceRoot":"","sources":["../../src/lib/alexaCustom.ts"],"names":[],"mappings":"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","sourcesContent":["import textsT from './texts';\nimport type { IotAdapterConfig } from './types';\nimport type { IotAdapter } from '../main';\n\n// Stop phrases all in lower case!\n// Required by v2 custom skill to detect when the user wants to cancel the conversation\nconst stopPhrases: { [language: string]: string[] } = {\n de: ['es reicht', 'ich bin fertig', 'ende', 'abbrechen', 'stopp', 'stop', 'beenden', 'danke', 'danke schön'],\n en: ['enough', 'i am done', \"i'm done\", 'stop', 'quit', 'bye', 'thanks', 'thank you'],\n ru: ['достаточно', 'я готов', 'хватит'],\n};\n\nexport type AlexaCustomResponse = {\n version: string;\n sessionAttributes: { [key: string]: string };\n responseId?: string; // This field added by iot adapter and will be deleted in the cloud\n response: {\n outputSpeech:\n | {\n type: 'PlainText';\n text?: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n }\n | {\n type: 'SSML';\n ssml: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n };\n card: {\n type: 'Simple' | 'Standard' | 'LinkAccount' | 'AskForPermissionsConsent';\n content: string;\n title: string;\n text?: string;\n image?: {\n smallImageUrl: string;\n largeImageUrl: string;\n };\n };\n shouldEndSession: boolean | null;\n reprompt?: {\n outputSpeech:\n | {\n type: 'PlainText';\n text?: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n }\n | {\n type: 'SSML';\n ssml?: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n };\n };\n directives?: {\n type: 'Dialog.ElicitSlot'; // | 'InterfaceName.Directive';\n updatedIntent: {\n name: 'queryIntent';\n confirmationStatus: 'NONE';\n slots: {\n query: {\n name: 'query';\n value: '';\n confirmationStatus: 'NONE';\n };\n };\n };\n slotToElicit: 'query';\n }[];\n };\n};\n\ntype AlexaCustomSession = {\n sessionId: `amzn1.echo-api.session.${string}`;\n application: {\n applicationId: `amzn1.ask.skill.${string}`;\n };\n attributes: Record<string, unknown>;\n user: {\n userId: `amzn1.ask.account.${string}`;\n accessToken: string;\n };\n new: boolean;\n};\ntype AlexaCustomLaunchRequest = {\n type: 'LaunchRequest';\n requestId: string;\n timestamp: string;\n locale: string;\n};\ntype AlexaCustomIntentRequest = {\n type: 'IntentRequest';\n requestId: string;\n timestamp: string;\n dialogState: 'STARTED' | 'IN_PROGRESS' | 'COMPLETED';\n locale: string;\n intent: {\n name: string;\n confirmationStatus: 'NONE' | 'CONFIRMED' | 'DENIED';\n slots: {\n [slotName: string]: {\n name: string;\n value: string;\n confirmationStatus: 'NONE' | 'CONFIRMED' | 'DENIED';\n slotValue?: {\n value:\n | {\n resolutions: any;\n type: 'Simple';\n value: string;\n }\n | {\n resolutions: any;\n type: 'List';\n values: string[];\n };\n };\n resolutions?: {\n resolutionsPerAuthority: [\n {\n authority: string;\n status: {\n code:\n | 'ER_SUCCESS_MATCH'\n | 'ER_SUCCESS_NO_MATCH'\n | 'ER_ERROR_TIMEOUT'\n | 'ER_ERROR_EXCEPTION';\n };\n values: [\n {\n value: {\n name: string;\n id: string;\n };\n },\n ];\n },\n ];\n };\n };\n };\n };\n};\ntype AlexaCustomSessionEndedRequest = {\n type: 'SessionEndedRequest';\n requestId: string;\n timestamp: string;\n reason: 'USER_INITIATED' | 'ERROR' | 'EXCEEDED_MAX_REPROMPTS';\n locale: string;\n error: {\n type: string;\n message: string;\n };\n};\ntype AlexaCustomCanFulfillIntentRequest = {\n // ONly english\n type: 'CanFulfillIntentRequest';\n requestId: string;\n timestamp: string;\n};\n\ntype AlexaCustomRequestContext = {\n System: {\n device: {\n deviceId: string;\n supportedInterfaces: {\n AudioPlayer: { [key: string]: any };\n };\n persistentEndpointId: `amzn1.alexa.endpoint.${string}`;\n };\n application: {\n applicationId: `amzn1.ask.skill.${string}`;\n };\n user: {\n userId: `amzn1.ask.account.${string}`;\n accessToken: string;\n };\n person: {\n personId: `amzn1.ask.person.${string}`;\n accessToken: string;\n };\n unit: {\n unitId: `amzn1.ask.unit.${string}`;\n persistentUnitId: `amzn1.alexa.unit.did.${string}`;\n };\n apiEndpoint: 'https://api.amazonalexa.com';\n apiAccessToken: string;\n };\n Advertising: {\n advertisingId: string;\n limitAdTracking: boolean;\n };\n AudioPlayer: {\n playerActivity: 'PLAYING';\n token: string;\n offsetInMilliseconds: number;\n };\n};\n\ntype AlexaCustomRequest = {\n session: AlexaCustomSession;\n customSkillV2?: boolean;\n request:\n | AlexaCustomLaunchRequest\n | AlexaCustomIntentRequest\n | AlexaCustomSessionEndedRequest\n | AlexaCustomCanFulfillIntentRequest;\n context: AlexaCustomRequestContext;\n};\n\ntype StoredSession = {\n request: AlexaCustomRequest | null;\n isV2Skill?: boolean;\n responseTimer: NodeJS.Timeout | null;\n expiryTimer: NodeJS.Timeout | null;\n callback: ((response: AlexaCustomResponse) => void) | null;\n};\n\nexport default class AlexaCustom {\n private lang: ioBroker.Languages = 'de';\n private openSessions: {\n [sessionId: string]: StoredSession;\n } = {};\n\n private knownDevices: {\n [deviceId: string]: {\n id: string;\n room: `enum.room.${string}`;\n lastSeen: number;\n };\n } = {};\n private knownUsers: {\n [deviceId: string]: {\n id: string;\n name: string;\n lastSeen: number;\n };\n } = {};\n private config: IotAdapterConfig;\n private adapter: IotAdapter;\n\n constructor(adapter: IotAdapter) {\n this.config = adapter.config;\n this.adapter = adapter;\n if (this.config.customKnownAlexaDevices && Array.isArray(this.config.customKnownAlexaDevices)) {\n this.config.customKnownAlexaDevices.forEach(device => {\n this.knownDevices[device.id] = device;\n // {\n // \"id\": \"amzn1.ask.device.XXXXXXXXX\", // just show last X chars in UI, should be unique enough\n // \"room\": \"enum.room.xyz\",\n // \"lastSeen\": 1234567899,\n // }\n });\n }\n if (this.config.customKnownAlexaUsers && Array.isArray(this.config.customKnownAlexaUsers)) {\n this.config.customKnownAlexaUsers.forEach(device => {\n this.knownUsers[device.id] = device;\n // {\n // \"id\": \"amzn1.ask.account.XXXXXXXXX\", // just show last X chars in UI, should be unique enough\n // \"name\": \"Holger\",\n // \"lastSeen\": 1234567899,\n // }\n });\n }\n }\n\n getKnownDevices(): {\n id: string;\n room: `enum.room.${string}`;\n lastSeen: number;\n }[] {\n return Object.values(this.knownDevices);\n }\n\n getKnownUsers(): {\n id: string;\n name: string;\n lastSeen: number;\n }[] {\n return Object.values(this.knownUsers);\n }\n\n // eslint-disable-next-line no-unused-private-class-members\n #writeResponse(_channelId: string, _stateId: string, _command: string, _value: ioBroker.StateValue): void {\n // adapter.log.warn('[CUSTOM] Unknown applianceId: ' + deviceId);\n }\n\n #getResponseV1(\n text: string,\n repromptText: string | null,\n requestId: string,\n shouldEndSession?: boolean,\n ): AlexaCustomResponse {\n let speechPlainText = text;\n let speechType: 'PlainText' | 'SSML' = 'PlainText';\n if (text.startsWith('<speak>')) {\n speechPlainText = text.replace(/<[^>]*>/g, '').trim();\n speechType = 'SSML';\n }\n\n let repromptType: 'PlainText' | 'SSML' = 'PlainText';\n if (repromptText?.startsWith('<speak>')) {\n repromptType = 'SSML';\n }\n\n const response: AlexaCustomResponse = {\n version: '1.0',\n sessionAttributes: {},\n responseId: requestId,\n response: {\n outputSpeech:\n speechType === 'PlainText'\n ? {\n type: 'PlainText',\n text,\n }\n : { type: 'SSML', ssml: `text` },\n card: {\n content: speechPlainText,\n title: textsT(this.lang, 'Answer from ioBroker') || 'ioBroker',\n type: 'Simple',\n },\n shouldEndSession: shouldEndSession || false,\n },\n };\n\n if (repromptText) {\n response.response.reprompt = {\n outputSpeech:\n repromptType === 'PlainText'\n ? {\n type: 'PlainText',\n text: repromptText,\n }\n : {\n type: 'SSML',\n ssml: repromptText,\n },\n };\n }\n\n return response;\n }\n\n #getResponseV2(\n text: string,\n repromptText: string | null,\n requestId: string,\n shouldEndSession?: boolean,\n ): AlexaCustomResponse {\n const response = this.#getResponseV1(text, repromptText, requestId, shouldEndSession);\n\n if (!shouldEndSession) {\n // We redirect the user to the Dialog Intent to capture the full traffic\n response.response.directives = [\n {\n type: 'Dialog.ElicitSlot',\n updatedIntent: {\n name: 'queryIntent',\n confirmationStatus: 'NONE',\n slots: {\n query: {\n name: 'query',\n value: '',\n confirmationStatus: 'NONE',\n },\n },\n },\n slotToElicit: 'query',\n },\n ];\n }\n return response;\n }\n\n setLanguage(_lang: ioBroker.Languages): void {\n this.lang = _lang || 'de';\n }\n\n setResponse(resp: string, shouldEndSession?: boolean): void {\n let response: {\n sessionId: string;\n responseText: string;\n shouldEndSession: boolean;\n } | null = null;\n if (resp.startsWith('{') && resp.endsWith('}')) {\n try {\n response = JSON.parse(resp);\n } catch {\n // ignore\n }\n }\n let session: StoredSession | undefined;\n let sessionId: string | undefined;\n if (response !== null && typeof response === 'object') {\n if (response.sessionId) {\n sessionId = response.sessionId;\n session = this.openSessions[sessionId];\n }\n }\n // We got a state response without session reference\n if (!session) {\n const sessions = Object.keys(this.openSessions).filter(\n sessionId => !!(this.openSessions[sessionId].responseTimer && this.openSessions[sessionId].callback),\n );\n if (sessions.length > 0) {\n sessionId = sessions[0];\n session = this.openSessions[sessionId];\n if (sessions.length > 1) {\n this.adapter.log.warn(\n '[CUSTOM] More than one session with expected responses ... consider the first one as the relevant one',\n );\n }\n }\n }\n\n const obj = {\n responseText: '',\n shouldEndSession: shouldEndSession === undefined ? !sessionId : shouldEndSession,\n };\n if (response !== null && typeof response === 'object') {\n if (response.responseText) {\n obj.responseText = response.responseText;\n }\n if (response.shouldEndSession !== undefined) {\n obj.shouldEndSession = response.shouldEndSession;\n }\n } else {\n obj.responseText = resp;\n }\n\n if (session?.responseTimer && session.callback) {\n this.processAfter(session.request!, obj.responseText, obj.shouldEndSession, session.callback);\n }\n }\n\n processAfter(\n request: AlexaCustomRequest,\n text: string,\n shouldEndSession: boolean | undefined,\n callback: (response: AlexaCustomResponse) => void,\n ): void {\n void this.adapter.setState('smart.lastResponse', text, true);\n\n const sessionId = request.session?.sessionId || '';\n const requestId = request.request?.requestId || '';\n\n if (this.openSessions[sessionId].responseTimer) {\n clearTimeout(this.openSessions[sessionId].responseTimer);\n this.openSessions[sessionId].responseTimer = null;\n }\n\n this.openSessions[sessionId].callback = null;\n this.openSessions[sessionId].request = null;\n\n const isV2Skill =\n this.openSessions[sessionId].isV2Skill !== undefined\n ? this.openSessions[sessionId].isV2Skill\n : !!request.customSkillV2;\n if (isV2Skill) {\n callback(this.#getResponseV2(text, null, requestId, shouldEndSession));\n } else {\n callback(this.#getResponseV1(text, null, requestId, shouldEndSession));\n }\n }\n\n touchSession(sessionId: string, isV2Skill: boolean): void {\n if (this.openSessions[sessionId]?.expiryTimer) {\n clearTimeout(this.openSessions[sessionId].expiryTimer);\n this.openSessions[sessionId].expiryTimer = null;\n }\n this.openSessions[sessionId] ||= {\n expiryTimer: null,\n responseTimer: null,\n request: null,\n callback: null,\n isV2Skill,\n };\n this.openSessions[sessionId].expiryTimer = setTimeout(() => {\n delete this.openSessions[sessionId];\n }, 60000); // latest after 10 mins we declare a session as closed\n }\n\n deleteSession(sessionId: string): void {\n if (this.openSessions[sessionId]?.expiryTimer) {\n clearTimeout(this.openSessions[sessionId].expiryTimer);\n }\n delete this.openSessions[sessionId];\n }\n\n // let example = {\n // \"session\": {\n // \"sessionId\": \"SessionId.74267f5d-3b58-45646-bdc7-4645645\",\n // \"application\": {\n // \"applicationId\": \"amzn1.ask.skill.6cee68cd-4356-456-9d53-45646456\"\n // },\n // \"attributes\": {},\n // \"user\": {\n // \"userId\": \"amzn1.ask.account.asdasdasdas\"\n // },\n // \"new\": true\n // },\n // \"request\": {\n // \"type\": \"IntentRequest\",\n // \"requestId\": \"EdwRequestId.b785ca9f-6ba9-45645-a667-4645646\",\n // \"locale\": \"de-DE\",\n // \"timestamp\": \"2017-07-25T15:30:51Z\",\n // \"intent\": {\n // \"name\": \"controlDevice\",\n // \"slots\": {\n // \"Command\": {\n // \"name\": \"Command\",\n // \"value\": \"an\"\n // },\n // \"Device\": {\n // \"name\": \"Device\"\n // },\n // \"Article\": {\n // \"name\": \"Article\"\n // },\n // \"Value\": {\n // \"name\": \"Value\"\n // },\n // \"Place\": {\n // \"name\": \"Place\",\n // \"value\": \"licht\"\n // }\n // }\n // }\n // },\n // \"version\": \"1.0\"\n // }\n async process(request: AlexaCustomRequest, isEnabled: boolean): Promise<AlexaCustomResponse | { error: string }> {\n if (!request?.request) {\n this.adapter.log.error('Invalid request: no intent!');\n return { error: 'Invalid request: no intent!' };\n }\n const isV2Skill = !!request.customSkillV2;\n const getResponse = isV2Skill ? this.#getResponseV2 : this.#getResponseV1;\n const requestId = request.request?.requestId || '';\n\n if (!isEnabled) {\n if (this.lang === 'en') {\n return getResponse(\n 'The service is not activated. Please enable Alexa integration in the iot Adapter.',\n null,\n requestId,\n true,\n );\n }\n if (this.lang === 'ru') {\n return getResponse(\n 'Услуга не активирована. Включите интеграцию Alexa в адаптере Интернета вещей.',\n null,\n requestId,\n true,\n );\n }\n return getResponse(\n 'Der Service ist nicht aktiviert. Bitte aktiviere die Alex-Integration im iot-Adapter um Ihn zu aktivieren.',\n null,\n requestId,\n true,\n );\n }\n\n const sessionId = request.session?.sessionId || '';\n\n if (request.request.type === 'LaunchRequest') {\n this.adapter.log.debug(request.request.type);\n this.touchSession(sessionId, isV2Skill);\n if (this.lang === 'en') {\n return getResponse(\n 'Hello, what do you want to know or control?',\n 'What do you want to know or control?',\n requestId,\n );\n }\n if (this.lang === 'ru') {\n return getResponse(\n 'Привет. Что вы хотите знать или контролировать?',\n 'Что вы хотите знать или контролировать?',\n requestId,\n );\n }\n return getResponse(\n 'Hallo, was möchtest Du wissen oder steuern?',\n 'Was möchtest Du wissen oder steuern?',\n requestId,\n );\n }\n if (request.request.type === 'IntentRequest') {\n this.adapter.log.debug(\n `Custom Skill ${isV2Skill ? 'V2' : 'V1'} request: ${request.request.type}/${request.request.intent?.name} for session ${sessionId}, dialog: ${request.request.dialogState}`,\n );\n if (request.request.intent) {\n this.touchSession(sessionId, isV2Skill);\n\n if (request.request.intent.name === 'AMAZON.HelpIntent') {\n if (this.lang === 'en') {\n return getResponse(\n 'This skill will pass all recognized words to your ioBroker installation and you can configure actions and responses there! What do you want to know or control?',\n 'What do you want to know or control?',\n requestId,\n );\n }\n if (this.lang === 'ru') {\n return getResponse(\n 'Этот навык передаст все распознанные слова в вашу установку ioBroker, и вы сможете настроить действия и ответы там! Что вы хотите знать или контролировать?',\n 'Что вы хотите знать или контролировать?',\n requestId,\n );\n }\n return getResponse(\n 'Dieser Skill gibt alle erkannten Wörter an Deine ioBroker-Installation weiter und Du kannst dort Aktionen und Antworten konfigurieren! Was möchtest Du wissen oder steuern?',\n 'Was möchtest Du wissen oder steuern?',\n requestId,\n );\n } else if (\n request.request.intent.name === 'AMAZON.CancelIntent' ||\n request.request.intent.name === 'AMAZON.StopIntent'\n ) {\n this.adapter.log.debug(request.request.intent.name);\n this.deleteSession(sessionId);\n if (this.lang === 'en') {\n return getResponse('Goodbye!', null, requestId, true);\n }\n if (this.lang === 'ru') {\n return getResponse('До скорого!', null, requestId, true);\n }\n return getResponse('Bis bald!', null, requestId, true);\n }\n const textsLog = [];\n const texts = [];\n\n const originalIntentName = request.request.intent.name;\n if (request.request.intent.name === 'AMAZON.YesIntent') {\n // Only relevant for v2 Skill. Convert an initial YesIntent to Words\n if (this.lang === 'en') {\n textsLog.push('AMAZON.YesIntent = Yes');\n texts.push('Yes');\n } else if (this.lang === 'ru') {\n textsLog.push('AMAZON.YesIntent = Да');\n texts.push('Да');\n } else if (this.lang === 'de') {\n textsLog.push('AMAZON.YesIntent = Ja');\n texts.push('Ja');\n }\n } else if (request.request.intent.name === 'AMAZON.NoIntent') {\n // Only relevant for v2 Skill. Convert an initial NoIntent to Words\n if (this.lang === 'en') {\n textsLog.push('AMAZON.NoIntent = No');\n texts.push('No');\n } else if (this.lang === 'ru') {\n textsLog.push('AMAZON.NoIntent = Нет');\n texts.push('Нет');\n } else if (this.lang === 'de') {\n textsLog.push('AMAZON.NoIntent = Nein');\n texts.push('Nein');\n }\n } else if (request.request.intent.name.startsWith('queryIntent')) {\n // v2 Skill\n // Only relevant for v2 Skill, get the start words out of the intent name\n const startWords = request.request.intent.name\n .replace(/^queryIntent/, '')\n .replace(/ae/, 'ä')\n .replace(/oe/, 'ö')\n .replace(/ue/, 'ü')\n .replace(/Oe/, 'Ö')\n .replace(/Ue/, 'Ü')\n .replace(/Ae/, 'Ä')\n .replace(/ss/, 'ß')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n request.request.intent.name = 'queryIntent';\n if (startWords.length && startWords !== 'FillWords') {\n // ignore FillWords\n textsLog.push(`queryIntent = ${startWords}`);\n texts.push(startWords);\n }\n }\n\n if (!request.request.intent.slots && textsLog.length === 0) {\n // No slots and nothing from above\n this.adapter.log.warn(`Unexpected ALEXA Request: ${JSON.stringify(request)}`);\n if (this.lang === 'en') {\n return getResponse('I did not hear you. Please repeat your question!', null, requestId);\n }\n if (this.lang === 'ru') {\n return getResponse('Я не слышал тебя. Пожалуйста, повторите свой вопрос!', null, requestId);\n }\n return getResponse(\n 'Ich habe Dich nicht verstanden. Bitte wiederhole deine Frage!',\n null,\n requestId,\n );\n }\n\n const internRequest: AlexaCustomIntentRequest = request.request;\n // collect all filled slots (v1 and v2 skill)\n if (internRequest.intent.slots) {\n const slots = Object.keys(internRequest.intent.slots);\n slots.forEach(slotId => {\n const slot = internRequest.intent.slots[slotId];\n let value = slot.value;\n const resolution =\n slot.resolutions?.resolutionsPerAuthority &&\n slot.resolutions.resolutionsPerAuthority.length > 0\n ? slot.resolutions.resolutionsPerAuthority[0]\n : null;\n\n if (resolution?.status.code === 'ER_SUCCESS_MATCH') {\n const resolutionValue = resolution.values[0].value;\n value = resolutionValue.name;\n }\n\n if (value?.length) {\n texts.push(value);\n textsLog.push(`${slotId} = ${value}`);\n }\n });\n }\n\n let text = texts.join(' ');\n\n const intent = internRequest.intent.name || '';\n if (originalIntentName.startsWith('queryIntentStarteDialog')) {\n // v2 Skill StarteDialog* intents are automatically handled without sending anywhere\n let response = '';\n if (originalIntentName === 'queryIntentStarteDialog') {\n // Intent to directly redirect to the dialog state without further processing\n response = text.replace(/^Starte Dialog /, '').trim();\n } else if (originalIntentName === 'queryIntentStarteDialogMitFrage') {\n // Intent to directly redirect to the dialog state with asking a question without further processing\n response = text.replace(/^Starte Dialog Mit Frage /, '').trim();\n if (response.length) {\n response += '?';\n }\n }\n if (!response.length) {\n // We need to send an answer, else it is an error\n if (this.lang === 'en') {\n response = 'Yes?';\n } else if (this.lang === 'ru') {\n response = 'Да?';\n } else {\n response = 'Ja?';\n }\n }\n return getResponse(response, response, requestId);\n }\n if (intent === 'queryIntent' && stopPhrases[this.lang].includes(text.toLowerCase())) {\n // v2 Skill when in dialog mode, we need to take care of the exit criteria ourselves\n this.deleteSession(sessionId);\n\n if (this.lang === 'en') {\n return getResponse('Goodbye!', null, requestId, true);\n }\n if (this.lang === 'ru') {\n return getResponse('До скорого!', null, requestId, true);\n }\n return getResponse('Bis bald!', null, requestId, true);\n }\n // v1 and v2 Skill\n const deviceId = request?.context?.System?.device?.deviceId\n ? request.context.System.device.deviceId\n : '';\n const deviceRoom = this.knownDevices[deviceId] ? this.knownDevices[deviceId].room : undefined;\n const userId = request?.session?.user?.userId ? request.session.user.userId : '';\n const userName = this.knownUsers[userId] ? this.knownUsers[userId].name : undefined;\n const commandObj = {\n words: texts,\n intent: intent,\n deviceId,\n deviceRoom,\n sessionId,\n userId,\n userName,\n };\n\n // Add room and username to the text if configured\n if (deviceRoom && this.config.addCustomKnownAlexaDeviceRoomToText) {\n text += ` ${deviceRoom}`;\n }\n if (userName && this.config.addCustomKnownAlexaUserNameToText) {\n text += ` ${userName}`;\n }\n\n // Add intent in front of the text to stay compatible with v1 Skill\n text = `${intent} ${text}`;\n text = text.trim();\n\n await this.adapter.setStateAsync('smart.lastCommand', text, true);\n await this.adapter.setStateAsync('smart.lastCommandObj', JSON.stringify(commandObj), true);\n\n this.adapter.log.debug(`${intent}: ${textsLog.join(', ')}`);\n\n if (intent) {\n let textTimeout;\n if (this.lang === 'en') {\n textTimeout = `Processing of ${text} is not possible!`;\n } else if (this.lang === 'ru') {\n textTimeout = `Обработка ${text} не возможна!`;\n } else {\n textTimeout = `Die Verarbeitung von ${text} ist nicht möglich!`;\n }\n\n if (\n this.config.text2command !== null &&\n this.config.text2command !== undefined &&\n (this.config.text2command as string) !== ''\n ) {\n const state = await this.adapter.getForeignStateAsync(\n `system.adapter.text2command.${this.config.text2command}.alive`,\n );\n if (state?.val) {\n return new Promise<AlexaCustomResponse>(\n (resolve: ((response: AlexaCustomResponse) => void) | null): void => {\n this.openSessions[sessionId].responseTimer = setTimeout(() => {\n this.openSessions[sessionId].responseTimer = null;\n if (resolve) {\n this.processAfter(request, textTimeout, true, resolve);\n resolve = null;\n }\n }, 1000);\n\n if (this.config.language) {\n text = `${this.config.language};${text}`;\n }\n\n this.adapter.sendTo(`text2command.${this.config.text2command}`, text, result => {\n const typedResult: {\n response: string;\n } = result as any;\n if (this.openSessions[sessionId].responseTimer) {\n clearTimeout(this.openSessions[sessionId].responseTimer);\n this.openSessions[sessionId].responseTimer = null;\n }\n const regExp = new RegExp(`\"${intent.toLowerCase()}\\\\s`);\n typedResult.response = typedResult.response\n .replace(/^\\w\\w;/, '')\n .replace(regExp, '\"');\n this.adapter.log.debug(`Response from text2command: ${typedResult.response}`);\n\n void this.adapter.setState('smart.lastResponse', typedResult.response, true);\n if (resolve) {\n resolve(getResponse(typedResult.response, null, requestId, true));\n resolve = null;\n }\n });\n },\n );\n }\n }\n\n return new Promise(resolve => {\n this.openSessions[sessionId].responseTimer &&\n clearTimeout(this.openSessions[sessionId].responseTimer);\n this.openSessions[sessionId].callback = resolve;\n this.openSessions[sessionId].request = request;\n\n this.openSessions[sessionId].responseTimer = setTimeout(\n () => this.processAfter(request, textTimeout, true, resolve),\n 200,\n );\n });\n }\n if (this.lang === 'en') {\n return getResponse('I did not understand the question!', null, requestId);\n }\n if (this.lang === 'ru') {\n return getResponse('Я не поняла ваш вопрос!', null, requestId);\n }\n return getResponse('Ich habe Deine Frage nicht verstanden!', null, requestId);\n }\n this.adapter.log.warn(`Unexpected ALEXA Request: ${JSON.stringify(request)}`);\n if (this.lang === 'en') {\n return getResponse('Please repeat your question!', null, requestId);\n }\n if (this.lang === 'ru') {\n return getResponse('Пожалуйста, повторите вопрос!', null, requestId);\n }\n return getResponse('Bitte wiederhole die Frage!', null, requestId);\n }\n if (request.request.type === 'SessionEndedRequest') {\n this.adapter.log.debug(`SessionEndedRequest: ${request.request.reason}`);\n this.deleteSession(sessionId);\n // Should not be called\n // A skill cannot return a response to SessionEndedRequest.\n return { error: 'Unexpected Session Ended' };\n }\n\n this.adapter.log.debug(`Unknown Request type: ${JSON.stringify(request)}`);\n\n return { error: 'Unknown Request type' };\n }\n}\n"]}
1
+ {"version":3,"file":"alexaCustom.js","sourceRoot":"","sources":["../../src/lib/alexaCustom.ts"],"names":[],"mappings":"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","sourcesContent":["import textsT from './texts';\nimport type { IotAdapterConfig } from './types';\nimport type { IotAdapter } from '../main';\n\n// Stop phrases all in lower case!\n// Required by v2 custom skill to detect when the user wants to cancel the conversation\nconst stopPhrases: { [language: string]: string[] } = {\n de: ['es reicht', 'ich bin fertig', 'ende', 'abbrechen', 'stopp', 'stop', 'beenden', 'danke', 'danke schön'],\n en: ['enough', 'i am done', \"i'm done\", 'stop', 'quit', 'bye', 'thanks', 'thank you'],\n ru: ['достаточно', 'я готов', 'хватит'],\n};\n\nexport type AlexaCustomResponse = {\n version: string;\n sessionAttributes: { [key: string]: string };\n responseId?: string; // This field added by iot adapter and will be deleted in the cloud\n response: {\n outputSpeech:\n | {\n type: 'PlainText';\n text?: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n }\n | {\n type: 'SSML';\n ssml: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n };\n card: {\n type: 'Simple' | 'Standard' | 'LinkAccount' | 'AskForPermissionsConsent';\n content: string;\n title: string;\n text?: string;\n image?: {\n smallImageUrl: string;\n largeImageUrl: string;\n };\n };\n shouldEndSession: boolean | null;\n reprompt?: {\n outputSpeech:\n | {\n type: 'PlainText';\n text?: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n }\n | {\n type: 'SSML';\n ssml?: string;\n playBehavior?: 'REPLACE_ENQUEUED' | 'ENQUEUE' | 'REPLACE_ALL';\n };\n };\n directives?: {\n type: 'Dialog.ElicitSlot'; // | 'InterfaceName.Directive';\n updatedIntent: {\n name: 'queryIntent';\n confirmationStatus: 'NONE';\n slots: {\n query: {\n name: 'query';\n value: '';\n confirmationStatus: 'NONE';\n };\n };\n };\n slotToElicit: 'query';\n }[];\n };\n};\n\ntype AlexaCustomSession = {\n sessionId: `amzn1.echo-api.session.${string}`;\n application: {\n applicationId: `amzn1.ask.skill.${string}`;\n };\n attributes: Record<string, unknown>;\n user: {\n userId: `amzn1.ask.account.${string}`;\n accessToken: string;\n };\n new: boolean;\n};\ntype AlexaCustomLaunchRequest = {\n type: 'LaunchRequest';\n requestId: string;\n timestamp: string;\n locale: string;\n};\ntype AlexaCustomIntentRequest = {\n type: 'IntentRequest';\n requestId: string;\n timestamp: string;\n dialogState: 'STARTED' | 'IN_PROGRESS' | 'COMPLETED';\n locale: string;\n intent: {\n name: string;\n confirmationStatus: 'NONE' | 'CONFIRMED' | 'DENIED';\n slots: {\n [slotName: string]: {\n name: string;\n value: string;\n confirmationStatus: 'NONE' | 'CONFIRMED' | 'DENIED';\n slotValue?: {\n value:\n | {\n resolutions: any;\n type: 'Simple';\n value: string;\n }\n | {\n resolutions: any;\n type: 'List';\n values: string[];\n };\n };\n resolutions?: {\n resolutionsPerAuthority: [\n {\n authority: string;\n status: {\n code:\n | 'ER_SUCCESS_MATCH'\n | 'ER_SUCCESS_NO_MATCH'\n | 'ER_ERROR_TIMEOUT'\n | 'ER_ERROR_EXCEPTION';\n };\n values: [\n {\n value: {\n name: string;\n id: string;\n };\n },\n ];\n },\n ];\n };\n };\n };\n };\n};\ntype AlexaCustomSessionEndedRequest = {\n type: 'SessionEndedRequest';\n requestId: string;\n timestamp: string;\n reason: 'USER_INITIATED' | 'ERROR' | 'EXCEEDED_MAX_REPROMPTS';\n locale: string;\n error: {\n type: string;\n message: string;\n };\n};\ntype AlexaCustomCanFulfillIntentRequest = {\n // ONly english\n type: 'CanFulfillIntentRequest';\n requestId: string;\n timestamp: string;\n};\n\ntype AlexaCustomRequestContext = {\n System: {\n device: {\n deviceId: string;\n supportedInterfaces: {\n AudioPlayer: { [key: string]: any };\n };\n persistentEndpointId: `amzn1.alexa.endpoint.${string}`;\n };\n application: {\n applicationId: `amzn1.ask.skill.${string}`;\n };\n user: {\n userId: `amzn1.ask.account.${string}`;\n accessToken: string;\n };\n person: {\n personId: `amzn1.ask.person.${string}`;\n accessToken: string;\n };\n unit: {\n unitId: `amzn1.ask.unit.${string}`;\n persistentUnitId: `amzn1.alexa.unit.did.${string}`;\n };\n apiEndpoint: 'https://api.amazonalexa.com';\n apiAccessToken: string;\n };\n Advertising: {\n advertisingId: string;\n limitAdTracking: boolean;\n };\n AudioPlayer: {\n playerActivity: 'PLAYING';\n token: string;\n offsetInMilliseconds: number;\n };\n};\n\ntype AlexaCustomRequest = {\n session: AlexaCustomSession;\n customSkillV2?: boolean;\n request:\n | AlexaCustomLaunchRequest\n | AlexaCustomIntentRequest\n | AlexaCustomSessionEndedRequest\n | AlexaCustomCanFulfillIntentRequest;\n context: AlexaCustomRequestContext;\n};\n\ntype StoredSession = {\n request: AlexaCustomRequest | null;\n isV2Skill?: boolean;\n responseTimer: NodeJS.Timeout | null;\n expiryTimer: NodeJS.Timeout | null;\n callback: ((response: AlexaCustomResponse) => void) | null;\n};\n\nexport default class AlexaCustom {\n private lang: ioBroker.Languages = 'de';\n private openSessions: {\n [sessionId: string]: StoredSession;\n } = {};\n\n private knownDevices: {\n [deviceId: string]: {\n id: string;\n room: `enum.room.${string}`;\n lastSeen: number;\n };\n } = {};\n private knownUsers: {\n [deviceId: string]: {\n id: string;\n name: string;\n lastSeen: number;\n };\n } = {};\n private config: IotAdapterConfig;\n private adapter: IotAdapter;\n\n constructor(adapter: IotAdapter) {\n this.config = adapter.config;\n this.adapter = adapter;\n if (this.config.customKnownAlexaDevices && Array.isArray(this.config.customKnownAlexaDevices)) {\n this.config.customKnownAlexaDevices.forEach(device => {\n this.knownDevices[device.id] = device;\n // {\n // \"id\": \"amzn1.ask.device.XXXXXXXXX\", // just show last X chars in UI, should be unique enough\n // \"room\": \"enum.room.xyz\",\n // \"lastSeen\": 1234567899,\n // }\n });\n }\n if (this.config.customKnownAlexaUsers && Array.isArray(this.config.customKnownAlexaUsers)) {\n this.config.customKnownAlexaUsers.forEach(device => {\n this.knownUsers[device.id] = device;\n // {\n // \"id\": \"amzn1.ask.account.XXXXXXXXX\", // just show last X chars in UI, should be unique enough\n // \"name\": \"Holger\",\n // \"lastSeen\": 1234567899,\n // }\n });\n }\n }\n\n getKnownDevices(): {\n id: string;\n room: `enum.room.${string}`;\n lastSeen: number;\n }[] {\n return Object.values(this.knownDevices);\n }\n\n getKnownUsers(): {\n id: string;\n name: string;\n lastSeen: number;\n }[] {\n return Object.values(this.knownUsers);\n }\n\n // eslint-disable-next-line no-unused-private-class-members\n #writeResponse(_channelId: string, _stateId: string, _command: string, _value: ioBroker.StateValue): void {\n // adapter.log.warn('[CUSTOM] Unknown applianceId: ' + deviceId);\n }\n\n #getResponseV1(\n text: string,\n repromptText: string | null,\n requestId: string,\n shouldEndSession?: boolean,\n ): AlexaCustomResponse {\n let speechPlainText = text;\n let speechType: 'PlainText' | 'SSML' = 'PlainText';\n if (text.startsWith('<speak>')) {\n speechPlainText = text.replace(/<[^>]*>/g, '').trim();\n speechType = 'SSML';\n }\n\n let repromptType: 'PlainText' | 'SSML' = 'PlainText';\n if (repromptText?.startsWith('<speak>')) {\n repromptType = 'SSML';\n }\n\n const response: AlexaCustomResponse = {\n version: '1.0',\n sessionAttributes: {},\n responseId: requestId,\n response: {\n outputSpeech:\n speechType === 'PlainText'\n ? {\n type: 'PlainText',\n text,\n }\n : { type: 'SSML', ssml: `text` },\n card: {\n content: speechPlainText,\n title: textsT(this.lang, 'Answer from ioBroker') || 'ioBroker',\n type: 'Simple',\n },\n shouldEndSession: shouldEndSession || false,\n },\n };\n\n if (repromptText) {\n response.response.reprompt = {\n outputSpeech:\n repromptType === 'PlainText'\n ? {\n type: 'PlainText',\n text: repromptText,\n }\n : {\n type: 'SSML',\n ssml: repromptText,\n },\n };\n }\n\n return response;\n }\n\n #getResponseV2(\n text: string,\n repromptText: string | null,\n requestId: string,\n shouldEndSession?: boolean,\n ): AlexaCustomResponse {\n const response = this.#getResponseV1(text, repromptText, requestId, shouldEndSession);\n\n if (!shouldEndSession) {\n // We redirect the user to the Dialog Intent to capture the full traffic\n response.response.directives = [\n {\n type: 'Dialog.ElicitSlot',\n updatedIntent: {\n name: 'queryIntent',\n confirmationStatus: 'NONE',\n slots: {\n query: {\n name: 'query',\n value: '',\n confirmationStatus: 'NONE',\n },\n },\n },\n slotToElicit: 'query',\n },\n ];\n }\n return response;\n }\n\n setLanguage(_lang: ioBroker.Languages): void {\n this.lang = _lang || 'de';\n }\n\n setResponse(resp: string, shouldEndSession?: boolean): void {\n let response: {\n sessionId: string;\n responseText: string;\n shouldEndSession: boolean;\n } | null = null;\n if (resp.startsWith('{') && resp.endsWith('}')) {\n try {\n response = JSON.parse(resp);\n } catch {\n // ignore\n }\n }\n let session: StoredSession | undefined;\n let sessionId: string | undefined;\n if (response !== null && typeof response === 'object') {\n if (response.sessionId) {\n sessionId = response.sessionId;\n session = this.openSessions[sessionId];\n }\n }\n // We got a state response without session reference\n if (!session) {\n const sessions = Object.keys(this.openSessions).filter(\n sessionId => !!(this.openSessions[sessionId].responseTimer && this.openSessions[sessionId].callback),\n );\n if (sessions.length > 0) {\n sessionId = sessions[0];\n session = this.openSessions[sessionId];\n if (sessions.length > 1) {\n this.adapter.log.warn(\n '[CUSTOM] More than one session with expected responses ... consider the first one as the relevant one',\n );\n }\n }\n }\n\n const obj = {\n responseText: '',\n shouldEndSession: shouldEndSession === undefined ? !sessionId : shouldEndSession,\n };\n if (response !== null && typeof response === 'object') {\n if (response.responseText) {\n obj.responseText = response.responseText;\n }\n if (response.shouldEndSession !== undefined) {\n obj.shouldEndSession = response.shouldEndSession;\n }\n } else {\n obj.responseText = resp;\n }\n\n if (session?.responseTimer && session.callback) {\n this.processAfter(session.request!, obj.responseText, obj.shouldEndSession, session.callback);\n }\n }\n\n processAfter(\n request: AlexaCustomRequest,\n text: string,\n shouldEndSession: boolean | undefined,\n callback: (response: AlexaCustomResponse) => void,\n ): void {\n void this.adapter.setState('smart.lastResponse', text, true);\n\n const sessionId = request.session?.sessionId || '';\n const requestId = request.request?.requestId || '';\n\n if (this.openSessions[sessionId].responseTimer) {\n clearTimeout(this.openSessions[sessionId].responseTimer);\n this.openSessions[sessionId].responseTimer = null;\n }\n\n this.openSessions[sessionId].callback = null;\n this.openSessions[sessionId].request = null;\n\n const isV2Skill =\n this.openSessions[sessionId].isV2Skill !== undefined\n ? this.openSessions[sessionId].isV2Skill\n : !!request.customSkillV2;\n if (isV2Skill) {\n callback(this.#getResponseV2(text, null, requestId, shouldEndSession));\n } else {\n callback(this.#getResponseV1(text, null, requestId, shouldEndSession));\n }\n }\n\n touchSession(sessionId: string, isV2Skill: boolean): void {\n if (this.openSessions[sessionId]?.expiryTimer) {\n clearTimeout(this.openSessions[sessionId].expiryTimer);\n this.openSessions[sessionId].expiryTimer = null;\n }\n this.openSessions[sessionId] ||= {\n expiryTimer: null,\n responseTimer: null,\n request: null,\n callback: null,\n isV2Skill,\n };\n this.openSessions[sessionId].expiryTimer = setTimeout(() => {\n delete this.openSessions[sessionId];\n }, 60000); // latest after 10 mins we declare a session as closed\n }\n\n deleteSession(sessionId: string): void {\n if (this.openSessions[sessionId]?.expiryTimer) {\n clearTimeout(this.openSessions[sessionId].expiryTimer);\n }\n delete this.openSessions[sessionId];\n }\n\n // let example = {\n // \"session\": {\n // \"sessionId\": \"SessionId.74267f5d-3b58-45646-bdc7-4645645\",\n // \"application\": {\n // \"applicationId\": \"amzn1.ask.skill.6cee68cd-4356-456-9d53-45646456\"\n // },\n // \"attributes\": {},\n // \"user\": {\n // \"userId\": \"amzn1.ask.account.asdasdasdas\"\n // },\n // \"new\": true\n // },\n // \"request\": {\n // \"type\": \"IntentRequest\",\n // \"requestId\": \"EdwRequestId.b785ca9f-6ba9-45645-a667-4645646\",\n // \"locale\": \"de-DE\",\n // \"timestamp\": \"2017-07-25T15:30:51Z\",\n // \"intent\": {\n // \"name\": \"controlDevice\",\n // \"slots\": {\n // \"Command\": {\n // \"name\": \"Command\",\n // \"value\": \"an\"\n // },\n // \"Device\": {\n // \"name\": \"Device\"\n // },\n // \"Article\": {\n // \"name\": \"Article\"\n // },\n // \"Value\": {\n // \"name\": \"Value\"\n // },\n // \"Place\": {\n // \"name\": \"Place\",\n // \"value\": \"licht\"\n // }\n // }\n // }\n // },\n // \"version\": \"1.0\"\n // }\n async process(request: AlexaCustomRequest, isEnabled: boolean): Promise<AlexaCustomResponse | { error: string }> {\n if (!request?.request) {\n this.adapter.log.error('Invalid request: no intent!');\n return { error: 'Invalid request: no intent!' };\n }\n const isV2Skill = !!request.customSkillV2;\n const getResponse = isV2Skill ? this.#getResponseV2.bind(this) : this.#getResponseV1.bind(this);\n const requestId = request.request?.requestId || '';\n\n if (!isEnabled) {\n if (this.lang === 'en') {\n return getResponse(\n 'The service is not activated. Please enable Alexa integration in the iot Adapter.',\n null,\n requestId,\n true,\n );\n }\n if (this.lang === 'ru') {\n return getResponse(\n 'Услуга не активирована. Включите интеграцию Alexa в адаптере Интернета вещей.',\n null,\n requestId,\n true,\n );\n }\n return getResponse(\n 'Der Service ist nicht aktiviert. Bitte aktiviere die Alex-Integration im iot-Adapter um Ihn zu aktivieren.',\n null,\n requestId,\n true,\n );\n }\n\n const sessionId = request.session?.sessionId || '';\n\n if (request.request.type === 'LaunchRequest') {\n this.adapter.log.debug(request.request.type);\n this.touchSession(sessionId, isV2Skill);\n if (this.lang === 'en') {\n return getResponse(\n 'Hello, what do you want to know or control?',\n 'What do you want to know or control?',\n requestId,\n );\n }\n if (this.lang === 'ru') {\n return getResponse(\n 'Привет. Что вы хотите знать или контролировать?',\n 'Что вы хотите знать или контролировать?',\n requestId,\n );\n }\n return getResponse(\n 'Hallo, was möchtest Du wissen oder steuern?',\n 'Was möchtest Du wissen oder steuern?',\n requestId,\n );\n }\n if (request.request.type === 'IntentRequest') {\n this.adapter.log.debug(\n `Custom Skill ${isV2Skill ? 'V2' : 'V1'} request: ${request.request.type}/${request.request.intent?.name} for session ${sessionId}, dialog: ${request.request.dialogState}`,\n );\n if (request.request.intent) {\n this.touchSession(sessionId, isV2Skill);\n\n if (request.request.intent.name === 'AMAZON.HelpIntent') {\n if (this.lang === 'en') {\n return getResponse(\n 'This skill will pass all recognized words to your ioBroker installation and you can configure actions and responses there! What do you want to know or control?',\n 'What do you want to know or control?',\n requestId,\n );\n }\n if (this.lang === 'ru') {\n return getResponse(\n 'Этот навык передаст все распознанные слова в вашу установку ioBroker, и вы сможете настроить действия и ответы там! Что вы хотите знать или контролировать?',\n 'Что вы хотите знать или контролировать?',\n requestId,\n );\n }\n return getResponse(\n 'Dieser Skill gibt alle erkannten Wörter an Deine ioBroker-Installation weiter und Du kannst dort Aktionen und Antworten konfigurieren! Was möchtest Du wissen oder steuern?',\n 'Was möchtest Du wissen oder steuern?',\n requestId,\n );\n } else if (\n request.request.intent.name === 'AMAZON.CancelIntent' ||\n request.request.intent.name === 'AMAZON.StopIntent'\n ) {\n this.adapter.log.debug(request.request.intent.name);\n this.deleteSession(sessionId);\n if (this.lang === 'en') {\n return getResponse('Goodbye!', null, requestId, true);\n }\n if (this.lang === 'ru') {\n return getResponse('До скорого!', null, requestId, true);\n }\n return getResponse('Bis bald!', null, requestId, true);\n }\n const textsLog = [];\n const texts = [];\n\n const originalIntentName = request.request.intent.name;\n if (request.request.intent.name === 'AMAZON.YesIntent') {\n // Only relevant for v2 Skill. Convert an initial YesIntent to Words\n if (this.lang === 'en') {\n textsLog.push('AMAZON.YesIntent = Yes');\n texts.push('Yes');\n } else if (this.lang === 'ru') {\n textsLog.push('AMAZON.YesIntent = Да');\n texts.push('Да');\n } else if (this.lang === 'de') {\n textsLog.push('AMAZON.YesIntent = Ja');\n texts.push('Ja');\n }\n } else if (request.request.intent.name === 'AMAZON.NoIntent') {\n // Only relevant for v2 Skill. Convert an initial NoIntent to Words\n if (this.lang === 'en') {\n textsLog.push('AMAZON.NoIntent = No');\n texts.push('No');\n } else if (this.lang === 'ru') {\n textsLog.push('AMAZON.NoIntent = Нет');\n texts.push('Нет');\n } else if (this.lang === 'de') {\n textsLog.push('AMAZON.NoIntent = Nein');\n texts.push('Nein');\n }\n } else if (request.request.intent.name.startsWith('queryIntent')) {\n // v2 Skill\n // Only relevant for v2 Skill, get the start words out of the intent name\n const startWords = request.request.intent.name\n .replace(/^queryIntent/, '')\n .replace(/ae/, 'ä')\n .replace(/oe/, 'ö')\n .replace(/ue/, 'ü')\n .replace(/Oe/, 'Ö')\n .replace(/Ue/, 'Ü')\n .replace(/Ae/, 'Ä')\n .replace(/ss/, 'ß')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n request.request.intent.name = 'queryIntent';\n if (startWords.length && startWords !== 'FillWords') {\n // ignore FillWords\n textsLog.push(`queryIntent = ${startWords}`);\n texts.push(startWords);\n }\n }\n\n if (!request.request.intent.slots && textsLog.length === 0) {\n // No slots and nothing from above\n this.adapter.log.warn(`Unexpected ALEXA Request: ${JSON.stringify(request)}`);\n if (this.lang === 'en') {\n return getResponse('I did not hear you. Please repeat your question!', null, requestId);\n }\n if (this.lang === 'ru') {\n return getResponse('Я не слышал тебя. Пожалуйста, повторите свой вопрос!', null, requestId);\n }\n return getResponse(\n 'Ich habe Dich nicht verstanden. Bitte wiederhole deine Frage!',\n null,\n requestId,\n );\n }\n\n const internRequest: AlexaCustomIntentRequest = request.request;\n // collect all filled slots (v1 and v2 skill)\n if (internRequest.intent.slots) {\n const slots = Object.keys(internRequest.intent.slots);\n slots.forEach(slotId => {\n const slot = internRequest.intent.slots[slotId];\n let value = slot.value;\n const resolution =\n slot.resolutions?.resolutionsPerAuthority &&\n slot.resolutions.resolutionsPerAuthority.length > 0\n ? slot.resolutions.resolutionsPerAuthority[0]\n : null;\n\n if (resolution?.status.code === 'ER_SUCCESS_MATCH') {\n const resolutionValue = resolution.values[0].value;\n value = resolutionValue.name;\n }\n\n if (value?.length) {\n texts.push(value);\n textsLog.push(`${slotId} = ${value}`);\n }\n });\n }\n\n let text = texts.join(' ');\n\n const intent = internRequest.intent.name || '';\n if (originalIntentName.startsWith('queryIntentStarteDialog')) {\n // v2 Skill StarteDialog* intents are automatically handled without sending anywhere\n let response = '';\n if (originalIntentName === 'queryIntentStarteDialog') {\n // Intent to directly redirect to the dialog state without further processing\n response = text.replace(/^Starte Dialog /, '').trim();\n } else if (originalIntentName === 'queryIntentStarteDialogMitFrage') {\n // Intent to directly redirect to the dialog state with asking a question without further processing\n response = text.replace(/^Starte Dialog Mit Frage /, '').trim();\n if (response.length) {\n response += '?';\n }\n }\n if (!response.length) {\n // We need to send an answer, else it is an error\n if (this.lang === 'en') {\n response = 'Yes?';\n } else if (this.lang === 'ru') {\n response = 'Да?';\n } else {\n response = 'Ja?';\n }\n }\n return getResponse(response, response, requestId);\n }\n if (intent === 'queryIntent' && stopPhrases[this.lang].includes(text.toLowerCase())) {\n // v2 Skill when in dialog mode, we need to take care of the exit criteria ourselves\n this.deleteSession(sessionId);\n\n if (this.lang === 'en') {\n return getResponse('Goodbye!', null, requestId, true);\n }\n if (this.lang === 'ru') {\n return getResponse('До скорого!', null, requestId, true);\n }\n return getResponse('Bis bald!', null, requestId, true);\n }\n // v1 and v2 Skill\n const deviceId = request?.context?.System?.device?.deviceId\n ? request.context.System.device.deviceId\n : '';\n const deviceRoom = this.knownDevices[deviceId] ? this.knownDevices[deviceId].room : undefined;\n const userId = request?.session?.user?.userId ? request.session.user.userId : '';\n const userName = this.knownUsers[userId] ? this.knownUsers[userId].name : undefined;\n const commandObj = {\n words: texts,\n intent: intent,\n deviceId,\n deviceRoom,\n sessionId,\n userId,\n userName,\n };\n\n // Add room and username to the text if configured\n if (deviceRoom && this.config.addCustomKnownAlexaDeviceRoomToText) {\n text += ` ${deviceRoom}`;\n }\n if (userName && this.config.addCustomKnownAlexaUserNameToText) {\n text += ` ${userName}`;\n }\n\n // Add intent in front of the text to stay compatible with v1 Skill\n text = `${intent} ${text}`;\n text = text.trim();\n\n await this.adapter.setStateAsync('smart.lastCommand', text, true);\n await this.adapter.setStateAsync('smart.lastCommandObj', JSON.stringify(commandObj), true);\n\n this.adapter.log.debug(`${intent}: ${textsLog.join(', ')}`);\n\n if (intent) {\n let textTimeout;\n if (this.lang === 'en') {\n textTimeout = `Processing of ${text} is not possible!`;\n } else if (this.lang === 'ru') {\n textTimeout = `Обработка ${text} не возможна!`;\n } else {\n textTimeout = `Die Verarbeitung von ${text} ist nicht möglich!`;\n }\n\n if (\n this.config.text2command !== null &&\n this.config.text2command !== undefined &&\n (this.config.text2command as string) !== ''\n ) {\n const state = await this.adapter.getForeignStateAsync(\n `system.adapter.text2command.${this.config.text2command}.alive`,\n );\n if (state?.val) {\n return new Promise<AlexaCustomResponse>(\n (resolve: ((response: AlexaCustomResponse) => void) | null): void => {\n this.openSessions[sessionId].responseTimer = setTimeout(() => {\n this.openSessions[sessionId].responseTimer = null;\n if (resolve) {\n this.processAfter(request, textTimeout, true, resolve);\n resolve = null;\n }\n }, 1000);\n\n if (this.config.language) {\n text = `${this.config.language};${text}`;\n }\n\n this.adapter.sendTo(`text2command.${this.config.text2command}`, text, result => {\n const typedResult: {\n response: string;\n } = result as any;\n if (this.openSessions[sessionId].responseTimer) {\n clearTimeout(this.openSessions[sessionId].responseTimer);\n this.openSessions[sessionId].responseTimer = null;\n }\n const regExp = new RegExp(`\"${intent.toLowerCase()}\\\\s`);\n typedResult.response = typedResult.response\n .replace(/^\\w\\w;/, '')\n .replace(regExp, '\"');\n this.adapter.log.debug(`Response from text2command: ${typedResult.response}`);\n\n void this.adapter.setState('smart.lastResponse', typedResult.response, true);\n if (resolve) {\n resolve(getResponse(typedResult.response, null, requestId, true));\n resolve = null;\n }\n });\n },\n );\n }\n }\n\n return new Promise(resolve => {\n this.openSessions[sessionId].responseTimer &&\n clearTimeout(this.openSessions[sessionId].responseTimer);\n this.openSessions[sessionId].callback = resolve;\n this.openSessions[sessionId].request = request;\n\n this.openSessions[sessionId].responseTimer = setTimeout(\n () => this.processAfter(request, textTimeout, true, resolve),\n 200,\n );\n });\n }\n if (this.lang === 'en') {\n return getResponse('I did not understand the question!', null, requestId);\n }\n if (this.lang === 'ru') {\n return getResponse('Я не поняла ваш вопрос!', null, requestId);\n }\n return getResponse('Ich habe Deine Frage nicht verstanden!', null, requestId);\n }\n this.adapter.log.warn(`Unexpected ALEXA Request: ${JSON.stringify(request)}`);\n if (this.lang === 'en') {\n return getResponse('Please repeat your question!', null, requestId);\n }\n if (this.lang === 'ru') {\n return getResponse('Пожалуйста, повторите вопрос!', null, requestId);\n }\n return getResponse('Bitte wiederhole die Frage!', null, requestId);\n }\n if (request.request.type === 'SessionEndedRequest') {\n this.adapter.log.debug(`SessionEndedRequest: ${request.request.reason}`);\n this.deleteSession(sessionId);\n // Should not be called\n // A skill cannot return a response to SessionEndedRequest.\n return { error: 'Unexpected Session Ended' };\n }\n\n this.adapter.log.debug(`Unknown Request type: ${JSON.stringify(request)}`);\n\n return { error: 'Unknown Request type' };\n }\n}\n"]}
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "iot",
4
- "version": "4.1.2",
4
+ "version": "4.1.3",
5
5
  "news": {
6
+ "4.1.3": {
7
+ "en": "Fixed custom skill\nAdded RGB single and scene support",
8
+ "de": "Benutzerdefinierte Fähigkeiten behoben\nRGB Single und Szenenunterstützung hinzugefügt",
9
+ "ru": "Фиксированный пользовательский навык\nДобавлена поддержка RGB одиночных и сцен",
10
+ "pt": "Habilidade personalizada fixa\nAdicionado suporte RGB single e cena",
11
+ "nl": "Vaste aangepaste vaardigheden\nToegevoegd RGB enkele en scène ondersteuning",
12
+ "fr": "Compétence personnalisée fixe\nAjout d'un seul RGB et d'un support de scène",
13
+ "it": "Abilità personalizzata fissa\nAggiunto supporto RGB singolo e scena",
14
+ "es": "Habilidad personalizada fija\nAñadido RGB single y soporte de escena",
15
+ "pl": "Naprawiono niestandardowe umiejętności\nDodano wsparcie RGB single i sceny",
16
+ "uk": "Фіксована спеціальна майстерність\nДодано RGB єдиного і сцена підтримки",
17
+ "zh-cn": "固定定制技能\n添加 RGB 单场和场景支持"
18
+ },
6
19
  "4.1.2": {
7
20
  "en": "Made Alexa V3 default\nUpdated packages\nCorrected Alexa V3 engine",
8
21
  "de": "Made Alexa V3 default\nAktualisierte Pakete\nKorrektur Alexa V3 Motor",
@@ -80,19 +93,6 @@
80
93
  "pl": "Poprawiony błąd w back- endzie",
81
94
  "uk": "Виправлена помилка в спині",
82
95
  "zh-cn": "后端更正错误"
83
- },
84
- "3.5.1": {
85
- "en": "Rewrite Rules with TypeScript\nPackage updates. SVG logo",
86
- "de": "Regeln neu schreiben mit TypeScript\nPaket-Updates. SVG Logo",
87
- "ru": "Переписать правила с помощью TypeScript\nОбновления пакетов. Логотип SVG",
88
- "pt": "Reescrever regras com TypeScript\nAtualizações do pacote. Logotipo SVG",
89
- "nl": "Regels herschrijven met TypeScript\nPakketupdates. SVG-logo",
90
- "fr": "Réécrire les règles avec TypeScript\nMises à jour du paquet. Logo SVG",
91
- "it": "Regole di riscrittura con TypeScript\nAggiornamenti del pacchetto. Logo SVG",
92
- "es": "Reescribir reglas con TipoScript\nActualizaciones de paquetes. Logo SVG",
93
- "pl": "Przepisz zasady za pomocą TypeScript\nAktualizacja pakietu. Logo SVG",
94
- "uk": "Правила перезапису з TypeScript\nОновлення пакету. Логотип SVG",
95
- "zh-cn": "用类型脚本重写规则\n软件包更新. SVG 标志"
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.iot",
3
- "version": "4.1.2",
3
+ "version": "4.1.3",
4
4
  "description": "This adapter allows to communicate Amazon Alexa and Google Home with ioBroker.",
5
5
  "author": {
6
6
  "name": "bluefox",
@@ -39,6 +39,9 @@
39
39
  "@iobroker/types": "^7.0.7",
40
40
  "@types/node": "^24.7.1",
41
41
  "@types/aws-iot-device-sdk": "^2.2.8",
42
+ "ajv": "^8.17.1",
43
+ "ajv-formats": "^3.0.1",
44
+ "ajv-draft-04": "^1.0.0",
42
45
  "colorette": "^2.0.20",
43
46
  "puppeteer": "^24.24.0",
44
47
  "typescript": "^5.9.3"