Node Red Position Volet Roulant

Bonjour à tous

Je cherche dans node red un moyen pour déclencher un node function en fonction du changement de la position de mon volet roulant.
J’ai tenté l’event state, le current state mais en vain pour que cela me lance mon node function
mais rien ne m’enclenche mon node.

Comment vous feriez pour déclencher en fonction de la position du VR

mon code de test dans ce node :

var position = msg.data.attributes.current_position


if (position > 90 && position <=100){
    msg.position = position + " ok 1";
} else if(position > 80 && position <= 90){
    msg.position = position + " ok 2";
} else if (position > 70 && position <= 80) {
    msg.position = position + " ok 3";
} else if (position > 60 && position <= 70) {
    msg.position = position + " ok 4";
} else if (position > 50 && position <= 60) {
    msg.position = position + " ok 5";
} else if (position > 40 && position <= 50) {
    msg.position = position + " ok 6";
} else if (position > 30 && position <= 40) {
    msg.position = position + " ok 7";
} else if (position > 20 && position <= 30) {
    msg.position = position + " ok 8";
} else if (position > 10 && position <= 20) {
    msg.position = position + " ok 9";
} else {
    msg.position = position + " ok fin";
}
return msg;

System Information

version core-2022.12.8
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.10.7
os_name Linux
os_version 5.15.80
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4954
Installed Version 1.29.0
Stage running
Available Repositories 1209
Downloaded Repositories 80
Home Assistant Cloud
logged_in true
subscription_expiration 13 décembre 2023 à 01:00
relayer_connected true
remote_enabled true
remote_connected true
alexa_enabled false
google_enabled false
remote_server eu-central-1-1.ui.nabu.casa
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 9.4
update_channel stable
supervisor_version supervisor-2022.11.2
agent_version 1.4.1
docker_version 20.10.19
disk_total 30.8 GB
disk_used 19.6 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons Samba share (10.0.0), File editor (5.4.2), Terminal & SSH (9.6.1), Studio Code Server (5.5.0), Check Home Assistant configuration (3.11.0), Network UPS Tools (0.11.0), Samba Backup (5.2.0), Home Assistant Google Drive Backup (0.109.2), Dropbox Sync (1.3.0), Node-RED (14.0.0), TheengsGateway (1.3.2), ESPHome (2022.12.3), AppDaemon (0.11.0), Shortumation (v0.7.6)
Dashboards
dashboards 3
resources 50
views 40
mode storage
Recorder
oldest_recorder_run 15 décembre 2022 à 05:54
current_recorder_run 22 décembre 2022 à 12:25
estimated_db_size 4746.04 MiB
database_engine sqlite
database_version 3.38.5

ça devrait pourtant… le mieux c’est de partager le flow ?

Bien sur pas de soucis la dessus c’est un flow de démarrage et de test donc light

[
    {
        "id": "5794a0feaf5eb8f6",
        "type": "server-state-changed",
        "z": "678e5b75cdd9e231",
        "name": "",
        "server": "e4803443912781dd",
        "version": 4,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "cover.vr_ch_parents",
        "entityidfiltertype": "exact",
        "outputinitially": true,
        "state_type": "str",
        "haltifstate": "open",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 2,
        "output_only_on_state_change": true,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": true,
        "ignoreCurrentStateUnavailable": true,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 940,
        "y": 740,
        "wires": [
            [
                "54a482840fa920d2",
                "84aca8929fa726f4"
            ],
            []
        ]
    },
    {
        "id": "5d0e7a4c64c0fa6b",
        "type": "debug",
        "z": "678e5b75cdd9e231",
        "name": "debug 140",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1430,
        "y": 800,
        "wires": []
    },
    {
        "id": "567d18c9dc769018",
        "type": "api-current-state",
        "z": "678e5b75cdd9e231",
        "name": "",
        "server": "e4803443912781dd",
        "version": 3,
        "outputs": 1,
        "halt_if": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "cover.vr_ch_parents",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "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": 940,
        "y": 800,
        "wires": [
            [
                "84aca8929fa726f4",
                "2961e51b3a940b92"
            ]
        ]
    },
    {
        "id": "1c528d407a08e108",
        "type": "inject",
        "z": "678e5b75cdd9e231",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 640,
        "y": 800,
        "wires": [
            [
                "567d18c9dc769018"
            ]
        ]
    },
    {
        "id": "84aca8929fa726f4",
        "type": "function",
        "z": "678e5b75cdd9e231",
        "name": "Position VR",
        "func": "var position = msg.data.attributes.current_position\n\n\nif (position > 90 && position <=100){\n    msg.position = position + \" ok 1\";\n} else if(position > 80 && position <= 90){\n    msg.position = position + \" ok 2\";\n} else if (position > 70 && position <= 80) {\n    msg.position = position + \" ok 3\";\n} else if (position > 60 && position <= 70) {\n    msg.position = position + \" ok 4\";\n} else if (position > 50 && position <= 60) {\n    msg.position = position + \" ok 5\";\n} else if (position > 40 && position <= 50) {\n    msg.position = position + \" ok 6\";\n} else if (position > 30 && position <= 40) {\n    msg.position = position + \" ok 7\";\n} else if (position > 20 && position <= 30) {\n    msg.position = position + \" ok 8\";\n} else if (position > 10 && position <= 20) {\n    msg.position = position + \" ok 9\";\n} else {\n    msg.position = position + \" ok fin\";\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1230,
        "y": 800,
        "wires": [
            [
                "5d0e7a4c64c0fa6b"
            ]
        ]
    },
    {
        "id": "54a482840fa920d2",
        "type": "debug",
        "z": "678e5b75cdd9e231",
        "name": "debug 141",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1330,
        "y": 700,
        "wires": []
    },
    {
        "id": "2961e51b3a940b92",
        "type": "debug",
        "z": "678e5b75cdd9e231",
        "name": "debug 144",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "data",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1210,
        "y": 760,
        "wires": []
    },
    {
        "id": "e4803443912781dd",
        "type": "server",
        "name": "HA domojeca",
        "version": 5,
        "addon": false,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": "at: ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "h23",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": true
    }
]

