Tuto - Récupérer les infos sur le risque pollens

Bonjour,

Je vais vous présenter ici comment récupérer les infos sur le risque pollens et ensuite y transférer dans un topic MQTT.
Les données sont issues de ce site : https://www.pollens.fr

Le résultat final :

Voici le flux Node-Red :
( Un catch all est présent pour récupérer les erreurs et les envoyer par email )

Voici le flux au format JSON pour l’importer sur votre Node-Red :
(Les valeurs sont récupérées tous les matins à 9h00)

[
    {
        "id": "bbc343252cb25eac",
        "type": "tab",
        "label": "Flux - Pollens",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "7ac575237abb4457",
        "type": "http request",
        "z": "bbc343252cb25eac",
        "name": "API Request",
        "method": "GET",
        "ret": "obj",
        "paytoqs": "ignore",
        "url": "https://www.pollens.fr/risks/thea/counties/69",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [],
        "x": 350,
        "y": 340,
        "wires": [
            [
                "bf36dd6349fe905f"
            ]
        ]
    },
    {
        "id": "bf36dd6349fe905f",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extract Data",
        "func": "const data = msg.payload;\n\n// Extract relevant information\nconst pollenRisks = data?.risks;\n\n// Create separate messages for each pollenName\nconst messages = pollenRisks.map(risk => {\n    let levelNumber = 0; // Default to 0 if level is unknown\n    switch (risk.level) {\n        case 0:\n        case 1:\n        case 2:\n        case 3:\n            levelNumber = risk.level;\n            break;\n    }\n    return {\n        topic: `pollen/${risk.pollenName}`, // Topic is unique for each pollenName\n        payload: levelNumber\n    };\n});\n\n// Output all messages\nfor (const message of messages) {\n    node.send({ payload: message });\n}",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 530,
        "y": 340,
        "wires": [
            [
                "ebb744a52f2d0284"
            ]
        ]
    },
    {
        "id": "7552d67540a2d961",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Urticacées",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:urticacees/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1260,
        "y": 20,
        "wires": []
    },
    {
        "id": "738b03c93b31f727",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Tilleul",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:tilleul/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1250,
        "y": 60,
        "wires": []
    },
    {
        "id": "a12343f669e4f8ce",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Saule",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:saule/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1240,
        "y": 100,
        "wires": []
    },
    {
        "id": "dc592ae8bba8cef2",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Platane",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:platane/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1240,
        "y": 140,
        "wires": []
    },
    {
        "id": "30f2ee8f4b0b53bf",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Plantain",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:plantain/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1240,
        "y": 180,
        "wires": []
    },
    {
        "id": "24a47cf2553c0f7c",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Peuplier",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:peuplier/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 220,
        "wires": []
    },
    {
        "id": "bc93d0fd53439b94",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Oseille",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:oseille/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 260,
        "wires": []
    },
    {
        "id": "6832327866bc04d4",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Olivier",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:olivier/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 300,
        "wires": []
    },
    {
        "id": "e2fced2c1228b5b3",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Noisetier",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:noisetier/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 340,
        "wires": []
    },
    {
        "id": "c9e8b061faf6b7ab",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Graminées",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:graminees/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1240,
        "y": 380,
        "wires": []
    },
    {
        "id": "68afc7734f581758",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Frêne",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:frene/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1220,
        "y": 420,
        "wires": []
    },
    {
        "id": "92ad5dd377dc541f",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Cupressacées",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:cupressacees/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1250,
        "y": 460,
        "wires": []
    },
    {
        "id": "939b222b7f7c1e9e",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Chêne",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:chene/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 500,
        "wires": []
    },
    {
        "id": "e67e604f59541e3c",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Châtaignier",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:chataignier/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1250,
        "y": 540,
        "wires": []
    },
    {
        "id": "4ade92344aec1398",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Charme",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:charme/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 580,
        "wires": []
    },
    {
        "id": "9d07f4044c43f4ca",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Bouleau",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:bouleau/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 620,
        "wires": []
    },
    {
        "id": "c52ccb37cc771e50",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Aulne",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:aulne/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1220,
        "y": 660,
        "wires": []
    },
    {
        "id": "63ebd22212600817",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Armoise",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:armoise/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 700,
        "wires": []
    },
    {
        "id": "b5014ef4d4b78031",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Ambroisies",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:ambroisies/state",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 740,
        "wires": []
    },
    {
        "id": "ebb744a52f2d0284",
        "type": "switch",
        "z": "bbc343252cb25eac",
        "name": "",
        "property": "payload.topic",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "Urticacées",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Tilleul",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Saule",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Platane",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Plantain",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Peuplier",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Oseille",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Olivier",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Noisetier",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Graminées",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Frêne",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Cupressacées",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Chêne",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Châtaignier",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Charme",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Bouleau",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Aulne",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Armoise",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Ambroisies",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 19,
        "x": 710,
        "y": 340,
        "wires": [
            [
                "8d0adde0aff95a13"
            ],
            [
                "45b3b282ee5c7f5b"
            ],
            [
                "141cd61cf70552dc"
            ],
            [
                "0c8d638c799564f0"
            ],
            [
                "a76f02d65b5b251b"
            ],
            [
                "ab7ba6214628bc23"
            ],
            [
                "4b764b9864485c4c"
            ],
            [
                "96b42f8a867b2fc6"
            ],
            [
                "2f2dad2bd71e80f9"
            ],
            [
                "552335c84c6fe8df"
            ],
            [
                "26e08c68dc2065bb"
            ],
            [
                "60bdf90b83076df1"
            ],
            [
                "caec8f89d4738303"
            ],
            [
                "6be8143442f0a2eb"
            ],
            [
                "e43acc2af6e9fe96"
            ],
            [
                "5d402663ddcf3d59"
            ],
            [
                "2c3f0316affb6ae7"
            ],
            [
                "19c57cc67447e518"
            ],
            [
                "e48d51016db99b89"
            ]
        ]
    },
    {
        "id": "141cd61cf70552dc",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 100,
        "wires": [
            [
                "a12343f669e4f8ce"
            ]
        ]
    },
    {
        "id": "45b3b282ee5c7f5b",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 60,
        "wires": [
            [
                "738b03c93b31f727"
            ]
        ]
    },
    {
        "id": "8d0adde0aff95a13",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 20,
        "wires": [
            [
                "7552d67540a2d961"
            ]
        ]
    },
    {
        "id": "0c8d638c799564f0",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 140,
        "wires": [
            [
                "dc592ae8bba8cef2"
            ]
        ]
    },
    {
        "id": "a76f02d65b5b251b",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 180,
        "wires": [
            [
                "30f2ee8f4b0b53bf"
            ]
        ]
    },
    {
        "id": "ab7ba6214628bc23",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 220,
        "wires": [
            [
                "24a47cf2553c0f7c"
            ]
        ]
    },
    {
        "id": "4b764b9864485c4c",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 260,
        "wires": [
            [
                "bc93d0fd53439b94"
            ]
        ]
    },
    {
        "id": "96b42f8a867b2fc6",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 300,
        "wires": [
            [
                "6832327866bc04d4"
            ]
        ]
    },
    {
        "id": "2f2dad2bd71e80f9",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 340,
        "wires": [
            [
                "e2fced2c1228b5b3"
            ]
        ]
    },
    {
        "id": "552335c84c6fe8df",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 380,
        "wires": [
            [
                "c9e8b061faf6b7ab"
            ]
        ]
    },
    {
        "id": "26e08c68dc2065bb",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 420,
        "wires": [
            [
                "68afc7734f581758"
            ]
        ]
    },
    {
        "id": "60bdf90b83076df1",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 460,
        "wires": [
            [
                "92ad5dd377dc541f"
            ]
        ]
    },
    {
        "id": "caec8f89d4738303",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 500,
        "wires": [
            [
                "939b222b7f7c1e9e"
            ]
        ]
    },
    {
        "id": "6be8143442f0a2eb",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 540,
        "wires": [
            [
                "e67e604f59541e3c"
            ]
        ]
    },
    {
        "id": "e43acc2af6e9fe96",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 580,
        "wires": [
            [
                "4ade92344aec1398"
            ]
        ]
    },
    {
        "id": "5d402663ddcf3d59",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 620,
        "wires": [
            [
                "9d07f4044c43f4ca"
            ]
        ]
    },
    {
        "id": "2c3f0316affb6ae7",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 660,
        "wires": [
            [
                "c52ccb37cc771e50"
            ]
        ]
    },
    {
        "id": "19c57cc67447e518",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 700,
        "wires": [
            [
                "63ebd22212600817"
            ]
        ]
    },
    {
        "id": "e48d51016db99b89",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extraction valeur",
        "func": "const topic = msg.payload.topic;\nconst payload = msg.payload.payload;\nmsg.topic = topic;\nmsg.payload = payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 990,
        "y": 740,
        "wires": [
            [
                "b5014ef4d4b78031"
            ]
        ]
    },
    {
        "id": "6e9a8b6333516061",
        "type": "cronplus",
        "z": "bbc343252cb25eac",
        "name": "Cron",
        "outputField": "payload",
        "timeZone": "",
        "storeName": "",
        "commandResponseMsgOutput": "output1",
        "defaultLocation": "",
        "defaultLocationType": "default",
        "outputs": 1,
        "options": [
            {
                "name": "schedule1",
                "topic": "topic1",
                "payloadType": "default",
                "payload": "",
                "expressionType": "cron",
                "expression": "0 0 07 * * *",
                "location": "",
                "offset": "0",
                "solarType": "all",
                "solarEvents": "sunrise,sunset"
            }
        ],
        "x": 190,
        "y": 340,
        "wires": [
            [
                "7ac575237abb4457",
                "aa3e0879.49a3d8"
            ]
        ]
    },
    {
        "id": "4e5ac12b.2d8a4c",
        "type": "catch",
        "z": "bbc343252cb25eac",
        "name": "Erreurs",
        "scope": null,
        "uncaught": false,
        "x": 170,
        "y": 240,
        "wires": [
            [
                "29c9f07e.2920d6"
            ]
        ]
    },
    {
        "id": "29c9f07e.2920d6",
        "type": "e-mail",
        "z": "bbc343252cb25eac",
        "server": "monserveuremail",
        "port": "465",
        "authtype": "BASIC",
        "saslformat": false,
        "token": "oauth2Response.access_token",
        "secure": true,
        "tls": true,
        "name": "monadresse@email.fr",
        "dname": "Mail",
        "x": 320,
        "y": 240,
        "wires": []
    },
    {
        "id": "aa3e0879.49a3d8",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Get Current Date & Time",
        "func": "// Récupérer la date et l'heure actuelles pour Paris\nvar currentDate = new Date();\n\n// Calculer le décalage horaire pour Paris (en minutes)\nvar offsetParis = 120; // Décalage horaire pour Paris (UTC+2) en minutes\n\n// Ajouter le décalage horaire de Paris à la date actuelle\ncurrentDate.setMinutes(currentDate.getMinutes() + offsetParis);\n\n// Récupérer les composants de la date et de l'heure\nvar day = (\"0\" + currentDate.getDate()).slice(-2);\nvar month = (\"0\" + (currentDate.getMonth() + 1)).slice(-2);\nvar year = currentDate.getFullYear();\nvar hours = (\"0\" + currentDate.getHours()).slice(-2);\nvar minutes = (\"0\" + currentDate.getMinutes()).slice(-2);\n\n// Concaténer les composants pour obtenir le format souhaité\nvar formattedDate = day + \"/\" + month + \"/\" + year + \" \" + hours + \":\" + minutes;\n\n// Créer un objet de réponse\nvar msg = {\n    payload: formattedDate\n};\n\n// Envoyer le message de sortie\nreturn msg;\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1010,
        "y": 780,
        "wires": [
            [
                "8bec17071380c5a3"
            ]
        ]
    },
    {
        "id": "8bec17071380c5a3",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "Date/Heure",
        "topic": "gladys/master/device/mqtt:pollens/feature/mqtt:pollens-date-maj/text",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 1230,
        "y": 780,
        "wires": []
    },
    {
        "id": "0ee77e0f90aa9681",
        "type": "mqtt-broker",
        "name": "Gladys",
        "broker": "mqtt://192.168.xx.xx",
        "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": ""
    }
]

