Blog Tutorial

Homematic – Withings Sleep in die Hausautomatisierung einbinden

Letzte Aktualisierung am 24. Februar 2024

Die Schlafsensormatte Sleep von Withings erkennt sehr zuverlässig die Momente des zu Bett Gehens und Aufstehens. Nachfolgend zeige ich, wie ich sie bei mir als Sensor in die Homematic eingebunden habe und ergänzend meine Shelly Lampen nutze.

Anmerkungen

Als beispielhafter Anwendungsfall soll das Licht im Schlafzimmer ausgehen, wenn man sich nachts in das Bett begibt und sich beim Aufstehen, sofern es noch dunkel ist, automatisch einschalten.

Die Withings Sleep kann zwar anscheinend auch über die Withings API eingebunden werden, was ich dazu bislang gelesen hatte, hat mich aber nicht wirklich überzeugt. Ich habe daher den Weg über IFTTT gewählt, jedoch auf eine eher „unkonventionelle“ Art und Weise.

Wer z.B. Shelly-, Hue- oder Yeelight-Lampen einsetzt, kann diese direkt über IFTTT steuern. Auch Alexa-Nutzer können mit IFTTT-Triggern diverse Lampen einbinden. Allerdings dürfte dabei recht schnell ein kostenpflichtiger IFTTT-Account erforderlich werden.

Eine direkte Einbindung von Homematic in IFTTT ist Stand Februar 2024 wohl nach wie vor nicht möglich.

Um die Einbindung der CCU dennoch zu realisieren, kann Node-RED verwendet werden, das mit dem Add-On RedMatic für CCU 3 und RaspberryMatic verfügbar ist. Wie das für die Withings Sleep mit Pushbullet realisiert werden kann, ist weiter unten beschrieben.

Da mich an Pushbullet in Verbindung mit IFTTT störte, dass man es bei mehreren Tagen Inaktivität (Urlaub etc.) wieder manuell in IFTTT reaktivieren muss, bin ich vor einem Jahr auf ein Verfahren mittels IFTTT Webhook und Mediola aio Creator NEO umgestiegen. Dabei habe ich auch eine Shelly Bulb Duo RGBW mit eingebunden.

Seit Ende Februar 2024 sind Webhooks in IFTTT aber nur noch für Pro-Nutzer verfügbar und damit kostenpflichtig. Weil das meine einzige IFTTT-Nutzung ist, für die ich keinen Pro-Account einrichten und bezahlen wollte, bin zurück zum hier beschriebenen Verfahren mittels Pushbullet gewechselt, habe diesen Artikel aus der „Obsoleszenz“ geholt und entsprechend angepasst.

Es gibt Node-Red Knoten, die IFTTT direkt in Node-Red einbinden, die meisten haben jedoch nur einen Trigger nach IFTTT. Lediglich der node-red-contrib-ifttt-broker bietet derzeit die Möglichkeit, einen Trigger von IFTTT einzubinden. Hierzu braucht IFTTT aber einen http- oder https-Zugang zu dem Gerät, auf dem Node-Red installiert ist (also der CCU). Da dies für mich aus Sicherheitsgründen grenzwertig ist, habe ich einen Umweg über Pushbullet gewählt. Die sich dadurch ergebenden leichten Verzögerungen von wenigen Sekunden sind für viele Anwendungsfälle hinnehmbar.

Die Shelly Lampe lässt sich dabei in Node-Red sehr einfach über http-Requests steuern.

Voraussetzungen für die Umsetzung dieses Projekts sind Accounts bei IFTTT und Pushbullet.

In RedMatic müssen folgende Knoten zusätzlich installiert sein/werden:

IFTTT

Zunächst werden in IFTTT zwei Withings Sleep Applets wie folgt eingerichtet…

Node-Red

Die so an Pushbullet versandten Nachrichten,…

…kann man mit dem node-red-node-pushbullet Eingangsknoten in Node-Red unmittelbar auswerten.

Nachdem im node-red-node-pushbullet Knoten der eigene Pushbullet Access-Token eingetragen wurde, gibt er die eingehenden Nachrichten an den node-red-contrib-sun-position Knoten weiter.

Dort werden unter „Konfiguration“ die Koordinaten eingetragen und Start sowie Ende nach Wunsch konfiguriert. Bei Bedarf kann man noch einen Offset eintragen…

Über den oberen Ausgang wird die Nachricht bei zutreffender Bedingung, über den unteren bei nicht zutreffender Bedingung weitergegeben. Da die Lampe nur bei Dunkelheit geschaltet werden soll, wird der obere Ausgang gewählt…

Der folgende Switch Knoten filtert die Pusbullet-Nachrichten nach dem Inhalt der Kopfzeile (topic)…

Am Ausgang 1 (Hinlegen) geben wir mit dem anschließenden Change Knoten den Payload „false“ (Aktor ausschalten) weiter…

Am Ausgang 2 (Aufstehen) entsprechend „true“ (Aktor einschalten).

Die HomeMatic value-Knoten werden wie folgt konfiguriert…

Im Beispiel werden beim Hinlegen beide Leuchten ausgeschaltet, beim Aufstehen wird nur die Stehleuchte eingeschaltet.

Shelly

Um eine Shelly Bulb einzubinden, können http-Anfragen auf die Shelly API genutzt werden, die in Node-Red über http-Anforderungen ausgerufen werden.

Im folgenden Beispiel werden nach dem zu Bett gehen – sofern es draußen dunkel ist – die Homematic Leuchten direkt ausgeschaltet. Die Shelly Bulb erhält eine angenehme, dunkelgelbe Farbe, wird auf 10 % gedimmt und nach 45 Sekunden ausgeschaltet. Beim Aufstehen während der Dunkelheit erhält sie nochmals die gleichen Farb- und Dimmwerte (falls zwischenzeitlich von extern daran nochmal etwas geändert wurde) und wird dauerhaft eingeschaltet. Begibt man sich wieder zur Ruhe, wird das Ausschalten erneut getriggert und die Lampe geht nach 45 Sekunden aus….

Im Screenshot ist beispielhaft der Aufruf für das Ausschalten der hier verwendeten Duo RGBW gezeigt. Im oben abgebildeten Flow werden folgende beiden URL genutzt:

ZweckURL
Einschalten, Dimmen und Farbwahl (Aufstehen)http://n.n.n.n/color/0?turn=on&gain=10&red=236&green=99&blue=1
Einschalten, Dimmen, Farbwahl und Ausschalttimer (Hinlegen)http://n.n.n.n/color/0?turn=on&gain=10&red=236&green=99&blue=1&timer=45

Beispiel-Flows

Das Vorgehen über Pushbullet lässt sich auf alle möglichen, in IFTTT verfügbare Trigger und individuelle Zwecke anpassen.

Hier zwei Beispiel-Flows, ohne…

[
    {
        "id": "f953c3c6.2aa548",
        "type": "tab",
        "label": "Licht bei Bettruhe",
        "disabled": false,
        "info": ""
    },
    {
        "id": "24cb24ce.ef6a14",
        "type": "pushbullet in",
        "z": "f953c3c6.2aa548",
        "config": "2d53efc7.e061c",
        "name": "",
        "x": 80,
        "y": 140,
        "wires": [
            [
                "50ed165.b2ca9e8"
            ]
        ]
    },
    {
        "id": "96f77a64.2d0088",
        "type": "switch",
        "z": "f953c3c6.2aa548",
        "name": "Schlafen oder Aufstehen?",
        "property": "topic",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "Bedtime detection",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Out of bed detection",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 620,
        "y": 140,
        "wires": [
            [
                "37450f7f.2d2178"
            ],
            [
                "c7d4df41.0d4a08"
            ]
        ]
    },
    {
        "id": "c7d4df41.0d4a08",
        "type": "change",
        "z": "f953c3c6.2aa548",
        "name": "einschalten",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 180,
        "wires": [
            [
                "55507308.4c2144"
            ]
        ]
    },
    {
        "id": "55507308.4c2144",
        "type": "ccu-value",
        "z": "f953c3c6.2aa548",
        "name": "Schlafzimmer Stehlampe",
        "iface": "BidCos-RF",
        "channel": "ABC1234567:1 Schlafzimmer Stehlampe:1",
        "datapoint": "STATE",
        "mode": "",
        "start": true,
        "change": true,
        "cache": false,
        "queue": false,
        "on": 0,
        "onType": "undefined",
        "ramp": 0,
        "rampType": "undefined",
        "working": false,
        "ccuConfig": "38263145.35ea0e",
        "topic": "${CCU}/${Interface}/${channel}/${datapoint}",
        "x": 1110,
        "y": 100,
        "wires": [
            []
        ]
    },
    {
        "id": "18547a5b.02bb3e",
        "type": "ccu-value",
        "z": "f953c3c6.2aa548",
        "name": "Schlafzimmer Lampe Fensterbank",
        "iface": "BidCos-RF",
        "channel": "ABC1234568:1 Schlafzimmer Lampe Fensterbank:1",
        "datapoint": "STATE",
        "mode": "",
        "start": true,
        "change": true,
        "cache": false,
        "queue": false,
        "on": 0,
        "onType": "undefined",
        "ramp": 0,
        "rampType": "undefined",
        "working": false,
        "ccuConfig": "38263145.35ea0e",
        "topic": "${CCU}/${Interface}/${channel}/${datapoint}",
        "x": 1140,
        "y": 180,
        "wires": [
            []
        ]
    },
    {
        "id": "37450f7f.2d2178",
        "type": "change",
        "z": "f953c3c6.2aa548",
        "name": "ausschalten",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "false",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 100,
        "wires": [
            [
                "18547a5b.02bb3e",
                "55507308.4c2144"
            ]
        ]
    },
    {
        "id": "664d4611.52ae78",
        "type": "comment",
        "z": "f953c3c6.2aa548",
        "name": "Licht aus nach zu Bett gehen; Licht an nach Aufstehen",
        "info": "",
        "x": 230,
        "y": 60,
        "wires": []
    },
    {
        "id": "50ed165.b2ca9e8",
        "type": "within-time-switch",
        "z": "f953c3c6.2aa548",
        "name": "zwischen Sunset und Sunrise",
        "positionConfig": "6db036ad.18af",
        "startTime": "sunsetStart",
        "startTimeType": "pdsTime",
        "startOffset": "-30",
        "startOffsetType": "num",
        "startOffsetMultiplier": 60000,
        "endTime": "sunriseEnd",
        "endTimeType": "pdsTime",
        "endOffset": "30",
        "endOffsetType": "num",
        "endOffsetMultiplier": 60000,
        "propertyStart": "",
        "propertyStartType": "none",
        "propertyStartCompare": "true",
        "propertyStartThreshold": "",
        "propertyStartThresholdType": "num",
        "startTimeAlt": "",
        "startTimeAltType": "entered",
        "startOffsetAlt": 0,
        "startOffsetAltType": "none",
        "startOffsetAltMultiplier": 60000,
        "propertyEnd": "",
        "propertyEndType": "none",
        "propertyEndCompare": "true",
        "propertyEndThreshold": "",
        "propertyEndThresholdType": "num",
        "endTimeAlt": "",
        "endTimeAltType": "entered",
        "endOffsetAlt": 0,
        "endOffsetAltType": "none",
        "endOffsetAltMultiplier": 60000,
        "tsCompare": "0",
        "lastMsgOnStartOut": false,
        "lastMsgOnEndOut": false,
        "x": 290,
        "y": 140,
        "wires": [
            [
                "96f77a64.2d0088"
            ],
            []
        ]
    },
    {
        "id": "2d53efc7.e061c",
        "type": "pushbullet-config",
        "z": "",
        "name": ""
    },
    {
        "id": "38263145.35ea0e",
        "type": "ccu-connection",
        "z": "",
        "name": "localhost",
        "host": "localhost",
        "regaEnabled": true,
        "bcrfEnabled": true,
        "iprfEnabled": false,
        "virtEnabled": true,
        "bcwiEnabled": false,
        "cuxdEnabled": true,
        "regaPoll": true,
        "regaInterval": "30",
        "rpcPingTimeout": "60",
        "rpcInitAddress": "127.0.0.1",
        "rpcServerHost": "127.0.0.1",
        "rpcBinPort": "2047",
        "rpcXmlPort": "2048",
        "queueTimeout": "5000",
        "queuePause": "250",
        "contextStore": ""
    },
    {
        "id": "6db036ad.18af",
        "type": "position-config",
        "z": "",
        "name": "Berlin",
        "isValide": "true",
        "longitude": "0",
        "latitude": "0",
        "angleType": "deg",
        "timeZoneOffset": 99,
        "timeZoneDST": 0
    }
]

…und mit Shelly-Integration…

[
    {
        "id": "f953c3c6.2aa548",
        "type": "tab",
        "label": "Licht bei Bettruhe",
        "disabled": false,
        "info": ""
    },
    {
        "id": "24cb24ce.ef6a14",
        "type": "pushbullet in",
        "z": "f953c3c6.2aa548",
        "config": "2d53efc7.e061c",
        "name": "",
        "x": 80,
        "y": 220,
        "wires": [
            [
                "50ed165.b2ca9e8"
            ]
        ]
    },
    {
        "id": "96f77a64.2d0088",
        "type": "switch",
        "z": "f953c3c6.2aa548",
        "name": "Schlafen oder Aufstehen?",
        "property": "topic",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "Bedtime detection",
                "vt": "str"
            },
            {
                "t": "cont",
                "v": "Out of bed detection",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 580,
        "y": 220,
        "wires": [
            [
                "37450f7f.2d2178",
                "8ab03148.f29278"
            ],
            [
                "c7d4df41.0d4a08",
                "3bee8dcc.1cc1da"
            ]
        ]
    },
    {
        "id": "c7d4df41.0d4a08",
        "type": "change",
        "z": "f953c3c6.2aa548",
        "name": "einschalten",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 890,
        "y": 280,
        "wires": [
            []
        ]
    },
    {
        "id": "55507308.4c2144",
        "type": "ccu-value",
        "z": "f953c3c6.2aa548",
        "name": "Schlafzimmer Stehlampe",
        "iface": "BidCos-RF",
        "channel": "ABC1234567:1 Schlafzimmer Stehlampe:1",
        "datapoint": "STATE",
        "mode": "",
        "start": true,
        "change": true,
        "cache": false,
        "queue": false,
        "on": 0,
        "onType": "undefined",
        "ramp": 0,
        "rampType": "undefined",
        "working": false,
        "ccuConfig": "38263145.35ea0e",
        "topic": "${CCU}/${Interface}/${channel}/${datapoint}",
        "x": 1130,
        "y": 160,
        "wires": [
            []
        ]
    },
    {
        "id": "18547a5b.02bb3e",
        "type": "ccu-value",
        "z": "f953c3c6.2aa548",
        "name": "Schlafzimmer Lampe Fensterbank",
        "iface": "BidCos-RF",
        "channel": "ABC1234567:1 Schlafzimmer Lampe Fensterbank:1",
        "datapoint": "STATE",
        "mode": "",
        "start": true,
        "change": true,
        "cache": false,
        "queue": false,
        "on": 0,
        "onType": "undefined",
        "ramp": 0,
        "rampType": "undefined",
        "working": false,
        "ccuConfig": "38263145.35ea0e",
        "topic": "${CCU}/${Interface}/${channel}/${datapoint}",
        "x": 1160,
        "y": 220,
        "wires": [
            []
        ]
    },
    {
        "id": "37450f7f.2d2178",
        "type": "change",
        "z": "f953c3c6.2aa548",
        "name": "ausschalten",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "false",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 890,
        "y": 200,
        "wires": [
            [
                "18547a5b.02bb3e",
                "55507308.4c2144"
            ]
        ]
    },
    {
        "id": "664d4611.52ae78",
        "type": "comment",
        "z": "f953c3c6.2aa548",
        "name": "Licht aus nach zu Bett gehen; Licht an nach Aufstehen",
        "info": "",
        "x": 230,
        "y": 60,
        "wires": []
    },
    {
        "id": "50ed165.b2ca9e8",
        "type": "within-time-switch",
        "z": "f953c3c6.2aa548",
        "name": "zwischen Sunset und Sunrise",
        "positionConfig": "6db036ad.18af",
        "startTime": "sunsetStart",
        "startTimeType": "pdsTime",
        "startOffset": "-30",
        "startOffsetType": "num",
        "startOffsetMultiplier": 60000,
        "endTime": "sunriseEnd",
        "endTimeType": "pdsTime",
        "endOffset": "30",
        "endOffsetType": "num",
        "endOffsetMultiplier": 60000,
        "timeRestrictions": "",
        "timeRestrictionsType": "none",
        "timeDays": "*",
        "timeOnlyOddDays": true,
        "timeOnlyEvenDays": true,
        "timeMonths": "*",
        "timedatestart": "",
        "timedateend": "",
        "propertyStart": "",
        "propertyStartType": "none",
        "propertyStartCompare": "true",
        "propertyStartThreshold": "",
        "propertyStartThresholdType": "num",
        "startTimeAlt": "",
        "startTimeAltType": "entered",
        "startOffsetAlt": 0,
        "startOffsetAltType": "none",
        "startOffsetAltMultiplier": 60000,
        "propertyEnd": "",
        "propertyEndType": "none",
        "propertyEndCompare": "true",
        "propertyEndThreshold": "",
        "propertyEndThresholdType": "num",
        "endTimeAlt": "",
        "endTimeAltType": "entered",
        "endOffsetAlt": 0,
        "endOffsetAltType": "none",
        "endOffsetAltMultiplier": 60000,
        "tsCompare": "0",
        "x": 290,
        "y": 220,
        "wires": [
            [
                "96f77a64.2d0088"
            ],
            []
        ]
    },
    {
        "id": "3bee8dcc.1cc1da",
        "type": "http request",
        "z": "f953c3c6.2aa548",
        "name": "",
        "method": "GET",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "http://n.n.n.n/color/0?turn=on&gain=10&red=236&green=99&blue=1",
        "tls": "",
        "persist": false,
        "proxy": "",
        "authType": "",
        "x": 910,
        "y": 340,
        "wires": [
            []
        ]
    },
    {
        "id": "8ab03148.f29278",
        "type": "http request",
        "z": "f953c3c6.2aa548",
        "name": "",
        "method": "GET",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "http://n.n.n.n/color/0?turn=on&gain=10&red=236&green=99&blue=1&timer=45",
        "tls": "",
        "persist": false,
        "proxy": "",
        "authType": "",
        "x": 910,
        "y": 100,
        "wires": [
            []
        ]
    },
    {
        "id": "2d53efc7.e061c",
        "type": "pushbullet-config",
        "name": ""
    },
    {
        "id": "38263145.35ea0e",
        "type": "ccu-connection",
        "name": "localhost",
        "host": "localhost",
        "regaEnabled": true,
        "bcrfEnabled": true,
        "iprfEnabled": false,
        "virtEnabled": true,
        "bcwiEnabled": false,
        "cuxdEnabled": true,
        "regaPoll": true,
        "regaInterval": "30",
        "rpcPingTimeout": "60",
        "rpcInitAddress": "127.0.0.1",
        "rpcServerHost": "127.0.0.1",
        "rpcBinPort": "2047",
        "rpcXmlPort": "2048",
        "queueTimeout": "5000",
        "queuePause": "250",
        "contextStore": ""
    },
    {
        "id": "6db036ad.18af",
        "type": "position-config",
        "name": "Berlin",
        "isValide": "true",
        "longitude": "0",
        "latitude": "0",
        "angleType": "deg",
        "timeZoneOffset": "99",
        "timeZoneDST": "0",
        "stateTimeFormat": "3",
        "stateDateFormat": "12"
    }
]

Bitte beachten...

SMART WOHNEN in Stern's Haus ist ein rein privates, nicht kommerzielles Projekt. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“, Support kann ich nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis.
Die Verwendung meiner Hinweise, Anleitungen, Schaltungen und Software erfolgt auf eigenes Risiko. Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung! Für die Einhaltung der einschlägigen technischen Vorschriften ist jeder Anwender selbst verantwortlich!
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN in Stern's Haus | sternshaus.de
WordPress Cookie Plugin von Real Cookie Banner