Grotti 3.7.0: Treiber für Kobra 4 und Marlin, smartere Dateien-Auswahl und einstellbare Etiketten.

Senden und Abbruch laufen über den Treiber, Orca-Doppelzeilen und tote Ideen-API fallen weg, Drucker folgen der Datei, Etikettenformat liegt in den Einstellungen.
This commit is contained in:
Dominic Gundel committed 2026-11-02 14:03:57 +01:00
1 parent 5081212212
commit db6a85a703
54 files changed
+3379 -384

No files matched your search

+20 -7
View File
@@ -266,7 +266,13 @@ function tempbarHtml(label, value, target, scale, iconName) {
function tempbarsHtml(printer, state) {
if (state === "offline") return "";
const nozzle = tempbarHtml("Düse", printer.nozzle, printer.nozzle_target, 300, "nozzle");
const tools = Array.isArray(printer.tools) ? printer.tools : [];
const nozzle = tools.length > 1
? tools.map((tool) => tempbarHtml(
tool.name || ("Kopf " + (Number(tool.index) + 1)),
tool.temp, tool.target, 300, "nozzle",
)).join("")
: tempbarHtml("Düse", printer.nozzle, printer.nozzle_target, 300, "nozzle");
const bed = tempbarHtml("Bett", printer.bed, printer.bed_target, 110, "bed");
const chamber = tempbarHtml("Bauraum", printer.chamber, printer.chamber_target, 80, "chamber");
if (!nozzle && !bed && !chamber) return "";
@@ -443,8 +449,10 @@ function spoolHex(spool) {
return "";
}
function aceSlotLabel(slot) {
function aceSlotLabel(slot, family) {
const n = Number(slot);
if (family === "tenlog") return "Kopf " + n;
if (family === "anycubic_i3") return "am Drucker";
if (n <= 4) return "ACE 1 · " + n;
return "ACE 2 · " + (n - 4);
}
@@ -489,7 +497,7 @@ function aceSteerHtml(printer) {
const kind = spool.material_type || "—";
bits.push(`<div class="steer-slot-row">
<span class="dot" style="background:${escapeHtml(hex)}"></span>
<span class="grow"><b>${escapeHtml(aceSlotLabel(slot))}</b> · ${escapeHtml(kind)} · ${escapeHtml(spool.name || "")}</span>
<span class="grow"><b>${escapeHtml(aceSlotLabel(slot, printer.family))}</b> · ${escapeHtml(kind)} · ${escapeHtml(spool.name || "")}</span>
<button type="button" class="ghost" data-steer-go="slot_setzen" data-ace-slot="${slot}">an den Drucker</button>
</div>`);
});
@@ -499,6 +507,7 @@ function aceSteerHtml(printer) {
}
function steerPanelHtml(printer) {
if (printer.family === "tenlog" || printer.family === "anycubic_i3") return "";
const n = printer.nozzle_target != null ? Math.round(printer.nozzle_target) : "";
const b = printer.bed_target != null ? Math.round(printer.bed_target) : "";
const sp = typeof printer.speed_factor === "number" ? Math.round(printer.speed_factor * 100) : 100;
@@ -1590,8 +1599,8 @@ async function refresh() {
printerCache.clear();
for (const printer of all) printerCache.set(printer.host, printer);
deskHostsOrder = printers.map((p) => p.host);
document.getElementById("summary").innerHTML = summaryText(all) || "keine Drucker";
document.getElementById("when").textContent = new Date().toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" });
setHtml(document.getElementById("summary"), summaryText(all) || "keine Drucker");
setText(document.getElementById("when"), new Date().toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" }));
if (!all.length) {
lastFleetKey = "";
@@ -1614,7 +1623,6 @@ async function refresh() {
bucket.appendChild(article);
} else {
patchCard(article, printer);
if (article.parentElement !== bucket) bucket.appendChild(article);
}
}
for (const [host, article] of [...cardNodes.entries()]) {
@@ -1628,9 +1636,14 @@ async function refresh() {
? document.querySelector("#cards [data-fleet]")
: document.querySelector(`#cards [data-fleet="${CSS.escape(section.label)}"]`);
if (!bucket) continue;
let marker = bucket.firstChild;
for (const printer of section.printers) {
const article = cardNodes.get(printer.host);
if (article) bucket.appendChild(article);
if (!article) continue;
if (article !== marker) {
bucket.insertBefore(article, marker);
}
marker = article.nextSibling;
}
}