Jump to content

RED reboot, auch durch RTC Alarm


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

 

 

Edited by Tipsy Tinker
typo
Link to post
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 to post
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 to post
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 to post
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 to post
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 to post
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...