Mini-tutorial Sun-Position Nore-red Mqtt to control shutters based on the sun's position and the month

Bonjour,

Voici un flow node-red pour injecter la position du soleil dans Gladys via Node-red (azimuth et altitude)

[
    {
        "id": "dbd46647b51191ed",
        "type": "tab",
        "label": "Sun-Position",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "a0d0e562.7ad1d8",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 1",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 720,
        "y": 180,
        "wires": []
    },
    {
        "id": "9cc2d51.4ac0828",
        "type": "change",
        "z": "dbd46647b51191ed",
        "name": "azimuth",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.azimuth",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "gladys/master/device/mqtt:soleil/feature/mqtt:azimuth/state",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 240,
        "wires": [
            [
                "0a17f9d94c9dae35",
                "ddf8b5e66052a4dc"
            ]
        ]
    },
    {
        "id": "28e91.9d63d16f6",
        "type": "change",
        "z": "dbd46647b51191ed",
        "name": "altitude",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.altitude",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "gladys/master/device/mqtt:soleil/feature/mqtt:altitude/state",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 320,
        "wires": [
            [
                "ae57174554627c71",
                "58367a9aedab25dc"
            ]
        ]
    },
    {
        "id": "e921e01a.a0fa3",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 4",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 720,
        "y": 380,
        "wires": []
    },
    {
        "id": "e866e950.a7f798",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 3",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1140,
        "y": 180,
        "wires": []
    },
    {
        "id": "5b085e1b.4ec8a",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 6",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1140,
        "y": 380,
        "wires": []
    },
    {
        "id": "56265aeb.99f034",
        "type": "sun-position",
        "z": "dbd46647b51191ed",
        "name": "",
        "positionConfig": "2831ba70.55a636",
        "rules": [
            {
                "valueLow": "0",
                "valueLowType": "num",
                "valueHigh": "360",
                "valueHighType": "num"
            }
        ],
        "onlyOnChange": "true",
        "topic": "",
        "outputs": 2,
        "start": "sunsetStart",
        "startType": "pdsTime",
        "startOffset": 0,
        "startOffsetType": "num",
        "startOffsetMultiplier": 60000,
        "end": "sunriseEnd",
        "endType": "pdsTime",
        "endOffset": 0,
        "endOffsetType": "num",
        "endOffsetMultiplier": 60000,
        "x": 470,
        "y": 280,
        "wires": [
            [
                "a0d0e562.7ad1d8",
                "9cc2d51.4ac0828",
                "28e91.9d63d16f6"
            ],
            [
                "e921e01a.a0fa3"
            ]
        ]
    },
    {
        "id": "8eee70dd77c1369c",
        "type": "mqtt out",
        "z": "dbd46647b51191ed",
        "name": "",
        "topic": "",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "3c3eb52d.9fb296",
        "x": 1130,
        "y": 280,
        "wires": []
    },
    {
        "id": "0a17f9d94c9dae35",
        "type": "function",
        "z": "dbd46647b51191ed",
        "name": "arrondi entier",
        "func": "msg.payload = Math.round(msg.payload)\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 940,
        "y": 240,
        "wires": [
            [
                "8eee70dd77c1369c",
                "e866e950.a7f798"
            ]
        ]
    },
    {
        "id": "ddf8b5e66052a4dc",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 2",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 920,
        "y": 180,
        "wires": []
    },
    {
        "id": "ae57174554627c71",
        "type": "function",
        "z": "dbd46647b51191ed",
        "name": "arrondi entier",
        "func": "msg.payload = Math.round(msg.payload)\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 940,
        "y": 320,
        "wires": [
            [
                "5b085e1b.4ec8a",
                "8eee70dd77c1369c"
            ]
        ]
    },
    {
        "id": "58367a9aedab25dc",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 5",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 920,
        "y": 380,
        "wires": []
    },
    {
        "id": "664b1852987e09be",
        "type": "time-inject",
        "z": "dbd46647b51191ed",
        "name": "Période et Intervalle d'injection .",
        "nameInt": "¹sunrise start - sunset end = timestamp ↻10min",
        "positionConfig": "2831ba70.55a636",
        "props": [
            {
                "p": "",
                "pt": "msgPayload",
                "v": "",
                "vt": "date",
                "o": "",
                "oT": "none",
                "oM": "60000",
                "f": 0,
                "fS": 0,
                "fT": "UNIX timestamp (ms)",
                "fI": "0",
                "next": true,
                "days": "*",
                "months": "*",
                "onlyOddDays": false,
                "onlyEvenDays": false,
                "onlyOddWeeks": false,
                "onlyEvenWeeks": false
            },
            {
                "p": "",
                "pt": "msgTopic",
                "v": "",
                "vt": "str",
                "o": "",
                "oT": "none",
                "oM": "60000",
                "f": 0,
                "fS": 0,
                "fT": "UNIX timestamp (ms)",
                "fI": "0",
                "next": false,
                "days": "*",
                "months": "*",
                "onlyOddDays": false,
                "onlyEvenDays": false,
                "onlyOddWeeks": false,
                "onlyEvenWeeks": false
            }
        ],
        "injectTypeSelect": "interval-time",
        "intervalCount": "10",
        "intervalCountType": "num",
        "intervalCountMultiplier": 60000,
        "cron": "",
        "cronType": "cronexpr",
        "time": "sunriseStart",
        "timeType": "pdsTime",
        "offset": 0,
        "offsetType": "none",
        "offsetMultiplier": 60000,
        "timeEnd": "sunsetEnd",
        "timeEndType": "pdsTime",
        "timeEndOffset": 0,
        "timeEndOffsetType": "none",
        "timeEndOffsetMultiplier": 60000,
        "timeDays": "*",
        "timeOnlyOddDays": false,
        "timeOnlyEvenDays": false,
        "timeOnlyOddWeeks": false,
        "timeOnlyEvenWeeks": false,
        "timeMonths": "*",
        "timedatestart": "",
        "timedateend": "",
        "property": "",
        "propertyType": "none",
        "propertyCompare": "true",
        "propertyThreshold": "",
        "propertyThresholdType": "num",
        "timeAlt": "",
        "timeAltType": "entered",
        "timeAltDays": "*",
        "timeAltOnlyOddDays": false,
        "timeAltOnlyEvenDays": false,
        "timeAltOnlyOddWeeks": false,
        "timeAltOnlyEvenWeeks": false,
        "timeAltMonths": "*",
        "timeAltOffset": 0,
        "timeAltOffsetType": "none",
        "timeAltOffsetMultiplier": 60000,
        "once": true,
        "onceDelay": 0.1,
        "recalcTime": 2,
        "x": 220,
        "y": 280,
        "wires": [
            [
                "56265aeb.99f034"
            ]
        ]
    },
    {
        "id": "2831ba70.55a636",
        "type": "position-config",
        "name": "Maison",
        "isValide": "true",
        "angleType": "deg",
        "timeZoneOffset": "99",
        "timeZoneDST": "0",
        "stateTimeFormat": "3",
        "stateDateFormat": "12",
        "contextStore": ""
    },
    {
        "id": "3c3eb52d.9fb296",
        "type": "mqtt-broker",
        "name": "MQTT Broker",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "compatmode": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

Cela donnera un flow qui ressemble Ă  cela

ensuite dans Gladys créez un device comme suit

et une scène comme suit

Voila il est maintenant possible de créer un événement en fonction de la position du soleil dans Gladys comme par exemple ouvrir ou fermer les volets selon leur orientation pour chauffer ou rafraichir la pièce

Il faudra personnaliser votre localisation GPS ici

image

image

Il faut Ă©galement avoir installĂ© via « Manage palette Â»

image

le module « node-red-contrib-sun-position Â» via l’onglet « install Â»

image

La frĂ©quence d’injection mqtt est dĂ©fini dans le node « inject enhanced Â» ici 10mn (et qui dĂ©finit l’intervalle entre le lever et le coucher de soleil !)

image

Voila, j’espère que cela dépannera certains, c’est vrai que le couple Gladys Node-red solutionne bien des manques en attendant que les dévs adéquats soient implémentés ! :wink:
Bien sur en attendant que cette fonctionnalité soit de base dans Gladys ! :crazy_face:

8 Likes

Awesome!!! Thank you so much @cce66 :wink:
Perfect for my roller shutters!!!

hi @guim31,

I’ve modified the flow and used the « inject enhanced Â» which works (the « trigger Â» doesn’t) and which has the advantage of being able to be configured between sunrise and sunset!
I’ll look into creating additional nodes in Node-RED to configure the MQTT output based on shutter settings (orientation) and why not the up/down order of Shutter elements in Gladys!
This should give

If azimuth is between shutter X min AZ value and shutter X max AZ value then
If altitude is between shutter X min AL value and shutter X max AL value then
If Winter Month = true then
Send MQTT Open Shutter X to 100%
If Summer Month = true then
Send MQTT Close Shutter X to 100%
Else
Send MQTT Open Shutter X to 50%

This should completely cover the gap and allow for significant energy savings

Afterwards I’ll create another mini-tutorial but to couple Gladys, Node-RED, MQTT and my X-4VR shutter modules coupled to my GCE IPX800 V5
https://www.gce-electronics.com/fr/carte-relais-ethernet-module-rail-din/1097-ipx800-v4-extension-4-volets-roulants-x-4vr-3760309690094.html

But I have a bit more work because the MQTT calls had to be modified since the mini-tutorial I had made no longer works (at least for me :! :slight_smile:)

1 Like

Voici le flow modifié pour controler les volets mqtt dans gladys selon la position du soleil et les mois via node-red :blush:
Le flow a importer dans node-red et Ă  adapter (identifiant mqtt et position geographique comme vu plus haut dans les messages)

[
    {
        "id": "dbd46647b51191ed",
        "type": "tab",
        "label": "Sun-Position",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "a0d0e562.7ad1d8",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 1",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 580,
        "y": 240,
        "wires": []
    },
    {
        "id": "9cc2d51.4ac0828",
        "type": "change",
        "z": "dbd46647b51191ed",
        "name": "azimuth",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.azimuth",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 580,
        "y": 300,
        "wires": [
            [
                "0a17f9d94c9dae35",
                "ddf8b5e66052a4dc"
            ]
        ]
    },
    {
        "id": "28e91.9d63d16f6",
        "type": "change",
        "z": "dbd46647b51191ed",
        "name": "altitude  .",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.altitude",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 580,
        "y": 520,
        "wires": [
            [
                "ae57174554627c71",
                "5b085e1b.4ec8a"
            ]
        ]
    },
    {
        "id": "e921e01a.a0fa3",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "payload",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1520,
        "y": 440,
        "wires": []
    },
    {
        "id": "e866e950.a7f798",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "payload",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 1080,
        "y": 220,
        "wires": []
    },
    {
        "id": "5b085e1b.4ec8a",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "payload",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 760,
        "y": 580,
        "wires": []
    },
    {
        "id": "56265aeb.99f034",
        "type": "sun-position",
        "z": "dbd46647b51191ed",
        "name": "",
        "positionConfig": "2831ba70.55a636",
        "rules": [
            {
                "valueLow": "0",
                "valueLowType": "num",
                "valueHigh": "360",
                "valueHighType": "num"
            }
        ],
        "onlyOnChange": "true",
        "topic": "",
        "outputs": 2,
        "start": "sunsetStart",
        "startType": "pdsTime",
        "startOffset": 0,
        "startOffsetType": "num",
        "startOffsetMultiplier": 60000,
        "end": "sunriseEnd",
        "endType": "pdsTime",
        "endOffset": 0,
        "endOffsetType": "num",
        "endOffsetMultiplier": 60000,
        "x": 370,
        "y": 400,
        "wires": [
            [
                "a0d0e562.7ad1d8",
                "9cc2d51.4ac0828",
                "28e91.9d63d16f6"
            ],
            [
                "58367a9aedab25dc"
            ]
        ]
    },
    {
        "id": "8eee70dd77c1369c",
        "type": "mqtt out",
        "z": "dbd46647b51191ed",
        "name": "",
        "topic": "",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "3c3eb52d.9fb296",
        "x": 1330,
        "y": 400,
        "wires": []
    },
    {
        "id": "0a17f9d94c9dae35",
        "type": "function",
        "z": "dbd46647b51191ed",
        "name": "azimuth arrondi entier",
        "func": "/*  Affecte Ă  la variable varAzimuth la valeur arrondie de Azimuth de sun-position */\nlet varflowAzimuth = Math.round(msg.payload);\n\n/*  Affecte Ă  la variable globale varContextAzimuth la valeur de varAzimuth */\nflow.set(\"varFlowAzimuth\", varflowAzimuth);\n\n/* affecte le topic et payload de msg*/\nmsg.topic = \"gladys/master/device/mqtt:soleil/feature/mqtt:azimuth/state\";\nmsg.payload = varflowAzimuth;\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 800,
        "y": 300,
        "wires": [
            [
                "e866e950.a7f798",
                "b81561e463751087",
                "d1588b32167b06a7",
                "c4f9d7b9c239cb40",
                "d2c0c56b22042616"
            ]
        ]
    },
    {
        "id": "ddf8b5e66052a4dc",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "payload",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 760,
        "y": 240,
        "wires": []
    },
    {
        "id": "ae57174554627c71",
        "type": "function",
        "z": "dbd46647b51191ed",
        "name": "altitude arrondi entier",
        "func": "/*  Affecte Ă  la variable varAltitude la valeur arrondie de Altitude de sun-position */\nlet varFlowAltitude = Math.round(msg.payload);\n\n/*  Affecte Ă  la variable globale varContextAltitude la valeur de varAltitude */\nflow.set(\"varFlowAltitude\", varFlowAltitude);\n\n/* affecte le topic et payload de msg*/\nmsg.topic = \"gladys/master/device/mqtt:soleil/feature/mqtt:altitude/state\";\nmsg.payload = varFlowAltitude;\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 800,
        "y": 520,
        "wires": [
            [
                "7999acaff2c5f870",
                "b81561e463751087",
                "d1588b32167b06a7",
                "c4f9d7b9c239cb40",
                "8ea45d375a4adde2"
            ]
        ]
    },
    {
        "id": "58367a9aedab25dc",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "debug 5",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 580,
        "y": 580,
        "wires": []
    },
    {
        "id": "664b1852987e09be",
        "type": "time-inject",
        "z": "dbd46647b51191ed",
        "name": "Période et Intervalle d'injection .",
        "nameInt": "¹sunrise start - sunset end = timestamp ↻10min",
        "positionConfig": "2831ba70.55a636",
        "props": [
            {
                "p": "",
                "pt": "msgPayload",
                "v": "",
                "vt": "date",
                "o": "",
                "oT": "none",
                "oM": "60000",
                "f": 0,
                "fS": 0,
                "fT": "UNIX timestamp (ms)",
                "fI": "0",
                "next": true,
                "days": "*",
                "months": "*",
                "onlyOddDays": false,
                "onlyEvenDays": false,
                "onlyOddWeeks": false,
                "onlyEvenWeeks": false
            },
            {
                "p": "",
                "pt": "msgTopic",
                "v": "",
                "vt": "str",
                "o": "",
                "oT": "none",
                "oM": "60000",
                "f": 0,
                "fS": 0,
                "fT": "UNIX timestamp (ms)",
                "fI": "0",
                "next": false,
                "days": "*",
                "months": "*",
                "onlyOddDays": false,
                "onlyEvenDays": false,
                "onlyOddWeeks": false,
                "onlyEvenWeeks": false
            }
        ],
        "injectTypeSelect": "interval-time",
        "intervalCount": "10",
        "intervalCountType": "num",
        "intervalCountMultiplier": 60000,
        "cron": "",
        "cronType": "cronexpr",
        "time": "sunriseStart",
        "timeType": "pdsTime",
        "offset": 0,
        "offsetType": "none",
        "offsetMultiplier": 60000,
        "timeEnd": "sunsetEnd",
        "timeEndType": "pdsTime",
        "timeEndOffset": 0,
        "timeEndOffsetType": "none",
        "timeEndOffsetMultiplier": 60000,
        "timeDays": "*",
        "timeOnlyOddDays": false,
        "timeOnlyEvenDays": false,
        "timeOnlyOddWeeks": false,
        "timeOnlyEvenWeeks": false,
        "timeMonths": "*",
        "timedatestart": "",
        "timedateend": "",
        "property": "",
        "propertyType": "none",
        "propertyCompare": "true",
        "propertyThreshold": "",
        "propertyThresholdType": "num",
        "timeAlt": "",
        "timeAltType": "entered",
        "timeAltDays": "*",
        "timeAltOnlyOddDays": false,
        "timeAltOnlyEvenDays": false,
        "timeAltOnlyOddWeeks": false,
        "timeAltOnlyEvenWeeks": false,
        "timeAltMonths": "*",
        "timeAltOffset": 0,
        "timeAltOffsetType": "none",
        "timeAltOffsetMultiplier": 60000,
        "once": true,
        "onceDelay": 0.1,
        "recalcTime": 2,
        "x": 160,
        "y": 400,
        "wires": [
            [
                "56265aeb.99f034"
            ]
        ]
    },
    {
        "id": "b81561e463751087",
        "type": "function",
        "z": "dbd46647b51191ed",
        "name": "volet 1 -  ouvre Az  55 Ă  230 / Alt 20 a 90",
        "func": "let varAltitude = flow.get(\"varFlowAltitude\");\nlet varAzimuth  = flow.get(\"varFlowAzimuth\");\n\n/* definit la position du volet */\nlet varAzimuthMinVoletOuvre = 55;\nlet varAzimuthMaxVoletOuvre = 230;\nlet varAltitudeMinVoletOuvre = 20;\nlet varAltitudeMaxVoletOuvre = 90;\n\n/* affecte le topic au mqtt du volet crée et defini dans gladys */\nmsg.topic = \"gladys/master/device/mqtt:volet1/feature/mqtt:volet1/state\";\n\n\n/* Récupère le numéro du mois */\nvar dateGlobale = new Date();\nvar noMois = dateGlobale.getUTCMonth() + 1;\n\nmsg.payload = \"0\";\nif (varAzimuth > varAzimuthMinVoletOuvre && varAzimuth < varAzimuthMaxVoletOuvre) {\n  if (varAltitude > varAltitudeMinVoletOuvre && varAltitude < varAltitudeMaxVoletOuvre) {\n    /* ouvre ou ferme le volet selon la saison et l'orientation du volet (nord, sud etc) */\n    if (noMois > 4 && noMois < 10) {\n         /* ici d'avril a octobre le volet est ouvert à 100% */\n         msg.payload = \"100\";\n       } else {\n         /* ici de novembre a mars le volet est ouvert à 0% */\n         msg.payload = \"0\";\n    }\n  }\n}\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1190,
        "y": 300,
        "wires": [
            [
                "8eee70dd77c1369c",
                "e921e01a.a0fa3",
                "98dff73cf45fc459"
            ]
        ]
    },
    {
        "id": "d1588b32167b06a7",
        "type": "function",
        "z": "dbd46647b51191ed",
        "name": "volet 2 -  ouvre Az   75 Ă  180 / Alt 20 a 90",
        "func": "let varAltitude = flow.get(\"varFlowAltitude\");\nlet varAzimuth = flow.get(\"varFlowAzimuth\");\n\nlet varAzimuthMinVoletOuvre = 75;\nlet varAzimuthMaxVoletOuvre = 180;\nlet varAltitudeMinVoletOuvre = 20;\nlet varAltitudeMaxVoletOuvre = 90;\n\nmsg.topic = \"gladys/master/device/mqtt:volet2/feature/mqtt:volet2/state\";\n\n/* Récupère le numéro du mois */\nvar dateGlobale = new Date();\nvar noMois = dateGlobale.getUTCMonth() + 1;\n\nmsg.payload = \"0\";\nif (varAzimuth > varAzimuthMinVoletOuvre && varAzimuth < varAzimuthMaxVoletOuvre) {\n  if (varAltitude > varAltitudeMinVoletOuvre && varAltitude < varAltitudeMaxVoletOuvre) {\n    /* ouvre ou ferme le volet selon la saison et l'orientation du volet (nord, sud etc) */\n    if (noMois > 4 && noMois < 10) {\n      /* ici d'avril a octobre le volet est ouvert à 100% */\n      msg.payload = \"100\";\n    } else {\n      /* ici de novembre a mars le volet est ouvert à 0% */\n      msg.payload = \"0\";\n    }\n  }\n}\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1190,
        "y": 520,
        "wires": [
            [
                "8eee70dd77c1369c",
                "e921e01a.a0fa3",
                "98dff73cf45fc459"
            ]
        ]
    },
    {
        "id": "7999acaff2c5f870",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "payload",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 1080,
        "y": 640,
        "wires": []
    },
    {
        "id": "c4f9d7b9c239cb40",
        "type": "mqtt out",
        "z": "dbd46647b51191ed",
        "name": "",
        "topic": "",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "3c3eb52d.9fb296",
        "x": 890,
        "y": 400,
        "wires": []
    },
    {
        "id": "d2c0c56b22042616",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "topic",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "topic",
        "statusType": "msg",
        "x": 1070,
        "y": 160,
        "wires": []
    },
    {
        "id": "8ea45d375a4adde2",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "topic",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "topic",
        "statusType": "msg",
        "x": 1070,
        "y": 580,
        "wires": []
    },
    {
        "id": "98dff73cf45fc459",
        "type": "debug",
        "z": "dbd46647b51191ed",
        "name": "topic",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "topic",
        "statusType": "msg",
        "x": 1510,
        "y": 360,
        "wires": []
    },
    {
        "id": "2831ba70.55a636",
        "type": "position-config",
        "name": "Maison",
        "isValide": "true",
        "angleType": "deg",
        "timeZoneOffset": "99",
        "timeZoneDST": "0",
        "stateTimeFormat": "3",
        "stateDateFormat": "12",
        "contextStore": ""
    },
    {
        "id": "3c3eb52d.9fb296",
        "type": "mqtt-broker",
        "name": "MQTT Broker Gladys",
        "broker": "192.168.0.125",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "compatmode": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

le résultat graphique du flow

la création des objets volets dans mqtt

et la visu de la position des volets dans un dashboard volets qui affiche aussi les valeurs azimuth et altitude (réutilisable dans les scénarios de gladys)

le paramétrage des volets se fait dans le code (ou dans les scénarios de gladys !)

image

Voila il reste plus qu’à adapter a vos configs ! :wink:

2 Likes