Skip to content

Instantly share code, notes, and snippets.

@der-pw
Last active January 2, 2024 21:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save der-pw/0e1475bbbbbc11da190e72b4b0fe7985 to your computer and use it in GitHub Desktop.
Save der-pw/0e1475bbbbbc11da190e72b4b0fe7985 to your computer and use it in GitHub Desktop.
Pollt die Telemetriedaten deines Prusa Mini und stellt den Inhalt in IOBroker-Datenpunkten zur Verfügung.
// ----------------------------------------------------------------------------------------------------
//
// Prusa Mini JSON2Objects V0.2 (der-pw https://github.com/der-pw)
//
// V0.1 erste Idee
// V0.2 stoppt den loop, wenn der Mini nicht erreichbar ist (Log wird nicht zugemüllt)
//
// https://gist.github.com/der-pw/0e1475bbbbbc11da190e72b4b0fe7985
//
// Helfer-Script zum Auslesen der Telemetriedaten des Prusa Mini (http://<prusamini-ip>/api/telemetry)
// JSON wird im angegebenen Intervall gepollt
// Objekte werden in 0_userdata.0.Prusa_Mini_Data.<printer_name> angelegt
//
// ----------------------------------------------------------------------------------------------------
var ip_address, printer_name, trigger_obj, temps_list, values_list, loop, i_temps, i_values, intval_sec, printstate, result, error;
ip_address = '192.168.xxx.xxx'; // IP-Adresse des Prusa Mini
printer_name = 'Mini_1'; // Name für endgültigen Objektpfad
intval_sec = 20; // Interval in Sekunden
trigger_obj = '' // Datenpunkt vom Zustand der Schaltsteckdose (true/false), Intervall läuft nur wenn Schaltsteckdose vom Drucker an ist
temps_list = ['temp_nozzle', 'temp_bed'];
values_list = ['project_name', 'print_dur', 'progress', 'time_est'];
printstate = false; // Debouncevariable für printstate
createState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.temp_nozzle', 0, JSON.parse('{"type":"number","unit":"°C", "role":"value.temperature"}'), async function () {
});
createState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.temp_bed', 0, JSON.parse('{"type":"number","unit":"°C", "role":"value.temperature"}'), async function () {
});
createState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.progress', 0, JSON.parse('{"type":"number","unit":"%", "role":"value"}'), async function () {
});
createState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.print_dur', 0, JSON.parse('{"type":"string"}'), async function () {
});
createState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.time_est', 0, JSON.parse('{"unit":"seconds"}'), async function () {
});
createState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.project_name', 'none', JSON.parse('{"type":"string"}'), async function () {
});
createState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.printing', 'none', JSON.parse('{"type":"boolean"}'), async function () {
});
on({id: trigger_obj, change: "ne"}, async function (obj) {
if ((obj.state ? obj.state.val : "")) {
await wait(10000); // warte 10 Sekunden damit der Mini sich verbinden kann
loop = setInterval(async function () {
try {
require("request")((['http://',ip_address,'/api/telemetry'].join('')), async function (error, response, result) {
if (getAttr((function () { try {return JSON.parse(result);} catch(e) {return {};}})(), 'project_name')) {
// nur wenn Druck läuft (project_name verfügbar) alle Werte aktualisieren
for (var i_values_index in values_list) {
i_values = values_list[i_values_index];
setState(('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.' + String(i_values)), getAttr((function () { try {return JSON.parse(result);} catch(e) {return {};}})(), i_values));
if (!printstate) {
// printstate true setzen, sofern nicht schon geschehen
setState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.printing', true);
console.log(printer_name + ' druckt!');
}
printstate = true;
}
} else {
if (printstate) {
// printstate false setzen, sofern nicht schon geschehen
setState('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.printing', false);
console.log(printer_name + ' Druck beendet!');
}
printstate = false;
}
// andernfalls nur die Temperaturdaten schreiben
for (var i_temps_index in temps_list) {
i_temps = temps_list[i_temps_index];
setState(('0_userdata.0.Prusa_Mini_Data.' + printer_name + '.' + String(i_temps)), getAttr((function () { try {return JSON.parse(result);} catch(e) {return {};}})(), i_temps));
}
}).on("error", function (e) {console.error(e); clearInterval(loop); loop = null;} // stoppe den Loop wenn Mini nicht erreichbar ist
);
} catch (e) { console.error(e); }
}, intval_sec * 1000);
} else {
(function () {if (loop) {clearInterval(loop); loop = null;}})();
console.log(printer_name + ' Power off!');
}
});
@der-pw
Copy link
Author

der-pw commented Sep 5, 2021

image

@JVF2
Copy link

JVF2 commented Jan 2, 2024

Hallo Patrick,
die Vorzüge deines Skriptes habe ich bis dato sehr genossen.
Mit dem Wechsel auf die aktuelle "Prusa"-Firmware (5.X.X) ist die Schnittstelle nicht mehr erreichbar.
Eine Dokumentation seitens Prusa konnte ich nicht finden.
Kannst du mir weiterhelfen?
Besten Dank!

@der-pw
Copy link
Author

der-pw commented Jan 2, 2024

Hi,

als ich noch ein Update auf meinem Mini gemacht habe, kam ich mit meinem Skritp nicht an der Authentifizierung vorbei.
Irgendwie cool, was die da so machen und aus dem Ding herausholen, aber manches wirkt so überstürzt und eine Lösung dafür kommt dann recht spät, wenn überhaupt.

Lange Rede: ich habe meinen Mini verkauft, hab das ganze dann nicht mehr verfolgt und auch gar keine Möglichkeit mehr mein Skript hier zu testen. Tut mir Leid.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment