Hey everyone,
I am new to this whole thing and I am having a few issues with a module I am trying to develop.
The aim here is to parse the information displayed on a server with cheerio. The original version of the method
updateSens()
is working (and still working), I tested it manually before trying to develop my own module. Everything else is working as it should, the communication between the node_helper and the module is fine, it updates as it should, but the entire block in the
request ({});
is not working at all.
Here you can find the entire module:
/*
* Node Helper zur Abfrage von Probe- und Sensordaten
* Requested Daten vom Monitoring Server und parsed
* diese mithilfe von Cheerio
*
* Entwickelt von Sönke Thiele / kichilron
*/
// Definiere require
const NodeHelper = require('node_helper');
const request = require('request');
const cheerio = require('cheerio');
// Definiere Konstanten für die Anzeige des Textes
const gruenText = "Grün: ";
const alarmText = "Alarm: ";
const bestText = "Bestätigt: ";
const pauseText = "Pausiert: ";
const warnungText = "Warnung: ";
const ungewText = "Ungewöhnlich: ";
// Erzeuge den Helper
module.exports = NodeHelper.create({
/*
* Funktion, die die eigentliche Abfrage an den Monitoring Server stellt
*/
updateSens: function() {
const self = this;
self.sensorenTable = [];
// Stelle Request an den Monitoring Server
request('omitted', function (error, response, html) {
// Überprüfe Status und Error Code von Server Response
if (!error && response.statusCode == 200) {
// Inhalt vom Monitoring Server fürs Parsen laden
var $ = cheerio.load(html);
// Finde Elemente, die "TreeOpen" heißen und iteriere über diese
$('div.treeopen').each(function (i, element) {
// Finde nächstes Element, welches unser nutzbares Element ist
var a = $(this).next();
// Gib Text aus == Probe-Name
var c = a.text();
// Wenn der Text "Gerät" nicht vorkommt, ist es der Name der Probe
if (!(c.indexOf("Gerät") >= 0)) {
var probeName = c;
// Pushe ProbeName in den Array
self.sensorenTable.push({
probe: true,
loaded: true,
probeName: c,
});
// Sonst suchen wir nach Anzahl der Sensoren
} else {
// Gehe von treesens zwei Mal im Tree runter und suche nach Klasse "sens"
var m = a.children().children().nextAll('div.sens');
// Finde erstes Child
var erster = m.children().first();
var gruenSens = "";
var pauseSens = "";
var ungewSens = "";
var warnSens = "";
var bestSens = "";
var alarmSens = "";
var undefSens = "";
// Überprüfe, welche Art von Child das erste ist
if (erster.hasClass("sg")) {
gruenSens = gruenText + erster.text();
} else if (erster.hasClass("sr")) {
alarmSens = alarmText + erster.text();
} else if (erster.hasClass("sb")) {
pauseSens = pauseText + erster.text();
} else if (erster.hasClass("sp")) {
ungewSens = ungewText + erster.text();
} else if (erster.hasClass("sy")) {
warnSens = warnungText + erster.text();
} else if (erster.hasClass("so")) {
bestSens = bestText + erster.text();
} else {
undefSens = alarmText + erster.text();
}
var naechster = erster.next();
while (!(naechster.text() == "")) {
if (naechster.hasClass("sg")) {
gruenSens = gruenText + naechster.text();
} else if (naechster.hasClass("sr")) {
alarmSens = alarmText + naechster.text();
} else if (naechster.hasClass("sb")) {
pauseSens = pauseText + naechster.text();
} else if (naechster.hasClass("sp")) {
ungewSens = ungewText + naechster.text();
} else if (naechster.hasClass("sy")) {
pauseSens = pauseText + naechster.text();
} else if (naechster.hasClass("so")) {
bestSens = bestText + naechster.text();
} else {
undefSens = alarmText + naechster.text();
}
// Nächste Zelle untersuchen in der While Schleife
naechster = naechster.next();
}
self.sensorenTable.push({
probe: false,
loaded: true,
gruenSens: gruenSens,
alarmSens: alarmSens,
pauseSens: pauseSens,
ungewSens: ungewSens,
pauseSens: pauseSens,
bestSens: bestSens,
undefSens: undefSens,
});
}
});
} else {
// Abfrage vom Server fehlgeschlagen, Text zurückgeben
self.sensorenTable.push({
probe: false,
loaded: false,
});
}
});
// Senden der Tabelle an das Hauptmodul
self.sendSocketNotification("Loaded", self.sensorenTable);
// Update schedulen, um Abfrage erneut durchzuführen
self.scheduleUpdate(10000);
},
/*
* Sobald die Notifikation vom Modul erhalten wurde
* sollte ein Update gescheduled werden
*/
socketNotificationReceived: function(notification, payload) {
const self = this;
self.updateSens();
},
/*
* Reiht das nächste Update ein, basierend auf Millisekunden
*/
scheduleUpdate: function(delay) {
// Nächstes mal in 10 Sekunden / 10.000 Millisekunden laden
var nextLoad = 10000;
const self = this;
// Timeout-Funktion definieren
clearTimeout(this.updateTimer);
this.updateTimer = setTimeout(function() {
self.updateSens();
}, nextLoad);
},
});
There still are a few things I have to work out, especially as I’m completely new to JS and had to learn everything from scratch. That’s probably also why I have a noob-ish error hidden somewhere, which every normal human being will find immediately.
Sadly, I can not give you the full link of the request, rest assured, that it’s working when I test it manually.