MagicMirror Forum
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • 3rd-Party-Modules
    • Donate
    • Discord
    • Register
    • Login
    1. Home
    2. Perlchamp
    3. Posts
    A New Chapter for MagicMirror: The Community Takes the Lead
    Read the statement by Michael Teeuw here.
    Offline
    • Profile
    • Following 0
    • Followers 0
    • Topics 6
    • Posts 171
    • Groups 0

    Posts

    Recent Best Controversial
    • RE: read csv-data and put it in an array

      i can’t find … so everything’s right ?
      picture

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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();
      		}     			
      },
      
      posted in Utilities
      PerlchampP
      Perlchamp
    • 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 ?

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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 ;-)

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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 ;-) …

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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.

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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 …

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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 …

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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 …

      posted in Utilities
      PerlchampP
      Perlchamp
    • 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

      posted in Utilities
      PerlchampP
      Perlchamp
    • 1
    • 2
    • 10
    • 11
    • 12
    • 13
    • 14
    • 17
    • 18
    • 12 / 18