• 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

Welches von dir?
das von dir weiter oben funktioniert, habe ich doch probiert :)

die 249 ist aber auch die Datenrate wie das ant+ übermittelt, meine Ausgabe macht das auch bei sampletime 0.249 also a 0.249 kommt auch eine Ausgabe.
 
http://forum.jswelt.de/node-js/63342-python-to-javascript-2.html#post404777

das von dir weiter oben funktioniert, habe ich doch probiert :)
du hast dein js mit meinem python getestet, jetzt sollst du mein js mit deinem python testen

die 249 ist aber auch die Datenrate wie das ant+ übermittelt,
wenn die fest sein muss, musst du noch was zusätzlich einbauen, aber dazu muss die übermittlung der daten von python zu js erst mal laufen

meine Ausgabe macht das auch bei sampletime 0.249 also a 0.249 kommt auch eine Ausgabe.
die vorgegebene zeit 249 ist bei js aber sowieso mehr ein wunsch als wirklichkeit, das dürfte unter node besser funktionieren als im browser, aber verlassen kannst du dich da nicht drauf
 
Ach so.... na ja ist ja auch schon spät.

nein es kommt keine Ausgabe.

das meinst du:

Code:
var PythonShell = require('python-shell');
var pyshell = new PythonShell('7powerx.py');

pyshell.on('message', function (message) {
  console.log(message);
});

pyshell.end(function (err) {
  if (err) throw err;
  console.log('finished');
});

- - - Aktualisiert - - -

Wenn ich die sample time auf 0.0 setzt in meinem python script rennt es durch, allerdings bricht dann der raspberry zusammen und ich muss den neu starten :)

Aber somit wissen wir, ich habe ein time Problem! :)

- - - Aktualisiert - - -

Wenn ich auf 0.001 setzte stottert das script.

Kann ich hiermit was anfangen?

Code:
function sleep(time, callback) {
    var stop = new Date().getTime();
    while(new Date().getTime() < stop + time) {
        ;
    }
    callback();
}
to be used as

sleep(1000, function() {
   // executes after one second, and blocks the thread
});

Zumindest bin ich froh, das ich das Problem isolieren konnte. :)
 
Zuletzt bearbeitet:
In meinem py Script ist eine (Ich glaube es heisst GLOBALE]

Code:
SAMPLE_TIME = 0.249

die ich dann hier auch im py script benutze:

Code:
    LEVEL = count
    RPM = p.RPM()
    RPM = (int(RPM+1))
    time.sleep(SAMPLE_TIME)
    print(calculate_power(LEVEL, RPM))

die RPM werden ja in dem script aufbereitet, so das der output sauber ist.

GPIO 4 = RPM
GPIO 20,21 = die LEVEL

wenn ich das time.sleep weg lasse geht cpu und memory auf 100% dann *tod

- - - Aktualisiert - - -

ich glaub ich habs!

Code:
var pyshell = new PythonShell('7powerx.py',{scriptPath:"./", pythonOptions: ['-u']});

Lass ich mal nen bissel laufen :)

Läuft! Jetzt muss ich noch mein py script so bauen das es interpoliert :) dann fertig und dann wird Zwift gerockt.
Ich poste das Ergebnis mit etwas Anleitung auf Github. Ich denke das andere das auch machen wollen!

Und vielen Dank für deine Hilfe tsseh. Das hat mich sehr viel weiter gebracht.
 
Zuletzt bearbeitet:
Da ich leider keinen Python Programmierer finde, muss ich das Projekt leider einstampfen.
150€ sind wohl zu wenig.

Schade eigentlich.
 
ja das JS läuft ja auch.

Aber das Pythonscript mit Levelwechsel und Umdrehungen, Berechnung der Power etc. bekomme ich nicht zum laufen.
 
Ja, aber die Werte waren völlig falsch und ich habe immer ein index out of range bekommen, da hab ich mich zu früh gefreut.

Mit dem Taster auf dem Brett ist ja was anderes als am Objekt. Deswegen fiel das da erst nicht auf.

Also ich hab jetzt wohl nen script gefunden womit er zumindest die RPM mit dem reed Kontakt richtig zählt, aber da ich kein Programmierer bin, bekomme ich das nicht hin.

Ich hab da 2 Wochen rumprobiert, aber mit probieren wird sowas ja nix. Ich brauch da zwingend Jemanden dafür.

Mein Frau guckt mich auch schon an, als überlege Sie, wo mich das Messer treffen könnte :)
 
na dann probieren wir das doch mal rein in nodejs
1) verzeichniss erstellen
2) npm install rpi-gpio
3) SpeedMeter.js
Code:
var SpeedMeter = function(pin, weighting, pulsesPerRev, timeOut)
{
  var rpm = 0;
  var timeAct = 0;
  var timeOld = 0;
  var timeDiff = 0;
  var watchdog = null;
  var gpio = require('rpi-gpio');
  
  
  weighting = weighting || 0;
  pulsesPerRev = pulsesPerRev || 1;
  timeOut = timeOut || 1000;
  
  gpio.on('change', function(channel, value)
  {
    if (channel == pin)
    {
      var timeAct = new Date();
      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);
    }
  });
  gpio.setup(pin, gpio.DIR_IN, gpio.EDGE_RISING);
  
  this.getSpeed = function()
  {
    return rpm;
  };
};

