NEWS
[gelöst]Adapterentwicklung: getState --> undefined
-
Hallo Zusammen,
ich versuche mich gerade daran einen Adapter zu schreiben.
ich komme auch gut voran.
Nur schaffe ich es nicht den Wert eines States auszulesen.var wert_aktivedelay = this.getState(stateID);
Dieser Code gibt mir im Log ein "undefined" aus. Eigentlich sollte da doch das Objekt ausgegeben werden.
Sodass ich mit xxx.val einfach den Wert in die Variable bekomme.denn this.setState (xxx) funktioniert...
Den Code aus der Dokumentation:
this.getState('myState', function (err, state) { this.log.info( 'State ' + adapter.namespace + '.myState -' + ' Value: ' + state.val + ', ack: ' + state.ack + ', time stamp: ' + state.ts + ', last changed: ' + state.lc ); });
Hab ich versucht. Da sagt er mir er kennt "log" nicht. Somit komm ich hier auch nicht weiter.
Kann mir jemand weiterhelfen?
Grüße
Daniel -
@rde-master sagte in Adapterentwicklung: getState --> undefined:
Da sagt er mir er kennt "log" nicht.
Welche Doku ist das? Das ist falsch.
function (err, state)
müsste(err, state) =>
lauten. -
-
@rde-master Da steht aber nichts von this.log - du scheinst einen Mix aus dem "alten" Stil und dem Klassen-Stil aus dem Template zu haben.
Prinzipiell kannst du die Doku so verwenden, allerdings musst du überall, wo Callback-Funktionen genutzt werden, Arrow-Funktionen statt "konventionellen"
function
s einsetzen. -
Oder für die "konventionellen" Funktionen die Umgebung definieren. Also entweder .bind(this) oder als Member übergeben. Wenn man JavaScript nicht gut kennt, ist das aber alles eher verwirrend. Und die Arrow Funktionen haben den Nachteil, dass man die nicht beliebig aufblasen kann (ok, kann auch ein Vorteil sein ;-)). Aber es bleibt das Problem, dass man im "intuitiven" Programmfluss danach den Wert ja immer noch nicht hat.
Von daher würde ich stark empfehlen das ganze in async / await umzubauen.
Da würde das, was du willst dann so gehen:var wert_aktivedelay = await this.getStateAsync(stateID);
Dafür muss aber die Funktion, in der du das aufrufst selber async sein. Dafür ist es ganz hilfreich ins neue Template zu gucken und den eigenen Code vielleicht in die Richtung zu biegen. Wenn man noch nicht zu viel gemacht hat, dann geht das relativ einfach: https://github.com/ioBroker/ioBroker.template/blob/master/JavaScript/main.js
(helfe zur Not auch dabei)
-
@AlCalzone
DANKE!
Super jetzt bekomm ich im Log immerhin die Werte geliefertvar wert_aktivedelay = this.getState('myState', (err, state) => {this.log.info(state.val)});
Wie bekomme ich das jetzt in die Varialbe "wert_aktivedelay" rein?
Ich habs mit dem Code versucht:var wert_aktivedelay; this.getState('myState', (err, state) => {wert_aktivedelay = state.val}); this.log.warn("wert_aktivedelay: " + wert_aktivedelay);
Leider kommt hier auch nur "undefined" raus
Vlt ist noch hilfreich, dass die Abfrage in einer for Schleife lebt, weil ich nacheinander verschiedene States prüfen möchte.
Meine IDE gibt die Warnung aus, dass in einer for Schleife keine funktionen definiert werden sollen.
Kann das daran liegen?
So sieht derzeit der komplette code Schmippsel aus:for (i = 0; i < device.wert; i++){ var wert_aktivedelay; this.getState(adname + adid + device.name + ".Schwelle" + i + ".AktiveDelay", (err, state) => {wert_aktivedelay = state.val}); this.log.warn("wert_aktivedelay: " + wert_aktivedelay); if (wert_aktivedelay === true){ //mach was..... }
@Garfonso
Danke für den Tipp!
Ich hab mich mit "async" noch gar nicht beschäftigt,.....
Der Code wird (hoffenltich) net so komplex, sobald ich mal die Grundfunktion am laufen habe werde ich mich damit mal beschäftigten,... momentan läuft alles ohne "async" -
@rde-master said in Adapterentwicklung: getState --> undefined:
momentan läuft alles ohne "async"
Aber es läuft trotzdem asynchron und genau da ist dein Denkfehler.
Der Wert wird schon irgendwann in deiner Variablen gespeichert. Aber eben erst "irgenwann", nämlich, wenn der getState Aufruf ein Ergebnis bekommen hat (halt asynchron). Dann wird die Klammerfunktion aufgerufen und der Wert zugewiesen. Wenn du das log noch mit in die Funktion tust, dann müsste es auch den richtigen Wert haben.Das getState startet eine Anfrage, der Ablauf wartet da aber nicht auf das Ergebnis, sondern es werden direkt die nächsten Zeilen ausgeführt. Daher muss man seinen Codefluss da deutlich anpassen.
Oder man beschäftigt sich mit async, dann kann man mit dem Codewort "await" dafür sorgen, dass der Code an einer Stelle auf das Ergebnis wartet und es erst danach weiter geht.
Das ist gerade, wenn man es noch nicht so oft gemacht hat, deutlich intuitiver, daher würde ich das schon stark empfehlen.
-
ahhhhhhhhhhh
DANKE,.. jetzt hat es klick gemacht.
Dann werd ich mir das Thema mal rein ziehen. Und den kompletten Code darauf aufbauen.
Nochmals DANKE!