Skip to content

Instantly share code, notes, and snippets.

@der-pw
Last active July 21, 2024 04:39
Show Gist options
  • 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!');
}
});
@Kammi61871
Copy link

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