Jump to content

RED reboot, auch durch RTC Alarm


Tipsy Tinker

Recommended Posts

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 von Tipsy Tinker
typo
Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
Share on other sites

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()

 

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...