NEWS
Übernahme Wert/Text aus Objekten in Skripten
-
Super Paul, genial! Jetzt funktioniert es scheinbar.
Vielen vielen lieben Dank, auch das du so sau schnell warst.
Wenn ich mal wieder dumme Anfängerfragen habe, melde ich mich bei dir! (ich hoffe das klingt nicht wie eine Drohung)
-
@schlumpf sagte: melde ich mich bei dir!
Bitte nicht per Chat-Nachricht, sondern als neues Thema im Forum. Dann können auch andere antworten, die mehr Ahnung als ich haben.
-
Werde ich natürlich auch so machen. Danke.
P.S.: leider weiß ich nicht wie ich deinen Kommentar als Lösung deklarieren kann.
-
Hallo Paul, hätte nochmal ne Frage, vielleicht kannst du mir nochmal helfen.
Ich habe folgende Java-Skript Funktion, woher auch immer ich die nochmal hatte:
var LastEventID; LastEventID = getState("netatmo.0.Kandel.LastEventData.LastEventId").val; setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, getState("netatmo.0.Kandel.Events."+LastEventID+".type").val);
Die wird genutzt um bei Netatmo mehrere Werte (hier nur einen, aber in mehreren Skripten eingesetzt) auszulesen und in eigene Objekte zu kopieren.
Jetzt hätte ich 2 Fragen da ich mich damit so garnicht auskenne:
-
Kann ich, bzw. wie, diese Funktion einfach um die anderen Werte erweitern (mein erster Gedanke einfach die 2. Zeile kopieren und andere Objekte einsetzen)?
-
Nicht immer sind die Objekte die abgefragt werden auch in dem Ordner vorhanden. Wenn dies vorkommt, bekomme ich zum Einen jedesmal mehrere Warnungen im Log und zum Anderen die Angabe "null" in dem zugewiesenen Objekt. Kann man das ganze so umbauen, evtl. auch im zugehörigen Blockly, das er nur dann einen Wert übernimmt wenn das Objekt vorhanden bzw. nicht leer ist? Und wenn das Objekt nicht vorhanden ist oder leer ist, dass zu schreibende Objekt auch leer lässt/macht?
Gruß
Jan -
-
Keine Ahnung? (siehe oben)
-
@schlumpf sagte: nur dann einen Wert übernimmt wenn das Objekt vorhanden
if(existsState('netatmo.0.Kandel.Events.' + LastEventID + '.type')) { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, getState("netatmo.0.Kandel.Events."+LastEventID+".type").val); }
-
Mit deiner Vorlage habe ich mal versucht auch die anderen Sachen die ich brauche mit einzubauen. Was hältst du davon:
var LastEventID; LastEventID = getState("netatmo.0.Kandel.LastEventData.LastEventId").val; if(existsState('netatmo.0.Kandel.Events.' + LastEventID + '.type' && getState('netatmo.0.Kandel.Events.' + LastEventID + '.type').val != '')) { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, getState("netatmo.0.Kandel.Events."+LastEventID+".type").val); } else { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, ''); }
Kann man das so lassen oder sind da irgendwo Fehler drin?
-
@schlumpf sagte: Was hältst du davon
Der Vergleich mit einem Leerstring ist umsonst, da ein Leerstring geschrieben wird, wenn die Bedingung nicht erfüllt ist.
-
Äh, hä?
Meinst du die 2. Abfrage bei if oder das schreiben des Leerzeichens (des leeren Feldes) nach else?
Das im if habe ich rein genommen um damit er bei einem leeren feld nicht den "Inhalt" überträgt, da dort dann immer "null" raus kommt. Ich hätte aber lieber ein leeres Feld als ein mit "null" drin.
Das bei else habe ich rein genommen damit er nicht einfach das drin lässt was vorher schon drin war, sondern einfach das Objekt leer lässt.
Hab ich da einen Denkfehler? (bzw. einfach nicht genug Ahnung)
-
@schlumpf sagte: Ich hätte aber lieber ein leeres Feld als ein mit "null" drin.
Dann vergleiche mit
null
, denn wenn ein Leerstring enthalten ist, wird nichtnull
geschrieben. -
Ok, ich bin noch nicht ganz sicher ob ich dich richtig verstehe oder wir aneinander vorbei reden.
Meinst du mit "Leerstring" ein Leerzeichen (sprich Space auf der Tastatur)? Weil das ist nicht vorhanden, es ist kein Zeichen zwischen den '.
Kann ich denn nach "null" suchen wenn der Wert des Objektes leer ist? Versteht er das? Weil es wird zwar "null" beim Übertragen in mein selbst erstelltes Objekt geschrieben, das Objekt von dem der Wert genommen werden soll ist aber zum Teil entweder leer (aber vorhanden) oder garnicht vorhanden.
-
@schlumpf sagte: Objekt ... entweder leer (aber vorhanden) oder garnicht vorhanden.
Es wird mit existsState(id) geprüft, ob ein Zustand (zu einem Datenpunkt-Objekt) vorhanden ist. Die Prüfung des Wertes ist nicht erforderlich.
-
Sprich er gibt auch "falsch" wieder (bzw. führt den Rest nicht aus) wenn das Objekt zwar da ist, aber keinen Wert enthält?
-
Grade versucht und ich verstehe zum Teil was du meinst. wenn jetzt etwas in dem Objekt drin steht, schreibt er trotzdem keinen Wert in das eigene Objekt (bzw. tut er schon, nur schreibt er eben einen leeren Wert rein).
Habe ein wenig rum Probiert, wenn ich den Zusatz weg lasse, schreibt er bei einem existierenden Objekt was aber leer ist wieder "null" in das Ziehlobjekt. Wenn kein Objekt da ist, funktioniert alles wie gewollt.
-
@schlumpf sagte: bei einem existierenden Objekt was aber leer ist
Was bedeutet "leer"? Wird ein Zeitstempel angezeigt, wenn man im Tab "Objekte" mit der Maus über das Werte-Feld fährt?
-
Angezeigt wird nix, Wert ist aber angeblich "null".
Hier werden in einem Ordner jedesmal ein neuer Ordner mit den verschiedenen Objekten neu angelegt sobald etwas durch die Kamera registriert wurde. Geändert werden die Werte nie, da dann wieder ein neuer Ordner angelegt wird.
-
@schlumpf sagte: Angezeigt wird nix, Wert ist aber angeblich "null".
Dann vergleiche auch mit
null
.if(existsState('netatmo.0.Kandel.Events.' + LastEventID + '.type') && getState('netatmo.0.Kandel.Events.' + LastEventID + '.type').val != null) {
-
Hab jetzt das hier gebastelt:
var LastEventID; LastEventID = getState("netatmo.0.Kandel.LastEventData.LastEventId").val; if (existsState('netatmo.0.Kandel.Events.' + LastEventID + '.type')) { if (('netatmo.0.Kandel.Events.' + LastEventID + '.type').val != 'null') { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, getState("netatmo.0.Kandel.Events."+LastEventID+".type").val); } else { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, ''); } }
Was hältst du davon?
-
@schlumpf sagte: Was hältst du davon?
So bleibt der alte Wert im Ziel-Datenpunkt stehen, wenn kein Zustand existiert.
@schlumpf sagte in Übernahme Wert/Text aus Objekten in Skripten:
Das bei else habe ich rein genommen damit er nicht einfach das drin lässt was vorher schon drin war, sondern einfach das Objekt leer lässt.
Außerdem darf
null
nicht in Hochkommata gesetzt werden. -
Irgendwie sieht das so nicht schön aus:
var LastEventID; LastEventID = getState("netatmo.0.Kandel.LastEventData.LastEventId").val; if (existsState('netatmo.0.Kandel.Events.' + LastEventID + '.type')) { if (('netatmo.0.Kandel.Events.' + LastEventID + '.type').val != null) { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, getState("netatmo.0.Kandel.Events."+LastEventID+".type").val); } else { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, ''); } } else { setState("0_userdata.0.Kamera.Letzter_Typ"/*Letzter_Typ*/, ''); }