Geräte in Node.js - Funktion auslesen und setzen

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Geräte in Node.js - Funktion auslesen und setzen

Beitrag von didiator » 01.09.2020, 19:25

Hallo zusammen,

ich möchte gern in einer Node-Red - function den Status eines Schalters (o.ä.) auslesen und setzen, ohne dafür extra eine eigene Node zu konfigurieren. Hintergrund sind etwas komplexere Vorhaben, in denen die sonst zu erstellenden -zig Nodes zu unübersichtlich werden würden. Ich habe das bereits in [goto]viewtopic.php?t=50838[/goto] angefragt, bekam aber bisher dort keine Antwort.
Zitat: "...Dazu muss im ccu-connection Node das Speichern aller Zustände im Context aktiviert werden..."
habe ich gemacht:
Connection1.PNG
Connection1.PNG (7.6 KiB) 1352 mal betrachtet
...
Connection2.PNG
Connection2.PNG (2.57 KiB) 1352 mal betrachtet

Code: Alles auswählen

global.get('Raspberry.values')['BidCos-RF.PEQ1195774:1.LEVEL'].value
müsste dann wohl einen Wert anzeigen. Tut es aber nicht weil

Code: Alles auswählen

global.get('Raspberry')
bereits null ist. .values von dem null-Wert ist damit unzulässig.

Das zeigt auch folgendes Beispiel:

Code: Alles auswählen

ccuData = global.get("Raspberry");
if (!ccuData.values)  
{ 
    msg.payload = "CCU hat keine Daten geliefert";
}
else
{
    msg.payload = "CCU hat Daten geliefert";
}
return msg;
Die Fehlermeldung lautet auch hier:

Code: Alles auswählen

TypeError: Cannot read property 'values' of undefined

Wenn ccuData gefüllt wäre, könnte ich dann beispielsweise folgendes machen:
Connection3.PNG
Connection3.PNG (8.88 KiB) 1352 mal betrachtet

Code: Alles auswählen

let t = ccuData.values['PEQ1195774:1.LEVEL'];
if (t) {
	msg.payload = t.value; 
}
Weiß jemand, wie ich im Code so ein Gerät abfragen / setzen kann? Was mache ich da falsch?
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Geräte in Node.js - Funktion auslesen und setzen

Beitrag von hobbyquaker » 01.09.2020, 20:04

Du kannst Dir mit dem Context-Browser anschauen was/wo im Context liegt:
Bildschirmfoto 2020-09-01 um 20.02.51.png
Dann unter "Global" den Refresh Button rechts klicken.

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: Geräte in Node.js - Funktion auslesen und setzen

Beitrag von didiator » 02.09.2020, 09:27

Hallo hobbyquaker,

vielen Dank für die schnelle Antwort. Das ist ja eine sehr gute Informationsquelle, die ich bisher noch nicht kannte. Allerdings komme ich damit noch nicht ganz klar, kannst Du mir bitte nochmal helfen?
Connection4.PNG
Connection4.PNG (7.3 KiB) 1308 mal betrachtet
ich habe die Daten nun im Kontextbrowser unter ccu-192_168 gefunden. und dann in einer Unterstruktur [2].["254"]. 192.168.2.254 ist die IP meines Pi4. kann ich irgendwo den Namen verändern und erreichen, dass die Daten nicht in Unterstrukturen auftauchen?

Und wenn nicht, wie fragt man dann diese Unterstruktur ab? Wenn ich mir den Pfad kopiere, lautet dieser

Code: Alles auswählen

[2]["254"].values["BidCos-RF.PEQ1195774:1.LEVEL"]
Die Abfrage müsste dann ja so ähnlich lauten wie

Code: Alles auswählen

global.get('ccu-192_168[2]["254"].values')["BidCos-RF.PEQ1195774:1.LEVEL"].value
Das bringt aber kein Ergebnis.
Connection5.PNG
Connection5.PNG (20.85 KiB) 1308 mal betrachtet
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: Geräte in Node.js - Funktion auslesen und setzen

Beitrag von didiator » 02.09.2020, 12:37

Code: Alles auswählen

global.get('ccu-192_168.2.254.values')["BidCos-RF.PEQ1195774:1.LEVEL"].value
liefert mir einen Wert.

Aber kann man den Namen nicht anpassen und die Unterstrukturen vermeiden?
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: Geräte in Node.js - Funktion auslesen und setzen

Beitrag von didiator » 02.09.2020, 14:46

Hallo,
ich wollte gern zeigen, wie ich die Frage für mich aktuell gelöst habe:
Name der CCU / values
Es ist ja ziemlich unübersichtlich, den vollqualifizierten Namen der CCU zu schreiben. Ich habe mir daher ein globales Objekt "cfg" gebaut, in dem ich den Namen und die Substruktur der values als Variable aufnehme.

Code: Alles auswählen

cfg = {};
cfg.CCUName = 'ccu-192_168';
cfg.CCUValues = cfg.CCUName+'.2.254.values';
global.set('cfg', cfg);
"Konstanten" global hinterlegen und persistieren
Diese Werte werden einmal geladen und dann bei mir über das Wegschreiben der Context-Daten ins Filesystem persistiert. Man soll dabei darauf achten, dass man die Daten nicht auf die SD-Karte schreibt, sondern auf einen USB-Stick. Das Ganze kann man in der Node-Red Konfiguration interlegen:
Config.PNG
Config.PNG (5.38 KiB) 1277 mal betrachtet

Mapping Gerätename und Seriennummer
In der gleichen Funktion, in der ich wie oben beschrieben das cfg-Objekt angelegt habe, lege ich mir noch ein zweites Objekt "dev" an, in dem ich das Mapping zwischen einem lesbaren Gerätenamen und der ID des Gerätes hinterlege. Das sieht dann so aus:

Code: Alles auswählen

dev = {}
dev.Licht_Esstisch = 'BidCos-RF.PEQ1195774';
dev.Display_Garage = 'BidCos-RF.NEQ1596014';
//usw.
global.set('dev', dev);
Verwenden der vorbereiteten Daten in functions
Dann kommt der Punkt, wo ich die Sachen in einer Funktion abfragen will. Ich lade mir dazu einmalig die globalen Objekte am Anfang der Funktion und kann dann später einfach auf die Synonyme zugreifen:

Code: Alles auswählen

let ccuData = global.get('cfg').CCUValues;
let dev = global.get('dev') || {};

let test = global.get(ccuData)[dev.Licht_Esstisch + ':1.LEVEL'].value;

msg.topic = 'Kontrolle'
msg.payload = test;
return msg;
Das ist doch recht einfach, oder?
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Geräte in Node.js - Funktion auslesen und setzen

Beitrag von hobbyquaker » 02.09.2020, 17:05

Oh, da bist Du auf einen mir bisher unbekannten Bug gestoßen. Eigentlich sollte die erste Property ccu-192_168_2_254 heissen, da wird aber nur der erste Punkt der IP-Adresse durch ein Unterstrich ersetzt anstatt alle - dadurch werden die 2 und die 254 zu Unterobjekten. Ist mir nie aufgefallen da ich hier mit Hostnamen und nicht mit IPs arbeite... Wird asap gefixt.

Ref: https://github.com/rdmtc/node-red-contr ... issues/126

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: Geräte in Node.js - Funktion auslesen und setzen

Beitrag von didiator » 04.09.2020, 14:51

:-)
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Antworten

Zurück zu „RedMatic“