Heeft er iemand ervaring met het veilig "Shutdown"en van een headless Raspberry Pi dmv een drukknop ?
Wat ik lees over het algemeen is dat het vie GPIO3 zou moeten kunnen (naar massa trekken) maar er staat ook bij als je I2S gebruikt (wat ik doe voor een HiFiBerry) die niet echt lekker werkt.
Met Google zie ik door de bomen het bos even niet meer. De RPi draait Volumio, dus lomp uitzetten zal ook wel vaak goed gaan omdat er niet zo vaak naar de SD geschreven word maar dan nog niet erg veilig.

Een Pi5 heeft een power switch, alle voorgangers niet.

Ik heb zelf een volumio doos op een Pi3 draaien, en daar heb ik zelf een microcontroller naast gezet die power management doet.

De 230V voeding schakel ik met een tuimelschakelaar die direct wordt overbrugd door een relais.

Bij uitschakelen van deze schakelaar (een 2e contact van die schakelaar gaat naar de uC) geeft de uC een pulsje op een gpio van die pi die een shutdown triggert.
Als de Pi doorgeeft dat hij is uitgeschakeld dan schakelt de uc (5 sec later) het relais uit en verbreekt daarmee de complete voeding.

Er bestaan twee plugins voor volumio die daar handig voor zijn GPIO buttons en GPIO Control.
Control geeft de status door aan de uC, en via buttons kun je een shutdown commando geven.

Dat zou toch met iedere GPIO moeten werken? Maak een scriptje of programma'tje dat in een lus die pin inleest en wanneer 'laag' het shutdown commando uitvoert. Wel wat aan ontdenderen doen in hardware of software. Dat scriptje of code staat vast ergens online..

@sine, wat een luxe shutdown :)

Op maandag 3 november 2025 10:10:33 schreef Sine:
Een Pi5 heeft een power switch, alle voorgangers niet.

Ik heb zelf een volumio doos op een Pi3 draaien, en daar heb ik zelf een microcontroller naast gezet die power management doet.

De 230V voeding schakel ik met een tuimelschakelaar die direct wordt overbrugd door een relais.

Bij uitschakelen van deze schakelaar (een 2e contact van die schakelaar gaat naar de uC) geeft de uC een pulsje op een gpio van die pi die een shutdown triggert.
Als de Pi doorgeeft dat hij is uitgeschakeld dan schakelt de uc (5 sec later) het relais uit en verbreekt daarmee de complete voeding.

Er bestaan twee plugins voor volumio die daar handig voor zijn GPIO buttons en GPIO Control.
Control geeft de status door aan de uC, en via buttons kun je een shutdown commando geven.

Bij mij draait het op een Pi 2B, op zich qua performance draait dat prima. Dank, ik ga eens naar die plugins kijken.

Op maandag 3 november 2025 10:15:22 schreef PE9SMS:
Dat zou toch met iedere GPIO moeten werken? Maak een scriptje of programma'tje dat in een lus die pin inleest en wanneer 'laag' het shutdown commando uitvoert. Wel wat aan ontdenderen doen in hardware of software. Dat scriptje of code staat vast ergens online..

@sine, wat een luxe shutdown :)

Dat werkt ook op bijna iedere GPIO, en de 2 plugins waar Sine naar refereert doen eigenlijk precies wat ik wil :)

Nouja, die doen bijna alles, je hebt nog iets nodig om weer te starten. En om eventueel de voeding compleet uit te schakelen. Een Pi in shutdown verbruikt nog altijd iets.

Op maandag 3 november 2025 10:10:33 schreef Sine:

De 230V voeding schakel ik met een tuimelschakelaar die direct wordt overbrugd door een relais.

Dat is dan een terugverende tuimelschakelaar ? Omdat je zegt "overbruggen" ?

Nee, een gewone bistabiele schakelaar die direct de inkomende voeding schakelt.
Maar als je die uitschakelt moet de Pi zijn shutdown nog doen. Dus dat relais overbrugd die schakelaar totdat het "ik ben uit" commando van de pi komt.

Een ander contact van diezelfde schakelaar heeft de uC laten weten dat hij 'uit' staat, en dan gaat er een verzoek naar de pi voor die shutdown.

Ik zal eens kijken of ik de code nog kan opsnorren, het is niets speciaals (en er valt vast nog wat aan te verbeteren) maar dan heb je een begin.

Bascom proggel, ik ben (absoluut) geen programmeur, dus dit is gegarandeerd clunky ... maar het werkt ;)
De "lamp" uitgang mag je letterlijk nemen, dat is een gloeilampje.


$regfile = "2313def.dat"
$crystal = 4000000

$hwstack = 8
$swstack = 4
$framesize = 4

'powersave, disable unnessesary hardware
Set Acsr.acd                 'Switch off  the power to the Analog Comparator


    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
    Enable Interrupts

    Config Portd = Input
    Config Portb = Output
    Portd = &B00000000                                         'Pull_down
    relay alias portb.0                                        'pwr latch relay
    pwr_switch alias pind.0
    pwr_off alias portb.1                                      'pwr off pin on raspi
    boot_ok alias pind.1                                       'boot ok pin on raspi

    Dim idle_timer as Word
    Dim pwr_lamp As word, pl_toggle as byte, fade_delay as byte , fade_time as Byte  , pwr_lamp_mode as Byte
    dim pwr_state as Byte

'                 ##### INIT #####
   relay = 1                                             'latch pwr
   pwr_lamp = 300                                        'start pwm level for rapid turn-on

Do                                                       'main loop

'                 ####  STATE 0  ####   Wait for boot_ok from raspberry ####
if pwr_state = 0 then
   if boot_ok = 0 then
      incr idle_timer
      if idle_timer =  65000 then                        'allowed boot time in ~msec
         pwr_state = 10  'failed to boot
      endif
      pwr_lamp_mode = 3 'heartbeat
   else               'boot ok from pi
      pwr_state = 1  'on
      idle_timer = 0
   endif
   ' boot timeout
endif

'                 ####  STATE 1  #### ON state  ####
if pwr_state = 1 then
   if pwr_switch = 1 then
      pwr_lamp_mode = 1 'on
   else
      pwr_lamp_mode = 3 'heartbeat
   endif

   if idle_timer = 10000 then    'grace period after boot_ok, allow shutdown after t
      if pwr_switch = 0 then     'sit in loop, wait for shutdown via power switch.
         pwr_state = 2
         idle_timer = 0
      endif
   else
      incr idle_timer
   endif

   if boot_ok = 0 then  'crash? reboot? soft shutdown? > redo power on
      pwr_state = 0
      idle_timer = 0
   endif
endif

'                 ####  STATE 2  ####  SHUTDOWN   ####
if pwr_state = 2 then
   pwr_lamp_mode = 2 'off
   pwr_state = 3
   pwr_off = 1       'pulse power-off pin to shutdown pi
   waitms 100
   pwr_off = 0
endif

'                 ####  STATE 3  ####  wait for power down  ###
if pwr_state = 3 then
   pwr_lamp_mode = 2       'off
   if boot_ok = 0 then     ' raspi reports being shutdown
      wait 10               ' give raspi time to properly end things
      relay = 0            ' shutoff power supply
      wait 2
      pwr_state = 10       ' error, shutdown failed (power switch on again?)
      idle_timer = 0
   else
      incr idle_timer  ' wait for raspi to do a clean shutdown
      if idle_timer =  20000 then  'allowed shutdown time in ~msec
         pwr_state = 10  'ERROR state > failed to shutdown within allowed time
      endif
   endif
endif

'                 ####  STATE 10  ####  ERROR  ####
if pwr_state = 10 then
   pwr_lamp_mode = 4   'fail
   if pwr_switch = 0 then relay = 0           'power down
endif

'                 #######   power LAMP control   ######
'on
if pwr_lamp_mode = 1 then pwr_lamp = 1023
'off (preheat)
if pwr_lamp_mode = 2 then pwr_lamp = 100

' heartbeat
if pwr_lamp_mode = 3 then
    if fade_delay = 0 then
      if pwr_lamp = 1023 then pl_toggle = 1
      if pwr_lamp = 200 then pl_toggle = 0    'min dim lvl
      if pl_toggle = 0 then incr pwr_lamp
      if pl_toggle = 1 then decr pwr_lamp
    end if
      incr fade_delay
      if fade_delay = 2 then fade_delay = 0     'sets fade speed
endif

' failure
if pwr_lamp_mode = 4 then
   if fade_delay = 0 then
      if pl_toggle = 0 then
         pwr_lamp = 1023
         pl_toggle = 1
      else
         pwr_lamp = 200
         pl_toggle = 0
      endif
   endif
   incr fade_delay
   if fade_delay = 125 then fade_delay = 0
endif

'every loop
  Compare1a = pwr_lamp 'write lamp pwm state to Portb.3
  Waitms 1 'loop delay
Loop

End

In mijn raspi-radio doe ik

 call('sudo shutdown -h now', shell=True)

Vanuit python, als allerlaatste in een scriptje dat in feite gewoon een i/o leest en zichzelf afsluit en daarna die call doet.

Er daarna de stekker uithalen is handmatig. En het filesystem is read-only. Gaat al een paar jaar goed.

Op maandag 3 november 2025 10:25:37 schreef Sine:
Nouja, die doen bijna alles, je hebt nog iets nodig om weer te starten. En om eventueel de voeding compleet uit te schakelen. Een Pi in shutdown verbruikt nog altijd iets.

Ik heb wel eens aan een pi z'n stroomverbruik zitten meten.

Wat je dan ziet is dat hij tijdens het opstarten steeds met stapjes meer gaat verbruiken naarmate er meer wordt aangezet.

Als je hem dan uitzet (halt), dan zie je het verbruik wel dalen, maar nog lang niet naar het niveau wat ie tijdens het booten de eerste paar stapjes heeft. Kortom, niet alles wat uit staat na een reset wordt ook weer uitgezet in de halt toestand.

Voor mij was het toen niet van belang, maar je zou er in kunnen duiken om het te fixen. Anderzijds, als je de spanning van de 230V voeding ook af wil hebben dan helpt het toch niet.

Op maandag 3 november 2025 12:42:07 schreef rew:
[...]

Voor mij was het toen niet van belang, maar je zou er in kunnen duiken om het te fixen. Anderzijds, als je de spanning van de 230V voeding ook af wil hebben dan helpt het toch niet.

Er blijft inderdaad wel een soort van "Standby voeding" aan. En het is een trafo'tje ivm lineaire voeding dus niet de zuinigste, maar dat neem ik op de koop toe.

@Sine , dank voor de code, dat gaat wel lukken.

Een mogelijkheid is ook om de Pi met één drukknopje uit te zetten. Langer ingedrukt houden om weer op te starten. Zie bijgaand schema. Naar dit (tamelijk oude) idee: https://forums.raspberrypi.com/viewtopic.php?t=48455&p=379280
In combinatie met een shutdown scriptje. Wordt hier in een RPi 4 gebruikt. Voor een idee, zie bijlage. Vergt wat aanpassing (omdat het script ook een OLED display gebruikt). Dat script kun je evt. starten als (systemd) service.
Success

Allemaal geprul met een shutdown scriptje is niet nodig.
De juiste GPIO moet je de in de devicetree aan het een power event knopen. Die triggert dan de shutdown.

Zoiets zou het moeten zijn: In /boot/config.txt dit toevoegen:

dtoverlay=gpio-shutdown,gpio_pull=up,gpio_pin=[GPIO Number]

-edit- De start schijnt altijd GPIO 3 te moeten zijn?

Je kan een Raspi vanaf een read-only root filesystem draaien. Dan heb je eigenlijk helemaal geen problemen meer met beschadigde SD kaartjes.

Ook buiten uitzetten is het natuurlijk zonde dat je SD-kaartje slijt door één of andere log file, timesync of apt-update die heel de dag op je kaartje zit te ploegen.

Ik ken Volumnio niet echt, mogelijk wil je wat data dan naar een tmpfs/ram fs schrijven (zoals /tmp ) óf heb je helemaal geen schrijfruimte nodig óf maak je een aparte netwerkschijf ofzo aan.

https://www.dzombak.com/blog/2024/03/running-a-raspberry-pi-with-a-rea…

Op maandag 3 november 2025 23:50:24 schreef henri62:
Allemaal geprul met een shutdown scriptje is niet nodig.
De juiste GPIO moet je de in de devicetree aan het een power event knopen. Die triggert dan de shutdown.

Zoiets zou het moeten zijn: In /boot/config.txt dit toevoegen:

dtoverlay=gpio-shutdown,gpio_pull=up,gpio_pin=[GPIO Number]

-edit- De start schijnt altijd GPIO 3 te moeten zijn?

Dat dacht ik ook begrepen te hebben en daar zit mijn I2C op (kant en klaar gekocht opzet printje).

Maar even zo een printje uit de kast getrokken en dan ga ik voor Sine's oplossing :

Op maandag 3 november 2025 23:50:24 schreef henri62:
Allemaal geprul met een shutdown scriptje is niet nodig.
De juiste GPIO moet je de in de devicetree aan het een power event knopen. Die triggert dan de shutdown.

Niet nodig voor volumio, daar zit dat standaard in.

Maar dat lost allemaal het probleem van echt uitschakelen niet op.