Integration von Feiertagen

Kalenderanbindung wäre super. Stichwort Feiertage aber auch Stichwort Ferien für die, die Kinder haben oder selbst noch zur Schule gehen :joy:

Dann lass dein like oben (Herz)

1 „Gefällt mir“

Hallo,

falls jemand Interesse hat: Aktuell versuchen wir ja alles, was homee von Haus aus nicht kann, über Nodered abzubilden.

Wie weiter oben schon geschrieben habe ich schon lange eine Lösung (oder soll ich besser sagen eine “Krücke”) umgesetzt, um das in homee abzubilden:

Das habe ich jetzt weiterentwickelt und vollständig automatisiert über iobroker und Nodered mit einem virtuellen Gerät in homee.

Dazu verwende ich in iobroker drei Adapter: “Deutsche Feiertage”, “iCal Calendar” und “schoolfree”, einen Flow in Nodered und einen virtuellen Schalter, der an freien Tagen eingeschaltet wird. Darüber schaffe ich es jetzt, dass neben Samstagen und Sonntagen auch Feiertage, Schulferien und im Familienkalender als “Urlaub” gekennzeichnete Tage automatisch als freier Tag in homee berücksichtigt werden und die Steuerungen (Rolllanden, Heizung, Licht) automatisch daran angepasst werden.

Bei Interesse stelle ich gerne den Nodered-Flow zur Verfügung.

Viele Grüße, Dieter

2 „Gefällt mir“

Dieter , sehr gerne stell deinen Flow mal bitte ein :+1:

Gerne, ja. Hab mir vor Zeiten auch mal so eine Krücke gebaut. War ganz überrascht, als ich das zugehörige Hilfs-HG neulich gefunden habe. :wink:

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.

2 „Gefällt mir“

prima wie sieht das weekday node bei dir aus

Sorry, das hatte ich ganz übersehen. Das ist der node “node-red-contrib-weekday”. Ich ergänze das oben noch.

genau das habe ich schon…nur wo hast du die Päckchen gesetzt?

Ach so, die sind von Sonntag bis Donnerstag gesetzt (nächster Tag ist ein Werktag).

Ok super danke !!!

Hab’s über Sirene gelöst

1 „Gefällt mir“

sagt mal wie würdet ihr das lösen…und zwar habe ich weitere Kalender in ical hinterlegt…

wie sollte ich die einbauen bzw. wo könnte ich die einbauen…

hier mal meine Kalender aus iCal… da sind eben auch Schin bewegliche Ferientage etc. mit drin…

Deshalb gehe ich hier nicht über scoolfree.

Du kannst alle Objekte aus iobroker mit den iobroker-in Node im nodered nutzen.

Ich nutze einen Merker für Urlaub und einen für Feiertag. Die Daten kommen aus iCal und dem Feiertagadapter.

Ja das ist mir klar… aktuell habe ich das über den Node In Urlaub von oben gemacht , allerdings eben nur mit einem Objekt „Faschingsferien“… aber die anderen Objekte fehlen eben noch…

Kann ich ja nicht einfach an die andere dran hängen …

Ich weiß nicht ob ich das richtig verstanden habe. Du musst für jede Rückmeldung einen Event im iCal anlegen. Diesen bekommst du dann als Objekt. Oder was meinst du?

Nein - also bisher reagiert der Flow von @shamrock bei mir nur auf Faschingsferien unter dem NODE in URLAUB.

ich möchte aber , dass die anderen Objekte( von meinem Screenshot oben) auch in das Node Urlaub miteinbezogen werden.

Dann ziehe doch alle Events mit heran und werte wie du es jetzt sicherlich auch schon machst true oder false aus.

Hast du den Flow auch installiert?

habs mal so gemacht und “Block unlesss value changhes”

Habe den Flow selber nicht laufen, aber so meinte ich es. Du musst nur aufpassen, dass nicht mehrere Events an einem Tag melden sonst wird im Zweifelsfall aus nem True durch ein 2. Event ein false und anders herum.

So ist es genau das war / ist mein Problem … wobei Ferien ja nicht zeitgleich sind …