<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HCU Archive - Smart home Ratgeber</title>
	<atom:link href="https://homeitems.de/category/hcu/feed/" rel="self" type="application/rss+xml" />
	<link>https://homeitems.de/category/hcu/</link>
	<description>Einfache Lösungen für zuhause mit Smart home items</description>
	<lastBuildDate>Sat, 31 Oct 2026 14:17:16 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://homeitems.de/wp-content/uploads/2020/10/cropped-wpicon_homeitems-32x32.jpg</url>
	<title>HCU Archive - Smart home Ratgeber</title>
	<link>https://homeitems.de/category/hcu/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 3</title>
		<link>https://homeitems.de/die-home-control-unit-hcu-in-node-red-integrieren-teil-3/</link>
					<comments>https://homeitems.de/die-home-control-unit-hcu-in-node-red-integrieren-teil-3/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sat, 31 Oct 2026 14:17:16 +0000</pubDate>
				<category><![CDATA[HCU]]></category>
		<category><![CDATA[Homematic IP]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=4784</guid>

					<description><![CDATA[<p>Im dritten Teil dieser Serie betrachte ich die von der HCU übermittelten Änderungen von Device-Informationen. Diese sollen zum einen zur Aktualisierung der gespeicherten HCU-Daten und zum anderen zur Ausgabe von Gerätänderungen verwendet werden. Um alles zu verstehen, ist es wichtig, mindestens den vorigen Beitrag der Serie zu lesen, da auch dieser darauf  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/die-home-control-unit-hcu-in-node-red-integrieren-teil-3/">Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 3</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">HCU</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-1"><p>Im dritten Teil dieser Serie betrachte ich die von der HCU übermittelten Änderungen von Device-Informationen. Diese sollen zum einen zur Aktualisierung der gespeicherten HCU-Daten und zum anderen zur Ausgabe von Gerätänderungen verwendet werden. Um alles zu verstehen, ist es wichtig, mindestens den vorigen Beitrag der Serie zu lesen, da auch dieser darauf aufbaut. Das wesentliche Dokument für alle folgenden Schritte ist auch die <a href="https://github.com/homematicip/connect-api/releases/download/1.0.1/connect-api-documentation-1.0.1.html">Homematic IP Connect API Dokumentation</a>.</p>
</div><div class="fusion-text fusion-text-2"><h2>HMIP System Events</h2>
<p>Wenn eine Plug-in-Message vom Typ „HMIP_SYSTEM_EVENT” ankommt – den unterscheide ich ab sofort auch im Switch-Node –, dann wurde auf der HCU irgendein Ereignis ausgelöst, welches die Änderung eines oder mehrerer Daten verursacht hat. Mehrere Änderungen ergeben sich beispielsweise, wenn ein Taster gedrückt wird und anschließend das Licht angeht oder auf eine bestimmte Helligkeit automatisch gedimmt wird. Die Änderungen befinden sich unter „body.eventTransaction.events” und zwar genau in der Reihenfolge, in der sie auch ausgeführt wurden.</p>
<p>Um ein Array von Objekten unter „body.eventTransaction.events” besser weiterverarbeiten zu können, teile ich dieses vorab mit einem Split-Node in seine Einzelteile auf. Der Split-Node macht aus einem Array eine Liste, d. h., jedes Objekt wird nun sequenziell weitergegeben.</p>
<p>Die Eigenschaften des Split-Nodes sind wie folgt:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/07/HCU-Split-Node-SYSTEM-Event.webp"><img fetchpriority="high" decoding="async" class="alignnone wp-image-4806 size-medium" src="https://homeitems.de/wp-content/uploads/2026/07/HCU-Split-Node-SYSTEM-Event-263x300.webp" alt="" width="263" height="300" srcset="https://homeitems.de/wp-content/uploads/2026/07/HCU-Split-Node-SYSTEM-Event-200x228.webp 200w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Split-Node-SYSTEM-Event-263x300.webp 263w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Split-Node-SYSTEM-Event-400x456.webp 400w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Split-Node-SYSTEM-Event-600x684.webp 600w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Split-Node-SYSTEM-Event.webp 684w" sizes="(max-width: 263px) 100vw, 263px" /></a></p>
<p>Für jedes Objekt in der Liste gibt es einen "pushEventType", der die Art des Ereignisse für das Objekt angibt, sowie das device, auf das sich das Event bezieht.</p>
<div>Folgenden Typen (<em>pushEventType</em>) sind anfangs interessant:</div>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left">pushEventType</th>
<th align="left">Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">DEVICE_CHANGED</td>
<td align="left">Mit diesem Type wird signalisiert, dass sich in einer Deice (einem Gerät) eine Änderung ergeben hat. I.d.R. sind das die für mich interessantesten Nachrichten.</td>
</tr>
<tr>
<td align="left">
<div class="table-1" style="--awb-margin-bottom:20px;"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span class="red-ui-debug-msg-object-value"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">DEVICE_CHANNEL_EVENT</span></span></span></span></div>
<div class="table-1" style="--awb-margin-bottom:20px;"></div>
</td>
<td align="left">Dieser Type ist nicht dokumentiert. Wenn er auftaucht, dann wurde ein Taster gedrückt (z.B. auf einem 6-Fach Taster). Das zugeörige Objekt liefert die deviceId, den ChannelIndex sowie den channelEventType mit z.B. <span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span class="red-ui-debug-msg-object-value"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"KEY_PRESS_SHORT"</span></span></span></span></td>
</tr>
<tr>
<td align="left">DEVICE_ADDED</td>
<td align="left">Ein Gerät wurde hinzugefügt (ist interessant, um es im Zwischenspeicher zu ergänzen)</td>
</tr>
<tr>
<td align="left">DEVICE_REMOVED</td>
<td align="left">Ein Gerät wurde gelöscht (ist interessant, um es im Zwischenspeicher zu löschen)</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-3"><p>In diesem Beispiel werde ich nur die Nachricht DEVICE_CHANGED verarbeiten. Nach dem gleichen Prinzip können auch alle anderen Nachrichten verarbeitet werden, um beispielsweise Geräte zu löschen oder hinzuzufügen.</p>
<h2>DEVICE_CHANGED-Nachricht verarbeiten</h2>
<p>Wenn die Nachricht (pushEventType) des Array-Eintrags den Typ „DEVICE_CHANGED” besitzt, weiß ich, dass es Änderungen an einem Gerät gab (z. B. wurde die Temperatur geändert). Mit diesen Daten kann ich anschließend die in der Flow-Variable „f_systemresponse” zwischengespeicherten HCU-Informationen aktualisieren, sodass ich in dieser Variablen immer die aktuellen Gerätedaten habe.</p>
<p>Das heißt, ich prüfe in einem Switch-Node, ob der pushEventType dem Wert „DEVICE_CHANGED” entspricht. Wenn ja, dann speichere ich den Device-Teil des Objekts mit einem Change-Node in der payload.msg. (Ich ergänze hier auch noch ein Topic, das ich später für einen Join-Node verwenden kann.)</p>
<p>Anschließend tausche ich in einem Funktionsknoten das alte Gerätsobjekt, das sich in „f_systemresponse” befindet, gegen das neue Gerätsobjekt aus. Im Function-Node „Device Änderungen” verwende ich folgenden Code:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-1 > .CodeMirror, .fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-1 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_1" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_1" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_1" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">const newDevice = msg.payload; // geändertes device
const deviceId = newDevice.id; // deviceID zur Suche verwenden
const data = flow.get("f_systemresponse"); // HC-Daten aus flow-Variable laden

//alle devices durchlaufen, bis deviceID übereinstimmt und diesen Teil dann austauschen
if (data?.body?.body?.devices?.[deviceId]) {
    data.body.body.devices[deviceId] = newDevice;
    flow.set("f_systemresponse", data);
    msg.payload = "Ersetzt";
} else {
    msg.payload = "Nicht ersetzt";
}

return msg;</textarea></div><div class="fusion-text fusion-text-4"><p>Weitere Typen sind in Kapitel 6.9 zu finden.</p>
<p>Bei meinen Versuchen habe ich festgestellt, dass im ersten Array-Element fast immer der Typ „DEVICE_CHANGED” steht. Das kann ich allerdings nicht garantieren. Daher baue ich in meinen Flow einen Split-Knoten ein, der das gesamte Array aufspaltet und die einzelnen Elemente zur Analyse der Events weiterschickt.</p>
</div><div class="fusion-text fusion-text-5"><h2>Änderungen eines Devices extrahieren</h2>
<p>Mit einer DEVICE_CHANGED-Nachricht wird eine Änderung an einem Gerät angezeigt. Um diese sichtbar zu machen, verwende ich eine Funktion, die alle Änderungen, die in den Daten eines Geräts stattgefunden haben, in einem Array protokolliert und um wichtige Daten wie die Seriennummer, das Label und die ID ergänzt. Zusätzlich füge ich hier ein payload.topic hinzu, welches ich später für einen Join-Node benötige. Der Function-Node wird „Differenzen ermitteln” genannt und beinhaltet folgenden Code:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-2 > .CodeMirror, .fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-2 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_2" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_2" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_2" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">// Neues Device-Objekt aus dem Eingang lesen
const newObj = msg.payload;

// Wichtige Basiswerte aus dem neuen Objekt übernehmen
const deviceId = newObj.id;
const label = newObj.label;

// Seriennummer bestimmen:
// - bei externen Plugins: pluginDeviceId
// - sonst: id
const serialNr = newObj.type === "PLUGIN_EXTERNAL"
    ? newObj.pluginDeviceId
    : newObj.id;

// Altes Device-Objekt aus dem gespeicherten Systemzustand holen
const oldObj = flow.get("f_systemresponse")?.body?.body?.devices?.[deviceId];

// Rekursive Differenzfunktion:
// Vergleicht zwei Objekte und sammelt alle Unterschiede in einem Array
function diff(a, b, path = "") {
    const changes = [];

    // Hilfsfunktion: Prüft, ob ein Wert ein normales Objekt ist
    // Arrays zählen hier nicht als Objekt
    const isObject = v => v && typeof v === "object" && !Array.isArray(v);

    // Alle Schlüssel aus altem und neuem Objekt zusammennehmen
    const keys = new Set([
        ...Object.keys(a || {}),
        ...Object.keys(b || {})
    ]);

    // Jeden Schlüssel einzeln vergleichen
    for (const key of keys) {
        // Vollständigen Pfad für die Änderung aufbauen
        const currentPath = path ? `${path}.${key}` : key;

        // Wert im alten und neuen Objekt lesen
        const oldValue = a ? a[key] : undefined;
        const newValue = b ? b[key] : undefined;

        // Wenn beide Werte Objekte sind, rekursiv weiter vergleichen
        if (isObject(oldValue) && isObject(newValue)) {
            changes.push(...diff(oldValue, newValue, currentPath));
        } else if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {
            // Sonst Unterschiede direkt als Änderung speichern
            changes.push({
                path: currentPath,
                oldValue: oldValue,
                newValue: newValue
            });
        }
    }

    return changes;
}

// Ergebnisobjekt 
msg.payload = {
    deviceId: deviceId,
    label: label,
    serialNr: serialNr,
    changes: diff(oldObj, newObj)
};

// Topic für den weiteren Flow setzen
msg.topic = "changes";

return msg;</textarea></div><div class="fusion-text fusion-text-6"><h2>Geräteänderungen automatisch anzeigen</h2>
<p>Nun sind alle Voraussetzungen vorhanden, um bei einem Ereignis automatisch Geräteänderungen anzuzeigen. Zur Spezifikation der Geräte, die ich anzeigen möchte, verwende ich einen Funktionsknoten („Device-Liste“), in dem ich die Seriennummern der gewünschten Geräte sowie das jeweilige Feld angebe, bei dessen Änderungen ich informiert werden möchte. Das Ganze ist als Array aufgebaut und enthält zusätzlich eine payload.topic-Angabe, die ich im folgenden Join-Node verwenden werde.</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-3 > .CodeMirror, .fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-3 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_3" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_3" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_3" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">msg.topic = "search";
msg.payload = [
    { serialNr: "0009149920ACD0:1", fieldname: "presenceDetected"},
    { serialNr: "0005BD7889E201:4", fieldname: "on" }
]
return msg;
</textarea></div><div class="fusion-text fusion-text-7"><p>Da ich jetzt alle Änderungen eines Geräts kenne (wie im vorigen Kapitel beschrieben), muss ich nur in den Änderungen nach der jeweiligen Seriennummer und dem gewünschten Feld suchen. Bei Übereinstimmung prüfe ich, ob sich dort eine Werteänderung ergeben hat. Wenn ja, gebe ich das als Ergebnis aus.</p>
<p>Da ein Function-Node nur einen Input hat und ich keine Flow-Variable nutzen möchte, füge ich den Input aus dem Function-Node, der mir die Änderungen ermittelt hat, sowie den Function-Node mit den zu überwachenden Devices mit einem Join-Node zusammen. Das ist möglich, da ich verschiedene payload.topic-Werte verwendet habe. So entsteht ein Objekt mit den beiden Topics „changes” und „search”, in denen alle Daten gemeinsam stehen. Der Node wird wie folgt konfiguriert.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device.webp"><img decoding="async" class="alignnone wp-image-4830 size-fusion-400" src="https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device-400x277.webp" alt="" width="400" height="277" srcset="https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device-200x138.webp 200w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device-300x208.webp 300w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device-400x277.webp 400w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device-600x415.webp 600w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device-768x532.webp 768w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device-800x554.webp 800w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Node-Red-Change-Node-Device.webp 858w" sizes="(max-width: 400px) 100vw, 400px" /></a></p>
<p>Das Ergebnis des Join-Nodes wird dann in einen Function-Node geleitet ("Werteänderung finden"), der die beschriebene Suche durchführt und eine Ausgabe erzeugt, wenn es zu einem gesuchten Device eine Änderungen bei der gesuchten Eigenschaft gegeben hat.</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-4 > .CodeMirror, .fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-4 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_4" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_4" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_4" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">// Aktuelles Device und Suchliste aus dem eingehenden Payload lesen
const device = msg.payload?.changes;
const searchList = msg.payload?.search;

// Nur weiterarbeiten, wenn alle benötigten Daten vorhanden sind
if (!device || !Array.isArray(device.changes) || !Array.isArray(searchList)) {
    return null;
}

// In der Suchliste den ersten Eintrag finden, dessen Seriennummer
// im aktuellen device.serialNr enthalten ist und der einen Feldnamen hat
const search = searchList.find(s =>
    s?.serialNr &&
    s?.fieldname &&
    String(device.serialNr || "").includes(String(s.serialNr).trim())
);

// Kein passender Such-Eintrag für dieses Device gefunden
if (!search) {
    return null;
}

// Den gesuchten Feldnamen normalisieren
const fieldname = String(search.fieldname).trim();

// In den Änderungen des Devices die erste echte Änderung für dieses Feld suchen
// Beispiel: "functionalChannels.1.presenceDetected" endet auf ".presenceDetected"
const change = device.changes.find(c =>
    String(c?.path || "").endsWith("." + fieldname) &&
    c.oldValue !== c.newValue
);

// Keine relevante Änderung gefunden
if (!change) {
    return null;
}

// Ergebnis für die weitere Verarbeitung im Flow aufbereiten
msg.topic = "changed";
msg.payload = {
    serialNr: search.serialNr,
    fieldname,
    label: device.label || null,
    oldValue: change.oldValue,
    newValue: change.newValue,
    path: change.path
};

return msg;</textarea></div><div class="fusion-text fusion-text-8"><p>Das Ergebnis im Debug-Fenster wäre bei der Erkennung einer Bewegung beispielsweise wie folgt:</p>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">serialNr</span>:</span> <span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"000C1BE9916CE3:1"</span></span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">fieldname</span>: </span><span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"presenceDetected"</span></span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">label</span>:</span> <span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"Praesenzsmelder:1"</span></span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">oldValue</span>:</span> <span style="color: #3366ff;">false</span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">newValue</span>: </span><span style="color: #3366ff;">true</span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">path</span>:</span> <span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"functionalChannels.1.presenceDetected"</span></span></span></span></div>
<p>Anschließend sollte noch der Funktionsknoten „Device Änderung” aufgerufen werden, damit der Status im Speicher wieder aktuell ist.</p>
<p>Der resultierende Node-Red-Flow sieht mit allen Ergänzungen jetzt wie folgt aus:</p>
<div></div>
<div data-wp-editing="1"><a href="https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change.webp"><img decoding="async" class="alignnone wp-image-4851 size-fusion-800" src="https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-800x113.webp" alt="" width="800" height="113" srcset="https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-200x28.webp 200w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-300x42.webp 300w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-400x56.webp 400w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-600x85.webp 600w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-768x108.webp 768w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-800x113.webp 800w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-1024x145.webp 1024w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-1200x169.webp 1200w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-Flow-Device-Change-1536x217.webp 1536w" sizes="(max-width: 800px) 100vw, 800px" /></a></div>
<div></div>
<div>Natürlich kann noch ganz viel optimiert werden. Auf dieser Basis können nun weitere Ergänzungen wie z.B. das Steuern eines Devices gebaut werden. Wer weitere Verbesserungen und Informationen hat, kann diese gerne hier posten.</div>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/die-home-control-unit-hcu-in-node-red-integrieren-teil-3/">Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 3</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/die-home-control-unit-hcu-in-node-red-integrieren-teil-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Neue Node-RED-Library für die Homematic HCU</title>
		<link>https://homeitems.de/neue-node-red-library-fuer-die-homematic-hcu/</link>
					<comments>https://homeitems.de/neue-node-red-library-fuer-die-homematic-hcu/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sun, 27 Sep 2026 16:44:05 +0000</pubDate>
				<category><![CDATA[HCU]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=5009</guid>

					<description><![CDATA[<p>In den letzten Monaten habe ich mich intensiver mit der neuen Homematic IP Home Control Unit (HCU) und den Möglichkeiten zur Integration in Node-RED beschäftigt. Da ich keine passende Lösung gefunden habe, habe ich mit KI-Unterstützung die Node-RED-Palette node-red-contrib-homematic-hcu entwickelt. Die Palette ermöglicht den direkten Zugriff auf die Homematic HCU über  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/neue-node-red-library-fuer-die-homematic-hcu/">Neue Node-RED-Library für die Homematic HCU</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"></div></div><div class="fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-2 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">HCU</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-9"><p>In den letzten Monaten habe ich mich intensiver mit der neuen Homematic IP Home Control Unit (HCU) und den Möglichkeiten zur Integration in Node-RED beschäftigt.</p>
<p>Da ich keine passende Lösung gefunden habe, habe ich mit KI-Unterstützung die Node-RED-Palette <strong>node-red-contrib-homematic-hcu</strong> entwickelt.</p>
<p>Die Palette ermöglicht den direkten Zugriff auf die Homematic HCU über die offizielle Connect API – ganz ohne Cloud. Gerätezustände können ausgelesen, Ereignisse in Echtzeit empfangen und Aktoren direkt aus Node-RED gesteuert werden. Ziel war es, die Anbindung der HCU so einfach wie möglich zu gestalten und gleichzeitig die Flexibilität von Node-RED vollständig nutzen zu können.</p>
<p>Aktuell unterstützt die Palette unter anderem:</p>
<p>• Aufbau der Verbindung zur Homematic HCU<br />
• Authentifizierung über die Connect API<br />
• Empfang von Geräteereignissen per WebSocket<br />
• Auslesen von Geräte- und Featurewerten<br />
• Schalten und Steuern von Homematic-IP-Geräten<br />
• Erstellen von Benutzermeldungen auf der HCU</p>
<p>Die Installation erfolgt wie gewohnt über den Node-RED Palette Manager oder per npm.</p>
<p>Ich stelle die Palette mit den Nodes frei zur Verfügung, da ich wahrscheinlich nicht der Einzige bin, der Node-RED als zentrales System nutzt. Anregungen, Verbesserungsvorschläge, Fehlermeldungen,etc. können auch über Github eingestellt werden. Da das Ganze ein Hobbyprojekt ist, bitte ich um Nachsicht, wenn ich nicht sofort antworte.</p>
<p>Weitere Informationen wie z.B. die Dokumentation findet ihr hier:</p>
<p><a href="https://flows.nodered.org/node/node-red-contrib-homematic-hcu">Node-Red Palette</a><br />
<a href="https://github.com/homeitems/node-red-contrib-homematic-hcu">GitHub Repository</a></p>
<p>Fragen und Anregungen können auch als Kommentare zu diesem Blog übermittelt werden.</p>
</div></div></div></div></div><div class="fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"></div></div></p>
<p>Der Beitrag <a href="https://homeitems.de/neue-node-red-library-fuer-die-homematic-hcu/">Neue Node-RED-Library für die Homematic HCU</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/neue-node-red-library-fuer-die-homematic-hcu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 2</title>
		<link>https://homeitems.de/home-control-unit-hcu-in-node-red-integrieren-teil-2/</link>
					<comments>https://homeitems.de/home-control-unit-hcu-in-node-red-integrieren-teil-2/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Mon, 27 Jul 2026 17:42:40 +0000</pubDate>
				<category><![CDATA[HCU]]></category>
		<category><![CDATA[Homematic IP]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=4729</guid>

					<description><![CDATA[<p>In der ersten Folge dieser Serie habe ich gezeigt, wie man aus Node-Red direkt auf die HCU zugreift und ein Objekt mit allen HMIP-Daten abfragt. In diesem Teil der Serie erkläre ich die Datenstruktur, mit der sich der Status von Geräten abfragen lässt. Das wesentliche Dokument für alle folgenden Schritte ist dabei  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/home-control-unit-hcu-in-node-red-integrieren-teil-2/">Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 2</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-3 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">HCU</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-10"><p>In der ersten Folge dieser Serie habe ich gezeigt, wie man aus Node-Red direkt auf die HCU zugreift und ein Objekt mit allen HMIP-Daten abfragt. In diesem Teil der Serie erkläre ich die Datenstruktur, mit der sich der Status von Geräten abfragen lässt. Das wesentliche Dokument für alle folgenden Schritte ist dabei die <a href="https://github.com/homematicip/connect-api/releases/download/1.0.1/connect-api-documentation-1.0.1.html">Homematic IP Connect API Dokumentation</a>.</p>
<h2><strong>Datenstruktur verstehen</strong></h2>
<p>Mithilfe des debug93-Nodes aus dem letzten Beitrag wurde die gesamte Datenstruktur der HCU ausgegeben. Bevor weitere Funktionen ergänzt werden, ist es wichtig, die Grundstruktur zu verstehen. Ich fokussiere mich hier nur auf die Geräte und deren besondere Attribute (Gruppen oder Clients werden nicht betrachtet). HMIP-Geräte werden als Devices bezeichnet.</p>
<p>Die Datenwerte eines Geräts werden in der HCU als Features bezeichnet (z. B. Temperatur), die einen Wert beinhalten können. Jedes Device besitzt einen „Type”, der genau angibt, welche Features obligatorisch oder optional zu einem Device-Objekt gehören.</p>
<p>Die Struktur des HCU-Datenobjektes mit den relevanten Daten zum Auslesen und Verarbeiten von Geräten ist in der folgenden Grafik dargestellt (blaue Kästchen sind Objekte, weiße Kästchen sind Attribute):</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur.webp"><img decoding="async" class="alignnone wp-image-4792 size-fusion-600" src="https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-600x532.webp" alt="" width="600" height="532" srcset="https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-200x177.webp 200w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-300x266.webp 300w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-400x355.webp 400w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-600x532.webp 600w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-768x681.webp 768w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-800x709.webp 800w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-1024x908.webp 1024w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-1200x1064.webp 1200w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur.webp 1400w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>
<p>Bei Änderungen schickt die HCU nur die geänderten Objekte. Der Gedanke dahinter ist, dass die Kommunikation deutlich schneller funktioniert, wenn nur die Änderungen übermittelt werden. Die Datenstruktur mit den Änderungen ist leicht anders und wird in folgender Grafik dargestellt (blaue Kästchen sind Objekte, weiße Kästchen Attribute):</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes.webp"><img decoding="async" class="alignnone wp-image-4793 size-fusion-600" src="https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-600x493.webp" alt="" width="600" height="493" srcset="https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-200x164.webp 200w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-300x247.webp 300w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-400x329.webp 400w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-600x493.webp 600w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-768x631.webp 768w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-800x658.webp 800w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-1024x842.webp 1024w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes-1200x987.webp 1200w, https://homeitems.de/wp-content/uploads/2026/07/HCU-Datenstruktur-Changes.webp 1400w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>
</div><div class="fusion-text fusion-text-11"><h2>Device Eigenschaften</h2>
<p>Jedes Gerät besitzt das Attribut „type“, das angibt, welche „Features“ es unterstützt. Mit den Features sind in der Regel die Daten der Sensorwerte, der Zustand eines Schalters etc. gemeint.</p>
<p>Die möglichen Features ergeben sich aus den Beschreibungen in Kapitel 6.6.5 der Connect-API-Dokumentation.</p>
<p>Für den HMIP-Bewegungsmelder (HMIP-SMI) vom Typ „OCCUPANCY_SENSOR” sind dies beispielsweise die Features:</p>
<ul>
<li>presenceDetected (true oder false)</li>
<li>unreach (true oder false, gehört zum Feature Maintenance)</li>
<li>lowbat (true oder false, gehört zum Feature Maintenance)</li>
<li>sabotage (true oder false, gehört zum Feature Maintenance)</li>
</ul>
<p>Diese stehen in einem zweidimensionalen Array im Objektbereich "Functional Channels".</p>
</div><div class="fusion-alert alert notice alert-warning fusion-alert-left awb-alert-native-link-color" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="awb-icon-cog" aria-hidden="true"></i></span><span class="fusion-alert-content"><p><strong>Besonderheiten bei PLUGIN_EXTERNAL</strong></p>
<p>Wenn der "type" eines devices "PLUGIN_EXTERNAL" ist dann ergeben sich ein paar Besonderheiten. Bei diesem Typ ist das Gerät nicht direkt in der HCU angelernt sondern wird durch ein anderes Plugin bereitgestellt (z.B. das CCU3 Plugin). Folgende Änderungen ergeben sich dann:</p>
<ul>
<li>Die Seriennummer des Gerätes steht unter <span style="color: #993300;">"pluginDeviceId"</span>, unter "id" steht eine eindeutige von der HCU vergebene Nummer mit mehreren von Bindestrichen getrennten HEX-Werten.</li>
<li>Für CCU3 Geräte hat die pluginDeviceId das folgendes Format: <span style="color: #993300;">"00196BE98B20B2:1</span>" (letzten 14 Stellen der SGTIN gefolgt von einem Doppelpunkt mit der Kanalnummer). Geräte, die direkt an der HCU angelernt wurden besitzen das Format "3014F711A00046F219898621" (entspricht der SGTIN mit insgesamt 24 Stellen).</li>
<li>Der Typ des Device steht nicht mehr unter "type" sondern unter <span style="color: #993300;">"pluginDeviceType"</span></li>
</ul></span></div></div><div class="fusion-alert alert notice alert-warning fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="awb-icon-cog" aria-hidden="true"></i></span><span class="fusion-alert-content"><p><strong>Die Suche nach der Seriennummer</strong></p>
<p>Durch die Nutzung der CCU3 habe ich mich an die Notation der Seriennummern mit der Kanalnummer gewöhnt.  Weil viele Geräte vorerst weiter auf der CCU laufen, möchte ich gerne diese Seriennummer-Notation für externe CCU3-Geräte bei der Suche nach Geräten beibehalten.</p>
<p>Da die Seriennummern von „PLUGIN_EXTERNAL“-Typen an anderer Stelle stehen als die Seriennummern von Geräten, die direkt an der HCU angelernt wurden, muss ich dies bei allen zukünftigen Funktionen berücksichtigen.</p>
<p>Will man diese Vorgehenswiese nicht verwenden kann auch einfach die id eines Gerätes verwendet werden, so dass man sich die Vergleiche mit dem Typ spart.</p>
<p>Ich gebe neben der Seriennummer auch ein Label-Feld zurück, damit die Geräte beim Debuggen schneller identifiziert werden können.</p></span></div><button type="button" class="close toggle-alert" data-dismiss="alert" aria-label="Schließen">&times;</button></div><div class="fusion-text fusion-text-12"><h2>Plugin Messages auswerten</h2>
<p>Wenn eine Nachricht von der HCU an Node-Red übermittelt wird, dann wird auch immer der Typ der Nachricht (<strong>PluginMessageType</strong>) übertragen. Dieser steht unter payload.type. Im Folgenden sind zunächst nur die folgenden Werte interessant (weitere Typen sind in Kapitel 6.4 der API erläutert):</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left">
<h4 id="_pluginmessagetype">PluginMessageType</h4>
</th>
<th align="left">Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">PLUGIN_STATE_RQUEST</td>
<td align="left">Wenn eine solche Nachricht ankommt, möchte die HCU eine Statusinformation des Plug-ins bzw. ein Lebenszeichen erhalten. Die Antwort darauf ist immer eine Nachricht an die HCU mit dem Payload-Typ PLUGIN_STATE_RESPONSE.</td>
</tr>
<tr>
<td align="left">HMIP_SYSTEM_RESPONSE</td>
<td align="left">Diese Nachricht beinhaltet den Status eines oder mehrerer Datenobjekte bzw. aller Daten in der HCU. Der Status wird erst dann gesendet, wenn zuvor ein HMIP_SYSTEM_REQUEST gesendet wurde.</td>
</tr>
<tr>
<td align="left">HMIP_SYSTEM_EVENT</td>
<td align="left">In dieser Nachricht befindet sich ein Update des HMIP-Systems. Wichtig ist, dass nicht immer der gesamte Status übertragen wird, sondern nur die geänderten Teile.</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-13"><h2><strong>Zwischenspeicherung der HCU-Daten</strong></h2>
<p>eQ3 empfiehlt, den gesamten Status aller Objekte (Devices, Gruppen etc.) auf der HCU nur einmal nach Aufbau der Verbindung abzuholen und in einem Cache zwischenzuspeichern. Gibt es Änderungen an den Daten, schickt die HCU nur die geänderten Objekte. Dahinter steckt der Gedanke, dass die Kommunikation deutlich schneller funktioniert, wenn nur Änderungen übermittelt werden. Daher empfiehlt eQ3 auch, die initialen HCU-Daten zwischenzuspeichern und bei jedem Update den geänderten Teil zu ersetzen. Damit sind im Speicher immer alle Daten der HCU auf dem aktuellen Stand verfügbar.</p>
<p>Um die Daten nach dem Aufbau der Websocket-Verbindung abfragen zu können, nutze ich einen Input-Node, der zwei Sekunden nach dem Start eine HMIP_SYSTE_REQUEST-Nachricht in der folgenden Form verschickt:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-5 > .CodeMirror, .fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-5 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_5" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_5" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_5" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="application/json">{
    "pluginId": "de.spike.grass.plugin.example1",
    "id": "cffabca5-3642-4f0d-9b74-5d21748db5e43",
    "type": "HMIP_SYSTEM_REQUEST",
    "body": {
        "path": "/hmip/home/getSystemState",
        "body": {}
    }
}</textarea></div><div class="fusion-text fusion-text-14"><p>Ich realisiere dies einfach durch Abfrage des PluginMessageType.  Hat dieser den Wert "HMIP_SYSTEM_RESPONSE", dann speichere ich den payload Wert in meiner Node-Red Flow-Variablen "f_systemresponse". Ich ergänze dies in meinem Flow am Ende des Beitrag1 <a href="https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/">Mit Node-RED auf die HMIP Home Control Unit (HCU) zugreifen Teil 1</a></p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2.webp"><img decoding="async" class="alignnone wp-image-4848 size-fusion-800" src="https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-800x164.webp" alt="" width="800" height="164" srcset="https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-200x41.webp 200w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-300x62.webp 300w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-400x82.webp 400w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-600x123.webp 600w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-768x158.webp 768w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-800x164.webp 800w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-1024x210.webp 1024w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-1200x246.webp 1200w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2-1536x315.webp 1536w, https://homeitems.de/wp-content/uploads/2026/07/Node-Red-HCU-flow2.webp 1842w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
</div><div class="fusion-text fusion-text-15"><h2>Status eines Device abfragen</h2>
<p>Auf Basis der in den vorigen Abschnitten beschriebenen Grundlagen kann nun die Statusabfrage eines Geräts erfolgen. Ich möchte beispielsweise für einen Bewegungsmelder abfragen, ob er eine Bewegung erkannt hat oder nicht. Dazu verwende ich einen Input-Node, in dem ich die Seriennummer angebe sowie das Feature „presenceDetected”, welches zu diesem Gerätetyp bereitgestellt wird.</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-6 > .CodeMirror, .fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-6 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_6" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_6" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_6" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">{
    "serialNr": "0009149920ACD0:1",
    "fieldname": "presenceDetected"
}</textarea></div><div class="fusion-text fusion-text-16"><p>Anschließend verwende ich die Daten in einem Function-Node. Nach diversen Prüfungen führt dieser die Suche nach der normierten Seriennummer durch, holt sich das passende Device-Objekt aus dem HCU-Objekt und extrahiert das Feature bzw. den Wert des Attributs.</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-7 > .CodeMirror, .fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-7 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_7" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_7" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_7" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">const input = msg.payload || {};
const searchSerialNr = String(input.serialNr ?? "").trim();
const fieldname = String(input.fieldname ?? "").trim();

// Prüfen, ob die benötigten Eingabewerte vorhanden sind
if (!searchSerialNr) {
    msg.payload = {
        error: "serialNr ist leer oder fehlt",
        input: input
    };
    return msg;
}

if (!fieldname) {
    msg.payload = {
        error: "fieldname ist leer oder fehlt",
        input: input
    };
    return msg;
}

// flow-Variable mit den HCU-Daten laden
const systemResponse = flow.get("f_systemresponse");

// Nur den Bereich mit den Devices verwenden
const devices = systemResponse?.body?.body?.devices || {};

let foundDevice = null;
let foundValue = null;

// Alle Devices durchsuchen
for (const device of Object.values(devices)) {
    const type = String(device?.type ?? "").trim();
    const deviceId = String(device?.id ?? "").trim();
    const pluginDeviceId = String(device?.pluginDeviceId ?? "").trim();

    let isMatch = false;

    // Für PLUGIN_EXTERNAL wird links gegen pluginDeviceId verglichen
    if (type === "PLUGIN_EXTERNAL") {
        isMatch = pluginDeviceId === searchSerialNr;
    }
    // Für alle anderen Geräte wird rechts gegen device.id verglichen
    else {
        isMatch = deviceId === searchSerialNr;
    }

    // Wenn das passende Device gefunden wurde, Schleife beenden
    if (isMatch) {
        foundDevice = device;
        break;
    }
}

// Im gefundenen Device unter functionalChannels nach dem gewünschten Feld suchen
if (foundDevice?.functionalChannels) {
    for (const channel of Object.values(foundDevice.functionalChannels)) {
        if (channel && Object.prototype.hasOwnProperty.call(channel, fieldname)) {
            foundValue = channel[fieldname];
            break;
        }
    }
}

// Ergebnis in msg.payload zurückgeben
msg.payload = {
    serialNr: searchSerialNr,
    fieldname: fieldname,
    foundDeviceName: foundDevice?.label || null,
    deviceId: foundDevice?.id || null,
    pluginDeviceId: foundDevice?.pluginDeviceId || null,
    value: foundValue
};

return msg;</textarea></div><div class="fusion-text fusion-text-17 fusion-text-no-margin" style="--awb-margin-bottom:20px;"><p>Anschließend sieht das Ergebnis wie folgt aus:</p>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">serialNr</span>:</span> <span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"0009149920ACD"</span></span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">fieldname</span>: </span><span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"presenceDetected"</span></span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">foundDeviceName</span>:</span> <span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-string red-ui-debug-msg-object-header">"BWM-Test-Flur:1"</span></span></span></span></div>
<div class="red-ui-debug-msg-object-entry collapsed"><span class="red-ui-debug-msg-element"><span class="red-ui-debug-msg-row"><span style="color: #800080;"><span class="red-ui-debug-msg-object-key">value</span>:</span> <span class="red-ui-debug-msg-object-value" style="color: #993300;"><span class="red-ui-debug-msg-type-other">false</span></span></span></span></div>
</div><div class="fusion-text fusion-text-18"><h2 class="red-ui-debug-msg-object-entry collapsed">Ausblick</h2>
<div>Im nächsten Beitrag werde ich zeigen, wie die zwischengespeicherten HCU-Daten aktualisiert werden. Auf dieser Grundlage wird es dann auch möglich sein, sich Statusänderungen von Geräten automatisch ausgeben zu lassen.</div>
<div></div>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/home-control-unit-hcu-in-node-red-integrieren-teil-2/">Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 2</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/home-control-unit-hcu-in-node-red-integrieren-teil-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 1</title>
		<link>https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/</link>
					<comments>https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sun, 17 May 2026 18:33:21 +0000</pubDate>
				<category><![CDATA[HCU]]></category>
		<category><![CDATA[Homematic IP]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=4639</guid>

					<description><![CDATA[<p>Nach der Einführung der neuen HMIP-Zentrale HCU (Home Control Unit) hat eQ-3 eine API veröffentlicht, mit der man eigene Plugins erstellen und auf die HMIP-Daten zugreifen kann. Im Herbst 2025 wurde angekündigt, dass die auch von mir genutzte CCU3 vom eQ-3 nicht weiterentwickelt, sondern in dem freien Modell OpenCCU (ehemals Raspberrymatic) durch  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/">Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 1</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-4 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">HCU</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-19"><p>Nach der Einführung der neuen HMIP-Zentrale HCU (Home Control Unit) hat eQ-3 eine API veröffentlicht, mit der man eigene Plugins erstellen und auf die HMIP-Daten zugreifen kann. Im Herbst 2025 wurde angekündigt, dass die auch von mir genutzte CCU3 vom eQ-3 nicht weiterentwickelt, sondern in dem freien Modell OpenCCU (ehemals Raspberrymatic) durch die Community weitergepflegt werden soll.</p>
<p>Ich habe auf der CCU3 viel programmiert und mit Node-RED auf die CCU3-Geräte zugegriffen. Jetzt will ich prüfen, wie gut man die HCU in Node-RED einbinden kann, um langfristig von der CCU auf die HCU zu wechseln.</p>
<p>Im ersten Schritt möchte ich eine Verbindung zwischen Node-RED und der HCU aufbauen und erste Daten von HMIP-Geräten empfangen. Ich nehme vorweg, das Ganze funktioniert einfacher als erwartet. In den folgenden Kapiteln beschreibe ich dazu detailliert die Vorgehensweise. Das wesenliche Dokument für alle folgenden Schritte ist dabei die <a href="https://github.com/homematicip/connect-api/releases/download/1.0.1/connect-api-documentation-1.0.1.html">Homematic IP Connect API Dokumentation</a>.</p>
<h2><strong>HCU Entwicklermodus freischalten</strong></h2>
<p>Damit die HCU API-Zugriffe akzeptiert, muss der Entwickler-Modus aktiviert werden. In diesem Modus kann man eigene Plugins direkt auf der HCU laden. Oder man kann mit Plugins auf anderen Systemen (z. B. Node-RED) über eine Websocket-Verbindung kommunizieren.</p>
<p>Die Vorgehensweise zur Freischaltung ist gut in der API-Dokumentation beschrieben, so dass ich nur auf folgendes hinweise:</p>
<ol>
<li>Aktiviere den Entwicklermodus und gebe sofort die Websockets frei (Häkchen setzen)</li>
<li>Warte mit der Erstellung des Aktivierungsschlüssels bis zum nächsten Schritt!</li>
</ol>
</div><div class="fusion-text fusion-text-20"><h2><strong>Authentication Token vereinbaren</strong></h2>
<p>Jedes Plugin braucht für die Kommunikation eine eindeutige ID.  eQ-3 empfiehlt zur Namensfindung die "Reverse Domain Name Notation". Ich habe diesen Namen für die folgenden Tests benutzt:</p>
<p><em>de.spike.grass.plugin.example1</em></p>
<p>Damit die Kommunikation zwischen der HCU und einem anderen Gerät sicher, aber einfach ist, brauche ich außerdem ein Token. Dieser Authentication Token ist wie ein Passwort. Zur Erstellung des Tokens muss man mit der HCU über API-Requests kommunizieren.</p>
<p>Ich empfehle das Tool <a href="https://www.postman.com/">Postman</a> zu verwenden, da es einfach zu bedienen ist.</p>
<p>Ich verweise hier auch auf die Anleitung in Kapitel 2.4 (Step 2) und ergänze noch ein paar Hinweise::</p>
<ul>
<li>Wähle in Postman die Methode "POST" aus. Trage dahinter als Adresse <em>https://hcu1-XXXX.local:6969/hmip/auth/requestConnectApiAuthToken ein </em>(Setze anstelle von hcu1-XXXX den lokalen Netzwerknamen ein)</li>
<li>Ergänze unter dem Tab "Headers" das Feld "VERSION" mit dem Wert "12"</li>
<li>Gehe nun zuerst zurück in den Entwicklermodus der HCU und generiere einen Aktivierungsschlüssel (dieser ist nur kurzzeitig gültig)</li>
<li>Kopiere in den Tab "body" den body-example Code aus Kapitel 2.4 Step 2</li>
<li>Tausche den Aktivierungsschlüssel gegen den soeben generierten Schlüssel aus</li>
<li>Tausche die plugin_id gegen die von dir gewählte ID aus (siehe oben)</li>
</ul>
<pre class="rouge highlight"><a href="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1.webp"><img decoding="async" class="alignnone wp-image-4645 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1024x271.webp" alt="" width="1024" height="271" srcset="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-200x53.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-300x79.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-400x106.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-600x159.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-768x203.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-800x211.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1024x271.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1200x317.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1536x406.webp 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></pre>
<p>Drücke auf Send und man sollte ein solches Feedback erhalten (Wert für spätere Verwendung speichern):<code data-lang="json"></code></p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-8 > .CodeMirror, .fusion-syntax-highlighter-8 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-8 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-8 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-8 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_8" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_8" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_8" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="application/json">{
    "authToken": "B23FB0DC7FDAA140CDF679D5F78F047C16CEF349691A3E9B425DE16E291E51DF"
}</textarea></div><div class="fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color" style="--awb-background-color:#fcf8e3;--awb-accent-color:#808080;--awb-border-size:1px;--awb-border-top-left-radius:8px;--awb-border-top-right-radius:8px;--awb-border-bottom-left-radius:8px;--awb-border-bottom-right-radius:8px;" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="fa-exclamation-triangle fas" aria-hidden="true"></i></span><span class="fusion-alert-content">Erscheint hier der Fehler "Could not generate response.  SSL Error: Self signed certificate", dann braucht man nur die angebotene Option "Disable SSL Verification" zu bestätigen und schon funktioniert es.</span></div></div><div class="fusion-text fusion-text-21"><p>Nun muss der Erhalt dieses Schlüssels noch bestätigt werden. Gehe dazu wie folgt in Postman vor:</p>
<ul>
<li>Drücke oben in der Tabzeile auf "New Request"</li>
<li>Ergänze unter dem Tab "Headers" das Feld "VERSION" mit dem Wert "12"</li>
<li>Wähle in Postman die Methode "POST" aus. Trage dahinter als Adresse <em>https://hcu1-XXXX.local:6969/hmip/auth/confirmConnectApiAuthToken</em> (Setze anstelle von hcu1-XXXX den lokalen Netzwerknamen ein)</li>
<li>Kopiere in den Tab "body" den body-example Code aus Kapitel 2.4 Step 3</li>
<li>Tausche den Aktivierungsschlüssel gegen den eben generierten aus</li>
<li>Tausche den authToken gegen den im vorigen Schritt erhaltenen authToken aus.</li>
</ul>
<p>Drücke auf Send und du solltest eine client_id in der folgenden Form erhalten (Wert für spätere Verwendung speichern):</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-9 > .CodeMirror, .fusion-syntax-highlighter-9 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-9 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-9 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-9 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_9" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_9" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_9" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="application/json">{
    "clientId": "9fa276c2-b410-456d-bfde-4202918e8ce4"
}</textarea></div><div class="fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color" style="--awb-background-color:#fcf8e3;--awb-accent-color:#808080;--awb-border-size:1px;--awb-border-top-left-radius:8px;--awb-border-top-right-radius:8px;--awb-border-bottom-left-radius:8px;--awb-border-bottom-right-radius:8px;" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="fa-exclamation-triangle fas" aria-hidden="true"></i></span><span class="fusion-alert-content">Wenn es bei einem der beiden Request-Aufrufe zu dem Fehler "Invalid Request" kommt, dann kann das daran liegen, dass der Aktivierungsschlüssel abgelaufen ist. Dann generiert einfach einen Neuen, tauscht diesen in den body-Bereich aus und für die Requests erneut durch.</span></div></div><div class="fusion-text fusion-text-22"><h2>Websocket Verbindung testen</h2>
<p>Nun kann getestet werden, ob eine Websocket-Verbindung zur HCU mit den gerade erzeugten Daten aufgebaut werden kann. Ich empfehle hierzu auch wieder das Tool Postman zu verwenden.</p>
<p>Hier gibt es allerdings mit der freien und unregistrierten Version eine Einschränkung: In dieser Version kann man keine Self-Signed-Socket Verbindungen aufbauen, die wir aber für die Kommunikation mit der HCU benötigen.</p>
<p>Man löst das Ganze, indem man sich einen (kostenlosen) Postman-Account erstellt und sich dann mit dem Account in der App anmeldet. Anschließend ist die Kommunikation mit den Self- Signed- Zertifikaten möglich.</p>
<p>Folgende Schritte sind anschließend in Postman durchzuführen:</p>
<ul>
<li>In der Adressleiste wird folgende Adresse eingetragen: wss://<em>hcu1-XXXX.local</em>:9001 (Setze anstelle von hcu1-XXXX den lokalen Netzwerknamen ein)</li>
<li>Auf das Plus-Zeichen links oben im Workspace drücken und "Websocket" auswählen.</li>
<li>Unter Headers wird ein neuer Key "authtoken" mit dem eben generierten Wert eingetragen.</li>
<li>Unter Headers wird ein weiterer neuer Key "plugin-id" mit der generierten Plugin-ID eingetragen.</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2.webp"><img decoding="async" class="alignnone wp-image-4651 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-1024x295.webp" alt="" width="1024" height="295" srcset="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-200x58.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-300x86.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-400x115.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-600x173.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-768x221.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-800x230.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-1024x295.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-1200x345.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2.webp 1400w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>Nach Betätigen von Connect sollte die Meldung "<em>connected to .local:9001</em>" erscheinen.</p>
<p>Und in der HCU im Plugins Menü sollte die Verbindung ebenfalls auftauchen!</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1.webp"><img decoding="async" class="alignnone wp-image-4652 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1024x384.webp" alt="" width="1024" height="384" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-200x75.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-300x113.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-400x150.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-600x225.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-768x288.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-800x300.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1024x384.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1200x451.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1536x577.webp 1536w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1.webp 1614w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
</div><div class="fusion-text fusion-text-23"><h1>Mit Node-RED HCU-Daten abfragen</h1>
<p>Jetzt kann eine Websocket Verbindung zur HCU aus Node-RED aufgebaut werden. Die Sockets-Nodes in Node-RED unterstützen allerdings keine Self-Signed Zertifikate. Stattdessen verwende ich die Palette <a href="https://flows.nodered.org/node/node-red-contrib-dynamic-websocket">node-red-contrib-dynamic-websocket</a>, die ich in Node-RED installiert habe. Darin befindet sich ein Websocket-Node, der viel mehr Möglichkeiten als die Standard-Nodes bietet.</p>
</div><div class="fusion-alert alert notice alert-warning fusion-alert-left awb-alert-native-link-color" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="awb-icon-cog" aria-hidden="true"></i></span><span class="fusion-alert-content"><p>Für die Angabe von Serveradressen gibt es zwei Möglichkeiten.</p>
<ol>
<li>eQ3 verwendet https://hcu1-XXX.local:9001 oder wss://hcu1-XXXX.local:9001, wobei das XXXX durch die letzten 4 Zeichen der Seriennummer ersetzt werden.</li>
<li>Alternativ kann man https://192.177.156.43:9001 oder wss://192.177.156.43:9001 verwenden (d.h. man adressiert die HCU über die IP-Adresse und den Port)</li>
</ol>
<p>Ich habe in Node-Red immer die zweite Variante verwendet, da ich mit der Namensauflösung erheblich Schwierigkeiten hatte. Diese Variante funktioniert auch für alle vorherigen Schritte.</p></span></div></div><div class="fusion-text fusion-text-24"><p>In Node-RED wird nun der Dynamic-Websocket-Node eingefügt und in den Eigenschaften folgende Daten eingetragen:</p>
<ul>
<li>Default-Url "wss://"</li>
<li>"Allow Self Signed Certificates"-Häkchen setzen</li>
</ul>
<p>Unter Custom Headers wird anschließend folgender JSON-Eintrag ergänzt:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-10 > .CodeMirror, .fusion-syntax-highlighter-10 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-10 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-10 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-10 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_10" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_10" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_10" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">{
  "authtoken": "<das Authentication Token>",
  "plugin-id": "<die selbstgewählte Plugin ID (bei mir: de.spike.grass.plugin.example1)>",
  "hmip-system-events": "true"
}</textarea></div><div class="fusion-text fusion-text-25"><p>Im Code wird die eigene Plugin-ID sowie das eigene Authentication Token eingetragen. Mit der Zeile "hmip-system-events":"true" wird die HCU so eingestellt, dass alle Änderungen an HMIP-Zuständen (Basisstation, Geräte, Gruppen, etc.=) sofort an Node-Red übermittelt werden (siehe auch API-Dokumentation).</p>
<p><img decoding="async" class="alignnone wp-image-4668 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-1024x733.webp" alt="" width="1024" height="733" srcset="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-200x143.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-300x214.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-400x286.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-600x429.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-768x549.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-800x572.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-1024x733.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755.webp 1188w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>Alle Websocket-Nachrichten können durch einen Debug-Node am ersten Ausgang des Websocket-Nodes im Debug-Fenster ausgegeben werden. Nach dem deployen des Flows sollte das Ergebnis wie folgt aussehen. In den Objekten sind bereits alle Informationen zu den HMIP-Geräte enthalten.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2.webp"><img decoding="async" class="alignnone wp-image-4666 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1024x206.webp" alt="" width="1024" height="206" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-200x40.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-300x60.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-400x80.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-600x121.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-768x155.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-800x161.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1024x206.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1200x241.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1536x309.webp 1536w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2.webp 1630w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
</div><div class="fusion-text fusion-text-26"><h2>Weitere Funktionen ergänzen</h2>
<p>Ich erweitere den Flow jetzt noch um Funktionen, die bei den weiteren Tests hilfreich sind. Hierzu gehört auch, dass die HCU zwischenzeitlich abfragt, ob mein Plugin einsatzbnereit ist. Hierzu sendet die HCU an Node-Red unter payload.type einen "PLUGIN_STATE_REQUEST". Sobald ich diesen erhalte schicke ich eine PLUGIN_STATE_RESPOND Message zurück. Die Nodes, die ich ergänze sind in folgender Tabelle aufgeführt.</p>
</div>
<div class="table-1">
<table width="100%">
<thead>
<tr>
<th align="left"><strong>Node</strong></th>
<th align="left"><strong>Beschreibung</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Inject Node ("Close Connection")</td>
<td align="left">Mit diesem Node kann ich die Websocket-Verbindung schließen. Dazu braucht als Parameter nur in "msg.close" gleich "true" angegeben zu werden.</td>
</tr>
<tr>
<td align="left">Inject Node ("Open Connection")</td>
<td align="left">Mit diesem Node kann ich die Websocket-Verbindung wieder aufbauen. Dazu braucht als Parameter nur in "msg.url" als String die Serveradresse "wss://" angegeben zu werden.</td>
</tr>
<tr>
<td align="left">Switch Node ("Event Types unterscheiden")</td>
<td align="left">Hier löse ich die Event-Types auf, die von der HCU übermittelt werden (wird später noch weiter ausgebaut).</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1.webp"><img decoding="async" class="alignnone wp-image-4678 size-medium" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-300x221.webp" alt="" width="300" height="221" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-200x147.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-300x221.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-400x295.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-600x442.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1.webp 676w" sizes="(max-width: 300px) 100vw, 300px" /></a></td>
</tr>
<tr>
<td align="left">Switch Node ("PLUGIN_STATE_RESPONS Message")</td>
<td align="left">Über diesen Node erstelle ich die JSON-Nachricht, die ich per Websocket an die HCU schicke. In dem folgenden Screenshot müssen die PluginID sowie die ClientID durch die eigenen Werte ersetzt werden.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2.webp"><img decoding="async" class="alignnone wp-image-4679 size-medium" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-300x144.webp" alt="" width="300" height="144" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-200x96.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-300x144.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-400x192.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-600x288.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-768x369.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-800x385.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2.webp 878w" sizes="(max-width: 300px) 100vw, 300px" /></a></td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-27"><p>Der Flow sieht anschließend wie folgt aus und bietet jetzt eine solide Basis für die Kommunikation mit der HCU.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1.webp"><img decoding="async" class="alignnone wp-image-4680 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1024x159.webp" alt="" width="1024" height="159" srcset="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-200x31.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-300x47.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-400x62.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-600x93.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-768x119.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-800x124.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1024x159.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1200x187.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1536x239.webp 1536w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1.webp 1904w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>Im nächsten Beitrag werde ich mir die Nachrichtenformate der HCU näher anschauen und entscheiden, wie ich diese am besten auswerte. Anregungen und Ergänzungen sind herzlich willkommen.</p>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/">Die Home Control Unit (HCU) in Node-RED integrieren &#8211; Teil 1</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
