Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Anfängerfrage: Funktion umschreiben
#1
Hallo zusammen,
ich bräuchte Hilfe beim Umschreiben einer Funktion...

Auf einem Raspberry nutze ich zwei 1-wire-Busse. Das Plugin "ds18b20" für node-red zeigt mir immer nur die Thermostate an, die in der Datei ''/sys/bus/w1/devices/w1_bus_master'''1'''/w1_master_slaves'' liegen. Die Sensoren in der Datei ''/sys/bus/w1/devices/w1_bus_master'''2'''/w1_master_slaves'' werden ignoriert.
Ich habe versucht die Funktion so umzuschreiben, dass beide Dateien ausgelesen, verarbeitet und deren Inhalt zusammen gefügt wird. Leider habe ich wo einen Fehler, so dass mir node-red eine leere Liste anzeigt ;-(

Weiß leider nicht woran es liegt. Habe auch versucht über readFileSync Fehler bzgl. mit synchroner/asynchroner Programmierung zu vermeiden - aber js ist alles Neuland für mich...
Kann mir hier vllt. jemand weiter helfen?

Hier die Originaldatei, in der die Funktion ''sensors'' umgeschrieben werden muss:

Code:
'use strict';

//
// Get and temperature from connected sensors.
//
// @chamerling
//

var fs = require('fs');

var W1_FILE = '/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves';
var W2_FILE = '/sys/bus/w1/devices/w1_bus_master2/w1_master_slaves';

function parseHexData(data) {
  var arr = data.split(' ');

  if (arr[1].charAt(0) === 'f') {
    var x = parseInt('0xffff' + arr[1].toString() + arr[0].toString(), 16);
    return (-((~x + 1) * 0.0625));
  } else if (arr[1].charAt(0) === '0') {
    return parseInt('0x0000' + arr[1].toString() + arr[0].toString(), 16) * 0.0625;
  }
  throw new Error('Can not parse data');
}

function parseDecimalData(data) {
  var arr = data.split('\n');

  if (arr[0].indexOf('YES') > -1) {
    var output = data.match(/t=(-?(\d+))/);
    return Math.round(output[1] / 100) / 10;
  } else if (arr[0].indexOf('NO') > -1) {
    return false;
  }
  throw new Error('Can not get temperature');
}

var parsers = {
  'hex': parseHexData,
  'decimal': parseDecimalData,
  'default': parseDecimalData
};

function parseData(data, options) {
  var parser = options.parser || 'default';
  if (!parsers[parser]) {
    parser = 'default';
  }
  return parsers[parser](data);
}
module.exports.parseData = parseData;

// Get all connected sensor IDs as array
// @param callback(err, array)
function sensors(callback) {

  fs.readFile(W1_FILE, 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    var parts = data.split('\n');
    parts.pop();
    return callback(null, parts);
  });
}
module.exports.sensors = sensors;

// Get the temperature of a given sensor
// @param sensor : The sensor ID
// @param callback : callback (err, value)
function temperature(sensor, options, callback) {
  if (options instanceof Function) {
    callback = options;
    options = {};
  }

  fs.readFile('/sys/bus/w1/devices/' + sensor + '/w1_slave', 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    try {
      return callback(null, parseData(data, options));
    } catch(e) {
      return callback(new Error('Can not read temperature for sensor ' + sensor));
    }
  });
};
module.exports.temperature = temperature;

function temperatureSync(sensor, options) {
  options = options || {};
  var data = fs.readFileSync('/sys/bus/w1/devices/' + sensor + '/w1_slave', 'utf8');
  return parseData(data, options);
};
module.exports.temperatureSync = temperatureSync;


Folgendes habe ich umgeschrieben:

Code:
var W1_FILE = '/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves';
var W2_FILE = '/sys/bus/w1/devices/w1_bus_master2/w1_master_slaves';
var sensorsW1;
var sensorsW2;
var sensorsAll;

[...........]

// Get all connected sensor IDs as array
// @param callback(err, array)
function sensors(callback) {
  sensorsW1 =  fs.readFileSync(W1_FILE, 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    var parts = data.split('\n');
    parts.pop();
    return parts;
  });

  sensorsW2 =  fs.readFileSync(W2_FILE, 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    var parts = data.split('\n');
    parts.pop();
    return parts;
  });
return callback(null, sensorsW1);
}
module.exports.sensors = sensors;


Danke und liebe Grüße
Leo
Zitieren
#2
Ist das noch aktuell?

Ist das reiner Javascript Code?
Raspberry und Temperatur Fühler habe ich auch nicht und kann es so auch nicht testen.
Falls es noch aktuell ist, werde ich das mal umschreib en wie ich es machen würde, nur ob es dann richtig ist kann ich dann auch nicht zusagen.
Zitieren
#3
Ja - das Thema ist noch aktuell...
Schon einmal danke für deine Hilfe...
Zitieren
#4
Wie gesagt ich kann das nicht testen und kann dir nur Psydo Code geben wie ich es versuchen würde.Vieleicht kannst du dir dadurch einen eigenen Weg suchen 
Zb so
Code:
function sensors(callback) {
var parts=[];
  fs.readFile(W1_FILE, 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    parts.push(data.split('\n'));
    parts.pop();
  }); 
  fs.readFile(W1_FILE, 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    parts.push(data.split('\n'));
    parts.pop();
  }); 

  return callback(null, parts);

}
oder
Code:
function sensors(callback) {

  fs.readFile(W1_FILE, 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    var parts1=data.split('\n');
    parts1.pop();
  }); 
  fs.readFile(W1_FILE, 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }

    var parts2=data.split('\n');
    parts2.pop();
  }); 

  return callback(null, parts1+parts2);

}

An besten wäre wenn du mal hier schaust.
Das könnte bei dir wohl am ehrsten klappen
https://stackoverflow.com/questions/9448...s-readfile
Zitieren
#5
Ich denke das es so langsam in de richtigen richtung sein Könnte
Code:
function sensors(callback) {
  var data_back=[];
  var count = 0;
  var handler = function(error, content){
    count++;
    if (error){
      console.log(error);
    }else{
      data_back.push(content);
    }

    if (count == 2) {
      console.log(data_back);
      return callback(null, data_back);
    }
  }

  fs.readFile(W1_FILE, handler);
  fs.readFile(W2_FILE, handler);
}

Bin mir da aber auch nicht sicher
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen:
1 Gast/Gäste