NEWS
[gelöst] Geräte-Name ermitteln mit JS-Funktion
-
@cinimod sagte: liefert aber nicht das gewünschte Ergebnis :
Das funktioniert beim HmIP-Adapter nicht, da noch die Ordnerebene "channels" zwischen Device und Channel ist.
-
@paul53
In der CCU kann ich auch den Kanal benennen. Das würde ja reichen.
Geht das bei HmIP? -
@codierknecht sagte: Kanal benennen. Das würde ja reichen.
Das sollte auch bei HmIP funktionieren (habe selbst nur HM-RPC).
Oder man verwendet eine JS-Funktion mit Ergebnis. -
Oder man verwendet eine JS-Funktion mit Ergebnis.
Oh da kenne ich mich garnicht aus ... habe das jetzt so übernommen:
function deviceName(id) { // Datenpunkt-ID id = id.substring(0, id.lastIndexOf('.')); id = id.substring(0, id.lastIndexOf('.')); id = id.substring(0, id.lastIndexOf('.')); if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name; }
Weiß nicht ob das richtig ist ... oder richtig eingebunden ... liefert aber auch nicht das gewünschte Ergebnis:
javascript.0 2022-11-14 08:32:40.500 info script.js.common.Alarmanlage.Alarmanlage_Sensoren2: undefined javascript.0 2022-11-14 08:32:37.761 info script.js.common.Alarmanlage.Alarmanlage_Sensoren2: undefined
-
@cinimod
Du erwartest in der Funktion "deviceName" einen Parameter "id".
Der wird aber im Blockly nicht übergegeben.
Außerdem heißt die aufgerufene Funktion die ich da sehe "deviceName". Im Blockly wird aber eine Funktion "read_out_device" aufgerufen.
Und Du benötigst ein Funktion, die auch ein Ergebnis zurückliefert.
Und zum guten Schluss: Die ID des übergeordneten Gerätes kann man vermutlich auch besser (RegEx?) aus der kompletten ID extrahieren. Damit stehe ich aber auch noch auf Kriegsfuß - vielleicht kann @paul53 da einspringenDu kannst das hier als Vorlage verwenden:
-
@codierknecht in deiner Funktion steht quasi nichts drin ? ist das richtig ?
-
@cinimod sagte in Geräte-Name ermitteln:
@codierknecht in deiner Funktion steht quasi nichts drin ? ist das richtig ?
Ja, das soll ja nur eine Vorlage sein, die das Prinzip klarstellen soll.
Mit Leben darfst Du die dann selbst füllen -
Und genau da bin ich total raus
Da brauche ich unbedingt Hilfe, das ist Neuland für mich, aber ich bin interessiert ....
Kannst du es mir vielleicht etwas näher bringen ? -
@cinimod
Nimm doch erstmal den Code den Du in Deiner Funktion "deviceName" drin hattest.
So allein vom Lesen müsste die doch schon ein Ergebnis bringen. Ob's das richtige Ergebnis ist, kann ich nicht beurteilen.
Zur Not mal Holzhammer-Debugging: Hinter jede Anweisung den aktuellen Wert ins Log schreiben -
@cinimod sagte: Kannst du es mir vielleicht etwas näher bringen ?
In die Funktion gehört nur der innere Teil, die Funktionsdeklaration bildet Blockly:
Es muss der Funktionsparameter
id
an die Funktion übergeben werden:An die Funktion muss bei Aufruf die Datenpunkt-ID übergeben werden.
-
@paul53
Es muss aber eine Funktion mit Ergebnis sein. Sonst ist die hier relativ sinnbefreit -
@codierknecht sagte: Es muss aber eine Funktion mit Ergebnis sein.
Du hast natürlich recht. Habe oben korrigiert.
-
und die Variable "id" beinhaltete dann das Ergebnis ?
Ach so ne das geht ja nicht, weiß er ja garnicht woraus er das nehmen soll ...
dann so ?
EDIT: da kommt dann das raus:
javascript.0 2022-11-14 12:23:17.361 info script.js.common.testen.eigene.JS_Funktion_mit_ergebnis: undefined
-
@cinimod sagte: weiß er ja garnicht woraus er das nehmen soll ...
Habe ich doch geschrieben:
An die Funktion muss bei Aufruf die Datenpunkt-ID übergeben werden.
-
Sorry, hatte ich nicht gleich verstanden. Jetzt klappt es wie gewünscht.
Danke euch beiden. -
@paul53 @Cinimod
Wenn's dann funktioniert, könnte man die Funktion noch etwas verschlanken:id = id.split('.',3).join('.'); // die ersten 3 Teil-Strings if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name; // Name aus DP lesen
Da wird das Pferd von der anderen Seite aufgezäumt und man spart sich 2 Durchläufe
OK, ich weiß ... Erbsenzählerei
-
@cinimod
Zum rumprobieren kann man auch das hier gut brauchen: https://playcode.io/javascript
Da fehlen dann zwar die ioBroker-spezifischen Dinge, aber für ein paar Gehversuche mit JS kann man das ganz gut einsetzen.
-
@codierknecht sagte: die Funktion noch etwas verschlanken:
Das wird mit 3 nicht funktionieren, da noch ein Ordner "devices" dazwischen hängt:
hmip.0.devices.3014F711A0001118A9925C9B -
@paul53
Jetzt wirst Du aber kleinlich ... dann sind's halt 4Das wird jeder vielleicht ein bisschen anders sehen, aber ich persönlich finde die so deutlich besser lesbar.
Und wenn man die Funktion dann noch umbenennt in z.B.getDeviceNameFromID
kann man auch im Blockly direkt erkennen, was die denn so macht und auch die CleanCode-Fraktion ist zufrieden -
@codierknecht
Beide Versionen sind an den HmIP-Adapter angepasste Versionen.
Eine Version, die mit allen Adaptern (auch Zigbee) funktioniert, würde so aussehen:id = id.substring(0, id.lastIndexOf('.')); if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name; id = id.substring(0, id.lastIndexOf('.')); if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name; id = id.substring(0, id.lastIndexOf('.')); if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;