German: Python Script mit Button ausführen

Aloa,

Ich nutze für meinen 3D Drucker Octoprint und habe eine LED Beleuchtung die ich mit dem Knopf in Octoprint Ein und Ausschalten will. Das Script funktioniert und sonst ist alles bereit.
Mein Problem:
Die LED Beleuchtung möchte ich mit einem Knopf schalten und dafür habe ich in der control.jinja2 Datei einen Knopf hinzugefügt über Copy&Paste und versucht mein Python Script damit irgendwie zu Starten.

Der Button ganz oben soll das script ausführen allerdings habe ich keine Ahnung wie ich das hier machen soll. (Bin kein Programmierer oder sowas)

Auszug:

<h1>{{ _('General') }}</h1>
<div>
<button class="btn btn-block control-box" data-bind="enable: isOperational() && !isPrinting() && loginState.isUser(), click: function() { "/home/pi/OctoPrint/script/led.py"}) }">{{ _('Licht an /15 Sek') }}</button>
<button class="btn btn-block control-box" data-bind="enable: isOperational() && !isPrinting() && loginState.isUser(), click: function() { $root.sendCustomCommand({type:'command',command:'M18'}) }">{{ _('Motors off') }}</button>
<button class="btn btn-block control-box" data-bind="enable: isOperational() && loginState.isUser(), click: function() { $root.sendCustomCommand({type:'command',command:'M106 S255'}) }">{{ _('Fan on') }}</button>
<button class="btn btn-block control-box" data-bind="enable: isOperational() && loginState.isUser(), click: function() { $root.sendCustomCommand({type:'command',command:'M106 S0'}) }">{{ _('Fan off') }}</button>
</div>
</div>

Ich hoffe ich habe alle wichtigen Infos genannt, falls nicht fragt nur.

LG
Ramset

Hallo.

Schau dir mal die "action commands" an. Hier kannst du "System" definieren und direkt auf das Script verweisen.

Und mit dem "Custom Control Editor" erstellst du einfach für diesen Command einen Button.

Grüße

Using the Simple API mixin, you can allow your web page to make a call back into your Python. Mit dem Simple API-Mixin können Sie Ihrer Webseite erlauben, einen Rückruf in Python zu tätigen.

In the template:

data-bind="click: ledOn"

In your JavaScript file:

        ledOn = function() {
            $.ajax({
                url:         "/api/plugin/meinpluginname",
                type:        "POST",
                contentType: "application/json",
                dataType:    "json",
                headers:     {"X-Api-Key": UI_API_KEY},
                data:        JSON.stringify({"command": "led", "state": true}),
                complete: function () {
                }
            });
            return true;
        };

In your __init__.py:

  • In the arguments for your class definition near the top, add:
									 octoprint.plugin.SimpleApiPlugin,
  • Add this:
	def get_api_commands(self):
		return dict(led=["state"])

	def on_api_command(self, command, data):
		if command == "led":
            bOn = "{state}".format(**data)
            # Führen Sie in Python eine Aktion aus, um die LED ein- und auszuschalten

WOW! Vielen Dank für eure Antworten!!!
Ich werde mich mal daran versuchen :slight_smile:

Danke!

Hallo,

Also ich habe nun beide Varianten ausprobiert... ich muss wohl zu dumm fürs Programmieren sein.
Habe nun folgendes gemacht:
Apache Webserver aufgelegt auf dem Pi
In der index.jinja2 Datei: /home/pi/OctoPrint/venv/lib/python2.7/site-packages/octoprint/templates/index.jinja2

Einen Button erstellt:

<form>
<input type="button" value="Licht an" onclick="window.location.href='http://192.168.179.3/relais.php'" />
</form>

Inhalt der relais.php:


<?php
echo shell_exec("sudo python /home/pi/OctoPrint/script/led.py");
?>

