Hallo Rolf,
an Code wie
a = obj1.Dings.Bums.value
sind automatisch mehrere Objekte beteiligt. Inobj1
findest Du ein Objekt mit EigenschaftDings
. In der EigenschaftDings
findest Du ein weiteres Objekt, das die EigenschaftBums
hat. Und inBums
steht ein Objekt mit der Eigenschaftvalue
.
Vielen Dank für deine Erläuterungen. Genau dieses Verständnis hat mir gefehlt und habe ich im Tutorial so leider auf die schnelle auch nicht finden können. Aber so wie von dir erklärt, habe ich es jetzt (so bilde ich es mir zumindest jetzt ein) verstanden.
Um sowas zu erzeugen, kannst Du geschachtelte Objektliterale verwenden. Das könnte so aussehen (ich habe noch ein paar weitere Eigenschaften hinzugemixt):
const obj1 = { Dings: { Bums: { value: 8, name: 'Hugo' }, Blub: 7 }, Bla: 3 };
Objektliterale konnte ich im Tutorial bereits nachlesen und habe ich in der Theorie soweit auch verstanden. Nur der Zusammenbau des von mir gewünschten Objekts mittels Verschachtelungen von mehreren Objekten war mir absolut nicht klar. Dein Beispiel finde ich aber super, da es genau den Strukturaufbau zeigt, den ich mir für mein Vorhaben vorgestellt habe.
Wenn Du sowas per Code Stück für Stück aufbaust, musst Du die Objekte Stück für Stück zusammensetzen. An Stelle von
new Object()
(was nicht falsch ist), kann man einfacher das leere Objektliteral{}
verwenden, damit passiert das Gleiche.const obj1 = {}; obj1.Dings = {}; obj1.Bla = 3; obj1.Dings.Bums = {}; obj1.Dings.Blub = 7; obj1.Dings.Bums.value = 8; obj1.Dings.Bums.name = 'hugo';
Das Objekt, das so entsteht, ist das Gleiche
Verstehe ich das nun richtig:
In deinem ersten Beispiel wird ein neues Objekt komplett mittels einer objektliteralen Struktur zusammengebaut und als Konstante mit der Bezeichnung obj1
bereitgestellt.
In deinem zweiten Beispiel geschieht im Prinzip dasselbe, jedoch wird das Objekt nicht mit einer Struktur als ganzes gebaut sondern laufend mit direkten Zuweisungen Name = Wert
aufgebaut/erweitert.
- es ergibt nur keinen Sinn, es so zu tun, wenn die Zuweisungen wie hier direkt untereinander stehen. Aber wenn Du die Teile über mehrere Codestellen verteilt einsammelst, ergibt das mehr Sinn.
Das habe ich jetzt nicht ganz verstanden.... wieso ergibt es so keinen Sinn?
Generell - bevor Du zu viel baust, beschäftige Dich zunächst mal damit, was der Adapter für deine Solaranlage von sich aus anbietet. Es kann gut sein, dass der bereits eine Objekthierarchie bereitstellt.
Der Adapter für den Wechselrichter im IOBroker bringt sehr viele Datenpunkte, aber nicht alle sind für mich von Bedeutung. Der Adapter selbst hat auch eine Art "Struktur" oder "Objekthierachie", jedoch nicht als JavaScript Objekt, sondern eben nur als Adapter mit Datenpunkten. Die relevanten Datenpunkte müssen dann in einem JavaScript mittels der von IOBroker zur Verfügung gestellter Funktion getState()
in nutzbare Variabeln eingelesen werden. So habe ich das aktuell bei mir umgesetzt, was mir persönlich aber nicht so gut gefällt. Ich würde gerne ein JavaScript schreiben, dass mir alle relevanten Datenpunkte des Adapters ausliest und diese dann in einem einzigen JavaScript-Objekt in realtime (das wird wohl noch eine andere Herausforderung werden???) vereint. Dieses JavaScript könnte ich dann in allen anderen JavaScripten wiederverwenden. Sollte ich einmal Anpassungen am JavaScript-Objekt vornehmen müssen, so muss ich dass dann nur in dem einen Script anpassen und für alle anderen Scripte (die dieses Script includen) wäre das dann automatisch ebenfalls angepasst. Soweit mein Gedanke dahinter 😀
Ich habe gerade nur etwas die Doku von IOBroker überflogen, und bin erstmal von der Komplexität erschlagen. Das ganze Ding basiert auf Node.js - was wichtig ist zu wissen. Das ist auch eine JavaScript-Umgebung, aber es ist kein Browser. D.h. es gibt dort ganz andere Programmierschnittstellen. Der JavaScript-Kern ist gleich, aber es gibt eine Menge drumherum, und das Drumherum ist im Browser und in Node sehr verschieden. Unser Wiki bezieht sich nur auf JavaScript im Browser. Der /JavaScript-Teil geht vor allem auf JavaScript ein, aber es kann auch sein, dass einige Beispiele Dinge tun, die nur im Browser funktionieren.
Das ist eine sehr wichtige Information für mich, vielen Dank auch dafür! Ich werde mir das im Hinterkopf behalten 😉
Möglicherweise - soweit habe ich die Doku nicht studiert - kann man im IOBroker auch Script bereitstellen, das auf den von IOBroker ausgelieferten HTML Seiten abläuft. Du musst also immer genau aufpassen, für welche Plattform Du programmierst.
Ja, soweit ich das verstehe, ist die Plattform immer die IOBroker Plattform, für die ich Scripte erstellen kann und nicht für den "Browser", wie es vermutlich üblicherweise in diesem Forum diskutiert wird. Aber JavaScript als solches ist in seiner Grundlage bei beiden Umgebungen (mehr oder weniger) dasselbe.
Diese "getSate"-Funktion (die vermutlich getState heißt) - ist das etwas von Dir oder von IOBroker?
Der Schreibfehler ist von mir, die Funktion von IOBroker 😉
Ich danke dir für deine konstruktive und sehr hilfreiche Lektion.
LG Roli