Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions front/src/config/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -2742,6 +2742,20 @@
},
"askAi": {
"answer": "AI Antwort"
},
"trigger": {
"device": {
"name": "Name des auslösenden Geräts"
},
"deviceFeature": {
"name": "Name der auslösenden Gerätefunktion",
"last_value": "Aktueller Wert des Auslösers",
"previous_value": "Vorheriger Wert des Auslösers"
},
"mqtt": {
"topic": "Empfangenes MQTT-Topic",
"message": "Empfangene MQTT-Nachricht"
}
}
},
"triggers": {
Expand Down
14 changes: 14 additions & 0 deletions front/src/config/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2742,6 +2742,20 @@
},
"askAi": {
"answer": "AI answer"
},
"trigger": {
"device": {
"name": "Triggering device name"
},
"deviceFeature": {
"name": "Triggering device feature name",
"last_value": "Triggering device current value",
"previous_value": "Triggering device previous value"
},
"mqtt": {
"topic": "Received MQTT topic",
"message": "Received MQTT message"
}
}
},
"triggers": {
Expand Down
14 changes: 14 additions & 0 deletions front/src/config/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -2742,6 +2742,20 @@
},
"askAi": {
"answer": "Réponse de l'IA"
},
"trigger": {
"device": {
"name": "Nom de l'appareil déclencheur"
},
"deviceFeature": {
"name": "Nom de la fonctionnalité déclencheuse",
"last_value": "Valeur actuelle du déclencheur",
"previous_value": "Valeur précédente du déclencheur"
},
"mqtt": {
"topic": "Topic MQTT reçu",
"message": "Message MQTT reçu"
}
}
},
"triggers": {
Expand Down
2 changes: 2 additions & 0 deletions front/src/routes/scene/edit-scene/TriggerCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ const TriggerCard = ({ children, ...props }) => (
updateTriggerProperty={props.updateTriggerProperty}
index={props.index}
trigger={props.trigger}
setVariablesTrigger={props.setVariablesTrigger}
/>
)}
{props.trigger.type === EVENTS.TIME.CHANGED && (
Expand Down Expand Up @@ -172,6 +173,7 @@ const TriggerCard = ({ children, ...props }) => (
updateTriggerProperty={props.updateTriggerProperty}
index={props.index}
trigger={props.trigger}
setVariablesTrigger={props.setVariablesTrigger}
/>
)}
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Component } from 'preact';
import { connect } from 'unistore/preact';
import { Text, Localizer } from 'preact-i18n';
import get from 'get-value';

import { DEVICE_FEATURE_CATEGORIES, DEVICE_FEATURE_TYPES } from '../../../../../../server/utils/constants';

Expand All @@ -15,8 +16,57 @@ import FanModeDeviceState from './device-states/FanModeDeviceState';
import FanLabeledDeviceState from './device-states/FanLabeledDeviceState';
import LevelSensorDeviceState from './device-states/LevelSensorDeviceState';
import LevelMatterSensorDeviceState from './device-states/LevelMatterSensorDeviceState';
import withIntlAsProp from '../../../../utils/withIntlAsProp';

class TurnOnLight extends Component {
setVariables = () => {
const DEVICE_NAME_VARIABLE = get(this.props.intl.dictionary, 'editScene.variables.trigger.device.name');
const DEVICE_FEATURE_NAME_VARIABLE = get(
this.props.intl.dictionary,
'editScene.variables.trigger.deviceFeature.name'
);
const LAST_VALUE_VARIABLE = get(this.props.intl.dictionary, 'editScene.variables.trigger.deviceFeature.last_value');
const PREVIOUS_VALUE_VARIABLE = get(
this.props.intl.dictionary,
'editScene.variables.trigger.deviceFeature.previous_value'
);

this.props.setVariablesTrigger(this.props.index, [
{
name: 'device.name',
type: 'trigger',
ready: true,
label: DEVICE_NAME_VARIABLE,
data: {}
},
{
name: 'deviceFeature.name',
type: 'trigger',
ready: true,
label: DEVICE_FEATURE_NAME_VARIABLE,
data: {}
},
{
name: 'deviceFeature.last_value',
type: 'trigger',
ready: true,
label: LAST_VALUE_VARIABLE,
data: {}
},
{
name: 'deviceFeature.previous_value',
type: 'trigger',
ready: true,
label: PREVIOUS_VALUE_VARIABLE,
data: {}
}
]);
};

componentDidMount() {
this.setVariables();
}

onDeviceFeatureChange = deviceFeature => {
this.setState({ selectedDeviceFeature: deviceFeature });
if (deviceFeature) {
Expand Down Expand Up @@ -170,4 +220,4 @@ class TurnOnLight extends Component {
}
}

export default connect('httpClient', {})(TurnOnLight);
export default connect('httpClient', {})(withIntlAsProp(TurnOnLight));
Original file line number Diff line number Diff line change
@@ -1,8 +1,36 @@
import { Component } from 'preact';
import { connect } from 'unistore/preact';
import { Text, Localizer } from 'preact-i18n';
import get from 'get-value';
import withIntlAsProp from '../../../../utils/withIntlAsProp';

class MQTTReceived extends Component {
setVariables = () => {
const TOPIC_VARIABLE = get(this.props.intl.dictionary, 'editScene.variables.trigger.mqtt.topic');
const MESSAGE_VARIABLE = get(this.props.intl.dictionary, 'editScene.variables.trigger.mqtt.message');

this.props.setVariablesTrigger(this.props.index, [
{
name: 'topic',
type: 'trigger',
ready: true,
label: TOPIC_VARIABLE,
data: {}
},
{
name: 'message',
type: 'trigger',
ready: true,
label: MESSAGE_VARIABLE,
data: {}
}
]);
};

componentDidMount() {
this.setVariables();
}

updateTopicName = e => {
this.props.updateTriggerProperty(this.props.index, 'topic', e.target.value);
};
Expand Down Expand Up @@ -53,4 +81,4 @@ class MQTTReceived extends Component {
}
}

export default connect('httpClient,user', {})(MQTTReceived);
export default connect('httpClient,user', {})(withIntlAsProp(MQTTReceived));
80 changes: 80 additions & 0 deletions server/lib/scene/scene.buildTriggerEventScope.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
const cloneDeep = require('lodash.clonedeep');

const { EVENTS } = require('../../utils/constants');

/**
* @description Enrich a trigger event with human-readable data for use in scene variables.
* @param {object} event - The raw trigger event.
* @param {object} stateManager - The Gladys state manager.
* @returns {object} The enriched trigger event.
* @example
* buildTriggerEventScope({ type: 'device.new-state', device_feature: 'door-sensor' }, stateManager);
*/
function buildTriggerEventScope(event, stateManager) {
const triggerEvent = cloneDeep(event);

switch (event.type) {
case EVENTS.DEVICE.NEW_STATE: {
const deviceFeature = stateManager.get('deviceFeature', event.device_feature);
if (deviceFeature) {
triggerEvent.deviceFeature = cloneDeep({
selector: deviceFeature.selector,
name: deviceFeature.name,
category: deviceFeature.category,
type: deviceFeature.type,
unit: deviceFeature.unit,
last_value: event.last_value,
previous_value: event.previous_value,
last_value_changed: event.last_value_changed,
});
const device = stateManager.get('deviceById', deviceFeature.device_id);
if (device) {
triggerEvent.device = cloneDeep({
selector: device.selector,
name: device.name,
});
}
}
break;
}
case EVENTS.USER_PRESENCE.BACK_HOME:
case EVENTS.USER_PRESENCE.LEFT_HOME: {
const user = stateManager.get('user', event.user);
if (user) {
triggerEvent.user = cloneDeep({
selector: user.selector,
firstname: user.firstname,
lastname: user.lastname,
});
}
const house = stateManager.get('house', event.house);
if (house) {
triggerEvent.house = cloneDeep({
selector: house.selector,
name: house.name,
});
}
break;
}
case EVENTS.AREA.USER_ENTERED:
case EVENTS.AREA.USER_LEFT: {
const user = stateManager.get('user', event.user);
if (user) {
triggerEvent.user = cloneDeep({
selector: user.selector,
firstname: user.firstname,
lastname: user.lastname,
});
}
break;
}
default:
break;
}

return triggerEvent;
}

module.exports = {
buildTriggerEventScope,
};
3 changes: 2 additions & 1 deletion server/lib/scene/scene.checkTrigger.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { triggersFunc } = require('./scene.triggers');
const { buildTriggerEventScope } = require('./scene.buildTriggerEventScope');
const logger = require('../../utils/logger');

/**
Expand Down Expand Up @@ -36,7 +37,7 @@ function checkTrigger(event) {
// if yes, we execute the scene
if (conditionVerified) {
this.execute(sceneSelector, {
triggerEvent: event,
triggerEvent: buildTriggerEventScope(event, this.stateManager),
});
}
}
Expand Down
Loading
Loading