@paul53
Ich weiß. Dies war mein letzter Versuch, weil ich es in einem Beispiel gelesen haben. Ich dachte es ändert eventuell etwas am verhalten.
Leider nein. Davor habe ich die ganze Zeit unterschiedliche Bezeichner verwendet.
NEWS
Latest posts made by roland
-
RE: ClearSchedule funktioniert nicht
-
ClearSchedule funktioniert nicht
Hallo an alle,
ich möchte eine kleine Stoppuhr basteln. Die Stoppuhr startet, wenn ein Kanal auf true springt und soll beendet werden, wenn der Kanal wieder auf false springt.
Wenn mein Kanal auf false springt, trigert diesr korrekt die unteren "on".. code Zeilen. Meine Variable 'Bewaesserung.LaufzeitVorgarten' wird zuverlässig auf 00:00 gesetzt. Allerdings wird der Scheduler nicht beendet.
Ich arbeite öfter mit Scheduler und beende oder setzte diese neu. Ich sehe den Fehler nicht, warum dies hier nicht funktioniert.Hat jemand eine Idee für mich. Danke im Voraus.
//Vorgarten var TimerVorgarten=null; on({ id:'hm-rpc.1.000D1D89A09811.10.STATE'/*Bewaesserung Kanal:1:10 STATE*/, val:true },function(obj){ var ZeitMin=getState('Bewaesserung.BewaesserungNoetig.VorgartenZeit').val; var Zeitms=ZeitMin*60*1000; setStateDelayed('hm-rpc.1.000D1D89A09811.10.STATE',false,Zeitms); TimerVorgarten='*/10 * * * * *'; TimerVorgarten=schedule(TimerVorgarten,function(){ var TimerVorgartenLaufzeit=getState('Bewaesserung.LaufzeitVorgarten').val; var minute=TimerVorgartenLaufzeit.substr(0,2); log(minute); var sekunde=TimerVorgartenLaufzeit.substr(3,2); log(sekunde); if (sekunde<50){ sekunde=parseInt(sekunde)+10; }else{ sekunde='00'; minute=parseInt(minute)+1; if (minute<10){minute='0'+minute}; } setState('Bewaesserung.LaufzeitVorgarten',minute+":"+sekunde); }) }); on({ id:'hm-rpc.1.000D1D89A09811.10.STATE'/*Bewaesserung Kanal:1:10 STATE*/, val:false },function(obj){ clearSchedule(TimerVorgarten); setStateDelayed('Bewaesserung.LaufzeitVorgarten','00:00',5000); });
-
RE: JSON
Danke.
Das funktioniert.
Ich habe nach bestem wissen nach der korrekten Syntax gesucht data[0] in eckige Klammer zu setzen habe ich nicht vericht. Ich habe runden klammern verwendet.
Jetzt komme ich weiter.
Prima.
-
JSON
Hallo,
ich bekomme mein Json Object nicht gelesen. Ich weiß nicht wo das Problem liegt.
Ich lade einen Json String von einem meiner Server. Dieser landet in "body".
console.log(body); var data=JSON.parse(body); console.log(data.attributes.ip) var data2=JSON.stringify(data.attributes); console.log(data2);
folgende Fehlermeldung erscheint
javascript.1 script.js.Eigene.Audi: [{"id":264939,"attributes":{"ignition":false,"status":4,"battery":6,"rssi":4,"ip":"2.xxx.xxx.34","distance":0.0,"totalDistance":9554952.72},"deviceId":1,"type":null,"protocol":"gt06","serverTime":null,"deviceTime":"2017-07-12T21:06:43.996+0000","fixTime":"2017-07-12T14:41:50.000+0000","outdated":true,"valid":true,"latitude":xx.x7622222222222,"longitude":xx.x78912222222222,"altitude":0.0,"speed":0.0,"course":248.0,"address":"94A Straße, Berlin, BB, DE","accuracy":0.0,"network":null}] javascript.1 TypeError: Cannot read property 'ip' of undefined at Request.callback [as _callback] (script.js.Eigene.Audi:163:28) at Request.self.callback (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:188:22) at emitTwo (events.js:106:13) at Request.emit (events.js:191:7) at Request. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:1171:10) at emitOne (events.js:96:13) at Request.emit (events.js:188:7) at IncomingMessage. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:1091:12) at IncomingMessage.g (events.js:292:16) at emitNone (events.js:91:20)
Ich verstehe nicht wieso ich z.B. das Attribut ip nicht aufgerufen bekomme.
Ich kann das Objekt wieder in Json wandeln. Es funktioniert. Die Daten sind also da. Welche Syntax ist falsch bei mir? Ich finde nichts, was funktioniert im Netz.
Selbst das erste Attribut ID läst sich nicht ansprechen.
var data=JSON.parse(body); console.log(data.id); var data2=JSON.stringify(data.attributes); console.log(data2); var data2=JSON.stringify(data); console.log(data2)
23:15:33.019 [info] javascript.1 script.js.Eigene.Audi: [{"id":264940,"attributes":{"ignition":false,"status":4,"battery":6,"rssi":4,"ip":"2.xxx.xxx.34","distance":0.0,"totalDistance":9554952.72},"deviceId":1,"type":null,"protocol":"gt06","serverTime":null,"deviceTime":"2017-07-12T21:11:44.018+0000","fixTime":"2017-07-12T14:41:50.000+0000","outdated":true,"valid":true,"latitude":xx.x7622222222222,"longitude":xx.x78912222222222,"altitude":0.0,"speed":0.0,"course":248.0,"address":"94A Straße, Berlin, BB, DE","accuracy":0.0,"network":null}] 23:15:33.020 [info] javascript.1 script.js.Eigene.Audi: undefined 23:15:33.021 [info] javascript.1 script.js.Eigene.Audi: undefined 23:15:33.021 [info] javascript.1 script.js.Eigene.Audi: [{"id":264940,"attributes":{"ignition":false,"status":4,"battery":6,"rssi":4,"ip":"2.xxx.xxx.34","distance":0,"totalDistance":9554952.72},"deviceId":1,"type":null,"protocol":"gt06","serverTime":null,"deviceTime":"2017-07-12T21:11:44.018+0000","fixTime":"2017-07-12T14:41:50.000+0000","outdated":true,"valid":true,"latitude":xx.x7622222222222,"longitude":xx.x78912222222222,"altitude":0,"speed":0,"course":248,"address":"94A Straße,Berlin, BB, DE","accuracy":0,"network":null}]
Kann mir jemand helfen und sagen, wo mein Fehler liegt?
-
RE: Wert aus Unterfunktion übergeben?
Die callback-Funktion MW_Min_Max wird von der Funktion sendTo() aufgerufen. Somit bestimmt auch sendTo(), welche Parameter an die callback-Funktion übergeben werden. `
Das verstehe ich noch nicht so ganz. Wie kann ich in dem sendto Befehl Parameter für die Callbackfunktion übergeben?
Mit der Variante setTimeout habe ich auch experimentiert.
var h=1; var id = '"hm-rpc.0.KEQ0766772.1.TEMPERATURE"'/*Temperatur-Feuchtefühler Balkon.TEMPERATURE*/; setTimeout(function() {SQLAbfrage(id,h);}, 5000); id ='"hm-rpc.0.MEQ1600050.1.TEMPERATURE"'/*Balkon Temperatur links Sonne.TEMPERATURE*/; setTimeout(function() {SQLAbfrage(id,h);}, 5000); id ='"hm-rpc.0.MEQ1600050.2.TEMPERATURE"'/*Balkon Temperatur rechts Sonne.TEMPERATURE*/; setTimeout(function() {SQLAbfrage(id,h);}, 5000);
Diese hat leider deine gleichen Effekt. Wenn das Programm wie oben, gestartet wird, wird die Funktion SQLAbfrage nicht nach 5,10 und 15 s gestartet, sondern alle 3 nach 5 s. Das hat zur folge, dass alle drei Abfragen mit der zuletzt gesetzten ID gestartet werden. Ich habe aber gerade gesehen, dass in der Beschreibung von setTimout Argumente vorgesehen sind.
Diese werde ich demnächst mal testen.
Derzeit habe ich eine geänderte SQL Abfrage in Verwendung. Vielleicht ist diese auch anderen Nützlich.
Mit dieser werden eindeutige Datensätze abgerufen.
`function SQLAbfrage (id_name, zeit_h) { var zeit_ms = zeit_h*3600*1000; var end_time = new Date().getTime(); var start_time = end_time-zeit_ms; sendTo('sql.0', 'query', 'SELECT * FROM iobroker.ts_number INNER JOIN iobroker.datapoints ON datapoints.id=ts_number.id WHERE ts_number.ts >= ' + start_time + ' AND datapoints.name=' + id_name, MW_Min_Max); } function MW_Min_Max(result){ if (result.error) { console.error(result.error); } else { var mw=0; var max=-100; var min=100; //console.log('Rows: ' + JSON.stringify(result.result)); createState(result.result[0].name+'_mw'); createState(result.result[0].name+'_max'); createState(result.result[0].name+'_min'); for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()); mw=mw+result.result[i].val; if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;} } mw=mw/(result.result.length-1) console.log(mw.toFixed(1)); console.log(max.toFixed(1)); console.log(min.toFixed(1)); setState(result.result[0].name+'_mw',mw.toFixed(1)); setState(result.result[0].name+'_max',max.toFixed(1)); setState(result.result[0].name+'_min',min.toFixed(1)); } }</result.result[i].val){max=result.result[i].val;}>` [/i][/i][/i][/i][/i][/i][/i]
-
RE: Wert aus Unterfunktion übergeben?
Danke.
Ich habe die art wie und wo welche Variablen deklariert werden und dann zur Verfügung stehen verstanden.
An sich habe ich nun folgendes Problem.
Die Zeile habe ich in einer globalen Funktion,da ich sie gern an mehren Stellen in dieser oder einer ähnlichen Art verwenden möchte.
sendTo('sql.0', 'query', 'SELECT * FROM iobroker.ts_number WHERE ts >= ' + start_time.getTime() + ' AND id=' + result.result[0].id, MW_Min_Max);
Das Problem ist, dass wenn die Funktion 2 mal hintereinander aufgerufen wird, ist in der Callbackfunktion "MW_Min_Max" die ID der aufrufenden Funktion nicht mehr eindeutig, da sie vom zweiten aufruf überschrieben wird.
Gibt es eine Möglichkeit der Funktion MW_Min_Max einen Parameter zu übermitteln?
Einen Return in die Funktion MW_Min_Max einzubauen mach keinen Sinn, da das Ergebniss vom sendTo Befehl nicht ausgewertet wird.
Ich hoffe dies ist verständlich.
-
RE: Wert aus Unterfunktion übergeben?
Ansich wollte ich ersteinmal verstehen, wie die übergabe von Parametern und Ergebnisse in Javascript funktioniert.
Mein erster Fehler war nach Java und nicht nach Javascript zu googlen.
Auf meiner CCU habe ich bis jetzt die Temperaturen des letzten Tages dazu verwendet, Rolläden im Obergeschoss zu steuern.
Sommer/Winter betrieb. Ist es am Tage sehr warm dürfen sie Nachts oben bleiben. Ist es Nachts zu kalt und ich muss am Tage heizen, sollen sie nachts runter.
Das funktiionierte bis jetzt ganz gut in der CCU. Von den CCU Problemen abgesehen.
Die Werte aus einer SQL DB zu berechnen ist eleganter.
Die Unterfunktion funktioniert nun ganz gut.
`// mittel, maximum, minimum function mmm(result) { var i; var mw=0; var max=-100; var min=100; for (i = 0; i < result.result.length; i++) { //console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()); mw=mw+result.result[i].val; if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;} } mw=mw/(result.result.length); console.log(id); console.log(result.result[1].id); console.log(mw); console.log(max); console.log(min); setState(id+'_mw', mw); setState(id+'_max', max); setState(id+'_min', min); } function SQLAbfrage (id, dt) { var status_mmm; createState(id+'_mw'); createState(id+'_max'); createState(id+'_min'); dt = dt*3600*1000; var end_time = new Date().getTime(); var start_time = end_time - dt; sendTo('sql.0', 'getHistory', { id: id, options: { start: start_time, end: end_time, aggregate: 'none' // or 'none' to get raw values } }, mmm); }</result.result[i].val){max=result.result[i].val;}>` Prinzipiell finde ich es nicht schon schön, dass die Funktionen parallel laufen und ich nicht weiß, wann sie fertig sind. Diese Funktionen wollte ich folgendermaßen aufrufen. `~~[code]~~ var dt=1; var id = "hm-rpc.0.KEQ0766772.1.TEMPERATURE"/*Temperatur-Feuchtefühler Balkon.TEMPERATURE*/; SQLAbfrage(id,dt); id ="hm-rpc.0.MEQ1600050.1.TEMPERATURE"/*Balkon Temperatur links Sonne.TEMPERATURE*/; SQLAbfrage(id,dt); id ="hm-rpc.0.MEQ1600050.2.TEMPERATURE"/*Balkon Temperatur rechts Sonne.TEMPERATURE*/; SQLAbfrage(id,dt); [/code]` Das hat zur Folge, dass die Funktion als Variable "id" immer die letzte aus meinem aufrufenden Programm hat. In diesem Fall "hm-rpc.0.MEQ1600050.2.TEMPERATURE". Da das Hauptprogramm erheblihc schneller zu ende ist. Sauber wäre jetzt entweder die korrekt ID der Datensätze in der funktion mmm abzufragen. In der Funktion mmm soll mit result.result[1].id eigentlich die id des Datensatzes zurückgegeben werden. Diese leifert mir aber immer ein "undefined". Hat dafür jemand eine Erklärung? Eine 2\. Variante wäre eine "Pausenzeit" im Hauptprogramm einzubauen. Da suche ich gerade, welche systemschonend läuft.[/i][/i][/i][/i][/i][/i][/i]
-
RE: Wert aus Unterfunktion übergeben?
Danke für die Antworten.
Ich wollte vermeiden über createstate Werte anzulegen, wenn ich sie nur im Programm benötige.
Offensichtlich ist aber wohl nicht möglich.
So ist es doch gemeint im letzten Code, oder?
-
RE: Wert aus Unterfunktion übergeben?
Danke für die schnelle Antwort.
Unter dem Begriff Javascrpit finde ich schon mal bessere Beschreibungen der Syntax.
Ich habe jetzt mal folgenden Code:
`var id = 'hm-rpc.0.KEQ0766772.1.TEMPERATURE'; SQLAbfrage(id,'0.5','MW'); function SQLAbfrage (id,dt,Status) { dt = dt*3600*1000; var end_time = new Date().getTime(); var start_time = end_time - dt; var i; var mw=0; var max=-100; var min=100; sendTo('sql.0', 'getHistory', { id: id, options: { start: start_time, end: end_time, aggregate: 'none' // or 'none' to get raw values } }, function (result) { for (i = 0; i < result.result.length; i++) { console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()); mw=mw+result.result[i].val; if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;} } mw=mw/(result.result.length); console.log(mw); console.log(max); console.log(min); } ); console.log('MW '+ mw); }</result.result[i].val){max=result.result[i].val;}>` Der Eintrag im Log sieht so aus: ~~~~ * 11:46:25.893 [info] javascript.0 Start javascript script.js.Eigene.test 11:46:25.894 [info] javascript.0 script.js.Eigene.test: MW 0 11:46:25.895 [info] javascript.0 script.js.Eigene.test: registered 0 subscriptions and 0 schedules 11:46:25.975 [info] javascript.0 script.js.Eigene.test: 19.7 2016-08-15T09:16:25.871Z 11:46:25.977 [info] javascript.0 script.js.Eigene.test: 19.8 2016-08-15T09:17:44.211Z 11:46:25.977 [info] javascript.0 script.js.Eigene.test: 19.9 2016-08-15T09:20:26.948Z 11:46:25.977 [info] javascript.0 script.js.Eigene.test: 20 2016-08-15T09:25:08.956Z 11:46:25.978 [info] javascript.0 script.js.Eigene.test: 20.2 2016-08-15T09:33:35.721Z 11:46:25.978 [info] javascript.0 script.js.Eigene.test: 20.3 2016-08-15T09:35:55.720Z 11:46:25.978 [info] javascript.0 script.js.Eigene.test: 20.4 2016-08-15T09:38:01.499Z 11:46:25.978 [info] javascript.0 script.js.Eigene.test: 20.6 2016-08-15T09:40:56.725Z 11:46:25.979 [info] javascript.0 script.js.Eigene.test: 20.7 2016-08-15T09:43:37.482Z 11:46:25.979 [info] javascript.0 script.js.Eigene.test: 20.177777777777777 11:46:25.979 [info] javascript.0 script.js.Eigene.test: 20.7 11:46:25.979 [info] javascript.0 script.js.Eigene.test: 19.7 Der letzte Log Eintrag der Haupfunktion SQL Abfrage taucht als erstes auf, da ist der Wert noch null, obwohl er am Ende der Funktion steht. In der Funktion vom sendto Befehl werden MW, Min und Max korrekt berechnet. Es scheint mir doch so, als würde die Funktion im sendto Befehl nicht der Reihe nach in der Funktion ausgeführt, sondern parallel zur Funktion SQLAbfrage.[/i][/i][/i][/i][/i][/i][/i]
-
Wert aus Unterfunktion übergeben?
Hallo an alle,
ich bin neu hier und beschäftige mich erst seit kurzem mit JAVA.
Ich möchte derzeit Mittelwerte, min und max Werte aus meiner SQL Datenbank berechnen.
Also habe ich eine Funktion geschrieben, welche die entsprechenden Werte aus der DB holt.
`function SQLAbfrage (id,dt,Status) { dt = dt*3600*1000; var end_time = new Date().getTime(); var start_time = end_time - dt; var i; var mw=0; var max=-100; var min=100; var wert; wert=sendTo('sql.0', 'getHistory', { id: id, options: { start: start_time, end: end_time, aggregate: 'none' // or 'none' to get raw values } }, function (result) { for (i = 0; i < result.result.length; i++) { console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()); mw=mw+result.result[i].val; if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;} } mw=mw/(result.result.length-1); if (Status=="MW"){return mw;} if (Status=="MIN"){return min;} if (Status=="MAX"){return max;} } ); return wert; }</result.result[i].val){max=result.result[i].val;}>` Diese Variante funktioniert nicht, wie ich es möchte. Die Funktion die inerhalb des sendto Befehls aufgerufen wird, holt die Werte aus der DB und berechnet auch alles richtig. Die Werte kann ich mir in der Console anzeigen lassen. Nur bekomme ich die Werte nicht in die Funktion SQLAbfrage übergeben. Am liebsten würde ich gern Mittelwert, max und min geichzeitig übergeben. Ich dachte aber zum verständniss probiere ich es erstmal mit einem Wert. Wenn ich Log Ausgaben erzeuge, scheint es mir so, als würde die Funktion SQL Abfrage komplett abgearbeitet werden und die Funktion inerhalb des sendto befehls läuft parallel dazu. Ich habe mehrere Versuche unternommen. Auch des Ergebniss des sendto Befehls in eine Variable zu schreiben und damit eine neue Unterfunktion aufzurufen. Alles glückte nicht. Immer kam das Ergebniss der Hauptfunktion schon vor dem Eigentlich abarbeiten des sendto befehl. Kann mir jemand meinen Fehler nennen. Offensichlich habe ich etwas an den Funktion oder an Java noch nicht verstanden. Grüße[/i][/i][/i][/i][/i][/i][/i]