diff --git a/server/config/brain/light/answers.en.json b/server/config/brain/light/answers.en.json index 5d4a5bbab2..451f5a7625 100644 --- a/server/config/brain/light/answers.en.json +++ b/server/config/brain/light/answers.en.json @@ -14,5 +14,9 @@ { "label": "light.turn-off.fail", "answers": ["I didn't manage to turn off the light."] + }, + { + "label": "light.not-found", + "answers": ["I didn't find any light in this room."] } ] diff --git a/server/config/brain/light/answers.fr.json b/server/config/brain/light/answers.fr.json index 58070d4ef8..0ac8861506 100644 --- a/server/config/brain/light/answers.fr.json +++ b/server/config/brain/light/answers.fr.json @@ -14,5 +14,9 @@ { "label": "light.turn-off.fail", "answers": ["Je n'ai pas réussi à éteindre la lumière."] + }, + { + "label": "light.not-found", + "answers": ["Je n'ai pas trouvé de lumière dans cette pièce."] } ] diff --git a/server/lib/device/light/light.command.js b/server/lib/device/light/light.command.js index bd8a2bc331..9acf0d5abd 100644 --- a/server/lib/device/light/light.command.js +++ b/server/lib/device/light/light.command.js @@ -13,6 +13,7 @@ const { DEVICE_FEATURE_CATEGORIES, DEVICE_FEATURE_TYPES } = require('../../../ut * light.command(message, classification, context); */ async function command(message, classification, context) { + let nbAffectedLights = 0; try { const devices = await this.getLightsInRoom(context.room); switch (classification.intent) { @@ -28,9 +29,12 @@ async function command(message, classification, context) { // and if the binary feature exists, call it if (deviceFeature) { await this.turnOn(device, deviceFeature); + nbAffectedLights += 1; } }); - this.messageManager.replyByIntent(message, 'light.turn-on.success', context); + if (nbAffectedLights > 0) { + this.messageManager.replyByIntent(message, 'light.turn-on.success', context); + } break; case 'light.turn-off': // foreach devices in room @@ -44,13 +48,19 @@ async function command(message, classification, context) { // and if the binary feature exists, call it if (deviceFeature) { await this.turnOff(device, deviceFeature); + nbAffectedLights += 1; } }); - this.messageManager.replyByIntent(message, 'light.turn-off.success', context); + if (nbAffectedLights > 0) { + this.messageManager.replyByIntent(message, 'light.turn-off.success', context); + } break; default: throw new Error('Not found'); } + if (nbAffectedLights === 0) { + this.messageManager.replyByIntent(message, 'light.not-found', context); + } } catch (e) { logger.debug(e); this.messageManager.replyByIntent(message, 'light.turn-on.fail', context); diff --git a/server/test/lib/device/light/light.command.test.js b/server/test/lib/device/light/light.command.test.js index 5c29288756..fc46be4962 100644 --- a/server/test/lib/device/light/light.command.test.js +++ b/server/test/lib/device/light/light.command.test.js @@ -65,4 +65,32 @@ describe('Light.command', () => { assert.calledWith(messageManager.replyByIntent, message, 'light.turn-off.success', context); assert.called(testService.device.setValue); }); + it('should fail to send a command because no device with binary feature in this room', async () => { + const stateManager = new StateManager(event); + const deviceManager = new Device(event, messageManager, stateManager, service); + // Mock getDeviceFeature to answer no binay feature + deviceManager.lightManager.getLightsInRoom = () => + new Promise((resolve) => { + resolve([ + { + device: { + getDeviceFeature: () => null, + }, + }, + ]); + }); + await deviceManager.lightManager.command(message, { intent: 'light.turn-off' }, context); + assert.calledWith(messageManager.replyByIntent, message, 'light.not-found', context); + }); + it('should fail to send a command because no device in this room', async () => { + const stateManager = new StateManager(event); + const deviceManager = new Device(event, messageManager, stateManager, service); + // Mock getLightsInRoom to answer no devices + deviceManager.lightManager.getLightsInRoom = () => + new Promise((resolve) => { + resolve([]); + }); + await deviceManager.lightManager.command(message, { intent: 'light.turn-off' }, context); + assert.calledWith(messageManager.replyByIntent, message, 'light.not-found', context); + }); });