Last active
July 21, 2024 04:39
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ---------------------------------------------------------------------------------------------------- | |
// | |
// 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!'); | |
} | |
}); |
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.
Wenn es dir weiter hilft hier ist es in blockly
nur diesen abschnitt müsst ihr mit euren daten befüllen und ip ändern
curl -v http://192.168.0.91/api/printer --digest -u USER:PASSWORD
<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id="B=%HkNFd;Jc-lk:s1;ct">result</variable>
</variables>
<block type="on" id="iHq6A)^AZ=QN+;coR^ht" x="238" y="-387">
<field name="OID">tuya.0.bffbff9117c8137818tkbd.1</field>
<field name="CONDITION">true</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="schedule" id="$@Q{Q!oh$(Xi+YfJ+Sth">
<field name="SCHEDULE">*/30 * * * * *</field>
<statement name="STATEMENT">
<block type="exec" id="rl%::%dMuDzH:Oq|nx4Y">
<mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="true"></mutation>
<field name="WITH_STATEMENT">TRUE</field>
<field name="LOG">info</field>
<value name="COMMAND">
<shadow type="text" id="S*SWo2P:N:YD_t7GS@AP">
<field name="TEXT">curl -v http://192.168.0.91/api/printer --digest -u USER:PASSWORD</field>
</shadow>
</value>
<statement name="STATEMENT">
<block type="comment" id="yX7S6rmlAz8S41pwf76$">
<field name="COMMENT">Bett-Temperatur</field>
<next>
<block type="update" id="/JU=hq_EbM2uBYcH#CaL">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">0_userdata.0.Prusa_Mini_Data.MK4.temp_bed</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="get_attr" id="3/qiV[k;qu[CEb1F)vlm">
<value name="PATH">
<shadow type="text" id="@oLvnd+50^[4HE/z}A32">
<field name="TEXT">telemetry.temp-bed</field>
</shadow>
</value>
<value name="OBJECT">
<shadow type="get_object" id="RBy5134AZ8s%X*gAr;oY">
<field name="OID">Object ID</field>
</shadow>
<block type="convert_json2object" id="wY8~t+qQ~SSt/NP+P?2v">
<value name="VALUE">
<block type="variables_get" id="LbTt(:6:+br;^?Ac98Z-">
<field name="VAR" id="B=%HkNFd;Jc-lk:s1;ct">result</field>
</block>
</value>
</block>
</value>
</block>
</value>
<next>
<block type="comment" id="){|e{c5FD%a!Wj:zbQ?`">
<field name="COMMENT">Nozzle-Temperatur</field>
<next>
<block type="update" id="KI|.h+7Bi_(u^I?ED4/*">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">0_userdata.0.Prusa_Mini_Data.MK4.temp_nozzle</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="get_attr" id="3JtjS~*Azu.Tvy0B5ZdR">
<value name="PATH">
<shadow type="text" id="@.t;#czSI9/wagM2I$4k">
<field name="TEXT">telemetry.temp-nozzle</field>
</shadow>
</value>
<value name="OBJECT">
<shadow type="get_object" id="RBy5134AZ8s%X*gAr;oY">
<field name="OID">Object ID</field>
</shadow>
<block type="convert_json2object" id="B!?BT$h.22H?X|dNhtuE">
<value name="VALUE">
<block type="variables_get" id="UwY@-hJ:*uEOSI3{OP]d">
<field name="VAR" id="B=%HkNFd;Jc-lk:s1;ct">result</field>
</block>
</value>
</block>
</value>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</statement>
</block>
</statement>
</block>
</xml>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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!