Der Button führt dann ein Python Script aus:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
LED = 7
GPIO.setup(LED, GPIO.OUT)
GPIO.output(LED, GPIO.HIGH)
time.sleep(60)
GPIO.output(LED, GPIO.LOW)

Nicht schön aber es geht...
Ein Nachteil hat das ganze:
Wenn ich auf den Button klicke dann geht das Licht an
allerdings lädt er nach 60 Sekunden (oben im Script definiert) dann eine leere Seite.
Das kann ich nur verhindern in dem ich dann im Browser auf das X klicke um das Laden zu beenden.
Letztendlich dient das ganze dazu wenn ich von Unterwegs mich mit meinem VPN verbinde dann Licht einzuschalten damit ich per Webcam (im Octoprint) dann sehen kann wie weit der Druck ist.

Ja da werden einige nun "Oh Gott" rufen und die Hände über dem Kopf zusammenschlagen aber die komischen Wege funktionieren bei mir... die einfachen und sauberen Methoden hingegen nicht :*(

Edit:
Den Button habe ich nun in den Steuerbereich von Octoprint verfrachtet:
/home/pi/OctoPrint/venv/lib/python2.7/site-packages/octoprint/templates/tabs/control.jinja2

    <div>
        <button class="btn btn-block control-box" data-bind="enable: isOperational() && !isPrinting() && loginState.isUser(), click: function() { $root.sendCustomCommand({type:'command',command:'M18'}) }">{{ _('Motors off') }}</button>
        <button class="btn btn-block control-box" data-bind="enable: isOperational() && loginState.isUser(), click: function() { $root.sendCustomCommand({type:'command',command:'M106 S255'}) }">{{ _('Fan on') }}</button>
        <button class="btn btn-block control-box" data-bind="enable: isOperational() && loginState.isUser(), click: function() { $root.sendCustomCommand({type:'command',command:'M106 S0'}) }">{{ _('Fan off') }}</button>
<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Titel</title>
  </head>
  <body>
<form>
<input type="button" value="Licht an" onclick="window.location.href='http://192.168.179.3/relais.php'" />
</form> 
  </body>
</html>
    </div>
</div>

Sieht dann so aus...

lichtan

I didn't expect that you would edit the OctoPrint code directly. I thought you might be working on your own plugin perhaps. I'm pretty sure that foosel would not like this; the next update will just overwrite your work. Ich hatte nicht erwartet, dass Sie den OctoPrint-Code direkt bearbeiten würden. Ich dachte, Sie arbeiten vielleicht an Ihrem eigenen Plugin. Ich bin mir ziemlich sicher, dass Foosel das nicht gefallen würde. Das nächste Update überschreibt nur Ihre Arbeit.

If you would like to add a custom Control button, it can be done as Schnello was suggesting. In this way, your own button would appear in the interface and you wouldn't be directly editing the OctoPrint template's code. Wenn Sie eine benutzerdefinierte Steuerungsschaltfläche hinzufügen möchten, können Sie dies wie von Schnello vorgeschlagen tun. Auf diese Weise würde Ihre eigene Schaltfläche in der Benutzeroberfläche angezeigt und Sie würden den Code der OctoPrint-Vorlage nicht direkt bearbeiten.

Ich werde den Weg von Schnello nochmals probieren.

Schau dir mal System commands an, die sind genau für sowas da. Alternativ schau dir das Plugin hier an und bau dir dann eine Custom Control mit einem Befehl für deine LEDs.

1 Like

Jawoll das hat geklappt!!!!! und ganz ohne den Nachteil. :slight_smile:
Ich wusste schon warum ich vor einiger Zeit gespendet habe!
Octoprint ist einfach Hammer und dazu noch die Plugins. Und natürlich ihr die einem helfen!

Sieht nun so aus:
licht

1 Like

Okay.... zu früh gefreut... ich weis nicht warum aber wenn ich über das Plugin das Licht einschalten will dann sorgt das dafür das mein Drucker sich aufhängt wenn ich auf den Knopf drücke... nehme ich die alte Variante über den Server und das Script dann funktioniert das (hab das zur sicherheit noch drin gelassen, nun weis ich warum ^^ )#
Mal gehts mal schießt er den Drucker damit ab.

Hm wenn sich das so äußert dann ist die Funktion leider für mich nicht Praktikabel denn mein Druck der gerade lief durfte ich soeben entsorgen... (sehr ärgerlich :confused: )

Wer eine Idee dazu?

Hallo @Ramset,

was hast Du denn bei dem Licht Button als Script eingetragen?

Es hört sich so an, als würde Ihr Skript im Hauptthread von OctoPrint "blockieren", sodass die Aktivität angehalten wird, bis sie beendet ist. Sie können es stattdessen im Hintergrund ausführen.

Vor

<?php echo shell_exec("sudo python /home/pi/OctoPrint/script/led.py"); ?>

Nach dem

<?php echo shell_exec("sudo python /home/pi/OctoPrint/script/led.py &"); ?>

Das Script ist oben zu sehen. Als GCODE Kommando ist OCTO1 eingetragen

Das PHP kommt beim Plugin wie von Foosel vorgeschlagen nicht zu Anwendung.
Mit dem Plugin führe ich das Python Script direkt aus.

Ok Nachtrag:

Der Fehler tritt auf wenn ich den Knopf mehr als 1x Drücke. Das Relai klickt dann und bleibt dann für ca 5 Sekunden aktiv. Danach schaltet es wieder ab und Octoprint reagiert dann nicht mehr und ist nicht mehr erreichbar. Stürzt ab.Remote und SSH funktionieren.

Edit: Octoprint stürzt nur ab wenn ich den Knopf des Plugins verwende wo dann der GCODE gesendet wird.
Die PHP Version funktioniert auch bei 20x drücken. Habe es gerade getestet.

Hi.

Also ich würde es so lösen:

Dann das script anlegen. In meinem Fall ist "nas" der selbe User wo auch octoprint ausgeführt wird:
Ein Testscript welches einfach das Datum nach /tmp schreibt:
nas@service-uplink:~$ cat /home/nas/octo.sh

#!/bin/bash

date >> /tmp/testlog.txt


exit

Als nächstes:

Uns sobald ich auf den Button drücke wird das Script ausgeführt:

nas@service-uplink:~$ cat /tmp/testlog.txt
Sat Aug 17 18:48:41 CEST 2019
Sat Aug 17 18:53:00 CEST 2019
Sat Aug 17 18:53:10 CEST 2019
Sat Aug 17 18:53:11 CEST 2019
Sat Aug 17 18:53:50 CEST 2019
Sat Aug 17 18:53:51 CEST 2019
Sat Aug 17 18:53:51 CEST 2019
Sat Aug 17 18:53:51 CEST 2019
Sat Aug 17 18:53:51 CEST 2019
Sat Aug 17 18:53:52 CEST 2019
Sat Aug 17 18:53:52 CEST 2019
Sat Aug 17 18:53:53 CEST 2019
Sat Aug 17 18:53:53 CEST 2019
Sat Aug 17 18:53:53 CEST 2019
Sat Aug 17 18:53:53 CEST 2019
Sat Aug 17 18:53:54 CEST 2019
Sat Aug 17 18:58:35 CEST 2019
Sat Aug 17 18:58:36 CEST 2019
Sat Aug 17 18:58:36 CEST 2019
Sat Aug 17 18:58:36 CEST 2019
Sat Aug 17 18:58:36 CEST 2019
Sat Aug 17 18:58:36 CEST 2019
Sat Aug 17 18:58:36 CEST 2019
Sat Aug 17 18:58:37 CEST 2019
Sat Aug 17 18:58:37 CEST 2019

Grüße

PS: Lt Marlin Doku (ich verwende kein Marlin werden M118 Codes wie folgt ausgeführt

M118 A1 action:test