Début sur NodeRed

Je m’essaie à NodeRed, et j’ai un peu de mal à configurer les noeuds.
Je voudrais avoir une notification sur l’application Android de mon smartphone lorsque le niveau de la batterie d’un autre appareil (sensor.controlcenter_niveau_de_batterie) est en dessous d’un seuil.

  • Comment faire pour envoyer la notification sur mon smartphone ?
  • Comment configurer le noeud « current_state » pour déclencher la notif lorsque le seuil de la batterie (sensor.controlcenter_niveau_de_batterie) est atteint ?

salut,

je partirais plus sur un event state < 50 puis un node call service comme tu as fait, mais comme ca :

image

un node Delay :

dans data :

{
    "message": "La température du réfrigerateur est trop élevée elle est de {{states('sensor.temperature_frigo')}}°"
}

alors oui j’envois ma notif sur telegram, faudra adapter

Super @jybi89, ça marche nickel.

Je me demandais s’il était possible de n’avoir :

  • qu’un seul noeud Limite message qui limiterait l’envoi de message par entrée (dans la config du noeud Delay node, ça devrait être For each msg.topic ???) à 1 envoi par 30 min
  • du coup, comment faire pour que la notification récupère le nom humain de l’appareil pour le mettre dans le message de notification (exemple : Batterie du Control Center faible !)
Voici mon flow :
[
    {
        "id": "4614460.a24acbc",
        "type": "api-call-service",
        "z": "a5306ee0.a29a6",
        "name": "Notif. Batterie faible Control Center",
        "server": "9e52802.b11068",
        "version": 1,
        "debugenabled": true,
        "service_domain": "notify",
        "service": "mobile_app_sm_a530f",
        "entityId": "",
        "data": "{\"message\": \"Batterie du Control Center faible !\" }",
        "dataType": "json",
        "mergecontext": "",
        "output_location": "",
        "output_location_type": "none",
        "mustacheAltTags": false,
        "x": 680,
        "y": 100,
        "wires": [
            []
        ]
    },
    {
        "id": "2b4654b1.bbbd5c",
        "type": "server-state-changed",
        "z": "a5306ee0.a29a6",
        "name": "Control Center",
        "server": "9e52802.b11068",
        "version": 1,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "sensor.controlcenter_niveau_de_batterie",
        "entityidfiltertype": "exact",
        "outputinitially": true,
        "state_type": "num",
        "haltifstate": "30",
        "halt_if_type": "num",
        "halt_if_compare": "lt",
        "outputs": 2,
        "output_only_on_state_change": false,
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "x": 120,
        "y": 100,
        "wires": [
            [
                "2116f67f.aab35a"
            ],
            []
        ]
    },
    {
        "id": "2116f67f.aab35a",
        "type": "delay",
        "z": "a5306ee0.a29a6",
        "name": "Limite message",
        "pauseType": "timed",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "10",
        "rateUnits": "minute",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "x": 400,
        "y": 100,
        "wires": [
            [
                "4614460.a24acbc"
            ]
        ]
    },
    {
        "id": "87c56202.0799d",
        "type": "server-state-changed",
        "z": "a5306ee0.a29a6",
        "name": "Aquara 1",
        "server": "9e52802.b11068",
        "version": 1,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "sensor.aquara_1_battery",
        "entityidfiltertype": "exact",
        "outputinitially": true,
        "state_type": "str",
        "haltifstate": "30",
        "halt_if_type": "num",
        "halt_if_compare": "lt",
        "outputs": 2,
        "output_only_on_state_change": false,
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "x": 100,
        "y": 160,
        "wires": [
            [
                "8d4c2ba8.83a3a8"
            ],
            []
        ]
    },
    {
        "id": "8d4c2ba8.83a3a8",
        "type": "delay",
        "z": "a5306ee0.a29a6",
        "name": "Limite message",
        "pauseType": "timed",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "10",
        "rateUnits": "minute",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "x": 400,
        "y": 160,
        "wires": [
            [
                "a0c1103.99eabf"
            ]
        ]
    },
    {
        "id": "a0c1103.99eabf",
        "type": "api-call-service",
        "z": "a5306ee0.a29a6",
        "name": "Notif. Batterie faible Aquara 1",
        "server": "9e52802.b11068",
        "version": 1,
        "debugenabled": false,
        "service_domain": "notify",
        "service": "mobile_app_sm_a530f",
        "entityId": "",
        "data": "{\"message\": \"Batterie du capteur Aquara 1 faible !\" }",
        "dataType": "json",
        "mergecontext": "",
        "output_location": "",
        "output_location_type": "none",
        "mustacheAltTags": false,
        "x": 660,
        "y": 160,
        "wires": [
            []
        ]
    },
    {
        "id": "9e52802.b11068",
        "type": "server",
        "name": "Home Assistant",
        "legacy": false,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true
    }
]

pour afficher le nom du capteur dans ton message tu as déjà un bout de la réponse dans mon message précédent :wink:

{{state_attr('binary_sensor.porte_entree', 'friendly_name')}}
ou
{{states.binary_sensor.porte_entree.attributes.friendly_name}}

avec l’un ou l’autre tu affiches l’attribue « friendlyname » de l’état du binary_sensor.porte_entree

pour connaitre les attribues d’une entité :

Pour la limit d’un msg /30mn tu utilises le noeud delais

Je voudrais pouvoir rendre variable le <Entity ID du sensor> dans le message en fonction du nœud qui émet le message :

{
    "message": "Batterie faible sur {{state_attr('<Entity ID du sensor>', 'friendly_name')}}"
}

Sur cet exemple :

Je voudrais que si Control Center envoie un message, le message de la notification soit :

{
    "message": "Batterie faible sur {{state_attr('sensor.controlcenter_niveau_de_batterie', 'friendly_name')}}"
}

et si c’est Aquara 1 qui envoi, le message de notif soit :

{
    "message": "Batterie faible sur {{state_attr('sensor.aquara_1_battery', 'friendly_name')}}"
}

J’en demande peut-être un peu trop, je sais pas si c’est possible :thinking:

Je connais pas NodeRed, mais peut être peux tu faire la même chose que ce post. (va directement à la fin du post, partie Bonus)

On peut tout faire avec NodeRed :slight_smile:
Dans le noeud de debug ou @Sylvain_G affiche tout le message, tu dois pouvoir voir le friendly_name. C’est normalement dans msg.data.attributes.friendly_name.

Tous les noeuds de la palette home assistant permettent d’utiliser les templates mustache ou le jsonata.
Avec mustache, msg.data.attributes.friendly_name est accessible avec {{data.attributes.friendly_name}}. Donc, dans l’appel de notification, tu peux envoyer le « bon » nom.

state_attr et la suite, c’est du HA pur qui n’est pas accessible avec cette syntaxe dans NR. Mais, l’équivalent est disponiible.

Et sinon, « pour le plaisir », une façon totalement différente de faire la même chose que la solution proposée:

[{"id":"3e9fef38.25baf","type":"split","z":"b7318836.068048","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":630,"y":660,"wires":[["30322005.c907c"]]},{"id":"7bc12a05.fa96a4","type":"file in","z":"b7318836.068048","name":"Badges","filename":"/data/remy/test.json","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":320,"y":660,"wires":[["cdfe272b.7b47b8"]]},{"id":"cdfe272b.7b47b8","type":"json","z":"b7318836.068048","name":"","property":"payload","action":"","pretty":false,"x":490,"y":660,"wires":[["3e9fef38.25baf"]]},{"id":"30322005.c907c","type":"delay","z":"b7318836.068048","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":790,"y":660,"wires":[["d95942ef.a7fcd"]]},{"id":"73286bfe.1dac14","type":"api-current-state","z":"b7318836.068048","name":"","server":"d28c9492.f419c8","version":1,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"{{payload.name}}","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":1190,"y":660,"wires":[["59a01aaa.8840d4"]]},{"id":"40815e4f.f420b","type":"debug","z":"b7318836.068048","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"\"Froid\"","targetType":"jsonata","statusVal":"","statusType":"auto","x":1580,"y":640,"wires":[]},{"id":"d95942ef.a7fcd","type":"change","z":"b7318836.068048","name":"","rules":[{"t":"set","p":"seuil","pt":"msg","to":"payload.seuil","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":970,"y":660,"wires":[["73286bfe.1dac14"]]},{"id":"59a01aaa.8840d4","type":"switch","z":"b7318836.068048","name":"","property":"$number(payload)","propertyType":"jsonata","rules":[{"t":"lte","v":"seuil","vt":"msg"},{"t":"gt","v":"seuil","vt":"msg"}],"checkall":"true","repair":false,"outputs":2,"x":1410,"y":660,"wires":[["40815e4f.f420b"],["24751f05.f8eee"]]},{"id":"24751f05.f8eee","type":"debug","z":"b7318836.068048","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"\"Chaud\"","targetType":"jsonata","statusVal":"","statusType":"auto","x":1580,"y":700,"wires":[]},{"id":"d89f4939.79a948","type":"cronplus","z":"b7318836.068048","name":"","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 0 */6 * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":140,"y":660,"wires":[["7bc12a05.fa96a4"]]},{"id":"d28c9492.f419c8","type":"server","name":"hassio","legacy":false,"addon":false,"rejectUnauthorizedCerts":false,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]

Avec le fichier badges ayant cette structure:

[
  {
    "name": "sensor.oeil_salon_temperature",
    "seuil": 32
  },
  {
    "name": "sensor.oeil_couloir_haut_temperature",
    "seuil": 22
  },
  {
    "name": "sensor.oeil_bibliotheque_temperature",
    "seuil": 18
  },
  {
    "name": "sensor.oeil_entree_temperature",
    "seuil": 18
  }
]

Dans cet exemple (fait avec des yeux fibaro et la temperature -pas la batterie-), l’idée est:

  • d’exécuter le flot toutes les 6 heures (le niveau de batterie ça ne change pas si souvent)
  • de comparer une valeur de seuil par équipement avec la valeur en cours et d’indiquer « Chaud » ou « Froid »