i can’t find … so everything’s right ?
Read the statement by Michael Teeuw here.

Posts
-
RE: read csv-data and put it in an array
-
RE: read csv-data and put it in an array
yes, i understood. here’s my perlchamp.js (only socketNitificationReceived)
// messages received from from your node helper (NOT other modules or the system) // payload is a notification dependent data structure, up to you to design between module and node_helper socketNotificationReceived: function(notification, payload) { Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); if(notification === "message_from_helper"){ this.config.message = payload; // tell mirror runtime that our data has changed, // we will be called back at GetDom() to provide the updated content this.updateDom(1000) } if(notification === "have data"){ Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); var now = moment() var active_birthdays={} for( var birthday of payload) { // get 1st 5 chars of birthdate, thru month // we will use this as the key in the hash var birth_date = birthday.birth.subString(0,4) // for debugging only Log.log("Tag.Monat :", birth_date) // get the birthday as a moment in this year, for comparing var birth_date_moment = moment(birth_date + now.getYear(),"DD.MMYYYY") // u can add days to a moment object and then compare // if the birthdate is before that date (and after now) // so within the next xx days // if the date is the same or later, don't use time of day if(birth_date.startOf('day').isSame(now.startOf('day')){ // birthday is in this month // check the hash if we've seen anything for today yet // if we haven't see this date yet if(active_birthdays[birth_date] == undefined){ // create the holder for its info (array of // names) in the hash active_birthdays[birth_date] = [] } // save the persons name on the list active_birthdays[birth_date].push(birthday.name) } } // tell MM to call and get our content self.updateDom(); } },
-
RE: read csv-data and put it in an array
// send data to [modulname].js self.sendsocketNotification("have data", birthdaysArray)
i have found a typing error. Socket instead socket. if i than change self. to this. no errror messages will displayed. but still black screen.
maybe i did not understand how to handle the getDom-section … i will still try …
but:
i see no notification in the terminal. ‘have data’ should actually appear there, shouldn’t it ? -
RE: read csv-data and put it in an array
this is the actual node_helper.js:
var NodeHelper = require("node_helper"); var moment = require("moment"); // add require of other javascripot components here // var xxx = require('yyy'); here const csv = require("csvtojson"); var birthdaysArray = []; module.exports = NodeHelper.create({ init(){ console.log("init module helper perlchamp"); }, start() { console.log("Starting module helper: " + this.name); //console.log("Pfad zur csv-Datei: ", this.path + "/data/birthdays.csv"); moment.locale(config.language); // set locale // convert the csv-file into a JSON-String const csvFilePath = this.path + '/data/birthdays.csv'; csv() .fromFile(csvFilePath) .then((jsonObj)=>{ birthdaysArray = JSON.stringify(jsonObj); // for debugging only //console.log("birthdaysArray: ", birthdaysArray); // send data to [modulname].js self.sendsocketNotification("have data", birthdaysArray) // loop thru the array of birthday_info from file (jsonObj), // one 'row' per birthday }) }, stop(){ console.log("Stopping module helper: " + this.name); }, // handle messages from our module// each notification indicates a different messages // payload is a data structure that is different per message.. up to you to design this socketNotificationReceived(notification, payload) { // if config message from module if (notification === "CONFIG") { // save payload config info this.config=payload // wait 15 seconds, send a message back to module setTimeout(()=> { this.sendSocketNotification("message_from_helper"," this is a test_message")}, 15000) } else if(notification === "????2") { } }, });
i got an error-message :
[2020-05-01 23:21:12.072] [WARN] Unhandled rejection ReferenceError: self is not defined at /home/dirk/MagicMirror/modules/perlchamp/node_helper.js:34:4
i think this could be the problem:
// send data to [modulname].js self.sendsocketNotification("have data", birthdaysArray)
i tried “this.” and without “self.” and “this.” but nothing changed. now i’m searching in the web, maybe i will found some answers ;-)
-
RE: read csv-data and put it in an array
ok, thank you sam.
Now I have to process the whole thing first, otherwise my head will burst ;-) … -
RE: read csv-data and put it in an array
if i run :
for(var birthday of birthdaysArray) { if(birthday.birth.startsWith(today_day_month)) { // this birthday is for today console.log(" birthday on "+ today_day_month+" is for "+birthday.name); } }
than i get the following error-messages:
Unhandled rejection TypeError: Cannot read property 'startsWith' of undefined at /home/dirk/MagicMirror/modules/perlchamp/node_helper.js:33:22 at Object.onfulfilled (/home/dirk/MagicMirror/node_modules/csvtojson/v2/Converter.js:112:33) at Result.endProcess (/home/dirk/MagicMirror/node_modules/csvtojson/v2/Result.js:83:50) at Converter.processEnd (/home/dirk/MagicMirror/node_modules/csvtojson/v2/Converter.js:179:21) at /home/dirk/MagicMirror/node_modules/csvtojson/v2/Converter.js:172:19 at tryCatcher (/home/dirk/MagicMirror/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:547:31) at Promise._settlePromise (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:604:18) at Promise._settlePromise0 (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:649:10) at Promise._settlePromises (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:729:18) at _drainQueueStep (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:93:12) at _drainQueue (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:86:9) at Async._drainQueues (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:102:5) at Immediate.Async.drainQueues [as _onImmediate] (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:15:14) at processImmediate (internal/timers.js:439:21)
I was probably happy too early ;-( … shit happens.
-
RE: read csv-data and put it in an array
so i’m bloody happy :
var NodeHelper = require("node_helper"); var moment = require("moment"); // add require of other javascripot components here // var xxx = require('yyy'); here const csv = require("csvtojson"); var birthdaysArray = []; module.exports = NodeHelper.create({ init(){ console.log("init module helper perlchamp"); }, start() { console.log("Starting module helper: " + this.name); console.log("Pfad zur csv-Datei: ", this.path + "/data/birthdays.csv"); const csvFilePath = this.path + '/data/birthdays.csv'; csv() .fromFile(csvFilePath) .then((jsonObj)=>{ birthdaysArray = JSON.stringify(jsonObj); console.log("birthdaysArray: ", birthdaysArray); var result = Object.entries(jsonObj.reduce((a, {birth, name}) => { const day = +birth.split('.')[0]; a[day] = [...(a[day] || []), name]; return a }, {})).map(([day, name]) => ({day, name})).sort((a, b) => +a.day - b.day) console.log("sorted birthdays : ", result); var today_day_month = moment().format("DD.MM"); var today_month = moment().format("MM"); }) }, stop(){ console.log("Stopping module helper: " + this.name); }, // handle messages from our module// each notification indicates a different messages // payload is a data structure that is different per message.. up to you to design this socketNotificationReceived(notification, payload) { // console.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); console.log(this.name + " received a socket notification: " + birthdaysArray); // if config message from module if (notification === "CONFIG") { // save payload config info this.config=payload // wait 15 seconds, send a message back to module setTimeout(()=> { this.sendSocketNotification("message_from_helper"," this is a test_message")}, 15000) } else if(notification === "????2") { } }, });
so now I just have to manage to filter out the people from the complete csv-file who have their birthday in the current month …
-
RE: read csv-data and put it in an array
ok, thanks. to move the code is not heavy ;-) … i’ve found a snippte to sort my birthdaysArray, but that doesn’t match :
const csvFilePath = this.path + '/data/birthdays.csv'; csv() .fromFile(csvFilePath) .then((jsonObj)=>{ birthdaysArray = JSON.stringify(jsonObj); console.log("birthdaysArray: " + birthdaysArray); var result = Object.entries(birthdaysArray.reduce((a, {birth, name}) => { const day = +birth.split('.')[0]; a[day] = [...(a[day] || []), name]; return a }, {})).map(([day, name]) => ({day, name})).sort((a, b) => +a.day - b.day) console.log("sorted birthdays : " + result); var today_day_month = moment().format("DD.MM"); var today_month = moment().format("MM"); })
now i’m looking for another one. is the birthdaysArray a json-Array or a javascript-array or … someone told me, it’s an object-Array and that this has nothing to do witch json … but: csvtojson, so …
-
RE: read csv-data and put it in an array
console.log(this.name + " received a socket notification: " + birthdays);
should be
console.log(this.name + " received a socket notification: " + birthdaysArray);
of course. couldn’t edit it, because of spam-message from board …
-
RE: read csv-data and put it in an array
hi sam,
i have a major problem, that i don’t understand. this is my code in node_helper.js:var NodeHelper = require("node_helper"); var moment = require("moment"); // add require of other javascripot components here // var xxx = require('yyy'); here const csv = require("csvtojson"); var birthdaysArray = []; module.exports = NodeHelper.create({ init(){ console.log("init module helper perlchamp"); }, start() { console.log("Starting module helper: " + this.name); // console.log("Pfad zur csv-Datei: " + this.path + "/data/birthdays.csv"); const csvFilePath = this.path + '/data/birthdays.csv'; csv() .fromFile(csvFilePath) .then((jsonObj)=>{ birthdaysArray = JSON.stringify(jsonObj); console.log("birthdaysArray: " + birthdaysArray); var today_day_month = moment().format("DD.MM"); var today_month = moment().format("MM"); }) console.log("birthdaysArray #2: " + birthdaysArray); // moment.js moment.locale(config.language); // set locale console.log("aktuelle Zeit: " + moment().format('Do MMMM YYYY, hh:mm:ss')); console.log("aktueller Monat(Zahl): " + moment().format('MM')); console.log("aktueller Monat(Text): " + moment().format('MMM')); console.log("aktueller Tag(Zahl mit führender Null): " + moment().format('DD')); console.log("aktueller Tag(Text): " + moment().format('dddd')); console.log("aktueller Tag(Abkürzung): " + moment().format('dd')); console.log("aktuelles Jahr(Zahl): " + moment().format('YYYY')); }, stop(){ console.log("Stopping module helper: " + this.name); }, // handle messages from our module// each notification indicates a different messages // payload is a data structure that is different per message.. up to you to design this socketNotificationReceived(notification, payload) { // console.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); console.log(this.name + " received a socket notification: " + birthdays); // if config message from module if (notification === "CONFIG") { // save payload config info this.config=payload // wait 15 seconds, send a message back to module setTimeout(()=> { this.sendSocketNotification("message_from_helper"," this is a test_message")}, 15000) } else if(notification === "????2") { } }, });
why returns
console.log("birthdaysArray #2: " + birthdaysArray);
nothing.
many thanks in advance