Visualizzazione post con etichetta nodejs. Mostra tutti i post
Visualizzazione post con etichetta nodejs. Mostra tutti i post

giovedì 25 giugno 2015

Integrazione app Meteo con La Crosse Technology WS1640

Dopo un buon periodo di inattività delle rilevazioni meteo causate dal malfunzionamento della vecchia stazione meteo, Cinzia mi regala un sistema completo nuovo sotto il 150 Euro una  La Crosse Technology WS1640

Dopo aver installato la stazione sul balcone arriva la parte più interessante ovvero creare una app web e collegarci in tempo reale i risultati della stazione.

L'uscita usb della stazione è connesso ad un raspberry in wifi e alimentato da rete.

La stazione utilizza il cavo usb del raspberry per alimentarsi

Per prelevare i dati dalla stazione attraverso una piccola app in java sul Raspberry PI utilizzo questa libreria comoda e senza tanti fronzoli. La app in java preleva i dati e li invia ad una web-app sul server in formato json ogni tot minuti, oltre che alla sera scaricare tutto l'archivio sul dispositivo e rispedirlo al server in modo da prevedere eventuali buchi di rete durante la giornata.

La app è sul github.

Per la parte server il sitarello è realizzato con NodeJs compreso il servizio in ascolto del posto da parte del Raspberry PI qui il sorgente.

Seconda applicazione presente sul server è un piccolo batch per la generazione dei grafici con jfreechart. Visto che i dati sono molto non è possibile renderizzare tutto in tempo reale in javascript.

Naturalmente i dati sono tutti archiviati su MongoDB.

Questo è il sorgente del batch per i grafici.








giovedì 30 gennaio 2014

NodeJs - Oracle - No Bind Variables - "Error: ORA-01756: quoted string not properly terminated"


il problema della codifica con nodejs + oracle npm.

La soluzione è sempre quella di utilizzare le Bind Variables.

In alcuni casi dove non è possibile si procede con turn around:

var query = "UPDATE test SET  DESC_RISPOSTA = 'á';

oracle.connect(dbOracleConnection, function(err, connection) {
connection.execute(query, [], function(err, results) {
console.log(err);
console.log(results);
});
});

si ottiene questo errore :  Error: ORA-01756: quoted string not properly terminated

la soluzione più semplice è quella di utilizzare due funzionalità js per encodare correttamente la stringa

