3D Druck Status

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Spuckiii
Beiträge: 29
Registriert: 11. Jul 2021 11:55
Answers: 0

3D Druck Status

Beitrag von Spuckiii »

Hallo Gemeinde,

ich brauche bitte nochmal einen kleinen Schubser. Ich habe ein 3D Drucker... darauf ist klipper installiert, mainsail und moonraker. Moonraker kann zwar mqtt aber ich komme damit nicht ganz zu recht. Jetzt habe ich gesehen dass ich ein in json Format Ergebnis bekomme wenn ich die URL zum Drucker aufrufe mit dem "Befehl" /printer/objects/query?virtual_sdcard&display_status&print_stats&heater_bed:
{"result": {"eventtime": 834.601384618, "status": {"virtual_sdcard": {"file_path": null, "progress": 0.0, "is_active": false, "file_position": 0, "file_size": 0}, "display_status": {"progress": 0.0, "message": null}, "print_stats": {"filename": "", "total_duration": 0.0, "print_duration": 0.0, "filament_used": 0.0, "state": "standby", "message": "", "info": {"total_layer": null, "current_layer": null}}, "heater_bed": {"temperature": 14.24, "target": 60.0, "power": 1.0}}}}
Wie ich die Strings bekomme weiß ich jetzt, ich bräuchte aber noch eine Info.

Code: Alles auswählen

{"result": {"eventtime": 6756.460595777, "status": {"webhooks": {"state": "ready", "state_message": "Printer is ready"}, "print_stats": {"filename": "87.gcode", "total_duration": 417.23587888899965, "print_duration": 408.69955216699964, "filament_used": 146.05711999999994, "state": "printing", "message": "", "info": {"total_layer": null, "current_layer": null}}, "display_status": {"progress": 0.1534732459221214, "message": "Printing..."}}}}
Wie bekomme ich den "progress": 0.1534732459221214, in Prozent angezeigt - also der Druck ist wäre hier zu 15 % fertig?

LG
Martin

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: 3D Druck Status

Beitrag von udo1toni »

Etwas anders formatiert:

Code: Alles auswählen

{
    "result": {
        "eventtime": 834.601384618,
        "status": {
            "virtual_sdcard": {
                "file_path": null,
                "progress": 0.0,
                "is_active": false,
                "file_position": 0,
                "file_size": 0
            },
            "display_status": {
                "progress": 0.0,
                "message": null
            },
            "print_stats": {
                "filename": "",
                "total_duration": 0.0,
                "print_duration": 0.0,
                "filament_used": 0.0,
                "state": "standby",
                "message": "",
                "info": {
                    "total_layer": null,
                    "current_layer": null
                }
            },
            "heater_bed": {
                "temperature": 14.24,
                "target": 60.0,
                "power": 1.0
            }
        }
    }
}
bzw.

Code: Alles auswählen

{
    "result": {
        "eventtime": 6756.460595777,
        "status": {
            "webhooks": {
                "state": "ready",
                "state_message": "Printer is ready"
            },
            "print_stats": {
                "filename": "87.gcode",
                "total_duration": 417.23587888899965,
                "print_duration": 408.69955216699964,
                "filament_used": 146.05711999999994,
                "state": "printing",
                "message": "",
                "info": {
                    "total_layer": null,
                    "current_layer": null
                }
            },
            "display_status": {
                "progress": 0.1534732459221214,
                "message": "Printing..."
            }
        }
    }
}
Um an den konkreten Wert zu kommen kannst Du einfach den JSONPATH Transformation Service installieren und anschließend auf alle Werte gezielt zugreifen. Es gibt dafür zwei verschiedene Möglichkeiten. Möglichkeit eins: Du nutzt einen number channel und setzt transformationPattern auf

Code: Alles auswählen

JSONPATH:$.result.status.display_status.progress
Vorausgesetzt, Deine openHAB Version ist einigermaßen aktuell, kannst Du zusätzlich noch unit auf % setzen.
Als Item verwendest Du dann Number:Dimensionless und erhältst automatisch eine Prozent Anzeige. Über das Item kannst Du dann in den Metadaten noch einstellen, dass keine oder z.B. eine Nachkommastelle angezeigt wird.
Stellst Du fest, dass Dich noch mehr Werte interessieren, kannst Du die Transformation auch in den Link zum jeweiligen Item "verschieben", wichtig ist aber, dass dann der Channel ein string Channel sein muss, eine Unit kannst Du so leider nicht wählen, dafür kannst Du mit einem Channel alle Items abfrühstücken.

EDIT: Ich nutze VS Code, dafür gibt es einen Haufen Plugin, die sich um JSON und JSONPATH kümmern, zum einen um ein JSON Objekt lesbarer zu formatieren, zum anderen, um die passenden JSONPATH Ausdrücke zu extrahieren.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten