Jump to content

Recommended Posts

Posted (edited)

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
Posted

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.

Posted

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

Posted
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.

Posted

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

Posted

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

 

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...