Comment créer un éclairage intelligent de la salle de bain avec Home assistant et Node-Red

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.

Figure 1 diagram

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):

Figure 2 Button

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.

Figure 3 MqttTopic

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.

Figure 4 Derivative sensor

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.

Figure 5 Derivative threshold

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.

Figure 6 Detect shower

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.

Figure 7 Manage activations

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.

Figure 8 Trigger options

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.

Figure 9 Counter options

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 :

Figure 10 Reset options

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 :

Figure 11 Manage the flashs

Dans chaque branche, on commence par vérifier que la lumière est toujours allumée, puis on modifie la couleur :

Figure 12 Green flash

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.

Figure 13 Send notification

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 :

Figure 14 Delay for notification

Pour le nœud trigger, il est configuré comme le nœud trigger ci-dessus excepté qu’on l’active toutes les 15 minutes :

Figure 15 Trigger for notification

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.

Figure 16 Message for notification

Dans le nœud action qui enverra la notification, on aura :

Figure 17 Actions for notification

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 :

Figure 18 Actions to do

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.

Figure 19 Manage 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 :

Figure 20 Events for actions

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 » :

Figure 21 List of events

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:

Figure 22 Switch node

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:

Node-RED Flow
[
  {
    "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"
    }
  }
]

Articles suggérés

Home Assistant 2026-4

Dans cette nouvelle mise à jour, plusieurs nouveautés particulièrement intéressantes ont été introduites. Je l’ai installée depuis un moment et, à ma connaissance, aucune régression majeure...

Raccourcis iOS 26-4

La mise à jour iOS 26.4 apporte plusieurs nouveautés très intéressantes pour les utilisateurs de raccourcis iOS. Dans ce court post, je vous présente les nouvelles actions disponibles dans...

Comment synchroniser plusieurs alarmes sur Home assistant

Vous en avez assez de rater vos alarmes ou de devoir tout configurer tout le temps sur Home Assistant ? Dans ce tutoriel, découvrez comment synchroniser automatiquement plusieurs alarmes...

Commentaires

Aucun commentaire pour l'instant.