Gerne, hier ist er.
Ich habe wieder direkt in den Funktionen und Kommentaren kurze Beschreibungen gepackt. Es steht direkt drin, welche Adapter im ioBroker benötigt werden und was dort eingestellt werden muss. Ich verwende dann drei Flow-Variablen zum Zwischenspeichern, das ist ebenfalls beschrieben.
Am Besten nach dem Einstellen des Flows die Adapter kurz stoppen und wieder starten, dann werden die Variablen zeitnah erstellt. Ansonsten kann es bis zu 24h dauern.
Der Flow muss natürlich an die eigenen Bedürfnisse angepasst werden. Bei mir wird er (wie in dem Beitrag oben beschrieben) immer um 19:55 Uhr getriggert, da ich ab 20:00 Uhr schon unterschiedlich schalte, je nachdem ob am Folgetag ein Arbeitstag oder ein freier Tag ist.
[
{
"id": "5199f2d0.c3cdcc",
"type": "homeeDevice",
"z": "8cf60062.2f7c9",
"virtual-homee": "",
"name": "Freier Tag",
"nodeId": "10",
"profile": "16",
"icon": "nodeicon_bulb",
"attributes": "[{\"id\":100,\"node_id\":10,\"instance\":0,\"minimum\":0,\"maximum\":1,\"current_value\":0,\"target_value\":0,\"last_value\":0,\"unit\":\"\",\"step_value\":1,\"editable\":1,\"type\":1,\"state\":1,\"last_changed\":12345555,\"changed_by\":1,\"changed_by_id\":0,\"based_on\":1,\"data\":\"\"}]",
"x": 810,
"y": 200,
"wires": [
[]
]
},
{
"id": "2f49796e.9bfae6",
"type": "ioBroker in",
"z": "8cf60062.2f7c9",
"name": "Feiertag morgen?",
"topic": "feiertage.0.tomorrow.boolean",
"payloadType": "value",
"onlyack": "",
"func": "all",
"gap": "",
"x": 150,
"y": 79,
"wires": [
[
"17b12fe5.8e577"
]
]
},
{
"id": "3830e4fe.fdb54c",
"type": "ioBroker in",
"z": "8cf60062.2f7c9",
"name": "Schulfrei morgen?",
"topic": "schoolfree.0.info.tomorrow",
"payloadType": "value",
"onlyack": "",
"func": "all",
"gap": "",
"x": 150,
"y": 131,
"wires": [
[
"6063796e.9be1c8"
]
]
},
{
"id": "e3542dda.a8fa4",
"type": "weekday",
"z": "8cf60062.2f7c9",
"name": "Wochentag/Wochenende",
"sun": true,
"mon": true,
"tue": true,
"wed": true,
"thu": true,
"fri": false,
"sat": false,
"x": 390,
"y": 240,
"wires": [
[
"17b9aa6f.49e1fe"
],
[
"d575491f.f2c46"
]
],
"info": "Montag bis Freitag: Auswerten der Flow-Variablen\nSamstag und Sonntag: Ist immer ein freier Tag"
},
{
"id": "252cece1.8c5b54",
"type": "inject",
"z": "8cf60062.2f7c9",
"name": "Täglich 19:55 Uhr",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "",
"crontab": "55 19 * * *",
"once": false,
"onceDelay": 0.1,
"x": 150,
"y": 240,
"wires": [
[
"e3542dda.a8fa4"
]
]
},
{
"id": "17b12fe5.8e577",
"type": "function",
"z": "8cf60062.2f7c9",
"name": "Feiertag?",
"func": "// setzen der Flow-Variable \"feiertag\" auf true\n// wenn morgen ein Feiertag ist.\n// Die Anzeige des Nodes wird ebenfalls angepasst\n\nvar feiertag=flow.get('feiertag') || false;\nvar status_fill = \"blue\";\nvar status_text = \"false\";\nif (msg.payload == \"true\") {\n feiertag = true\n status_fill = \"green\";\n status_text = \"true\";\n}\nelse {\n feiertag = false\n}\nflow.set('feiertag',feiertag);\nnode.status({fill:status_fill,shape:\"dot\",text:status_text});\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 340,
"y": 60,
"wires": [
[]
]
},
{
"id": "6063796e.9be1c8",
"type": "function",
"z": "8cf60062.2f7c9",
"name": "Schulfrei?",
"func": "// setzen der Flow-Variable \"schulfrei\" auf true\n// wenn morgen ein Ferientag ist.\n// Die Anzeige des Nodes wird ebenfalls angepasst\n\nvar schulfrei=flow.get('schulfrei') || false;\nvar status_fill = \"blue\";\nvar status_text = \"false\";\nif (msg.payload == \"true\") {\n schulfrei = true\n status_fill = \"green\";\n status_text = \"true\";\n}\nelse {\n schulfrei = false\n}\nflow.set('schulfrei',schulfrei);\nnode.status({fill:status_fill,shape:\"dot\",text:status_text});\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 340,
"y": 120,
"wires": [
[]
]
},
{
"id": "17b9aa6f.49e1fe",
"type": "function",
"z": "8cf60062.2f7c9",
"name": "Freier Tag?",
"func": "// für Montag bis Freitag\n// es werden die Flow-Variablen \"feiertag\", \"schulfrei\"\n// und \"freier_tag\" ausgewertet, ob morgen frei ist\n// (obwohl Feiertag ist)\n// Die Anzeige des Nodes wird ebenfalls angepasst\n\nvar feiertag=flow.get('feiertag') || false;\nvar freier_tag=flow.get('freier_tag') || false;\nvar schulfrei=flow.get('schulfrei') || false;\nvar payload = { id:100, value: 0}\nif (feiertag === true || schulfrei === true || freier_tag === true) {\n payload.value = 1\n}\nmsg.payload = payload\nif (payload.value === 1) {\n node.status({fill:\"green\",shape:\"dot\",text:\"Freier Tag: Ja\"});\n}\nelse {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Freier Tag: Nein\"});\n}\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 610,
"y": 180,
"wires": [
[
"5199f2d0.c3cdcc"
]
]
},
{
"id": "55d342f5.6afe5c",
"type": "comment",
"z": "8cf60062.2f7c9",
"name": "Node",
"info": "# Freier Tag\n\nFolgende **Adpater** werden in iobroker benötigt:\n\n**1. Deutsche Feiertage**\nIn der Instanz die gewünschten Feiertage auswählen.\n1x täglich wird dann im Flow eine Variable \"feiertag\" geschrieben, ob morgen ein Feiertag ist\n\n**2. iCal Calendar**\nIn der Instanz dann unter Kalender die Kalender-Url eintragen (in meinem Fall ein Nextcloud-Kalender mit Terminen für die ganze Familie) und unter Ereignissen \"Urlaub\" anlegen.\n1x täglich wird dann im Flow eine Variable \"freier_tag\" geschrieben, wenn am nächsten Tag ein Kalendereintrag \"Urlaub\" existiert\n\n**3. schoolfree**\nIn der Instanz dann das Bundesland auswählen.\n1x täglich wird dann im Flow eine Variable \"schulfrei\" geschrieben, ob morgen ein Schulferientag ist",
"x": 80,
"y": 40,
"wires": []
},
{
"id": "e23bfa2a.7bd0a8",
"type": "inject",
"z": "8cf60062.2f7c9",
"name": "Nach Flow-Start",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"x": 150,
"y": 280,
"wires": [
[
"e3542dda.a8fa4"
]
]
},
{
"id": "d575491f.f2c46",
"type": "change",
"z": "8cf60062.2f7c9",
"name": "Freier Tag!",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"id\":100,\"value\":1}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 610,
"y": 240,
"wires": [
[
"5199f2d0.c3cdcc"
]
]
},
{
"id": "ea816109.2029c",
"type": "ioBroker in",
"z": "8cf60062.2f7c9",
"name": "Urlaub",
"topic": "ical.0.events.1.Urlaub",
"payloadType": "value",
"onlyack": "",
"func": "all",
"gap": "",
"x": 110,
"y": 180,
"wires": [
[
"31474421.16a604"
]
]
},
{
"id": "31474421.16a604",
"type": "function",
"z": "8cf60062.2f7c9",
"name": "freier Tag?",
"func": "// setzen der Flow-Variable \"freier_tag\" auf true\n// wenn morgen \"Urlaub\" im Kalender eingetragen ist\n// Die Anzeige des Nodes wird ebenfalls angepasst\n\nvar freiertag=flow.get('freier_tag') || false;\nvar status_fill = \"blue\";\nvar status_text = \"false\";\nif (msg.payload == \"true\") {\n freiertag = true\n status_fill = \"green\";\n status_text = \"true\";\n}\nelse {\n freiertag = false\n}\nflow.set('freier_tag',freiertag);\nnode.status({fill:status_fill,shape:\"dot\",text:status_text});\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 350,
"y": 180,
"wires": [
[]
]
}
]
Neben den drei ioBroker-Adpatern und dem homee-Node wird im Flow noch der node „node-red-contrib-weekday“ verwendet.
Viel Spaß und viel Erfolg mit dem Flow, Dieter
Update: Ich habe den Flow nochmal angepasst, ich hatte zu Testzwecken noch ein Debug-Node drin, den habe ich entfernt.
Update2: Node „node-red-contrib-weekday“ ergänzt.