Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Wert aus callback an Programm übergeben

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Wert aus callback an Programm übergeben

    This topic has been deleted. Only users with topic management privileges can see it.
    • stephan1827
      stephan1827 last edited by

      Hallo,
      ich möchte gerne historische Daten auslesen und weiter verarbeiten. Das Auslesen klappt auch soweit aber die Funktion sendTo erwartet eine Callback Funktion mit festen Parametern. Wie bekomme ich die Daten von der Callback Funktion an das Programm übergeben? Aktuell verwende ich den Umweg über einen zusätzlichen Datenpunkt aber das führt zu diversen Problemen.

          // --------------------------------------------------------------------
          // Give 7 latest values of variables
          sendTo('history.0', 'getHistory', {id: 'javascript.0.Solar.DailyTotal', options: {end: new Date().getTime(), count: 20, aggregate: 'onchange'}}, cbSendTo1);
          function cbSendTo1(result) 
          {
              let tmpDay = '';
              let tmpSTR = '';
              let x = 0;
              for (var i = result.result.length-1; i >= 0; i--) {
                  if (tmpDay != new Date(result.result[i].ts).getDate().toString())
                  {
                      tmpDay = new Date(result.result[i].ts).getDate().toString();
                      tmpSTR += "data.setCell(" + x.toString() + ", 0, '" + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + "." + "');\n";
                      if(result.result[i].val == null) {tmpSTR += "data.setCell(" + x.toString() + ", 1, '0');\n";}
                      else {tmpSTR += "data.setCell(" + x.toString() + ", 1, '" + result.result[i].val + "');\n";}
                      x++;
                      if (x > 6) break;
                      console.log('Total: ' + x.toString() + ' -> ' + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + ' -> ' + result.result[i].val);
                  }
              }
              setState('Solar.html1', tmpSTR);
          }
              
          tmpData += getState('Solar.html1').val;
          console.log(getState('Solar.html1').val);
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @stephan1827 last edited by

        @stephan1827 sagte:

        Wie bekomme ich die Daten von der Callback Funktion an das Programm übergeben?

        Weshalb willst Du die Daten an das Hauptprogramm übergeben und nicht innerhalb der Callback-Funktion weiter verarbeiten ?
        Eine Möglichkeit, den Wert eines Datenpunktes zu verarbeiten, ist ein Trigger.

        var tmpData = '';
        on({id: 'Solar.html1'}, function(dp) {
           tmpData += dp.state.val;
           log(dp.state.val);
        });
        
        1 Reply Last reply Reply Quote 0
        • J.A.R.V.I.S.
          J.A.R.V.I.S. Developer last edited by

          @stephan1827 was genau meinst du mit übergeben?

          Du könntest daraus auch ein Promise machen und dann in einer asynchronen Funktion auf den Wert warten, dann musst du das nicht in einen State schreiben.

              // --------------------------------------------------------------------
          
              // Give 7 latest values of variables
          
          	function getHistory() {
          		return new Promise(resolve, reject) => {
          			
          			sendTo('history.0', 'getHistory', {id: 'javascript.0.Solar.DailyTotal', options: {end: new Date().getTime(), count: 20, aggregate: 'onchange'}}, result => {
          
          				let tmpDay = '';
          
          				let tmpSTR = '';
          
          				let x = 0;
          
          				for (let i = result.result.length - 1; i >= 0; i--) {
          
          					if (tmpDay != new Date(result.result[i].ts).getDate().toString()) {
          
          						tmpDay = new Date(result.result[i].ts).getDate().toString();
          
          						tmpSTR += "data.setCell(" + x.toString() + ", 0, '" + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + "." + "');\n";
          
          						if(result.result[i].val == null) {tmpSTR += "data.setCell(" + x.toString() + ", 1, '0');\n";}
          
          						else {tmpSTR += "data.setCell(" + x.toString() + ", 1, '" + result.result[i].val + "');\n";}
          
          						x++;
          
          						if (x > 6) break;
          
          						console.log('Total: ' + x.toString() + ' -> ' + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + ' -> ' + result.result[i].val);
          
          					}
          				}
          
          				resolve(tmpSTR);
          			});
          		}
          	}
          
          
          	async function tuWasMitHistory() {
          		
          		const history = await getHistory();
          		
          		tmpData += history;
          		
          		console.log(history);
          	}
          	
          	tuWasMitHistory();
          

          Oder du verarbeitest es direkt in deinem Callback.

          1 Reply Last reply Reply Quote 0
          • stephan1827
            stephan1827 last edited by

            Ich muss diese Funktion mehrfach aufrufen und die Daten dann weiter verarbeiten. Ich habe es jetzt so gelöst.

            Funktionsaufruf

            const history = await GetData('javascript.0.Solar.DailyTotal');
            

            Funktion

            async function GetData(strID) {
                return new Promise(function (resolve, reject) {
                        sendTo('history.0', 'getHistory', {
                                id: strID,
                                options: {
                                    end: new Date().getTime(),
                                    count: 20,
                                    aggregate: 'onchange'
                                }
                            }, (result) => {
                                if (result.error) {
                                    reject('Error: ' + result.error);
                                } else {
                                    let retData = '';
                                    let tmpDay = '';
                                    let x = 0;
                                    for (var i = result.result.length - 1; i >= 0; i--) {
                                        if (tmpDay != new Date(result.result[i].ts).getDate().toString()) {
                                            tmpDay = new Date(result.result[i].ts).getDate().toString();
                                            retData += "data.setCell(" + x.toString() + ", 0, '" + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + "." + "');\n";
                                            if (result.result[i].val == null) {
                                                retData += "data.setCell(" + x.toString() + ", 1, '0');\n";
                                            } else {
                                                retData += "data.setCell(" + x.toString() + ", 1, '" + result.result[i].val + "');\n";
                                            }
                                            x++;
                                            if (x > 6) break;
                                            console.log('Total: ' + x.toString() + ' -> ' + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + ' -> ' + result.result[i].val);
                                        }
                                    //console.log('1---->' + retData + '<----');
                                };
                                resolve(retData);
                            }
                        });
                });
            }
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            923
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            javascript
            3
            4
            250
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo