• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Python to Javascript

nee
var cadence = math.round(speedmeter.getSpeed());

Also doch inne Funktion *(War mein erstre Gedanke)

Probier ich zu Hause gleich aus! Danke

- - - Aktualisiert - - -

Das ist gediegen.

Sobald ich trete zieht er die Level runter, aber nur wenn ich den crosstrainer anhabe.

Muss mal gucken wie ich die 5.5Volt com Gerät aus der Leitung schiebe.
 
also läuft alles?
Ja. Ich muss nur noch die Tabelle neu machen. Mein Gerät hat nur 16 Stufen. Gab 2 Revisionen. Bin aber schon auf Zwift gefahren. Das ist genial! Sogar Intervall Training kann ich jetzt machen. Ich mache morgen noch die Anleitung für Andere und poste die auf Instructables. Damit das andere auch nutzen​ können. Ich werde das Forum hier auch mit erwähnen. Ich bin überglücklich und das mit 43 :). Super herzlichen Dank von mir und meiner Familie.

- - - Aktualisiert - - -

So hab meine neue Tabelle:
Code:
  var power = [
    [25,38,50,69],
    [34,51,69,91],
    [42,64,88,114],
    [51,77,107,140],
    [60,91,126,163],
    [69,105,145,188],
    [79,119,164,214],
    [88,133,183,237],
    [97,146,202,263],
    [106,160,221,289],
    [115,174,240,312],
    [123,186,259,338],
    [133,200,278,361],
    [142,215,297,387],
    [151,228,316,409],
    [160,242,335,436]    
   ];

Leider fängt die Tabelle für mein Gerät erst bei 40 RPM an.
Was ich schon gemacht habe:
Code:
        if (level < 16)
        {
          ++level;
Ok das war jetzt nicht so schwer, aber mit den anderen Zahlen habe ich Schwierigkeiten.

Code:
      lowerVal = power[level - 1][idxLower - 2];
    }
    else
    {
      idxLower = 0;
    }
    if (idxUpper > 1 && idxUpper <= 12)  // das sind die Anzahl der Zahlen aus der Liste, die müssten jetzt auf 4?
    {
      upperVal = power[level - 1][idxUpper - 2];
    }
    else if (idxUpper > 12)  // das sind die Anzahl der Zahlen aus der Liste, die müssten jetzt auf 4?
    {
      console.log("RPM(", rpm, ") out of range");
      return power[level - 1][10];  //Muss hier nicht auch noch ein anderer Wert?

Was mich viel mehr ärgert, ist das ich das nicht bis zu Ende verstehe, aber magst du mir noch einmal helfen?
Hmm ich könnt aus der anderen Tabelle die Werte abgleichen und dann übernehmen. Ich probier das mal...

So nun ist das gut :) manchmal 5 Watt Abweichung, aber damit kann ich um, nennen wir das prozentualen Ausschluss. :)
 
Zuletzt bearbeitet von einem Moderator:
Leider fängt die Tabelle für mein Gerät erst bei 40 RPM an.
aber es zeigt doch auch die power werte an? das heißt du kannst die ablesen für 20 und 30 rpm.
deine tabelle geht aber auch nur bis 70! das funde ich ja wenig, ich laufe normal so um die 75. bis 100 sollten die schon gehen.
 
Zuletzt bearbeitet:
Ich hätte da gerne mal noch ein Problem :)

Ich bekomme zwischendurch einen Fehler im Poweroutput:

Code:
Event: 218       Power: NaNw     Cadence: 134rpm
Event: 219       Power: NaNw     Cadence: 134rpm
Event: 220       Power: NaNw     Cadence: 134rpm
Event: 221       Power: NaNw     Cadence: 134rpm

Eigentlich nicht schlimm dachte ich weil danach gehts ja weiter:
Code:
Event: 222       Power: 69w      Cadence: 70rpm
Event: 223       Power: 69w      Cadence: 70rpm
Event: 224       Power: NaNw     Cadence: 142rpm
Event: 225       Power: NaNw     Cadence: 142rpm
Event: 226       Power: NaNw     Cadence: 142rpm
Event: 227       Power: NaNw     Cadence: 142rpm
Event: 228       Power: NaNw     Cadence: 142rpm
Event: 229       Power: 28w      Cadence: 42rpm
Event: 230       Power: 28w      Cadence: 42rpm
Event: 231       Power: 28w      Cadence: 42rpm
Event: 232       Power: 28w      Cadence: 42rpm
Event: 233       Power: 28w      Cadence: 42rpm

Leider bringt das NaNw den ANT Stick aus dem Tritt und die Anzeige der Wattleistung friert bei zwift ein... Bei 280W ist das schon toll, aber ja nicht Sinn der Sache.

Ich finde nirgends ein NaNw, somit weiss leider nicht wie ich das weg bekomme, ich würde das NaNw gerne durch eine 0 ersetzen, da dieser Fehler nicht ständig auftritt.

Ich habe hier noch mal meinen Code, den ich mit dem Powermeter zusamme geführt habe:

Code:
var Ant = require('ant-plus');

var PowerMeter = function() {
  var stick = new Ant.GarminStick3;
  var channel = 1;
  if (!stick.is_present()) {
    stick = new Ant.GarminStick2;
  }

  stick.on('startup', function () {
    console.log('startup');
    console.log('Max channels:', stick.maxChannels);
    // 0xCAFFEDOOD
    var deviceId = 0xBEEF;
    stick.write(Ant.Messages.assignChannel(channel, 'transmit'));
    // The device type shall be set to 11 (0x0B) when searching to pair to an ANT+ bike power sensor
    // The transmitting sensor contains a 16-bit number that uniquely identifies its
    // transmissions. Set the Device Number parameter to zero to allow wildcard
    // matching. Once the device number is learned, the receiving device should
    // remember the number for future searches.
    // Device number set to 1 here
    stick.write(Ant.Messages.setDevice(channel, deviceId, 11, 1));
    // RF Channel 57 (2457 MHz) is used for the ANT+ bike power sensor.
    stick.write(Ant.Messages.setFrequency(channel, 57));
    // Channel period Data is transmitted from most bike power sensors every 8182/32768 seconds
    // (approximately 4.00 Hz). This channel period shall be used by default.
    stick.write(Ant.Messages.setPeriod(channel, 4096)); //8192 16384 2370
    stick.write(Ant.Messages.openChannel(channel));
    console.log('cycling power meter initialized');
  });

  stick.on('shutdown', function () { console.log('ANT+ shutdown'); });

  if (!stick.open()) {
  	console.log('ANT+ USB stick not found!');
  }

  this.stick = stick;
  this.channel = channel;
  this.power_event_count = 0;
  this.power_accumulated = 0;

};

PowerMeter.prototype.broadcast = function(power, cadence) { //, cadence
  if (!this.stick.is_present()) {
    return;
  }

  var data = [];
  data.push(this.channel);
  data.push(0x10); // power only
  this.power_event_count++;
  this.power_event_count = this.power_event_count % 254; // rollover 255
  data.push(this.power_event_count);
  data.push(0xFF); // pedal power not-used
  data.push(cadence); // cadence
  this.power_accumulated += power;
  this.power_accumulated = this.power_accumulated % 65534; //65535
  console.log("Event: %s \t Power: %sw \t Cadence: %srpm", this.power_event_count, power, cadence); //, cadence

  data = data.concat(Ant.Messages.intToLEHexArray(this.power_accumulated, 2));
  data = data.concat(Ant.Messages.intToLEHexArray(power, 2));
  this.stick.write(Ant.Messages.buildMessage(data, 0x4E)); //ANT_BROADCAST_DATA
};
module.exports.PowerMeter = PowerMeter;

