Seite 1 von 1

RPi stromlos schalten

Verfasst: 7. Mär 2022 20:26
von kaloschke
Hallo,
da ich hier schon oft Hilfe gefunden habe, möchte ich auch mal etwas helfen. Vielleicht kann es ja jemand gebrauchen.
Für ein Projekt benötige ich einen Raspberry Zero, der per Tastendruck ein- und ausgeschaltet werden soll. Beim Ausschalten soll er dabei zunächst heruntergefahren werden, bevor der Strom abgeschaltet wird. Dazu gibt es Schaltungen oder auch Hats z.B. von Pimoroni. Zum einen benutze ich schon aber schon ein Hat, zum anderen benötige ich fast alle restlichen GPIOs.
Langer Rede kurzer Sinn: Meine Schaltung kommt mit einem GPIO aus, benötigt lediglich zwei Kleinrelais - und eine über Openhab (o.ä.) schaltbare Steckdose.
RPi.png
In der Steckdose (bei mir eine mit Tasmota) steckt das Steckernetzteil des RPi, dessen Zuleitung aufgetrennt wurde, um an die Stromversorgung zu gelangen.
Funktionsweise:
Nach Betätigung des Tasters T1 fließt der Strom kurzzeitig über Relais R2, welches den Kontakt K2 schließt. Dies bleibt jedoch ohne Wirkung, da der RPi gerade erst hoch fährt. Den Strom dazu erhält er zunächst über die Diode D1, später über den Selbsthaltekontakt K1 des Relais R1, welches ebenfalls über den Tastendruck gestartet wurde.
Bei erneutem Tastendruck schließt wieder R2 mit K2. Diesmal führt das Setzen des GPIO-Eingangs zum Auslösen zweier Ereignisse. Zum einen wird der RPi herunter gefahren. Vorher jedoch setzt er eine Variable in Openhab, deren zugehörige Regel 10 Sekunden später die Schaltsteckdose ausschaltet (RPI wird stromlos und Relais R1 fällt ab) und kurz danach wieder einschaltet.
Das C-Script

Code: Alles auswählen

#include <bcm2835.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <time.h> 
#include <sys/time.h>
#define DEBUG

// benutzer GPIO
#define PIN_PRG_POWER RPI_V2_GPIO_P1_05   //GPIO 03 

int pbdown     = 0;
struct timeval tbegin, tend;

int main(int argc, char **argv)
{
   if (!bcm2835_init())	return 1;
    // Pin als Eingang setzen , mit Pull-Up
    bcm2835_gpio_fsel(PIN_PRG_POWER, BCM2835_GPIO_FSEL_INPT);   bcm2835_gpio_set_pud(PIN_PRG_POWER,BCM2835_GPIO_PUD_UP);

   // Endlosschleife
   while (1)
   { 
	  // Zustand am GPIO einlesen 
      uint8_t val_prg_power   = bcm2835_gpio_lev(PIN_PRG_POWER);
      // Länge des Tastendruck messen
      if ((val_prg_power == 0) && (pbdown == 0)) {  
         pbdown = 1;                              // Taste gedrückt ...
         gettimeofday(&tbegin, 0);         
      }
      if ((val_prg_power == 1) && (pbdown == 1)) {
         pbdown = 0;                              // ... und wieder losgelassen
         gettimeofday(&tend, 0);         
         long seconds = tend.tv_sec - tbegin.tv_sec;
         long microseconds = tend.tv_usec - tbegin.tv_usec;
         double elapsed = seconds + microseconds*1e-6;
         if (elapsed > 2.0) {     // bei langem Tastendruck wird lediglich ein Reboot durchgeführt
            system("sudo reboot");
         } else {
            system("curl -s 'http://192.168.2.222:8080/basicui/CMD?iRadio=OFF'");
            system("sudo poweroff");
         }
      }
      delay(50);
   }
   return 0;
}
wird mit

Code: Alles auswählen

sudo gcc rpi.c -o gpiod -lbcm2835
übersetzt und beim muss beim Einschalten automatisch gestartet werden.
Wie man sieht, wird bei mir der GPIO 3 benutzt und bei einem langen Tastendruck wird ein Reboot durchgeführt, anstatt das Ausschalten zu veranlassen. Meine Openhabvariable heisst "iRadio" und die zugehörige Regel lautet:

Code: Alles auswählen

rule "iRadio ausschalten"
when 
    Item iRadio received command OFF
then
    Thread::sleep(10000)
    Steckdose_2.sendCommand(OFF)
    Thread::sleep(2000)
    Steckdose_2.sendCommand(ON)
    iRadio.postUpdate(ON);
end 
Klappt bei mir bestens ...

Re: RPi stromlos schalten

Verfasst: 8. Mär 2022 06:21
von udo1toni
Ja, kann man so machen. Die Rule wäre mit Timer besser:

Code: Alles auswählen

var Timer tiRadio = null

rule "iRadio ausschalten"
when 
    Item iRadio received command OFF
then
    if(tiRadio !== null)
        return;
    tiRadio = createTimer(now.plusSeconds(10), [|
        if(Steckdose_2.state == ON) {
            Steckdose_2.sendCommand(OFF)
            tiRadio.reschedule(now.plusSeconds(2))
        } else {
            Steckdose_2.sendCommand(ON)
            tiRadio = null
        }
    ])
end 
Ich verwende hier bewusst nur einen Timer, der zweimal durchlaufen wird. Abhängig vom Zustand der Steckdose geht es darum, die Steckdose auszuschalten oder einzuschalten. Wird die Steckdose ausgeschaltet, so wird der Timer erneut eingeplant.

Es geht Dir vermutlich um einen dedizierten Taster, dort wo das Modul sitzt. Du könntest in dem Zusammenhang sogar komplett ohne GPIO auskommen und Dir noch die Relais und die Schaltung sparen. Nebenbei wird dann auch das Netzteil nur eingeschaltet, wenn es auch gebraucht wird.
Da Du ohnehin eine schaltbare Steckdose (oder Ähnliches) brauchst, bietet sich ein Sonoff Basic an. Dieser schaltet die Stromversorgung des Pi direkt.
Der Sonoff Basic wird auf Tasmota geflasht. Die Taste S0 wird nach außen geführt und dient zum Ein- und Ausschalten. der Sonoff wird so parametriert, dass die Taste unabhängig vom Relais genutzt werden kann. In openHAB wird ein Item für die Taste und ein Item für das Relais angelegt. Außerdem wird ein Item angegelgt, über das der Pi ferngesteuert wird.
Wenn Die Taste gedrückt wird, triggert eine Rule in openHAB. Die Rule prüft, ob die Stromversorgung gerade eingeschaltet ist. Ist das der Fall, so sendet openHAB den Befehl zum Shutdown an den Pi. Anschließend kann openHAB entweder stur nach x Sekunden die Steckdose abschalten oder alternativ auch auf anderem Weg prüfen, ob der Pi noch per Netzwerk erreichbar ist. Ist das nicht der Fall, so schaltet die Steckdose ab.
Umgekehrt schaltet openHAB die Steckdose ein.

Je nachdem, wie man den Shutdown Befehl übermittelt, kommt man sogar ohne zusätzliche Software auf dem Pi aus (ssh reicht), insbesondere braucht es aber keine zusätzlichen Pins :)

Re: RPi stromlos schalten

Verfasst: 8. Mär 2022 18:06
von kaloschke
Ja, es geht immer noch besser. Aber ich war froh, dass mir überhaupt etwas eingefallen ist.
Aber der Taster sollte eben auch im Gerät sein. Jetzt ist es da, jetzt bleibt es :D

Re: RPi stromlos schalten

Verfasst: 8. Mär 2022 18:17
von kaloschke
Also die Regel habe ich schon ersetzt ;)
Und so ein Sonoff liegt auch noch rum ...

Re: RPi stromlos schalten

Verfasst: 8. Mär 2022 19:03
von udo1toni
Vielleicht baust Du ja noch ein zweites "Radio" :)