Anleitung - Abruf des Stromabonnements-Preises über die Website data.gouv.fr - Tarife außerhalb von Tempo

Hallo,

Ich sehe, dass Sie hier zeigen, wie man den Stromtarif mit node-red über die Datei abruft: https://www.data.gouv.fr/fr/datasets/r/c13d05e5-9e55-4d03-bf7e-042a2ade7e49 und ihn dann in ein MQTT-Topic überträgt, um ihn in Gladys zu verwenden :wink:

Diese Datei finden Sie hier: https://www.data.gouv.fr/fr/datasets/historique-des-tarifs-reglementes-de-vente-delectricite-pour-les-consommateurs-residentiels/

Dieser Leitfaden ist nur mit der Option « Basis » kompatibel, da dies die Option ist, die mit meinem Vertrag verbunden ist :slight_smile:
Aber ich denke, es ist recht einfach, ihn für die Option « Hochtarif/ Niedertarif » einzurichten.

Das Endergebnis:

image

Hier ist der Node-Red-Fluss:

Hier ist der Fluss im JSON-Format zum Importieren in Ihren Node-Red:
(Der Wert wird jede Nacht um 3:00 Uhr abgerufen)

[
    {
        "id": "d6333988d9cfb817",
        "type": "tab",
        "label": "Flux - Coût EDF",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "d79ac3d249808c33",
        "type": "mqtt out",
        "z": "d6333988d9cfb817",
        "name": "",
        "topic": "gladys/master/device/mqtt:edf/feature/mqtt:cout-abonnement/state",
        "qos": "2",
        "retain": "true",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "0ee77e0f90aa9681",
        "x": 830,
        "y": 400,
        "wires": []
    },
    {
        "id": "1852e9b329fd3f44",
        "type": "http request",
        "z": "d6333988d9cfb817",
        "name": "Download CSV",
        "method": "GET",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "https://www.data.gouv.fr/fr/datasets/r/c13d05e5-9e55-4d03-bf7e-042a2ade7e49",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [],
        "x": 240,
        "y": 160,
        "wires": [
            [
                "24804ed33b7a2cd6"
            ]
        ]
    },
    {
        "id": "24804ed33b7a2cd6",
        "type": "csv",
        "z": "d6333988d9cfb817",
        "name": "Conversion CSV en tableau",
        "sep": ";",
        "hdrin": true,
        "hdrout": "none",
        "multi": "mult",
        "ret": "\\n",
        "temp": "DATE_DEBUT;DATE_FIN;P_SOUSCRITE;PART_FIXE_HT;PART_FIXE_TTC;PART_VARIABLE_HT;PART_VARIABLE_TTC",
        "skip": "0",
        "strings": false,
        "include_empty_strings": false,
        "include_null_values": false,
        "x": 400,
        "y": 220,
        "wires": [
            [
                "8576856348eb0e34"
            ]
        ]
    },
    {
        "id": "8576856348eb0e34",
        "type": "function",
        "z": "d6333988d9cfb817",
        "name": "Extraction de la plus recente PART_VARIABLE_TTC en fonction de P_SOUSCRITE",
        "func": "// Filtrer les données pour P_SOUSCRITE = 6 et DATE_FIN absente ou vide\nmsg.payload = msg.payload.filter(item => item.P_SOUSCRITE === \"6\" && (!item.DATE_FIN || item.DATE_FIN.trim() === \"\"));\n\n// Remplacer les virgules par des points dans les valeurs de PART_VARIABLE_TTC\nmsg.payload = msg.payload.map(item => {\n    // Remplacer les virgules par des points dans la valeur de PART_VARIABLE_TTC\n    item.PART_VARIABLE_TTC = item.PART_VARIABLE_TTC.replace(/,/g, '.');\n    // Convertir PART_VARIABLE_TTC en nombre\n    item.PART_VARIABLE_TTC = parseFloat(item.PART_VARIABLE_TTC);\n    return item.PART_VARIABLE_TTC;\n});\nreturn msg;\n\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 630,
        "y": 280,
        "wires": [
            [
                "644a3870177af55a"
            ]
        ]
    },
    {
        "id": "644a3870177af55a",
        "type": "function",
        "z": "d6333988d9cfb817",
        "name": "Convertion en nombre",
        "func": "msg.payload = parseFloat(msg.payload);\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 600,
        "y": 340,
        "wires": [
            [
                "d79ac3d249808c33"
            ]
        ]
    },
    {
        "id": "1943b35881c8a2fa",
        "type": "cronplus",
        "z": "d6333988d9cfb817",
        "name": "Cron daily",
        "outputField": "payload",
        "timeZone": "",
        "storeName": "",
        "commandResponseMsgOutput": "output1",
        "defaultLocation": "",
        "defaultLocationType": "default",
        "outputs": 1,
        "options": [
            {
                "name": "schedule1",
                "topic": "topic1",
                "payloadType": "default",
                "payload": "",
                "expressionType": "cron",
                "expression": "0 0 01 * * *",
                "location": "",
                "offset": "0",
                "solarType": "all",
                "solarEvents": "sunrise,sunset"
            }
        ],
        "x": 140,
        "y": 100,
        "wires": [
            [
                "1852e9b329fd3f44"
            ]
        ]
    },
    {
        "id": "670838a9edef0758",
        "type": "catch",
        "z": "d6333988d9cfb817",
        "name": "Erreurs",
        "scope": null,
        "uncaught": false,
        "x": 110,
        "y": 60,
        "wires": [
            [
                "c097dad994334b5e"
            ]
        ]
    },
    {
        "id": "c097dad994334b5e",
        "type": "e-mail",
        "z": "d6333988d9cfb817",
        "server": "monsmtp.a.remplacer",
        "port": "465",
        "authtype": "BASIC",
        "saslformat": false,
        "token": "oauth2Response.access_token",
        "secure": true,
        "tls": true,
        "name": "aremplacer@monmail.fr",
        "dname": "Mail",
        "x": 250,
        "y": 60,
        "wires": []
    },
    {
        "id": "0ee77e0f90aa9681",
        "type": "mqtt-broker",
        "name": "Gladys",
        "broker": "mqtt://192.168.x.x",
        "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": ""
    }
]

Denken Sie daran, den Wert von P_SOUSCRITE in der Funktion „Extraction de la plus recente PART_VARIABLE_TTC en fonction de P_SOUSCRITE“ zu ändern
Und auch die IP-Adresse Ihres MQTT-Brokers

Hier ist das MQTT-Gerät mit der Funktion:


Wenn Sie Fragen oder Anmerkungen haben, zögern Sie nicht, mir Bescheid zu sagen :slight_smile:

Changelog zu kommen:

  • Keine (Ihre Kommentare :slight_smile: )

Edit 23/04/2024:

  • Hinzufügen von Screenshots für das MQTT-Gerät
  • Hinzufügen eines Catch-All für die Fehlerbehandlung und Benachrichtigung per E-Mail

Super Tutorial! Danke @prohand :slight_smile:

Tutorial-Update :slight_smile:
Changelog ansehen :wink:

Anleitung für den Tempo-Tarif mit automatischer Aktualisierung: