Fix für fehlenden „room“ in den RPC Events

Einige Homematic- und Homematic-IP-Devices liefern in ihren RPC-Messages einen leeren "room" und ein leeres "room"-array. Da bei meiner Implementierung der Raum in der Influxdb zum Measurement wird (siehe meinen Blogpost Messdaten mit RedMatic in einer InfluxDB speichern), landen diese Meldungen leider nicht im richtigen Raum, sondern im Sammelbecken "undefined". Unschön.

Soweit ich sehen konnte, tritt das bei channelType = MAINTENANCE auf. Ein von mir eröffnetes Issue-Ticket bei redmatic (https://github.com/rdmtc/RedMatic/issues/364) hat enthüllt, dass schon das CCU-Webui keine Zuweisung eines Raumes zum Channel 0 erlaubt.

Trotzdem wollte ich nicht auf die korrekte Einsortierung meiner Signale verzichten. Bei der Lösung habe ich ausgenutzt, dass andere Messages des Geräts einen korrekt gesetzten Raum haben. Die sehr simple Lösung war daher, die Rauminformationen anhand der Device-ID zu cachen. Dafür verwende ich eine function-Node. Diese, wie auch anderen Nodes, hat Zugriff auf einen context, in dem man zur Laufzeit beliebige Daten ablegen und sozusagen von Message zu Message weitergeben kann. Als Cache-Key verwende ich die Device-ID und speichere darunter den Raum, sobald eine Message damit hereinkommt. Für spätere Messages vom selbem Device aber ohne Raum wird dann die gecachte Information verwendet:

var device = msg.device;
var room = msg.room;

var devKey = "DEV" + device;

var ctx = context.get(devKey) || 0;
if (!ctx && room) {
    context.set(devKey, room);
}

if (!room && ctx) {
    msg.room = ctx;
}

return msg;

Diese function node wird vor der "MeasurementAndTags"-Node eingefügt, hier "Room cache" genannt:

Der Nachteil ist, dass der Context beim Neustart von Redmatic verloren geht und daher einige Messages keine Räume haben, bis die erste Nachricht vom entsprechenden Device kommt. Für mich ist das kein Problem, so hoch kritisch ist meine Hausinstallation nicht. Wer jedoch den Cache über den Neustart hinaus persistieren möchte, findet hier eine Anleitung, wie das mit den Contexten geht: https://stevesnoderedguide.com/node-red-variables.