var query = unescape(encodeURIComponent("UPDATE test SET  DESC_RISPOSTA = 'á'));

giovedì 16 gennaio 2014

Rover + Nodejs + Socket.io

Prosegue la parte di sviluppo del piccolo rover con Raspberry Pi + Arduino e Dagu 5.
Nella prossima fase prevede l'integrazione del giroscopio MPU5060

La parte di gestione da browser adesso utilizza Express.io appunto con le chiamate in socket. Molto più veloce rispetto alle classiche chiamate ajax.

Sulla sinistra i comandi principali per muovere il rover sulle 4 ruote motrici. In basso a sinistra il controllo del Tilt pannel della RaspiCam

Sulla destra lo stream della camera.





tutti i sorgente e le foto sul gitHub

lunedì 13 gennaio 2014

Encoding - NodeJs + Oralce

Qualche problem sulle codifiche di Encoding con NodeJS + Oracle utilizzano la npm oracle ?

Su debian (il server dove è installato il client Oracle e la app di NodeJs) risolto inserendo nel file /etc/environment  la stringa

NLS_LANG=.UTF8

naturalmente il db di riferimento è in UTF8.


[via github]





lunedì 23 dicembre 2013

Arduino + Raspberry PI + Dagu 5 Rover + Node.js



Dopo un lungo periodo di esperimenti e di fatica finalmente sono arrivato alla prima fase del piccolo progetto.

Dai questo video il rover che muove i suoi primi passi in casa... con qualche problema..
L'hw è un mix di arduino per il controllo dei motori edella tilt pan per la Cam, Raspberry che gestisce lo streaming della cam sulla rete, e la parte web con node.js. Mancano alcuni dettagli che sistemerò a giorni.




Tutti i sorgenti, le specifiche e l'hw potete trovarlo sul GitHub



 

  










link on GitHub Site

martedì 25 settembre 2012

Import Geonames DB on MongoDB with NodeJs and Query


Continuo a pensare che le prestazioni di MongoDB siano veramente buone, ancora meglio se unite ad un linguaggio di scripting come NodeJs.

Ecco un esempio di utilizzo su moli di dati consistenti (testato con server MongoDB in locale quindi con poche risorse di sistema).

Resources:

Installare i seguenti moduli

MongoDB ODM Mongoose
npm install mongoose

Modulo per leggere file di grosse dimensioni
npm install carrier

Lib per il calcolo delle query
npm install moment

Il solito file da 1,2 GB di Geonames che uso per i test di una certa consistenza.


Procedura di import,
definiamo la struttura della collection, poi si prosegue con l'inserimento delle info.


var mongoose = require('mongoose');
var databaseName = 'geonames';
var connection_string = 'mongodb://localhost/'+databaseName;
var db = mongoose.connect(connection_string);

var schema_geonames = mongoose.Schema({ 
     geonameid :  Number, 
     name  :  String, 
     asciiname   :  String,
     alternatenames  :  String,
     loc  :       [Number],
     feature_class   :  String,
     feature_code :  String,
     country_code   :  String,
     alternatenames  :  String,
     cc2  :  String,
     admin1         :  String,
     admin2  :  String,
     admin3  :  String,
     admin4  :  String,
     population :  String,
     elevation :  Number,
     dem         :  String,
     timezone :  String,
     modification_date :  String
       });

schema_geonames.index ({
       loc : "2d",
       asciiname : 1,
       name : 1
});


var Geonames = db.model('Geonames', schema_geonames);

var carrier = require('carrier');
var fs = require('fs');
var filename = '/path/of/file/allCountries.txt';
var inStream = fs.createReadStream(filename, {flags:'r'});

carrier.carry(inStream)
 .on('line', 
 
  function(line) {
      
   var fields =  line.split('\t');
   
   var geonames = new Geonames({
     geonameid  :  fields[0], 
     name   :  fields[1],       
     asciiname    :  fields[2],
     alternatenames   :  fields[3],
     loc   :       [fields[4],fields[5]],
     feature_class    :  fields[6],
     feature_code  :  fields[7],
     country_code    :  fields[8],
     alternatenames   :  fields[9],
     cc2   :  fields[10],
     admin1          :  fields[11],
     admin2   :  fields[12],
     admin3   :  fields[13],
     admin4   :  fields[14],
     population  :  fields[15],
     elevation  :  fields[16],
     dem   :  fields[17],
     timezone  :  fields[18],
     modification_date :  fields[19]
   });
   
   
   
   geonames.save(function (err) {
    if (err)
     console.log('Error save geonames');
   });  

      
  } 
 )
 
 .on('end',
 
  function(){
        console.log('end');   
        process.exit(1);
   }
 );
db.geonames.find().count(); 8309522 Dopo aver aspettato che a procedura di import abbia concluso possiamo eseguire qualche semplice query es di $near:


GeonamesModel.find({ feature_class: 'P', loc : { $near : [45.32306, 8.41533] }} ,{},{ limit: 20 }, function(err, docs){
 
      if (err) {
          console.log("error in finding near", err);
          throw err;
      }
      
      console.log('docs.length : ' , docs.length);
      
      docs.forEach(function(doc) 
       { 
        console.log( doc.asciiname + ' (' + doc.admin1 + ')');
       }
      )

  })

Risultato: 
docs.length : 20 
Vercelli (VC) 45.32306,8.41533 
Larizzate (VC) 45.3,8.38333 
Caresanablot (VC) 45.35736,8.39203 
Torrione (VC) 45.31667,8.46667 
Borgo Vercelli (VC) 45.35786,8.46303 
Scavarda (NO) 45.33218,8.47477 
Asigliano Vercellese (VC) 45.26146,8.40853 
Villata (VC) 45.38776,8.43263 
Prarolo (VC) 45.28206,8.47814 
Desana (VC) 45.26966,8.35973 
Quinto Vercellese (VC) 45.37966,8.36173 
Lignana (VC) 45.28606,8.34393 
Oldenico (VC) 45.40276,8.38103 
Sali Vercellese (VC) 45.30986,8.32893 
Pertengo (VC) 45.23556,8.41754 
Casalvolone (NO) 45.40096,8.46463 
Pezzana (VC) 45.26206,8.48504 
Costanzana (VC) 45.23816,8.36813 
Collobiano (VC) 45.39686,8.34833 
Stroppiana (VC) 45.23026,8.45384 
Tot time 205ms

[Sorgenti completi]