Re: DSB - Abrage
Hallo,
nachdem ich im Main Beitrag damals die meisten Infos für eine laufende Abfrage gefunden habe will ich heute mal meinen derzeitigen Ansatz freigeben.
Bitte, ich gebe keinen wirklichen Support. Sicherlich einige Fragen kann ich beantworten bin aber eher PowerUser also Entwickler.
- Umgebung: Pi4 mit iobroker, Python 3.9
Naja iobroker ganz normal aufgesetzt, Python installieren (Anleitungen im Netz) - Python Modul: pysdb 2.1.1.
Ein Python Script erstellt:
import pydsb
dsb = pydsb.PyDSB("xxxxxxx", "xxxxxxx") //Zugangsdaten user/pw
a = dsb.get_plans()
print(a[0])
- Script in Javascript, aufruf eines Python Script's, extrahieren des DAB Links, Aufruf der htm Datei, Parsen der Schul-Daten
//Setzte CronDaten für den automatischen Aufruf dieses Script's**
var cron1 = "15 6,8,19-20 * * *"; // Jede Stunden um 15 nach 6h, 8h, 19-20h Mo-So
var cron2 = "10,15,20,25,27,30,32,35,40,50 7 * * 1-5"; // von 7:00 - 7:20 Alle 2 Min Mo-Fr
//Aufruf eines Python Script's
function get_dsb_data() {
var python = require('child_process').spawn('python3',
// second argument is array of parameters, e.g.:
//Pfad zum Python Script
["/home/iobroker/dsb.py"]);
var result = '';
python.stdout.on('data', function(data){ result += data.toString(); });
python.on('close', function(code){
if (code !== 0) {
log('Error: ' + code);
} else {
log(result);
//Extrahieren der DSB Daten
result = result.replace(/\{/g, "");
result = result.replace(/\}/g, "");
arr = result.split(",")
//Datum
dsbdate = arr[1].replace(/\'/g, "");
dsbdate = dsbdate.replace(/ uploaded_date/g, "Datum");
//Link
dsblink = arr[3].replace(/\'/g, "");
dsblink = dsblink.replace(/ url: /g, "");
dsblink = dsblink.replace(/ /g, "");
//Füllen der Objekt states in iobroker Datum/HTML Link zum Schulplan
setState('javascript.0.dsbplan.Date', dsbdate, true);
setState('javascript.0.dsbplan.LINK', dsblink, true);
//Abrufen des Schulplans
request(dsblink, function (error, response, body) {
//Füllen des Objekts RAW in iobroker mit den Rohdaten des Schulplans
setState('javascript.0.dsbplan.RAW',body);
});
}
});
};
//HTML Raw Daten bearbeiten
function parseplan() {
//Klasse/Klassen Wählen (Ich habe Zwillige :-))
var klasse = ["7C","7D"];
var myArrayA;
var myArrayB;
var mystra;
var bid;
var kid
myArrayA = [];
myArrayB = [];
//HTML Raw Daten holen
mystra = getState('javascript.0.dsbplan.RAW').val;
//Alles was im HTML Code ersetzt werden soll
mystra = mystra.replace(/7C/g, "7C (Evelina)");
mystra = mystra.replace(/7D/g, "7D (Matthis)");
mystra = mystra.replace(/f�r/gi, "für");
mystra = mystra.replace(/R�ume/gi, "Räume");
mystra = mystra.replace(/entf�llt/gi, "<h1><b>fällt aus</b></h1>");
mystra = mystra.replace(/g�ltig ab 07.02.22/g, "");
mystra = mystra.replace(/aufgel�st/g, "aufgelöst");
mystra = mystra.replace(/Stundenplan 21-22_1./g, "");
mystra = mystra.replace(/Halbjahr_Version/g, "");
mystra = mystra.replace(/1_Stand_15.03.22/gi, "");
mystra = mystra.replace(/Untis Stundenplan Software/g, "");
mystra = mystra.replace(/Untis/g, "");
mystra = mystra.replace(/ 2022 /g, "");
mystra = mystra.replace(/\<tr class="info"\>\<th class="info" align="center" colspan="2"\>/gi, "");
mystra = mystra.replace(/class="info"/gi, "");
mystra = mystra.replace(/Nachrichten zum Tag\<\/th\>\<\/tr\>/gi, "");
mystra = mystra.replace(/Stand:.+\<p>/gi, "<p>");
mystra = mystra.replace(/BEETHOVEN-OBERSCHULE.+/g, "");
mystra = mystra.replace(/Schuljahr.+/g, "");
mystra = mystra.replace(/colspan=\"2\"\>/gi, "colspan=\"2\"\>\<font size=\"1\"\>");
mystra = mystra.replace(/Ihr Browser kann leider keine eingebetteten Frames anzeigen/gi, "");
//Vollschreibweise Lernfächer
mystra = mystra.replace(/De</g, "Deutsch<");
mystra = mystra.replace(/Ma</g, "Mathe<");
mystra = mystra.replace(/Rev</g, "Religion<");
mystra = mystra.replace(/>Sp</g, ">Sport<");
mystra = mystra.replace(/PB</g, "Politik<");
mystra = mystra.replace(/Ph</g, "Physik<");
mystra = mystra.replace(/Bi</g, "Biologie<");
mystra = mystra.replace(/En</g, "Englisch<");
mystra = mystra.replace(/Ch</g, "Chemie<");
mystra = mystra.replace(/F</g, "Französisch<");
mystra = mystra.replace(/Ku</g, "Kunst<");
mystra = mystra.replace(/Ge</g, "Geschichte<");
mystra = mystra.replace(/Mu</g, "Musik<");
mystra = mystra.replace(/Ek</g, "Erdkunde<");
//Vollschreibweise Lehrer Namen
mystra = mystra.replace(/Bj</g, "Baumxxxxx<");
mystra = mystra.replace(/Hei</g, "Heinxxx<");
mystra = mystra.replace(/Ott</g, "Otto<");
mystra = mystra.replace(/Her</g, "Her<");
mystra = mystra.replace(/Rb</g, "Ribxxx<");
mystra = mystra.replace(/Ba</g, "Balxxx<");
mystra = mystra.replace(/Zpr</g, "Zepxxx<");
mystra = mystra.replace(/Beu</g, "Beuxxxx<");
mystra = mystra.replace(/Rol</g, "Rolxxxxx<");
mystra = mystra.replace(/Wsd</g, "Westexxx<");
//Nur HTML Elemente der angegebene Klassen hinzufügen
myArrayA = mystra.split("\n");
myArrayB = myArrayA
myArrayA = [];
myArrayB.forEach(function (element) {
if(!element.startsWith("<tr class=\'list")) {
myArrayA.push(element);
} else if(element.startsWith("<tr class=\'list") && element.includes(klasse[0])) {
myArrayA.push(element);
}
else if(element.startsWith("<tr class=\'list") && element.includes(klasse[1])) {
myArrayA.push(element);
}
});
mystra = "";
myArrayA.forEach(function (element) {
mystra += element + "\n";
});
//Füllen des Objekt states HTML in iobroker mit den bereinigten Daten
setState('javascript.0.dsbplan.HTML', mystra);
}
//Automatischen Aufruf dieses Script's alle 15Min*
schedule(cron1, function () { // Abruf alle 15Min
get_dsb_data();
setTimeout(function() {parseplan();}, 4000);
});
//Automatischen Aufruf dieses Script's ab 7h in kurzen Abständen
schedule(cron2, function () { n
get_dsb_data();
setTimeout(function() {parseplan();}, 4000);
});
//Einmaliger Aufruf beim Starten des Scripts*
get_dsb_data();
setTimeout(function() {parseplan();}, 4000);
-
Vis: Anzeigt Daten
Dafür nutze ich diesen State setState('javascript.0.dsbplan.HTML -
Email: sendet Daten an Familie (Kurz vor der Schule)
Einfach per email Adapter diesen State setState('javascript.0.dsbplan.HTML) versenden