Salut @jerome6994 , regardes du coté du node range
image

salut @fredarro c’est pas un soucis de range mais je veux juste récupérer dans NR le current_position quand il vient de changer afin d’envoyer un message sur mon serveur discord

et ce current_position est un attribut du state en fait

Si c’est ça ton idée tu va avoir des surprises… 10 messages à la suite pour un volet qui passe de fermé à ouvert… Bofbof je pense.
Après moi j’aime pas les notifications qui servent à rien…
A la limite déclencher le Flow lors du passage de moving à stopped…

Alors c’est pas une notification pour rien
Je veux juste faire en sorte que si le volet s’ouvre à 20% j’ai bien la notification de 20%
Je veux chopper le 20% au moment du volet STOP par pendant la montée ou descente (d’ailleurs j’ai pas l’info de ça)

mon volet est celui ci :

En gros je veux donc quand il y a STOP prendre la position et envoyer le bon message avec la bonne image.

Ensuite, c’est aussi pour l’exercice de savoir le faire pour cette usage ou un autre d’aller chercher la partie attribut de l’entité dans NR

Ça me semble plus viable comme idée. C’est juste pas du tout ce que le code aurait fait par contre (avec un trigger correct).
Avec les volets (time_rf_based et dérivés) les etats sont open / opening / close / closing donc quand ça passer de *ing à autre chose, c’et que l’action est finie.

Oui mais sur mon volet je n’ai pas opening et closing
En tout cas je ne vois pas du tout où c’est si je l’ai !

J’ai tiens quelques choses en faisant ceci :

