Shutdown and GET-Request after all jobs are done

I have a little print farm with four printers and I want to shut down the farm after all jobs are done.

For the shutdown I can send an GET request to switch off the power supply. But what is the best approach to trigger the switch from repetier?

Comments

  • I can run an own service which uses the "listPrinter" endpoint and if all jobs are "none" request the switch off. Is there a way to do this inside?
  • With server commands you can probably do this. But the main problem is normally to shut down the pi and then disable the power supply. Otherwise you risk damage on sd filesystem.

    You can define a function in your printer config that gets called at job end and tests if condition is met for a "special" action. Call this in response to jobDeactivated event. With

    @sendToPrinter slug command

    Sends command to the printer with given slug name. That way you can execute command sin the context of another printer. Note that command and all command parameter get parsed first in your printer context, so outer quotes get removed and computed expressions get executed. Escape them if that is not wanted accordingly.


    you can execute commands in other printers. Idea would be to set a counter in server global to 0 and let each printer add 1 to it if job is running.
    @func testShutdown
    @if {{sglobal.jobCount > 0}}
    ...
    @endif
    @endfunc
    @set sglobal.jobCount 0
    @sendToPrinter p1 set sglobal.jobCount {{sglobal.jobCount + job.running}}
    @sendToPrinter p2 set sglobal.jobCount {{sglobal.jobCount + job.running}}
    @sendToPrinter p3 set sglobal.jobCount {{sglobal.jobCount + job.running}}
    @timedCall shutTimer 60000 testShutdown

    p1-p3 are the slug names of your printers here. You need a delay since you do not know when the command on other printer gets executed.  Most risky time is when communication is blocked during heatup of bed/extruder so you might need to increase delay.

    But as said you should shutdown and then disable relay so it should bette rbe triggered by a external service or with some delay if that is possible.
  • Thank you. I´ll try this way and the delay can be an hour .. now the farm is running multiple hours without printing and so I can just save a little bit of energy and gently shutdown the farm.
  • Hallo,
    Ich habe vor kurzem von Octoprint auf RepetierServer gewechselt und bin begeistert von dem Funktionsumfang. Meine beiden Drucker laufen nun mit einem Raspi Pi4.
    Webcalls und execute Befehle sind super funktionieren sehr gut.

    Darf ich zu dem angeführten Beispiel eine Frage stellen da ich eine ähnliche Problemstellung habe.

    Ich möchte mit der Funktion "Ereignisabhängig - Drucker herunterfahren" die USB Schnittstellen des Raspi  und den Touchscreen ausschalten und würde das gerne mit der Abfrage von job.running über @sendToPrinter bewerkstelligen um nicht dem zweiten laufenden Drucker die USB Verbindung zu kappen..

    Ich bekomme aber leider keinen Wert von job.running beim Abfragen zurück.
    Der Drucker slugs sind HTA3D,  Sidewinder_X1 und nach dem Aufruf habe ich immer eine 0 als Ergebnis.
    Was mache ich da falsch?

    Den gesamten Text würde ich gerne bei beiden Druckern beim Ereignis - Drucker herunterfahren verwenden:

    "Drucker herunterfahren"
    @func Jobabfrage
    @if {{sglobal.jobCount > 0}}
    @execute USB-aus
    @endif
    @endfunc
    @set sglobal.jobCount 0
    @sendToPrinter HTA3D set sglobal.jobCount {{sglobal.jobCount + job.running}}
    @sendToPrinter Sidewinder_X1 set sglobal.jobCount {{sglobal.jobCount + job.running}}
    @call Jobabfrage


    Vielen Dank für ihre Bemühungen und beste Grüße
    Helmut


  • habe zusätzlich noch ein Break und else eingefügt.

    "Drucker herunterfahren"
    @func Jobabfrage
    @if {{sglobal.jobCount > 0}}
    @break
    @else
    @execute USB-aus
    @endif
    @endfunc
    @set sglobal.jobCount 0
    @sendToPrinter HTA3D set sglobal.jobCount {{sglobal.jobCount + job.running}}
    @sendToPrinter Sidewinder_X1 set sglobal.jobCount {{sglobal.jobCount + job.running}}
    @call Jobabfrage
  • Das Problem ist denke ich, dass der Befehl zwar zum anderen Drucker geschickt wurde, aber noch nicht ausgeführt wurde. Er wird mit @sendToPrinter ja nur in die Befehlsschlange eingefügt.

    Eine einfachere Lösung wäre für jeden Drucker eine sglobal variable zu haben ob er noch am Drucken ist. Im start Druck Ereignis auf 1 setzen und in Druck fertig/Druck abbrechen wird er auf 0 gesetzt.

    Warum eigentlich USB Ausschalten? Ich weiß ywar das es geht, aber ab da kommt er ja nicht mehr wieder bis zum reboot und bei Shutdown werden sie ja auch ausgeschaltet.
  • OK, war mir nicht bewusst, dass der Sendbefehl nur in der Warteschlange ist.

    Den Drucker, USB und Touchscreen vom Raspi schalte ich wegen der unter Strom stehenden Druckerdisplays aus, der Raspi läuft 24/7 durch.

    Dazu rufe ich Uhubctl  und Rpi-Backlight über @execute auf, das funktioniert eigentlich sehr gut, auch das Einschalten vor dem Druck funktioniert gut.
    Die Stromversorgung der Drucker schalte ich mit zwei WLan Steckdosen über ifttt webhook.


    Wenn ich  beim Druckstart jeweils eine sglobal.Drucker1 und sglobal.Drucker2 setze, reicht es dann beim Ereignis "Drucker runterfahren" diese Variable mit if - then abzufragen?

    Beispiel:
    Drucker 1
    Ereignisabhängig - "Sende vor Druckauftrag"
    @set sglobal.drucker1  1

    Drucker 2
    Ereignisabhängig " Drucker herunterfahren" 

    @if {{sglobal.drucker1 > 0}}
    @else
        @execute USB-aus
    @endif

    Die Variable sglobal.drucker1 setzte ich beim Herunterfahren auf 0.

    Teste ich sofort.

    Vielen Dank für die rasche Unterstützung und liebe Grüße
    Helmut


  • Nein, du musst ncoh beim Druckende den Wert wieder auf 0 setzen, sonst bleibt er nach dem ersten Druck ja ewig auf 1 und beim Druckerstart würd eich sie auch auf 0 belegen.

    Du kannst deine Bedingung vereinfachen:

    @if {{sglobal.drucker1 == 0}}
        @execute USB-aus
    @endif
Sign In or Register to comment.