var SpeedMeter = function (SensorPin, levelUpPin, levelDownPin, weighting, pulsesPerRev, timeOut, bounceTime, bounceTimeL) {
    var rpm = 0;
    var level = 1;
    var timeAct = 0;
    var timeOld = 0;
    var timeDiff = 0;
    var timeLevel = 0;
    var watchdog = null;
    var gpio = require('rpi-gpio');
    var power = [
      [8, 16, 25, 38, 50, 69, 88, 103, 120, 138, 152],
      [11, 22, 34, 51, 69, 91, 113, 131, 154, 178, 192],
      [12, 24, 42, 64, 88, 114, 145, 175, 202, 238, 254],
      [15, 31, 51, 77, 107, 140, 170, 206, 236, 280, 294],
      [19, 38, 60, 91, 126, 163, 203, 243, 283, 327, 367],
      [20, 40, 69, 105, 145, 188, 228, 273, 319, 362, 409],
      [22, 48, 79, 119, 164, 214, 260, 310, 360, 400, 458],
      [24, 53, 88, 133, 183, 237, 286, 350, 406, 447, 518],
      [28, 57, 97, 146, 202, 263, 318, 389, 449, 494, 585],
      [30, 64, 106, 160, 221, 289, 337, 415, 476, 518, 620],
      [32, 68, 115, 174, 240, 312, 351, 435, 499, 544, 655],
      [33, 72, 123, 186, 259, 338, 293, 483, 550, 596, 712],
      [37, 79, 133, 200, 278, 361, 427, 527, 592, 652, 783],
      [40, 87, 142, 215, 297, 387, 462, 571, 636, 709, 832],
      [42, 91, 151, 228, 316, 409, 485, 599, 669, 744, 864],
      [44, 95, 160, 242, 335, 436, 515, 633, 708, 787, 905]
    ];


    weighting = weighting || 0;
    pulsesPerRev = pulsesPerRev || 1;
    timeOut = timeOut || 10000;
    bounceTime = bounceTime || 150;
    bounceTimeL = bounceTimeL || 150;
    gpio.on('change', function (channel, value) {
        if (channel == SensorPin) {
            var timeAct = new Date();
            if ((timeAct - timeOld) > bounceTime) {
                if (watchdog) {
                    clearTimeout(watchdog);
                }
                if (timeOld) {
                    timeDiff *= weighting;
                    timeDiff += (1 - weighting) * (timeAct - timeOld);
                    rpm = 60000 / (timeDiff * pulsesPerRev);
                }
                timeOld = timeAct;
                watchdog = setTimeout(function () {
                    timeOld = 0;
                    rpm = 0;
                }, timeOut);
            }
        }
        else if (channel == levelUpPin) {
            var timeLevelUp = new Date();
            if ((timeLevelUp - timeLevel) > bounceTimeL) {
                if (level < 16) {
                    ++level;
                }
                timeLevel = timeLevelUp;
            }
        }
        else if (channel == levelDownPin) {
            var timeLevelDown = new Date();
            if ((timeLevelDown - timeLevel) > bounceTimeL) {
                if (level > 1) {
                    --level;
                }
                timeLevel = timeLevelDown;
            }
        }
    });

    gpio.setup(SensorPin, gpio.DIR_IN, gpio.EDGE_RISING);
    gpio.setup(levelUpPin, gpio.DIR_IN, gpio.EDGE_RISING);
    gpio.setup(levelDownPin, gpio.DIR_IN, gpio.EDGE_RISING);

    this.getSpeed = function () {
        return rpm;
    };
    this.getLevel = function () {
        return level;
    };
    this.getPower = function () {
        var lowerVal = 0;
        var upperVal = 0;
        var idxLower = Math.floor(rpm / 10);
        var idxUpper = Math.ceil(rpm / 10);
        if (idxLower > 1) {
            lowerVal = power[level - 1][idxLower - 2];
        }
        else {
            idxLower = 0;
        }
        if (idxUpper > 1 && idxUpper <= 12) //12
        {
            upperVal = power[level - 1][idxUpper - 2];
        }
        else if (idxUpper > 12) //12
        {
            console.log("RPM(", rpm, ") out of range");
            return power[level - 1][10];
        }
        else if (idxUpper <= 1) {
            idxUpper = 0;
        }
        if (idxUpper == 0 && idxLower == 0) {
            return 0;
        }
        return (upperVal - lowerVal) / (idxUpper * 10 - idxLower * 10) * (rpm - idxLower * 10) + lowerVal;
    };
};

module.exports.SpeedMeter = SpeedMeter;

idx upper ist 12, muss das vielleicht 11 sein?

Mit 11 "scheint es zu klappen" ich beobachte das mal.
Aber kann man so einen NaNw Fehler abfangen wenn er auftritt?
 
Zuletzt bearbeitet:
Hmmm...

Kann ich nicht einfach sagen das NaN = 0 ist?

Ich kann das coding technisch ja nicht, aber würde das nicht so gehen?
Ich denke das eine Teilung durch 0 statt findet, dann kommt das NaN.

Oder noch einfacher idxLower auf 1?


Verstehen würde ich das trotzdem nicht da idxLower doch mit == 0 hart gesetzt ist!?

Hab jetzt auch eingekreist das es immer bei 50 RPM passiert.

kann ich das NaN denn vor dem output abholen ohne in das große Script einzugreifen?

Code:
var SpeedMeter = require('./power-meter');
var power_meter = require('./power-meter');
var pm = new power_meter.PowerMeter();
var speedmeter = new power_meter.SpeedMeter(7, 16, 18);


function a() {
  var power_instant = Math.round(speedmeter.getPower());
  var cadence = Math.round(speedmeter.getSpeed());
  pm.broadcast(power_instant, cadence); //, cadence


//  console.log("level: ", speedmeter.getLevel(), " speed: ", speedmeter.getSpeed(0), " power: ", speedmeter.getPower());
  setTimeout(a, 249); //249
}


a();

power_instant = isNaN(power_instant) ? 0 : power_instant; // so ?

Scheint zu funktionieren, verstehe ich zwar immer noch nicht, aber naja, wenns funzt :)

Code:
Event: 171       Power: 0w       Cadence: 50rpm
Event: 172       Power: 0w       Cadence: 50rpm
Event: 173       Power: 0w       Cadence: 50rpm
Event: 174       Power: 0w       Cadence: 50rpm
Event: 175       Power: 0w       Cadence: 50rpm
 
Zuletzt bearbeitet:
Ich denke das eine Teilung durch 0 statt findet, dann kommt das NaN.
Nein, die würde Infinity liefern. Ich denke, dass du da irgendwo auf einen nicht existierenden Index zugreifst und dann undefined irgendwo drin hast.
Verstehen würde ich das trotzdem nicht da idxLower doch mit == 0 hart gesetzt ist!?
Wo machst du das?

Ich denke, du musst auch idxLower mit 12 vergleichen:
Code:
        if (idxLower > 1 && idxLower <= 12) {
            lowerVal = power[level - 1][idxLower - 2];
        }
        else {
 
Zurück
Oben