Giter VIP home page Giter VIP logo

waterrower-a1-logger's Introduction

WaterRower A1 Logger

Raspberry Pi 3 project for logging rowing on a WaterRower A1. It will track watt, pace, length, time, laps and heart rate (Needs ant plus stick).

The most important feature is the route feature. One needs to select route before starting a row session. This route will be used as a template for the row session. After a rowing session is done one can download the gpx file or even just push it to Strava. web-gui

Getting Started

Obviously the WaterRower A1 is needed. I also recommend a 2 EL Wire Splitter Cable and a Rasberry Pi 3. Please connect the WaterRower A1 sensor to the Raspberry Pi 3. Connect the 2 EL Wire Splitter is to the GPID 4 and ground on the RP3. Doesn't matter which way! This is a hacking project, and I am not I am not responsible for any damage caused by any problems that may arise!

setup

Prerequisites

A Raspberry Pi 3 with wifi and running with nodejs. I use nodejs 9.4. Recommend also use of yarn over npm.

Installing

mkdir /opt/waterrower
chown pi:pi waterrower
git clone https://github.com/andresol/waterrower-a1-logger.git waterrower
npm install
node app.js

Heart rate with Ant plus

This program supports heart rate by usb ant+ stick. Please install drivers with

 sudo apt-get install build-essential libudev-dev

Install as service.

sudo npm install -g forever
sudo npm install -g forever-service
sudo forever-service install  

Using

After starting the app one can go to the web page by typing its IP:3000 int the browser. E.g https://192.168.1.190:3000. I use a iPad mini with and iPad holder.

Strava

This is in a beta stage, but look at https://www.npmjs.com/package/strava-v3 Basic you need to do the quick start guide. After that you need to create get a writeable access_token. Look at the "Running the tests" section.

Mounting

Mounting the cable and Raspberry Pi 3 is done with only glue and double sided tape.

TODO

Complete Strava integration, more routes, better route handling, live view of rowing session.

Errors

Please make sure that GPIO is not shared. First gen of Raspberry Pi is to slow. Please use v3 because of speed and wifi.

Note

This project was just a test project to see if it was possible to create a my own computer. It is badly written code that is just patched together. This project needs to be written again. Important notes if one wants to create there own project on the WaterRower A1. The WaterRower uses a magnet and the length between 2 magnets is 20.81 cm in the real world. One need just to measure the time between this. It is important to use some kind of debounce to prevent false hits.

Ratio: 100 cm is 4.805 clicks. 1 click is about 20.81 cm.

Strok rate: Measure when the clicks are accelerating with a debouching.

Testing

One can use the parameter ?test=test to get a button that simulates a rowing session.

Screenshots

strava web-gui-history web-gui-ipad web-gui-side web-gui-side2

waterrower-a1-logger's People

Contributors

andresol avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

waterrower-a1-logger's Issues

S4 Monitor possible?

Dear Andresol,

this is a great idea! The installation was easy on my raspi 3.
I have a waterrower with a S4 monitor and three wires coming from the sensor / going to the S4 monitor.
Has anybody tried to connect this sensor to the waterrower-a1-logger?
If so, how did you you manage the wiring with the GPIOs on the raspi?

Thank you very much for your response!

More details please!

Awesome work @andresol this is really exciting project

Obviously the WaterRower A1 is needed. I also recommend a 2 EL Wire Splitter Cable and a Rasberry Pi 3. Please connect the WaterRower A1 sensor to the Raspberry Pi 3. Connect the 2 EL Wire Splitter is to the GPID 4 and ground on the RP3. Doesn't matter which way! This is a hacking project, and I am not I am not responsible for any damage caused by any problems that may arise!

Can you please expand on this section. How do you connect the EL Wire splitter to the AI? I have one, and would like to try this project.

Thanks,

Oscar

Not on Raspberry?

Hi,

I am trying to run the tool on on Raspberry, but the tool won't even npm install:

> [email protected] install /Users/knyttl/Workspace/waterrower-a1-logger/node_modules/leveldown
> prebuild-install || node-gyp rebuild

prebuild-install WARN install No prebuilt binaries found (target=13.8.0 runtime=node arch=x64 platform=darwin)
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/builder.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/db_impl.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/db_iter.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/filename.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/dbformat.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/log_reader.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/log_writer.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/memtable.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/repair.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/table_cache.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/version_edit.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/version_set.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/write_batch.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/port/port_posix_sse.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/block.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/block_builder.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/filter_block.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/format.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/iterator.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/merger.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/table.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/table_builder.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/table/two_level_iterator.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/arena.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/bloom.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/cache.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/coding.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/comparator.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/crc32c.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/env.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/filter_policy.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/hash.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/logging.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/options.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/status.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/port/port_posix.o
  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/util/env_posix.o
  LIBTOOL-STATIC Release/leveldb.a
  CXX(target) Release/obj.target/snappy/deps/snappy/snappy-1.1.4/snappy-sinksource.o
  CXX(target) Release/obj.target/snappy/deps/snappy/snappy-1.1.4/snappy-stubs-internal.o
  CXX(target) Release/obj.target/snappy/deps/snappy/snappy-1.1.4/snappy.o
  LIBTOOL-STATIC Release/snappy.a
  CXX(target) Release/obj.target/leveldown/src/batch.o
In file included from ../src/batch.cc:3:
In file included from ../node_modules/nan/nan.h:202:
In file included from ../node_modules/nan/nan_converters.h:67:
../node_modules/nan/nan_converters_43_inl.h:22:1: error: no viable conversion from 'Local<v8::Context>' to 'v8::Isolate *'
X(Boolean)
^~~~~~~~~~
../node_modules/nan/nan_converters_43_inl.h:18:23: note: expanded from macro 'X'
      val->To ## TYPE(isolate->GetCurrentContext())                            \
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2762:37: note: passing argument to parameter 'isolate' here
  Local<Boolean> ToBoolean(Isolate* isolate) const;
                                    ^
In file included from ../src/batch.cc:3:
In file included from ../node_modules/nan/nan.h:202:
In file included from ../node_modules/nan/nan_converters.h:67:
../node_modules/nan/nan_converters_43_inl.h:40:1: error: no viable conversion from 'Local<v8::Context>' to 'v8::Isolate *'
X(bool, Boolean)
^~~~~~~~~~~~~~~~
../node_modules/nan/nan_converters_43_inl.h:37:29: note: expanded from macro 'X'
  return val->NAME ## Value(isolate->GetCurrentContext());                     \
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2771:30: note: passing argument to parameter 'isolate' here
  bool BooleanValue(Isolate* isolate) const;
                             ^
