Video
Ci-dessous, vous trouverez le tutoriel vidéo (en anglais) si vous souhaitez suivre le guide pas à pas.
Introduction
Est-ce qu’il vous est déjà arrivé de vous réveiller en retard et au moment de prendre votre douche, vous voulez savoir exactement combien de temps s’est écoulé ? Bien sûr, vous pouvez utiliser une montre, mais avec cette automatisation (très simple), vous aurez un moyen différent, bien plus cool et moderne. Dans cet article, nous allons créer pas à pas, avec Home Assistant et Node-Red une automatisation en utilisant uniquement des blocs simples de Node-Red,. Nous commencerons par la gestion de la lumière, puis nous ajouterons une notification qui permettra d’avertir dans le cas où la lumière est restée allumée trop longtemps.
Objectif
Dans cette partie, je vous présente ce que nous allons réaliser. Ci-dessous, un diagramme simple illustrant le fonctionnement global.
La première étape consiste à vérifier si la lumière est allumée. Si ce n’est pas le cas, on ne fait rien. Dans le cas contraire, on allume une lumière blanche (intensité maximale, 5000K). Ensuite, nous détecterons si quelqu’un est en train de prendre une douche. Pour cela, vous pouvez utiliser un capteur de présence, mais dans mon cas je vais utiliser un capteur d’humidité. Si vous hésitiez à acheter un capteur de présence uniquement pour détecter la douche, sachez que ce n’est pas indispensable.
Ensuite, l’automatisation permettra d’effectuer des flashs lumineux de différentes couleurs toutes les 5 minutes. Après 3 flashs, si la lumière est toujours allumée, cela indique probablement que quelqu’un a oublié d’éteindre la lumière. Dans ce cas, une notification sera alors envoyée sur votre téléphone. Celle-ci proposera des actions pour par exemple éteindre la lumière à distance, ce qui est pratique lorsque vous n’êtes pas chez vous.
Avec cette automatisation, vous aurez un moyen visuel et pratique de suivre la durée de votre douche et d’éviter d’oublier d’éteindre la lumière.
Gestion de l’allumage
Dans mon cas, j’utilise un bouton Ikea fonctionnant avec Zigbee et Zigbee2mqtt. Il est pris en compte dans l’automatisation afin que, lorsqu’on appuie dessus, on puisse gérer soit un allumage normal (lumière blanche, intensité maximale), soit un éclairage atténué si c’est la nuit afin d’éviter l’éblouissement (ce qui est plus agréable lorsque qu’on se réveille la nuit pour aller aux toilettes):
Pour trouver les actions du bouton, vous pouvez utiliser MQTT Explorer pour identifier le topic et l’action associée, puis les renseigner dans la configuration du nœud comme ci-dessous.
Si la lumière était déjà allumée, un nouvel appui permettra simplement de l’éteindre. Une fois cette logique d’allumage configurée, nous pouvons passer à la partie détection de la douche.
Détection de la douche
Dans cette partie, nous allons nous occuper de la détection de la douche. Comme mentionné plus haut, si vous avez un capteur de présence vous pouvez passer cette étape. Avec un capteur d’humidité, nous allons exploiter la dérivée de la valeur pour détecter les variations rapides liées à la vapeur d’eau dans la salle de bain.
Vous pouvez créer cette dérivée dans « Paramètres », puis « Appareils et services », dans l’onglet « Entrées ». Renseignez le nom, sélectionnez votre capteur d’humidité, et choisissez la précision souhaitée (par exemple 3). L’unité de temps peut être en secondes ou en minutes selon vos préférences. Les autres options n’étant pas adaptées pour notre cas d’usage.
Une fois la dérivée configurée, importez-la dans Node-Red et définissez un seuil de déclenchement comme ci-dessous.
Ce seuil dépendra de votre salle de bain, de votre environnement et surtout de l’emplacement du capteur. L’idéal est de placer le capteur au-dessus de la douche mais pas trop près. Pour déterminer un seuil fiable, enregistrez une douche et observez la dérivée dans le tableau de bord « Historique ». Choisissez une valeur supérieure au bruit. Si vous avez trop de fausses détections, augmentez le seuil ou la durée et si l’automatisation ne détecte pas assez les douches, diminuez-les simplement.
Lorsque la douche est détectée, on vérifie que nous sommes dans le bon créneau horaire (pas d’intensité maximale la nuit ni de flashs) avant de poursuivre l’automatisation.
Un nœud « inject » peut également être ajouté pour tester votre automatisation.
Gestion du compteur
Pour gérer les flashs, nous allons utiliser un nœud trigger et un compteur qui s’incrémente toutes les 5 minutes. Chaque valeur du compteur déclenche un flash d’une couleur différente.
Ci-dessous, pour rendre la compréhension plus facile, vous trouverez l’ensemble de la partie liée à la gestion de l’activation et du compteur car tous les éléments sont reliés. N’hésitez pas à zoomer dans les différentes parties si nécessaire.
Il faut veiller à bien réinitialiser le trigger et le compteur, sinon ce dernier pourrait rester bloqué. Par exemple, lorsque le compteur atteint 4, il doit être réinitialisé pour recommencer à 1. De même lorsque la lumière est éteinte.
Pour le trigger, il suffit d’envoyer un booléen à true et de le renvoyer toutes les 5 minutes tant que la lumière est allumée et que la douche a été détectée.
Le trigger doit aussi être réinitialisé lorsque le compteur atteint sa limite ou si la lumière est éteinte.
Pour le compteur, sélectionnez le mode « incrément » et activez les deux sorties.
Si vous souhaitez plus de couleurs, augmentez simplement la limite supérieure du compteur.
Pour les options du reset du compteur, il faut envoyer un booléen à « true » une fois actif :
Le reset du compteur est déclenché lorsque la lumière est éteinte ou lorsque la limite du compteur est atteinte, afin que lorsque la lumière est rallumée, l’automatisation se remet à son état initial.
Lorsque cette partie est correctement configurée, nous pouvons passer à la gestion des flashs.
Gestion des flashs
Si vous êtes arrivé jusqu’ici, vous avez déjà réalisé la partie la plus difficile. Ici, nous allons gérer les flashs lumineux envoyés toutes les 5 minutes pour avertir l’utilisateur.
Le principe est simple, à chaque valeur du compteur correspond un flash d’une couleur. Dans ce tutoriel, nous utilisons les couleurs primaires (rouge, vert, bleu), mais vous pouvez choisir celles que vous voulez.
Ci-dessous, la gestion de l’ensemble des flashs :
Dans chaque branche, on commence par vérifier que la lumière est toujours allumée, puis on modifie la couleur :
Dans le nœud d’action, ajoutez dans « Data » la configuration correspondante, par exemple pour le vert : [0, 255, 0, 0]. Copiez ensuite cette branche pour le bleu [0, 0, 255, 0] et le rouge [255, 0, 0, 0]. Le dernière branche maintenant le rouge avant d’envoyer la notification.
Comment envoyer une notification ?
Lorsque le compteur atteint sa limite supérieure, on va maintenir la couleur rouge puis si la lumière est toujours allumée, cela voudra dire peut-être que quelqu’un a oublié d’éteindre la lumière. Dans ce cas, on va émettre une notification avec des actions à faire.
Nous utilisons un nœud « délai » configuré à 5 minutes, puis un nœud trigger répétant la notification toutes les 15 minutes.
Pour le nœud délai, il fait simplement sélectionner les options comme ci-dessous :
Pour le nœud trigger, il est configuré comme le nœud trigger ci-dessus excepté qu’on l’active toutes les 15 minutes :
Avant d’envoyer la notification, nous vérifions que la lumière n’a pas été éteinte entre-temps. Si elle est éteinte, on envoie un reset au trigger pour annuler les prochains envois de la notification.
Si la lumière est toujours allumée, nous définissons le message de notification via un nœud change dans msg.message, puis nous envoyons la notification via un nœud action.
Dans le nœud action qui enverra la notification, on aura :
Dans la configuration, il faut bien veiller à choisir l’action de notification. Pour les actions, on verra dans la partie suivante comment générer une notification avec possibilité d’effectuer des actions prédéfinies.
Comment créer une notification avec des actions ?
Dans la notification qu’on va générer, nous allons inclure des actions comme « Éteindre la lumière », « Ignorer », « Rappeler plus tard ». Pour cela, ajoutez dans la partie « Data » du nœud action le code suivant :
Le champ « title » est le titre affiché dans la notification. Le message contiendra msg.message. Le paramètre « actions » regroupe les actions disponibles. Le champ « action » servira d’identifiant dans la suite.
Une fois ce bloc configuré, on pourra passer à la gestion des actions.
Pour les actions, on va les récupérer dans le nœud « event » et dans celui-ci, on va le configurer comme ci-dessous :
La seule chose à remplir est le type d’événement. Pour savoir où trouver celui-ci, il faut aller dans « Outils de développement », puis « Evénements » :
A droite, vous avez la liste de tous les événements et il ne reste plus qu’à choisir le bon pour notre tutoriel.
Pour traiter chaque action de la notification, on va utiliser une nœud switch dans lequel, on a configurer comme ci-dessous:
Pour la propriété, il faut choisir « event.action » qui correspond aux actions reçues. Puis, pour chaque état, mettre le bon nom de chaque action qu’on avait créé auparavant.
Ainsi, quand on aura une action pour éteindre la lumière, on mettra le nœud action pour éteindre la lumière et également faire un reset du trigger pour ne plus envoyer de notifications. Pour l’action de rappeler plus tard, on ne fera rien comme cela la notification sera renvoyée toutes les 15 minutes. Et finalement, pour l’action d’ignorer, on va simplement faire un reset du trigger pour ne plus avoir les notifications.
Conclusion
Avec cette automatisation, vous disposez d’un moyen cool et pratique de connaître la durée de votre douche et d’être averti si vous oubliez d’éteindre la lumière, avec la possibilité de l’éteindre directement depuis la notification.
Si vous ne voulez pas créer vous-même l’automatisation, vous pourrez télécharger le fichier à importer sur Node-Red. Veillez à bien modifier les configurations pour correspondre à votre système.
Téléchargements
Vous pouvez importer le flux Node-Red:
[
{
"id": "90f3f488494fd855",
"type": "tab",
"label": "Smart Bathroom timer light",
"disabled": false,
"info": "",
"env": []
},
{
"id": "dd75a0f57d7d6f9d",
"type": "server-state-changed",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 6,
"outputs": 2,
"exposeAsEntityConfig": "",
"entities": {
"entity": [
"sensor.temperature_salle_de_bain_humidity_deriv_tuto"
],
"substring": [],
"regex": []
},
"outputInitially": false,
"stateType": "str",
"ifState": "5",
"ifStateType": "num",
"ifStateOperator": "gte",
"outputOnlyOnStateChange": true,
"for": "30",
"forType": "num",
"forUnits": "seconds",
"ignorePrevStateNull": false,
"ignorePrevStateUnknown": false,
"ignorePrevStateUnavailable": false,
"ignoreCurrentStateUnknown": false,
"ignoreCurrentStateUnavailable": false,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "eventData"
},
{
"property": "topic",
"propertyType": "msg",
"value": "",
"valueType": "triggerId"
}
],
"x": 250,
"y": 140,
"wires": [
[
"170b734d38690ba6"
],
[]
]
},
{
"id": "170b734d38690ba6",
"type": "time-range-switch",
"z": "90f3f488494fd855",
"name": "",
"lat": "",
"lon": "",
"startTime": "06:00",
"endTime": "23:59",
"startOffset": 0,
"endOffset": 0,
"x": 650,
"y": 140,
"wires": [
[
"da44604199018dde"
],
[]
]
},
{
"id": "da44604199018dde",
"type": "api-current-state",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"halt_if": "on",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "light.plafonnier_sdb",
"state_type": "str",
"blockInputOverrides": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"for": "0",
"forType": "num",
"forUnits": "minutes",
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 980,
"y": 120,
"wires": [
[
"945d5a5c791f23c6"
],
[]
]
},
{
"id": "3943c6b06e13406f",
"type": "inject",
"z": "90f3f488494fd855",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 370,
"y": 80,
"wires": [
[
"170b734d38690ba6"
]
]
},
{
"id": "945d5a5c791f23c6",
"type": "trigger",
"z": "90f3f488494fd855",
"name": "",
"op1": "true",
"op2": "0",
"op1type": "bool",
"op2type": "str",
"duration": "-5",
"extend": false,
"overrideDelay": false,
"units": "min",
"reset": "",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 1530,
"y": 260,
"wires": [
[
"d411b334c6ae3652"
]
]
},
{
"id": "d411b334c6ae3652",
"type": "counter",
"z": "90f3f488494fd855",
"name": "",
"init": "0",
"step": "1",
"lower": "0",
"upper": "4",
"mode": "increment",
"outputs": 2,
"x": 1820,
"y": 260,
"wires": [
[
"fb18880933478fdb"
],
[]
]
},
{
"id": "fb18880933478fdb",
"type": "switch",
"z": "90f3f488494fd855",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "eq",
"v": "2",
"vt": "num"
},
{
"t": "eq",
"v": "3",
"vt": "num"
},
{
"t": "eq",
"v": "4",
"vt": "num"
}
],
"checkall": "true",
"repair": false,
"outputs": 4,
"x": 2010,
"y": 260,
"wires": [
[
"2b9fb2b30d572760"
],
[
"aa8b420d8887486d"
],
[
"672683edbf0b497e"
],
[
"07279c0739e9de0a",
"e9822664516e8456"
]
]
},
{
"id": "2b9fb2b30d572760",
"type": "api-current-state",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"halt_if": "on",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "light.plafonnier_sdb",
"state_type": "str",
"blockInputOverrides": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"for": "0",
"forType": "num",
"forUnits": "minutes",
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 2300,
"y": 120,
"wires": [
[
"715a5e7ce7d94fad"
],
[
"8cb9cc668e195387"
]
]
},
{
"id": "715a5e7ce7d94fad",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\": 254,\t \"rgbw_color\": [\t 0,\t 255,\t 0,\t 0\t ]\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 2610,
"y": 100,
"wires": [
[
"9ce9b315187bd534"
]
]
},
{
"id": "9ce9b315187bd534",
"type": "ha-wait-until",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"entities": {
"entity": [
"light.plafonnier_sdb"
],
"substring": [],
"regex": []
},
"property": "payload",
"comparator": "is",
"value": "false",
"valueType": "bool",
"timeout": "2",
"timeoutType": "num",
"timeoutUnits": "seconds",
"checkCurrentState": true,
"blockInputOverrides": true,
"outputProperties": [],
"x": 2800,
"y": 100,
"wires": [
[],
[
"5e236abc2733b453"
]
]
},
{
"id": "5e236abc2733b453",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\":254,\t \"color_temp_kelvin\":5000\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 3010,
"y": 100,
"wires": [
[]
]
},
{
"id": "aa8b420d8887486d",
"type": "api-current-state",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"halt_if": "on",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "light.plafonnier_sdb",
"state_type": "str",
"blockInputOverrides": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"for": "0",
"forType": "num",
"forUnits": "minutes",
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 2300,
"y": 180,
"wires": [
[
"79ad25a8fb572e7f"
],
[
"07a5d2086e061589"
]
]
},
{
"id": "79ad25a8fb572e7f",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\": 254,\t \"rgbw_color\": [\t 0,\t 0,\t 255,\t 0\t ]\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 2610,
"y": 160,
"wires": [
[
"d5d3bad2ab668bbf"
]
]
},
{
"id": "d5d3bad2ab668bbf",
"type": "ha-wait-until",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"entities": {
"entity": [
"light.plafonnier_sdb"
],
"substring": [],
"regex": []
},
"property": "payload",
"comparator": "is",
"value": "false",
"valueType": "bool",
"timeout": "2",
"timeoutType": "num",
"timeoutUnits": "seconds",
"checkCurrentState": true,
"blockInputOverrides": true,
"outputProperties": [],
"x": 2800,
"y": 160,
"wires": [
[],
[
"7108f57c661bd060"
]
]
},
{
"id": "7108f57c661bd060",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\":254,\t \"color_temp_kelvin\":5000\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 3010,
"y": 160,
"wires": [
[]
]
},
{
"id": "672683edbf0b497e",
"type": "api-current-state",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"halt_if": "on",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "light.plafonnier_sdb",
"state_type": "str",
"blockInputOverrides": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"for": "0",
"forType": "num",
"forUnits": "minutes",
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 2300,
"y": 240,
"wires": [
[
"394447a6e227f7fb"
],
[
"6c10c1a97004e521"
]
]
},
{
"id": "394447a6e227f7fb",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\": 254,\t \"rgbw_color\": [\t 255,\t 0,\t 0,\t 0\t ]\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 2610,
"y": 220,
"wires": [
[
"ebd1eab1c2be4aac"
]
]
},
{
"id": "ebd1eab1c2be4aac",
"type": "ha-wait-until",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"entities": {
"entity": [
"light.plafonnier_sdb"
],
"substring": [],
"regex": []
},
"property": "payload",
"comparator": "is",
"value": "false",
"valueType": "bool",
"timeout": "2",
"timeoutType": "num",
"timeoutUnits": "seconds",
"checkCurrentState": true,
"blockInputOverrides": true,
"outputProperties": [],
"x": 2800,
"y": 220,
"wires": [
[],
[
"62d9725a1de02cc8"
]
]
},
{
"id": "62d9725a1de02cc8",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\":254,\t \"color_temp_kelvin\":5000\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 3010,
"y": 220,
"wires": [
[]
]
},
{
"id": "07279c0739e9de0a",
"type": "api-current-state",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"halt_if": "on",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "light.plafonnier_sdb",
"state_type": "str",
"blockInputOverrides": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"for": "0",
"forType": "num",
"forUnits": "minutes",
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 2300,
"y": 300,
"wires": [
[
"f7ea51b0d902d034"
],
[
"1931eb8fe19fd6c6"
]
]
},
{
"id": "f7ea51b0d902d034",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\": 254,\t \"rgbw_color\": [\t 255,\t 0,\t 0,\t 0\t ]\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 2610,
"y": 280,
"wires": [
[
"63a8daf5990a2b3e"
]
]
},
{
"id": "e9822664516e8456",
"type": "change",
"z": "90f3f488494fd855",
"name": "",
"rules": [
{
"t": "set",
"p": "reset",
"pt": "msg",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1820,
"y": 400,
"wires": [
[
"d411b334c6ae3652",
"945d5a5c791f23c6"
]
]
},
{
"id": "63a8daf5990a2b3e",
"type": "delay",
"z": "90f3f488494fd855",
"name": "",
"pauseType": "delay",
"timeout": "5",
"timeoutUnits": "minutes",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 2900,
"y": 280,
"wires": [
[
"979c24c70d0413ef"
]
]
},
{
"id": "979c24c70d0413ef",
"type": "trigger",
"z": "90f3f488494fd855",
"name": "",
"op1": "true",
"op2": "0",
"op1type": "bool",
"op2type": "str",
"duration": "-15",
"extend": false,
"overrideDelay": false,
"units": "min",
"reset": "",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 3170,
"y": 280,
"wires": [
[
"75313587bf266329"
]
]
},
{
"id": "75313587bf266329",
"type": "api-current-state",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"halt_if": "on",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "light.plafonnier_sdb",
"state_type": "str",
"blockInputOverrides": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"for": "0",
"forType": "num",
"forUnits": "minutes",
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 3460,
"y": 280,
"wires": [
[
"26b878f6e1643b86"
],
[
"f63a21e6f3e8870a"
]
]
},
{
"id": "26b878f6e1643b86",
"type": "change",
"z": "90f3f488494fd855",
"name": "",
"rules": [
{
"t": "set",
"p": "message",
"pt": "msg",
"to": "The bathroom light is on",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 3750,
"y": 260,
"wires": [
[
"af527b49afc483a1"
]
]
},
{
"id": "af527b49afc483a1",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "notify.mobile_app_ipad_abdoulaye",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [],
"labelId": [],
"data": "{\t \"title\":\"Light On\",\t \"message\":msg.message,\t \"data\":{\t \"actions\":[\t {\t \"action\":\"Turn_off\",\t \"title\":\"Turn Off\",\t \"icon\":\"sfsymbols:poweroff\"\t },\t {\t \"action\":\"Remind\",\t \"title\":\"Remind Later\",\t \"icon\":\"sfsymbols:clock\" \t },\t {\t \"action\":\"Ignore\",\t \"title\":\"Ignore: Stop reminds\",\t \"icon\":\"sfsymbols:xmark\",\t \"destructive\":true\t }\t \t ]\t }\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "notify",
"service": "mobile_app_ipad_abdoulaye",
"x": 4060,
"y": 260,
"wires": [
[]
]
},
{
"id": "0eabad8008a4794e",
"type": "server-events",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"exposeAsEntityConfig": "",
"eventType": "mobile_app_notification_action",
"eventData": "",
"waitForRunning": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "eventData"
},
{
"property": "topic",
"propertyType": "msg",
"value": "$outputData(\"eventData\").event_type",
"valueType": "jsonata"
}
],
"x": 2530,
"y": 480,
"wires": [
[
"34ecaa892271090e"
]
]
},
{
"id": "34ecaa892271090e",
"type": "switch",
"z": "90f3f488494fd855",
"name": "",
"property": "payload.event.action",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "Turn_off",
"vt": "str"
},
{
"t": "eq",
"v": "Remind",
"vt": "str"
},
{
"t": "eq",
"v": "Ignore",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 3,
"x": 2810,
"y": 480,
"wires": [
[
"b03f0c25157937f9"
],
[],
[
"f63a21e6f3e8870a"
]
]
},
{
"id": "b03f0c25157937f9",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_off",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_off",
"x": 2970,
"y": 420,
"wires": [
[
"f63a21e6f3e8870a"
]
]
},
{
"id": "f63a21e6f3e8870a",
"type": "change",
"z": "90f3f488494fd855",
"name": "",
"rules": [
{
"t": "set",
"p": "reset",
"pt": "msg",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 3200,
"y": 460,
"wires": [
[
"979c24c70d0413ef",
"cf4910afc512f178"
]
]
},
{
"id": "e9b370ed83b8e3ef",
"type": "link in",
"z": "90f3f488494fd855",
"name": "Light off",
"links": [
"07a5d2086e061589",
"1931eb8fe19fd6c6",
"6c10c1a97004e521",
"8cb9cc668e195387"
],
"x": 1645,
"y": 420,
"wires": [
[
"e9822664516e8456"
]
]
},
{
"id": "8cb9cc668e195387",
"type": "link out",
"z": "90f3f488494fd855",
"name": "Light off",
"mode": "link",
"links": [
"e9b370ed83b8e3ef"
],
"x": 2505,
"y": 140,
"wires": []
},
{
"id": "07a5d2086e061589",
"type": "link out",
"z": "90f3f488494fd855",
"name": "Light off",
"mode": "link",
"links": [
"e9b370ed83b8e3ef"
],
"x": 2485,
"y": 200,
"wires": []
},
{
"id": "6c10c1a97004e521",
"type": "link out",
"z": "90f3f488494fd855",
"name": "Light off",
"mode": "link",
"links": [
"e9b370ed83b8e3ef"
],
"x": 2495,
"y": 260,
"wires": []
},
{
"id": "1931eb8fe19fd6c6",
"type": "link out",
"z": "90f3f488494fd855",
"name": "Light off",
"mode": "link",
"links": [
"e9b370ed83b8e3ef"
],
"x": 2505,
"y": 320,
"wires": []
},
{
"id": "7fb9bdd64ccae6fa",
"type": "link in",
"z": "90f3f488494fd855",
"name": "link in 6",
"links": [
"cf4910afc512f178"
],
"x": 1675,
"y": 200,
"wires": [
[
"d411b334c6ae3652"
]
]
},
{
"id": "cf4910afc512f178",
"type": "link out",
"z": "90f3f488494fd855",
"name": "Rst Cnt",
"mode": "link",
"links": [
"7fb9bdd64ccae6fa"
],
"x": 3385,
"y": 460,
"wires": []
},
{
"id": "5932ae5eb6782406",
"type": "mqtt in",
"z": "90f3f488494fd855",
"name": "Button",
"topic": "zigbee2mqtt/Bouton_Sdb/action",
"qos": "2",
"datatype": "auto-detect",
"broker": "5914a38474afa853",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 90,
"y": 440,
"wires": [
[
"94e233e282e93c6d"
]
]
},
{
"id": "94e233e282e93c6d",
"type": "switch",
"z": "90f3f488494fd855",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "on",
"vt": "str"
},
{
"t": "eq",
"v": "off",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 350,
"y": 440,
"wires": [
[
"bdcc71e469d2654c"
],
[
"093f22c733d73318"
]
]
},
{
"id": "093f22c733d73318",
"type": "change",
"z": "90f3f488494fd855",
"name": "",
"rules": [
{
"t": "set",
"p": "reset",
"pt": "msg",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 620,
"y": 480,
"wires": [
[
"945d5a5c791f23c6",
"d411b334c6ae3652"
]
]
},
{
"id": "bdcc71e469d2654c",
"type": "api-current-state",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 3,
"outputs": 2,
"halt_if": "off",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "light.plafonnier_sdb",
"state_type": "str",
"blockInputOverrides": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "string",
"valueType": "entityState"
},
{
"property": "data",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"for": "0",
"forType": "num",
"forUnits": "minutes",
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 600,
"y": 340,
"wires": [
[
"b7b3d933acfeeb9a"
],
[
"53a8860ae310af7e"
]
]
},
{
"id": "53a8860ae310af7e",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_off",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_off",
"x": 870,
"y": 380,
"wires": [
[]
]
},
{
"id": "b7b3d933acfeeb9a",
"type": "time-range-switch",
"z": "90f3f488494fd855",
"name": "",
"lat": "",
"lon": "",
"startTime": "06:00",
"endTime": "23:59",
"startOffset": 0,
"endOffset": 0,
"x": 870,
"y": 260,
"wires": [
[
"f23fc98dd63a9b15"
],
[
"8d4b6719171e86ee"
]
]
},
{
"id": "f23fc98dd63a9b15",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\":254,\t \"color_temp_kelvin\":5000\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 1050,
"y": 220,
"wires": [
[]
]
},
{
"id": "8d4b6719171e86ee",
"type": "api-call-service",
"z": "90f3f488494fd855",
"name": "",
"server": "4e2c03c1.d491cc",
"version": 7,
"debugenabled": false,
"action": "light.turn_on",
"floorId": [],
"areaId": [],
"deviceId": [],
"entityId": [
"light.plafonnier_sdb"
],
"labelId": [],
"data": "{\t \"brightness\":90,\t \"color_temp_kelvin\":2200\t}",
"dataType": "jsonata",
"mergeContext": "",
"mustacheAltTags": false,
"outputProperties": [],
"queue": "none",
"blockInputOverrides": true,
"domain": "light",
"service": "turn_on",
"x": 1050,
"y": 300,
"wires": [
[]
]
},
{
"id": "c7e223e9ac7edca7",
"type": "comment",
"z": "90f3f488494fd855",
"name": "Node-Red automation create a smart bathroom lighting system with Home assistant and Node-Red : www.smarthome3d.com",
"info": "",
"x": 420,
"y": 20,
"wires": []
},
{
"id": "4e2c03c1.d491cc",
"type": "server",
"name": "Home Assistant",
"addon": true,
"rejectUnauthorizedCerts": true,
"ha_boolean": "",
"connectionDelay": false,
"cacheJson": false,
"heartbeat": false,
"heartbeatInterval": "",
"statusSeparator": "",
"enableGlobalContextStore": false
},
{
"id": "5914a38474afa853",
"type": "mqtt-broker",
"name": "Mqtt local",
"broker": "core-mosquitto.local.hass.io",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"autoUnsubscribe": true,
"birthTopic": "",
"birthQos": "0",
"birthRetain": "false",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closeRetain": "false",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willRetain": "false",
"willPayload": "",
"willMsg": {},
"userProps": "",
"sessionExpiry": ""
},
{
"id": "8101616283c75939",
"type": "global-config",
"env": [],
"modules": {
"node-red-contrib-home-assistant-websocket": "0.80.3",
"node-red-contrib-time-range-switch": "1.2.0",
"node-red-contrib-counter": "0.1.6"
}
}
]

Commentaires
Aucun commentaire pour l'instant.