Bien penser à modifier le numéro de votre département dans le noeud « Api Request »
Et également l’adresse IP de votre broker MQTT

Voici l’appareil MQTT avec les fonctionnalités :











Si vous avez des questions/remarques, n’hésitez pas à m’en faire part :slight_smile:

Changelog à venir :

  • Aucun (A vos commentaires :slight_smile: )

Edit 13/05/2024 :

  • Modification des types de fonctionnalités en niveau de risque avec le sortie de la version de Gladys 4.41.0

Edit 15/05/2024 :

  • Ajout de la date et heure de mise à jour
4 « J'aime »

Sacré flow Node-RED :joy:

A voir si il existe une fonctionnalité existante qui s’approche de la tienne et qui a des badges de couleurs

Sinon ça peut s’ajouter à Gladys, c’est assez simple franchement.

Effectivement c’est un sacrée flow :sweat_smile:
Merci pour ton retour.
Il me semble pas avoir vu de fonctionnalité existante qui s’approche de celle-ci :frowning:

Tu souhaites que je créer une demande de fonctionnalités pour ça ?

bonjour @prohand

tu as une petite erreur à la ligne 1002 de ton flow

        "name": "aremplacer@monmail.fr),
=>
        "name": "aremplacer@monmail.fr",

Très bien sinon ce flow ! Comme quoi node-red pour Gladys est vraiment un complément indispensable à Gladys ! :blush:

Hello,

Merci c’est modifié :wink:
Effectivement Node Red est un complément indispensable à Gladys

Je veux bien ! :slight_smile:

C’est fait :slight_smile:

Merci pour cet exemple qui explicite mieux l’intérêt de pouvoir spécifier le topic à écouter dans Gladys. Si cela était possible il suffirait dans le nœud « Extract Data » de formater le topic pour chaque allergène et de la passer directement à un seul noeud « MQTT out ». Dans Gladys d’associer le bon topic à chaque fonctionnalité lors de sa création.
La démultiplication des nœuds deviendrait superflu.

Oui je suis d’accord avec toi mais je n’ai pas trouvé comment faire :frowning:

Salut,
on peut très bien avoir qu’une sortie MQTT.

Je n’ai que modifié la sortie

[
    {
        "id": "bbc343252cb25eac",
        "type": "tab",
        "label": "Flux - Pollens",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "7ac575237abb4457",
        "type": "http request",
        "z": "bbc343252cb25eac",
        "name": "API Request",
        "method": "GET",
        "ret": "obj",
        "paytoqs": "ignore",
        "url": "https://www.pollens.fr/risks/thea/counties/69",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [],
        "x": 350,
        "y": 340,
        "wires": [
            [
                "bf36dd6349fe905f"
            ]
        ]
    },
    {
        "id": "bf36dd6349fe905f",
        "type": "function",
        "z": "bbc343252cb25eac",
        "name": "Extract Data",
        "func": "const data = msg.payload;\n\n// Extract relevant information\nconst pollenRisks = data?.risks;\n\n// Create separate messages for each pollenName\nconst messages = pollenRisks.map(risk => {\n    let levelText = \"\";\n    switch (risk) {\n        case 0:\n            levelText = \"Aucun\";\n            break;\n        case 1:\n            levelText = \"Faible\";\n            break;\n        case 2:\n            levelText = \"Moyen\";\n            break;\n        case 3:\n            levelText = \"Elevée\";\n            break;\n        default:\n            levelText = \"Inconnu\";\n            break;\n    }\n    //Pour enlever les accents\n    const removeAccents = str =>\n        str.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n\n    let a = removeAccents(risk.pollenName);\n    a = a.toLowerCase()//Mettre en commentaire cette ligne pour laisser le premier caractère e un majuscules\n    msg.topic = \"gladys/master/device/mqtt:pollens/feature/mqtt:\" + a + \"/text\";\n    msg.payload = levelText ;\n    node.send(msg);\n    //return {\n        //topic: `pollen/${risk.pollenName}`, // Topic is unique for each pollenName\n        //topic: risk.pollenName, // Topic is unique for each pollenName\n        //payload: levelText,\n    //};\n});\n\n// Output all messages\n//for (const message of messages) {\n//    node.send({ payload: message });\n//}\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 530,
        "y": 340,
        "wires": [
            [
                "5810137e3ac9c2a1",
                "8ee9057a695c554b"
            ]
        ]
    },
    {
        "id": "6e9a8b6333516061",
        "type": "cronplus",
        "z": "bbc343252cb25eac",
        "name": "Cron",
        "outputField": "payload",
        "timeZone": "",
        "storeName": "",
        "commandResponseMsgOutput": "output1",
        "defaultLocation": "",
        "defaultLocationType": "default",
        "outputs": 1,
        "options": [
            {
                "name": "schedule1",
                "topic": "topic1",
                "payloadType": "default",
                "payload": "",
                "expressionType": "cron",
                "expression": "0 0 07 * * *",
                "location": "",
                "offset": "0",
                "solarType": "all",
                "solarEvents": "sunrise,sunset"
            }
        ],
        "x": 190,
        "y": 340,
        "wires": [
            [
                "7ac575237abb4457"
            ]
        ]
    },
    {
        "id": "4e5ac12b.2d8a4c",
        "type": "catch",
        "z": "bbc343252cb25eac",
        "name": "Erreurs",
        "scope": null,
        "uncaught": false,
        "x": 170,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "5810137e3ac9c2a1",
        "type": "debug",
        "z": "bbc343252cb25eac",
        "name": "envoi MQTT",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 710,
        "y": 300,
        "wires": []
    },
    {
        "id": "8ee9057a695c554b",
        "type": "mqtt out",
        "z": "bbc343252cb25eac",
        "name": "",
        "topic": "",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "3afb98e8a9f77095",
        "x": 690,
        "y": 340,
        "wires": []
    },
    {
        "id": "3afb98e8a9f77095",
        "type": "mqtt-broker",
        "name": "Gladys",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

On s’est mal compris, je parlais de créer une demande pour avoir un type de fonctionnalité lié au niveau de pollen :smiley:

On essaie au maximum de faire du spécifique dans Gladys, pas du générique :slight_smile:

Effectivement on s’est mal compris :wink:
Vu qu’il y a des votes j’ai laissé la 1er demande et je viens d’en créer une autre

Je pense pas que ce soit quelque chose qu’on va faire la première demande ^^ c’est pas trop la philosophie

Pas de problème
Si tu veux tu peux supprimer complètement le post :slight_smile:

1 « J'aime »

Alors oui ça marche mais là ça donne un couplage important entre le nommage de utilisé par l’API et le nommage à appliquer dans Gladys.
Personnellement je trouve ça assez bancale sur du long terme.

Merci beaucoup pour ce tutoriel :pray: Implémenté de mon côté avec n8n (uniquement sur le pollen qui m’intéresse).
En attente de la prochaine version qui intègre l’affichage dans le dashboard :wink:

De rien :wink:
Dès que la prochaine version de Gladys sort je mets à jour le tuto :wink:

1 « J'aime »

Mise à jour du tutoriel :slight_smile:
Voir le changelog sur le 1er message.
Merci :wink:

1 « J'aime »

Mise à jour du tutoriel :slight_smile:
Voir le changelog sur le 1er message.
Merci :wink:

1 « J'aime »

Bonjour,

Je me permets de up le sujet, super boulot c’est génial !

Par contre, pourrais-tu me dire comment tu as trouvé l’endpoint API de pollens ? J’ai cherché pas mal sur Google en vain, et même quelques dork (du style inurl:risk site:pollens.fr) ne retournent rien, j’aimerais trouver comment récupérer les informations pour une ville et pas un département si possible.

Le fait de savoir permettra de rendre la solution pérenne par la même occasion :slight_smile:

Merci beaucoup :handshake:


EDIT J’ai continué mes recherches et j’ai trouvé l’URL sur un forum openHAB, je suppose que l’information a été trouvée dessus, merci :).

Je continue mes recherches pour avoir les données sur une ville uniquement

2 « J'aime »