In file included from ../src/batch.cc:3:
In file included from ../node_modules/nan/nan.h:203:
In file included from ../node_modules/nan/nan_new.h:189:
../node_modules/nan/nan_implementation_12_inl.h:103:42: error: no viable conversion from 'v8::Isolate *' to 'Local<v8::Context>'
  return scope.Escape(v8::Function::New( isolate
                                         ^~~~~~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:189:7: note: candidate constructor (the implicit copy constructor) not
      viable: no known conversion from 'v8::Isolate *' to 'const v8::Local<v8::Context> &' for 1st argument
class Local {
      ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:189:7: note: candidate constructor (the implicit move constructor) not
      viable: no known conversion from 'v8::Isolate *' to 'v8::Local<v8::Context> &&' for 1st argument
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:193:13: note: candidate template ignored: could not match
      'Local<type-parameter-0-0>' against 'v8::Isolate *'
  V8_INLINE Local(Local<S> that)
            ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:4313:22: note: passing argument to parameter 'context' here
      Local<Context> context, FunctionCallback callback,
                     ^
In file included from ../src/batch.cc:3:
In file included from ../node_modules/nan/nan.h:203:
In file included from ../node_modules/nan/nan_new.h:189:
../node_modules/nan/nan_implementation_12_inl.h:337:37: error: too few arguments to function call, expected 2, have 1
  return v8::StringObject::New(value).As<v8::StringObject>();
         ~~~~~~~~~~~~~~~~~~~~~      ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:5688:3: note: 'New' declared here
  static Local<Value> New(Isolate* isolate, Local<String> value);
  ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1034:53: error: too few arguments to function call, single argument 'context' was not specified
      v8::Local<v8::String> string = from->ToString();
                                     ~~~~~~~~~~~~~~ ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2750:3: note: 'ToString' declared here
  V8_WARN_UNUSED_RESULT MaybeLocal<String> ToString(
  ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8config.h:419:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
                              ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1044:37: error: cannot initialize a parameter of type 'v8::Isolate *' with an lvalue of type 'char *'
        length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
                                    ^~~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2947:26: note: passing argument to parameter 'isolate' here
  int WriteUtf8(Isolate* isolate, char* buffer, int length = -1,
                         ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1818:28: error: no matching member function for call to 'Set'
    New(persistentHandle)->Set(New(key).ToLocalChecked(), value);
    ~~~~~~~~~~~~~~~~~~~~~~~^~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3547:37: note: candidate function not viable: requires 3 arguments, but
      2 were provided
  V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
                                    ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3550:37: note: candidate function not viable: requires 3 arguments, but
      2 were provided
  V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
                                    ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1824:28: error: no matching member function for call to 'Set'
    New(persistentHandle)->Set(key, value);
    ~~~~~~~~~~~~~~~~~~~~~~~^~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3547:37: note: candidate function not viable: requires 3 arguments, but
      2 were provided
  V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
                                    ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3550:37: note: candidate function not viable: requires 3 arguments, but
      2 were provided
  V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
                                    ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1830:28: error: no matching member function for call to 'Set'
    New(persistentHandle)->Set(index, value);
    ~~~~~~~~~~~~~~~~~~~~~~~^~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3547:37: note: candidate function not viable: requires 3 arguments, but
      2 were provided
  V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
                                    ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3550:37: note: candidate function not viable: requires 3 arguments, but
      2 were provided
  V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
                                    ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1836:32: error: no matching member function for call to 'Get'
        New(persistentHandle)->Get(New(key).ToLocalChecked()));
        ~~~~~~~~~~~~~~~~~~~~~~~^~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3594:43: note: candidate function not viable: requires 2 arguments, but
      1 was provided
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
                                          ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3597:43: note: candidate function not viable: requires 2 arguments, but
      1 was provided
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
                                          ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1842:48: error: no matching member function for call to 'Get'
    return scope.Escape(New(persistentHandle)->Get(key));
                        ~~~~~~~~~~~~~~~~~~~~~~~^~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3594:43: note: candidate function not viable: requires 2 arguments, but
      1 was provided
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
                                          ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3597:43: note: candidate function not viable: requires 2 arguments, but
      1 was provided
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
                                          ^
In file included from ../src/batch.cc:3:
../node_modules/nan/nan.h:1847:48: error: no matching member function for call to 'Get'
    return scope.Escape(New(persistentHandle)->Get(index));
                        ~~~~~~~~~~~~~~~~~~~~~~~^~~
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3594:43: note: candidate function not viable: requires 2 arguments, but
      1 was provided
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
                                          ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:3597:43: note: candidate function not viable: requires 2 arguments, but
      1 was provided
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
                                          ^
In file included from ../src/batch.cc:3:
In file included from ../node_modules/nan/nan.h:2657:
../node_modules/nan/nan_object_wrap.h:24:25: error: no member named 'IsNearDeath' in 'Nan::Persistent<v8::Object,
      v8::NonCopyablePersistentTraits<v8::Object> >'
    assert(persistent().IsNearDeath());
           ~~~~~~~~~~~~ ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/assert.h:93:25: note:
      expanded from macro 'assert'
    (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
                        ^
In file included from ../src/batch.cc:3:
In file included from ../node_modules/nan/nan.h:2657:
../node_modules/nan/nan_object_wrap.h:67:18: error: no member named 'MarkIndependent' in 'Nan::Persistent<v8::Object,
      v8::NonCopyablePersistentTraits<v8::Object> >'
    persistent().MarkIndependent();
    ~~~~~~~~~~~~ ^
../node_modules/nan/nan_object_wrap.h:124:26: error: no member named 'IsNearDeath' in 'Nan::Persistent<v8::Object,
      v8::NonCopyablePersistentTraits<v8::Object> >'
    assert(wrap->handle_.IsNearDeath());
           ~~~~~~~~~~~~~ ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/assert.h:93:25: note:
      expanded from macro 'assert'
    (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
                        ^
In file included from ../src/batch.cc:5:
In file included from ../src/database.h:18:
../src/leveldown.h:16:26: error: too few arguments to function call, single argument 'context' was not specified
  return (!obj->ToObject().IsEmpty()
           ~~~~~~~~~~~~~ ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2754:3: note: 'ToObject' declared here
  V8_WARN_UNUSED_RESULT MaybeLocal<Object> ToObject(
  ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8config.h:419:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
                              ^
In file included from ../src/batch.cc:5:
In file included from ../src/database.h:18:
../src/leveldown.h:17:48: error: too few arguments to function call, single argument 'context' was not specified
    && node::Buffer::HasInstance(obj->ToObject()))
                                 ~~~~~~~~~~~~~ ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2754:3: note: 'ToObject' declared here
  V8_WARN_UNUSED_RESULT MaybeLocal<Object> ToObject(
  ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8config.h:419:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
                              ^
In file included from ../src/batch.cc:5:
In file included from ../src/database.h:18:
../src/leveldown.h:18:42: error: too few arguments to function call, single argument 'context' was not specified
    ? node::Buffer::Length(obj->ToObject())
                           ~~~~~~~~~~~~~ ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2754:3: note: 'ToObject' declared here
  V8_WARN_UNUSED_RESULT MaybeLocal<Object> ToObject(
  ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8config.h:419:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
                              ^
In file included from ../src/batch.cc:5:
In file included from ../src/database.h:18:
../src/leveldown.h:19:21: error: too few arguments to function call, single argument 'context' was not specified
    : obj->ToString()->Utf8Length();
      ~~~~~~~~~~~~~ ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8.h:2750:3: note: 'ToString' declared here
  V8_WARN_UNUSED_RESULT MaybeLocal<String> ToString(
  ^
/Users/knyttl/Library/Caches/node-gyp/13.8.0/include/node/v8config.h:419:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
                              ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [Release/obj.target/leveldown/src/batch.o] Error 1
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack     at ChildProcess.emit (events.js:321:20)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
gyp ERR! System Darwin 19.3.0
gyp ERR! command "/usr/local/Cellar/node/13.8.0/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/knyttl/Workspace/waterrower-a1-logger/node_modules/leveldown
gyp ERR! node -v v13.8.0
gyp ERR! node-gyp -v v5.0.7
gyp ERR! not ok
npm WARN [email protected] No repository field.

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: `prebuild-install || node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/knyttl/.npm/_logs/2020-04-10T21_17_51_937Z-debug.log
retina:~/Workspace/waterrower-a1-logger$ node app.js

Could you support how to run it?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.