module.exports.SpeedMeter = SpeedMeter;
4) test.js
Code:
var speedmeter = require('./SpeedMeter');
setInterval(function()
{
  console.log(speedmeter.getSpeed());
}, 250);
5) node test.js

dann sollte im idealfall (den wir vermutlich nicht haben) die rpm stimmen
 
Das ist super nett von dir, ich probier das auch gerne aus.
Kann aber 1 -2 Tage dauern. Kind ist krank geworden und ich glaub, er hat mich auch schon angesteckt.

Auf der Arbeit lassen sich auch immer weniger blicken, geht wohl grad was um.

Danke für die Hilfe

EDIT: Jemand vom Raspberry Forum wird grad aktiv und scheint auch helfen zu können.
Ich möchte jetzt nicht streuen und zwischen den Foren herspringen und somit mehr Leute beschäftigen als es muss. Wäre ja auch ärgerlich für den Helfer.
Aber wenn du auch Interesse an dieser Lösung hast, würde ich deins einfach mitmachen? Würde dann beide Lösungen zur Verfügung stellen?

- - - Aktualisiert - - -

Ich mach das einfach mit:

Fehler:
Code:
TypeError: speedmeter.getSpeed is not a function
    at Timeout._onTimeout (/home/pi/forumjs/test.js:4:26)
    at ontimeout (timers.js:380:14)
    at tryOnTimeout (timers.js:244:5)
    at Timer.listOnTimeout (timers.js:214:5)
pi@carcam:~/forumjs $
 
Zuletzt bearbeitet:
Code:
var SpeedMeter = require('./SpeedMeter');
var speedmeter = new SpeedMeter.SpeedMeter(4);
setInterval(function()
{
  console.log(speedmeter.getSpeed());
}, 250);
 
Script rennt los gibt 0 aus, auch bei mehrfachen schliessen des Kontaktes.
Habe dann mal pin in 4 umbenannt da es ja den GPIO 4 betrifft.

Mach ich das denn richtig, oder ist das egal ob da steht:

gpio.setup(pin, gpio.DIR_IN, gpio.EDGE_RISING);
GPIO.setup(4, GPIO.DIR_IN, GPIO.EDGE.RISING);

Wegen Groß und Kleinschreibung frage ich.
 
Script rennt los gibt 0 aus, auch bei mehrfachen schliessen des Kontaktes.
du musst innerhalb von 1 sekunde mindestens einmal schliessen, sonst gehe ich davon aus, dass keine bewegung erfolgt, wenn das zum testen mit schalter zu kurz ist, ersetze mal
var speedmeter = new SpeedMeter.SpeedMeter(4);
mit
var speedmeter = new SpeedMeter.SpeedMeter(4, 1, 1, 10000);
dann hast du 10 sekunden zeit
Habe dann mal pin in 4 umbenannt da es ja den GPIO 4 betrifft.
da wird doch 4 übergeben?!
var speedmeter = new SpeedMeter.SpeedMeter(4);
Mach ich das denn richtig, oder ist das egal ob da steht:

gpio.setup(pin, gpio.DIR_IN, gpio.EDGE_RISING);
GPIO.setup(4, GPIO.DIR_IN, GPIO.EDGE.RISING);

Wegen Groß und Kleinschreibung frage ich.
so wie es da steht, hast du das abgeschrieben? kopier es doch einfach
 
Doch ich kopier das.

Hab ich so geändert, aber Ausgabe weiter 0
reed Kontakt ist OK ich höre den klickern.
 
mhh, wenn ich das callback testweise zyklisch aufrufe kommen werte
also wird das callback vermutlich nicht aufgerufen.
mit
Please note that there are two different and confusing ways to reference a channel; either using the Raspberry Pi or the BCM/SoC naming schema (sadly, neither of which match the physical pins!). This module supports both schemas, with Raspberry Pi being the default. Please see this page for more details.
kann ich nicht so richtig was anfangen, will er damit sagen, dass man die pin nummer des pinheaders anstelle der gpio nummer angeben muss?
das kannst du mal probieren, anstelle von
var speedmeter = new SpeedMeter.SpeedMeter(4, 1, 1, 10000); bzw. var speedmeter = new SpeedMeter.SpeedMeter(4); nimm mal var speedmeter = new SpeedMeter.SpeedMeter(7, 1, 1, 10000); bzw. var speedmeter = new SpeedMeter.SpeedMeter(7); je nachdem welchen aufruf du gerade hast
 
Zurück
Oben