Tipsy Tinker Geschrieben September 10, 2020 at 13:51 Geschrieben September 10, 2020 at 13:51 (bearbeitet) Hallo Zusammen 🙂 Besteht die Möglichkeit, den RED Brick aus einem python-Script heraus zu rebooten? Wenn ja, wie ? Besteht die Möglichkeit, den Alarm aus dem "Real-Time Clock Bricklet 2.0" zu benutzen, um einen reboot auszulösen? Und aller guten Dinge sind 3: Besteht die Möglichkeit, irgendwie zu erkennen, das sich der RED aufgehängt hat, um ihn dann zu rebooten? Klingt irgendwie widersprüchlich, aber ihr versteht schon...🤣 Vielleicht hat wer Hinweise, wie ich diese Fragestellungen lösen kann, oder hat Recherchehinweise die mich weiter bringen. Grüßle, Tipsy bearbeitet September 10, 2020 at 13:51 von Tipsy Tinker typo Zitieren
rtrbt Geschrieben September 10, 2020 at 14:15 Geschrieben September 10, 2020 at 14:15 Moin, Ein paar Ideen dazu: 11 minutes ago, Tipsy Tinker said: Besteht die Möglichkeit, den RED Brick aus einem python-Script heraus zu rebooten? Wenn ja, wie ? Du kannst mit subprocess.run den reboot-Befehl ausführen. Das darfst du als normaler User aber nicht, da müsstest du davor auf der RED-Brick-Konsole mit sudo su (root-passwort ist tf) EDITOR=nano visudo bzw einfach nur visudo wenn du mit vi umgehen kannst, dir die Erlaubnis geben, reboot ohne Passwort auszuführen, indem du die folgende Zeile einträgst: tf ALL=(ALL) NOPASSWD:/sbin/reboot Danach sollte folgendes klappen: import subprocess subprocess.run(["sudo", "reboot"]) 21 minutes ago, Tipsy Tinker said: Besteht die Möglichkeit, den Alarm aus dem "Real-Time Clock Bricklet 2.0" zu benutzen, um einen reboot auszulösen? Nur wenn du dann in einem Python-Script ö.Ä. auf den Alarm reagierst und den reboot so auslöst. 21 minutes ago, Tipsy Tinker said: Und aller guten Dinge sind 3: Besteht die Möglichkeit, irgendwie zu erkennen, das sich der RED aufgehängt hat, um ihn dann zu rebooten? Klingt irgendwie widersprüchlich, aber ihr versteht schon...🤣 Das geht mit etwas Bastelei. Du könntest zum Beispiel diesen Aufbau nachbauen und dann auf dem RED-Brick ein Script laufen lassen, der den Monoflop immer setzt. Zitieren
Tipsy Tinker Geschrieben September 11, 2020 at 14:26 Autor Geschrieben September 11, 2020 at 14:26 rtrbt, vielen Dank für deine Eingaben. Hat mir sehr weiter geholfen. import subprocess subprocess.run(["sudo", "reboot"]) Hat direkt funktioniert, wird allerdings langfristig ein Sicherheitsproblem darstellen, schätze ich. Werd mal noch ein bisschen damit herum experimentieren, wäre schon nice das auf einen Alarm zu legen. Hab allerdings noch nicht so ganz raus wie ich auf den Alarm aus dem Skript heraus reagieren kann. Den Monoflop find ich großartig :) So naheliegend und doch so fern. Langfristig wirds der wohl werden.. 🙂 Grüßle Tipsy Zitieren
Backdraft007 Geschrieben September 14, 2020 at 10:24 Geschrieben September 14, 2020 at 10:24 Am 11.9.2020 um 16:26 schrieb Tipsy Tinker: Werd mal noch ein bisschen damit herum experimentieren, wäre schon nice das auf einen Alarm zu legen. Hab allerdings noch nicht so ganz raus wie ich auf den Alarm aus dem Skript heraus reagieren kann. Hi, Du kannst einen CALLBACK_ALARM erstellen. Dieser wird immer aufgerufen, wenn ein eingestellter Alarm erreicht wird. In diesem Callback kannst Du, wie oben geschrieben, den Rebbot durchführen. Zitieren
Tipsy Tinker Geschrieben September 14, 2020 at 12:49 Autor Geschrieben September 14, 2020 at 12:49 Genau, aber ich raffe noch nicht, wie ich mit dem Script auf den Alarm reagiere. def main(): ipcon = IPConnection() rtc = BrickletRealTimeClockV2(UID_Clock, ipcon) led = BrickletRGBLEDV2(UID_Led, ipcon) ipcon.connect(HOST, PORT) led_green(led) time.sleep(1) led_red(led) rtc.set_alarm(-1, -1, -1, -1, -1, -1, 5) ### led_green(led) ipcon.disconnect() Vielleicht könnte mal jemand anhand des Codebeispiel zeigen, was an stelle ### stehen muss, damit die Led nach 5* Sekunden (oder eingestelltem Alarmwert) wieder auf grün schaltet. Ich hab da irgendwie grad nen Knoten. Die nächste Frage wäre, wie ich das parallel zum eigentlichen Programm bewerkstellige :) Vielen Dank. Grüßle Tipsy Zitieren
rtrbt Geschrieben September 14, 2020 at 12:59 Geschrieben September 14, 2020 at 12:59 Du musst dir eine Callback-Funktion anlegen, die ausgeführt werden soll (im Beispiel cb_alarm) und die dann registrieren. Eigentlich kannst du als zweiten Parameter für register_callback direkt cb_alarm mitgeben, aber damit du im Callback Zugriff auf die LED hast habe ich das mit dem Lambda reinimprovisiert. (Achtung ungetesteter Code!) Das time.sleep ist nur dafür da, damit dein Programm nicht beendet während du noch auf das Callback wartest. import time def cb_alarm(led, year, month, day, hour, minute, second, centisecond, weekday, timestamp): led_green(led) def main(): ipcon = IPConnection() rtc = BrickletRealTimeClockV2(UID_Clock, ipcon) led = BrickletRGBLEDV2(UID_Led, ipcon) ipcon.connect(HOST, PORT) led_green(led) time.sleep(1) led_red(led) rtc.register_callback(rtc.CALLBACK_ALARM, lambda *args: cb_alarm(led, *args)) rtc.set_alarm(-1, -1, -1, -1, -1, -1, 5) time.sleep(10) ipcon.disconnect() Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.