[
    {
        "id": "567d18c9dc769018",
        "type": "api-current-state",
        "z": "678e5b75cdd9e231",
        "name": "",
        "server": "e4803443912781dd",
        "version": 3,
        "outputs": 1,
        "halt_if": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "cover.vr_ch_parents",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "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": 1260,
        "y": 1000,
        "wires": [
            [
                "84aca8929fa726f4"
            ]
        ]
    },
    {
        "id": "84aca8929fa726f4",
        "type": "function",
        "z": "678e5b75cdd9e231",
        "name": "Position VR",
        "func": "var position = msg.data.attributes.current_position\n//var data.new_state.attributes.current_position\n\nif (position > 90 && position <=100){\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/euE8rQi.png';\n    msg.icon_url = 'https://i.imgur.com/euE8rQi.png';\n} else if(position > 80 && position <= 90){\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/25kEzgz.png';\n    msg.icon_url = 'https://i.imgur.com/25kEzgz.png';\n} else if (position > 70 && position <= 80) {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/8qVV7Gt.png';\n    msg.icon_url = 'https://i.imgur.com/8qVV7Gt.png';\n} else if (position > 60 && position <= 70) {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/mpv2JZ5.png';\n    msg.icon_url = 'https://i.imgur.com/mpv2JZ5.png';\n} else if (position > 50 && position <= 60) {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/ZU7w1mR.png';\n    msg.icon_url = 'https://i.imgur.com/ZU7w1mR.png';\n} else if (position > 40 && position <= 50) {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/7GHZeDx.png';\n    msg.icon_url = 'https://i.imgur.com/7GHZeDx.png';\n} else if (position > 30 && position <= 40) {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/hrvZuss.png';\n    msg.icon_url = 'https://i.imgur.com/hrvZuss.png';\n} else if (position > 20 && position <= 30) {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/cDFtyWw.png';\n    msg.icon_url = 'https://i.imgur.com/cDFtyWw.png';\n} else if (position > 10 && position <= 20) {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/cztSRBY.png';\n    msg.icon_url = 'https://i.imgur.com/cztSRBY.png';\n} else {\n    msg.position = position;\n    msg.url = 'https://i.imgur.com/id9Pv6R.png';\n    msg.icon_url = 'https://i.imgur.com/id9Pv6R.png';\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1510,
        "y": 1000,
        "wires": [
            [
                "14f1e30e0b017d37"
            ]
        ]
    },
    {
        "id": "14f1e30e0b017d37",
        "type": "function",
        "z": "678e5b75cdd9e231",
        "name": "Embed ON",
        "func": "const msg1 = {};\nvar time = new Date();\nvar heure = time.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) //.toLocaleTimeString('fr-FR');\n//var position = msg.position\n\nglobal.set(\"heure_debut\",heure);\n\nmsg1.channel = \"1050807293509374003\";\nmsg1.payload = \"\";\nmsg.message = \"msg.message\"\nmsg1.embeds = {\n    color: '#FFD700',\n    title: \"VR CH Parents - Node Function Cron VR\",\n\tdescription: \"Le volet de la chambre vient de s'ouvrir à : **\" + heure + \"** à la position : \" + \"**\" + msg.position + \"**\",\n    author: {\n\t\tname: \"Gestion des Volets Roulants\",\n\t\ticon_url: msg.icon_url,\n\t\turl: 'https://148lx7gf3ch3nj9c1c5s2zmx5nwh9wtb.ui.nabu.casa/lovelace/ch-parents',\n\t},\n    thumbnail: {\n\t\turl: msg.url,\n\t},\n\ttimestamp: new Date(),\n    footer: {\n\t\ttext: 'Flow Volets HA - Node Red',\n\t\ticon_url: 'https://i.imgur.com/7NuCa93.png',\n\t},\n};\n\nreturn msg1;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1690,
        "y": 1000,
        "wires": [
            [
                "2d2ec940f38ebd00"
            ]
        ]
    },
    {
        "id": "2d2ec940f38ebd00",
        "type": "discordMessageManager",
        "z": "678e5b75cdd9e231",
        "name": "",
        "channel": "",
        "token": "",
        "x": 1910,
        "y": 1000,
        "wires": [
            []
        ]
    },
    {
        "id": "59c10b4cd8b48666",
        "type": "server-events",
        "z": "678e5b75cdd9e231",
        "name": "",
        "server": "e4803443912781dd",
        "version": 2,
        "eventType": "call_service",
        "exposeToHomeAssistant": false,
        "eventData": "",
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "waitForRunning": true,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "$outputData(\"eventData\").event_type",
                "valueType": "jsonata"
            }
        ],
        "event_type": "",
        "x": 670,
        "y": 1000,
        "wires": [
            [
                "96706cca83839f6a"
            ]
        ]
    },
    {
        "id": "96706cca83839f6a",
        "type": "switch",
        "z": "678e5b75cdd9e231",
        "name": "",
        "property": "payload.event.service",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "stop_cover",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "set_cover_position",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 850,
        "y": 1000,
        "wires": [
            [
                "9e9c0ed428803ac3"
            ],
            [
                "9e9c0ed428803ac3"
            ],
            []
        ]
    },
    {
        "id": "9e9c0ed428803ac3",
        "type": "delay",
        "z": "678e5b75cdd9e231",
        "name": "",
        "pauseType": "delay",
        "timeout": "500",
        "timeoutUnits": "milliseconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 1010,
        "y": 1000,
        "wires": [
            [
                "567d18c9dc769018"
            ]
        ]
    },
    {
        "id": "e4803443912781dd",
        "type": "server",
        "name": "HA domojeca",
        "version": 5,
        "addon": false,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": "at: ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "h23",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": true
    }
]

Un inconvénient à ceci c’est que sur le service set_cover_position j’ai l’info de suite alors que le VR est encore en mouvement mais il y a de l’idée du rendu que je souhaite.

Du coup je viens de m’apercevoir aussi que je ne sais pas mettre en variable Node Red la valeur de la position :thinking: du genre comme ceci
image