@patex said in Stuck in development:
populate the standings object yourself
If i would send the entire teams data how would i go about doing that? thx btw for the answer
@patex said in Stuck in development:
populate the standings object yourself
If i would send the entire teams data how would i go about doing that? thx btw for the answer
So im trying to build my own module without any real programming experence. With help from This post and MagicMirror-Module-Template i have gotten really really far but right now im stuck, im getting the results from the api in the console instead of it printing on the screen 
Any help would be greatly appreciated
SHL.js
Module.register("SHL", {
defaults: {
updateInterval: 60000,
retryDelay: 5000
},
requiresVersion: "2.1.0", // Required version of MagicMirror
start: function() {
var self = this;
var dataRequest = null;
var dataNotification = null;
//Flag for check if module is loaded
this.loaded = false;
// Schedule update timer.
this.getData();
setInterval(function() {
self.updateDom();
}, this.config.updateInterval);
},
/*
* getData
* function example return data and show it in the module wrapper
* get a URL request
*
*/
getData: function() {
var self = this;
var urlApi = "https://jsonplaceholder.typicode.com/posts/1";
var retry = true;
var dataRequest = new XMLHttpRequest();
dataRequest.open("GET", urlApi, true);
dataRequest.onreadystatechange = function() {
console.log(this.readyState);
if (this.readyState === 4) {
console.log(this.status);
if (this.status === 200) {
self.processData(JSON.parse(this.response));
} else if (this.status === 401) {
self.updateDom(self.config.animationSpeed);
Log.error(self.name, this.status);
retry = false;
} else {
Log.error(self.name, "Could not load data.");
}
if (retry) {
self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay);
}
}
};
dataRequest.send();
},
/* scheduleUpdate()
* Schedule next update.
*
* argument delay number - Milliseconds before next update.
* If empty, this.config.updateInterval is used.
*/
scheduleUpdate: function(delay) {
var nextLoad = this.config.updateInterval;
if (typeof delay !== "undefined" && delay >= 0) {
nextLoad = delay;
}
nextLoad = nextLoad ;
var self = this;
setTimeout(function() {
self.getData();
}, nextLoad);
},
getDom: function() {
var self = this;
// create element wrapper for show into the module
var wrapper = document.createElement("div");
// If this.dataRequest is not empty
if (this.dataRequest) {
var wrapperDataRequest = document.createElement("div");
// check format https://jsonplaceholder.typicode.com/posts/1
wrapperDataRequest.innerHTML = this.dataRequest.title;
var labelDataRequest = document.createElement("label");
// Use translate function
// this id defined in translations files
labelDataRequest.innerHTML = this.translate("TITLE");
wrapper.appendChild(labelDataRequest);
wrapper.appendChild(wrapperDataRequest);
}
// Data from helper
if (this.dataNotification) {
var wrapperDataNotification = document.createElement("div");
// translations + datanotification
wrapperDataNotification.innerHTML = this.translate("UPDATE") + ": " + this.dataNotification.date;
wrapper.appendChild(wrapperDataNotification);
}
return wrapper;
},
getScripts: function() {
return [];
},
getStyles: function () {
return [
"SHL.css",
];
},
start: function () {
this.sendSocketNotification("GET_STANDINGS")
},
// Load translations files
getTranslations: function() {
//FIXME: This can be load a one file javascript definition
return {
en: "translations/en.json",
es: "translations/es.json"
};
},
processData: function(data) {
var self = this;
this.dataRequest = data;
if (this.loaded === false) { self.updateDom(self.config.animationSpeed) ; }
this.loaded = true;
// the data if load
// send notification to helper
this.sendSocketNotification("SHL-NOTIFICATION_TEST", data);
},
// socketNotificationReceived from helper
socketNotificationReceived: function (notification, payload) {
if(notification === "STANDINGS"){
// set dataNotification
this.dataNotification = payload;
this.updateDom();
}
},
});
node_helper.js
var NodeHelper = require("node_helper");
const shl = require("open-shl");
const client = shl.connect({
clientId:"XXXX",
clientSecret:"XXXX"
});
module.exports = NodeHelper.create({
teamStandings: function() {
client.season(2017).statistics.teams.standings({teamIds: []})
.then(teams => {
for (i = 0; i < 14; i++) {
a = i + 1;
console.log(a + ": " + teams[i].team_code);
};
var standings = {};
this.sendSocketNotification('STANDINGS', standings);
});
},
// Override socketNotificationReceived method.
/* socketNotificationReceived(notification, payload)
* This method is called when a socket notification arrives.
*
* argument notification string - The identifier of the noitication.
* argument payload mixed - The payload of the notification.
*/
socketNotificationReceived: function(notification, payload) {
if (notification === "SHL-NOTIFICATION_TEST") {
// console.log("Working notification system. Notification:", notification, "payload: ", payload);
console.log("Working notification system.", notification)
}
if (notification === "GET_STANDINGS"){
this.teamStandings();
}
},
// this you can create extra routes for your module
extraRoutes: function() {
var self = this;
this.expressApp.get("/SHL/extra_route", function(req, res) {
// call another function
values = self.anotherFunction();
res.send(values);
});
},
// Test another function
anotherFunction: function() {
return {date: new Date()};
}
});
@ninjabreadman Thanks for the explanation!!
Is it possible to create a module with a existing Nodejs Client?
I trying to create a module for stats from the Swedish hockey league, im new to programming but im trying to learn as i go since there is such good documentation on creating a module, but im wondering one thing
The Api from SHL already have a npm client and as i understand the files in the “lib” subfolder handles all the connection.
How do i make so my module to load these files?
@Jopyth I figured it out myself but thanks for the help, i used MMM-ModuleScheduler and put this
{
module: 'MMM-ModuleScheduler',
config: {
notification_schedule: {
notification: 'UPDATE_SL',
schedule: '*/5 * * * *',
payload: {
type: "UPDATE_SL",
title: 'sl!',
action: "notification"
}
}
}
to make it update every 5 minutes
@Jopyth Holy shit it works, thanks man
the reason the author doesnt think the timer is a good idea its because the API have an maximum amount of calls you can make in a month which is 30 000, but if i wanted to go against his advice and make it update every 5 minute or so, how would i do that
@Mykle1 thanks for the tips unfortunately i dont have a button to test this with.
@tomyboy96 said in PM2 do not start at bootup on my RPI 2? Works fine on my RPI 3.:
errors in crontab file, can’t install.
do you have the @reboot before pm2 start mm.sh if you dont try with that
@tomyboy96 test with pm2 start mm.sh in crontab -e then and see if that works
have you put pm2 start mm in crontab? if you havent you can do so with
crontab -e then type @reboot pm2 start mm at the end of the file then restart it to test
On the Module MMM-SL’s github it says
“updateNotification The notification to listen for. If received then will trigger update of departure times.”
and
“I recommend that you don’t update it with a timer, otherwise you will see that after a while you will get an error message instead. The recommended way is to trigger the update either with a button or similiar.”
but i have no idea how to actually trigger the update and i havent found any guidance on how to do it on the modules github,
if anyone got the answer it would be to great help
After you type nano x11vnc.desktop you should type
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=X11VNC
Comment=
Exec=x11vnc -forever -usepw -display :0 -ultrafilexfer
StartupNotify=false
Terminal=false
Hidden=false
which causes x11vnc to autostart