Seite 1 von 1

3D Druck Status

Verfasst: 7. Feb 2023 08:42
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

Re: 3D Druck Status

Verfasst: 7. Feb 2023 13:25
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.