NEWS
Luft-Messdaten von OpenSenseMap auslesen
-
@Homoran sagte:
aus "Strukturgründen" deshalb ja lieber als channel gehabt.
Dann musst Du einen Javascript-Funktion mit setObject() verwenden.
-
@paul53 sagte in Luft-Messdaten von OpenSenseMap auslesen:
@Homoran sagte:
aus "Strukturgründen" deshalb ja lieber als channel gehabt.
Dann musst Du einen Javascript-Funktion mit setObject() verwenden.
Das lasse ich lieber wenn das so gefährlich ist.
Du überraschst mich immer wieder.
@paul53 sagte in Luft-Messdaten von OpenSenseMap auslesen:
Die Variable wird nur benötigt, weil die Funktion einen Wert zurück gibt,
Das ist doch Hokuspokus
Bin mal gespannt -
Natürlich hat es geklappt.
Danke @paul53
Aber bis ich das verdaut habe wird es noch etwas dauern@paul53 sagte in Luft-Messdaten von OpenSenseMap auslesen:
Dann musst Du einen Javascript-Funktion mit setObject() verwenden.
Wenn ich ganz mutig bin verwende ich meine alte StationDP-Anlegen funktion und tausche nur setState gegen setObject aus.
-
@Homoran sagte:
tausche nur setState gegen setObject aus.
Genau das ist die Gefahr !!
Die Funktion erzeugeChannel(id, Name) müsste etwa so aussehen:id = 'javascript.' + instance + '.' + id; if(!existsObject(id)) { let obj = {}; obj.type = 'channel'; obj.common = {}; obj.common.name = Name; setObject(id, obj); }
-
Sorry @paul53
ich kapiere das nicht ganz.
Du prüfst ob die Id bereits existiert. Wenn nicht, legt er los - klar soweit!
Die ID wäre ja die Stationsnummer
Muss ich da vorher eine ID übergeben = Station? - klappt nichtDen "Pfad" baust du ja im letzten Schritt komplett auf.
Name ist doch bereits die vorhandene Variable - muss ich da auch noch was übergeben?Ich habe alle(?) Versionen mit und ohne Übergabe versucht, auch mit Text aus "Luftdaten."+Station
bekomme immer
javascript.0 2020-01-02 16:53:29.576 error (4615) setForeignObject: try to set null object for [object Object]
-
@Homoran
Sorry, es wird eine falsche ID geprüft. Habe es oben korrigiert.An die Funktion muss die Teil-ID und der Name übergeben werden.
-
@paul53 sagte in Luft-Messdaten von OpenSenseMap auslesen:
Sorry, es wird eine falsche ID geprüft.
kein Problem - das lernt
@paul53 sagte in Luft-Messdaten von OpenSenseMap auslesen:
An die Funktion muss die Teil-ID und der Name übergeben werden.
Hatte ich fast so, ich hatte lediglich statt Attribut name... einfach Name genommen.
Da war doch was mit global und local :oops: -
@Homoran sagte:
das lernt
Ja, woran man sieht, dass der Umgang mit setObject() nicht trivial ist.
@Homoran sagte in Luft-Messdaten von OpenSenseMap auslesen:
Da war doch was mit global und local :oops:
Die Funktionsparameter id und Name und die intern deklarierte Variable obj sind lokal (nur innerhalb der Funktion gültig).
-
Nachdem @paul53 wie befürchtet das Skript komlett zerlegt und neu zusammengesetzt hat hier jetzt die aktuelle Version.
Vielen Dank nochmals an @paul53 - ich habe viel gelernt! (Hoffentlich behalte ich das auch).
Änderungen in v0.3.1:
- auslesen der Daten auf JSON-Attribute umgestellt
- Station erhält neben der ID auch den Klarnamen
- dieser Klarname kann editiert werden
- Auswertung erfolgt exakt nach Anzahl Sensoren
- keine Fehlermeldungen wegen "Leerlauf" der Parserroutine mehr
-
@Homoran
setze Name auf Attribut "name" von obj
ist überflüssig, da die globale Variable Name nirgends verwendet wird. -
@paul53
Danke - ich muss da eh nochmal ran, weil der BME280 jetzt wieder den Luftdruck in Pa angibtDas stammt noch aus meine Versuchen mit dem setObject - da hatte ich es verwendet
-
@Homoran sagte in Luft-Messdaten von OpenSenseMap auslesen:
ich muss da eh nochmal ran, weil der BME280 jetzt wieder den Luftdruck in Pa angibt
Wollte wieder eine Ersetzung einfügen, aber jetzt direkt meine json-"Kenntnisse" umsetzen.
Direkt bei der zweiten Zeile bin ich ins Schleudern gekommen.Ich fürchte ich kann hier nicht direkt mit den JSON-Daten arbeiten und muss doch auf Variable ausweichen.
Das sähe dann (wenn ich da jetzt keine Fehler reingebracht habe) so aus:
Oder gibt's da doch eine Möglichkeit JSON-Inhalte zu manipulieren
-
@Homoran
Vorschlag: -
@paul53 Wo zauberst du immer nur die Lösungen her, auf die kein "normaler" Mensch kommt.
Meine Version funktioniert jetzt und ich habe sogar nicht auf title=Luftdruck sondern auf unit=Pa geprüft.
Denke das ist sauberer.Werde deine Vorschlag trotzdem umsetzen, sieht einfach "runder" aus.
-
-
@paul53
Aber mit dem prüfe-Baustein gibt es nicht die Möglichkeit noch weitere Fälle abzufangen wie mit falls...sonstfalls...Oder habe ich da wieder etwas übersehen?
-
@Homoran sagte:
mit dem prüfe-Baustein gibt es nicht die Möglichkeit noch weitere Fälle abzufangen wie mit falls...sonstfalls...
Man kann schachteln.
falls falsch prüfe ... -
@paul53 Danke - muss man nur aufpassen dass man nicht falsch abfragt sonst macht er aus allen anderen Einheiten [°C, ppm usw.] immer hPa
-
Das Skript läuft soweit ganz gut - nochmals Danke für die Weiterbildung!
leider werden die Datenpunkte bei einer neuen Station (Skript kopiert und Station-ID geändert) bis auf Station-ID und Name der Station nicht beim ersten Durchlauf gefüllt.
Ich denke das liegt nach wie vor an der asynchronen Abarbeitung, auch wenn es jetzt keine Errors mehr gibt.
Bei dem Anlegen des Channel-DP habe ich anschließend einen Timeout, damit die weiteren DPs den fertigen Channel vorfinden.
Die Sensor DPs werden abr mit Wert 0 angelegt, was IMHO durch die Funktion bedingt ist.
function ( id, Name, unit )
if(existsState(id)) return true; createState(id, 0, {type:'number', name: Name, unit:unit, read:true, write:false, role:'value'});
Kann/darf man hier den default-Wert (=0) durch eine weitere Variable ersetzen, die direkt den Wert enthält?
-
@Homoran sagte:
Kann/darf man hier den default-Wert (=0) durch eine weitere Variable ersetzen, die direkt den Wert enthält?
Ja.
if(existsState(id)) return true; createState(id, init, {type:'number', name: Name, unit:unit, read:true, write:false, role:'value'});