---
title: Trucs et Astuces RaspBerryPi
author: Frederic AOUSTIN
version: 1.O
---

![category](application)


# Trucs et Astuces RaspBerryPi

Dans le cadre de projet perso sur RaspBerryPi j'ai souvent eu recours à quelques trucs qui m'ont permis de simplifier les choses

On peut par exemple retrouver un projet sur un RaspBerryPi Zero avec PiHat Display qui joue le rôle de réveil [ici](./upload/timer.py)

## Configuration Wifi

On peut faire en sorte qu'une configuration wifi s'applique au démarrage

Pour cela 

- je génère sur la partition *bootfs* un fichier **wifi.txt** contenant deux lignes : le nom du réseau sur la première, le mot de passe sur la seconde.

```
TplinkNomResau
tonMotDePasse
```

- je copie le fichier **wifi-fix.sh** sur cette même partition *bootfs*

```bash
#!/bin/bash
# wifi-fix.sh - recree la connexion Wi-Fi a partir de wifi.txt (partition bootfs).
# wifi.txt : ligne 1 = nom du reseau (SSID), ligne 2 = mot de passe.
# Execute une seule fois au demarrage via cmdline.txt, puis s'efface avec wifi.txt.

B=/boot/firmware
[ -f "$B/cmdline.txt" ] || B=/boot

# securite : retire le declencheur tout de suite pour ne pas boucler
sed -i 's| systemd.run.*||g' "$B/cmdline.txt"

LOG="$B/wifi-fix-log.txt"
{
  echo "=== wifi-fix $(date) ==="
  if [ ! -f "$B/wifi.txt" ]; then
    echo "ERREUR : wifi.txt introuvable"
  else
    # lecture en retirant les fins de ligne Windows (\r)
    SSID=$(sed -n '1p' "$B/wifi.txt" | tr -d '\r')
    PASS=$(sed -n '2p' "$B/wifi.txt" | tr -d '\r')

    if [ -z "$SSID" ] || [ ${#PASS} -lt 8 ]; then
      echo "ERREUR : SSID vide ou mot de passe trop court (8 caracteres minimum)"
    else
      # cle WPA pre-calculee (evite tout probleme de caracteres speciaux)
      PSK=$(wpa_passphrase "$SSID" "$PASS" | sed -n 's/^\s*psk=\([0-9a-f]\{64\}\)$/\1/p')
      [ -n "$PSK" ] || PSK="$PASS"

      DIR=/etc/NetworkManager/system-connections
      mkdir -p "$DIR"
      F="$DIR/wifi-maison.nmconnection"
      cat > "$F" <<EOF
[connection]
id=wifi-maison
type=wifi
autoconnect=true
autoconnect-retries=0

[wifi]
mode=infrastructure
ssid=$SSID

[wifi-security]
key-mgmt=wpa-psk
psk=$PSK

[ipv4]
method=auto

[ipv6]
method=auto
EOF
      chown root:root "$F"
      chmod 600 "$F"
      echo "OK : connexion 'wifi-maison' creee pour le reseau '$SSID'"
    fi
  fi

  # efface le mot de passe de la carte SD
  rm -f "$B/wifi.txt"
  echo "wifi.txt efface"
} > "$LOG" 2>&1

rm -f "$0"
sync
exit 0
```

- Ouvre cmdline.txt. La ligne ajoutée la dernière fois a été retirée automatiquement. Ajoute **à la fin de la ligne unique**, avec un espace avant :

```bash
systemd.run=/boot/firmware/wifi-fix.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target
```

On peut trouver un fichier post démarrage nommé *wifi-fix-log.txt* qui indique l'état du wifi

## Gestion de la configuration et des perf

Même principe que pour le wifi, on va lancer au démarrage un programme qui va aller chercher de nombreuses information ce qui permet de faire un diagnostique sans forcement connecter un clavier/écran sur le RaspBerryPi.

le fichier **diag.sh**

```bash
#!/bin/bash
# diag.sh - execute une seule fois au demarrage (via cmdline.txt), sans ecran ni reseau.
# 1) retire son propre declencheur de cmdline.txt
# 2) applique des corrections Wi-Fi sans risque
# 3) installe un petit service qui ecrit un rapport dans la carte SD a chaque demarrage
# 4) redemarre normalement

B=/boot/firmware
[ -f "$B/cmdline.txt" ] || B=/boot

# --- 1. securite : on enleve tout de suite le declencheur pour ne pas boucler
sed -i 's| systemd.run.*||g' "$B/cmdline.txt"

LOG="$B/diag-etape1.txt"
{
  echo "=== Etape 1 : $(date) ==="

  # --- 2. corrections Wi-Fi
  echo "- arret du service timer-reveil"
  systemctl disable timer-reveil.service 2>&1

  echo "- deblocage Wi-Fi"
  rfkill unblock wifi 2>&1

  echo "- pays Wi-Fi = FR"
  raspi-config nonint do_wifi_country FR 2>&1

  echo "- economie d'energie Wi-Fi desactivee"
  mkdir -p /etc/NetworkManager/conf.d
  printf '[connection]\nwifi.powersave = 2\n' > /etc/NetworkManager/conf.d/wifi-powersave-off.conf

  # --- 3. rapport de diagnostic a chaque demarrage normal
  cat > /usr/local/bin/pi-diag.sh <<'EOS'
#!/bin/bash
B=/boot/firmware; [ -f "$B/cmdline.txt" ] || B=/boot
sleep 90   # laisse le temps au Wi-Fi de se connecter
{
  echo "=== Rapport $(date) ==="
  echo; echo "--- Modele";        tr -d '\0' < /proc/device-tree/model; echo
  echo; echo "--- OS";            grep PRETTY_NAME /etc/os-release
  echo; echo "--- Alimentation (0x0 = OK)"; vcgencmd get_throttled
  echo; echo "--- dmesg tension / wifi"; dmesg | grep -i -E "voltage|brcmf|wlan" | tail -30
  echo; echo "--- rfkill";        rfkill list
  echo; echo "--- Heure";         timedatectl
  echo; echo "--- Interfaces";    ip -brief addr
  echo; echo "--- NetworkManager"; nmcli general status; nmcli device status
  echo; echo "--- Connexions enregistrees"; nmcli -f NAME,TYPE,AUTOCONNECT connection show
  echo; echo "--- Reseaux Wi-Fi visibles"; nmcli -f SSID,SIGNAL,SECURITY device wifi list --rescan yes
  echo; echo "--- Power save"; iw wlan0 get power_save
  echo; echo "--- Services en echec"; systemctl --failed --no-pager
  echo; echo "--- Crontab root"; crontab -l 2>&1
  echo; echo "--- Journal NetworkManager (ce demarrage)"
  journalctl -u NetworkManager -b --no-pager | tail -60
  echo; echo "--- Journal NetworkManager (demarrage precedent)"
  journalctl -u NetworkManager -b -1 --no-pager 2>&1 | tail -40
} > "$B/diag.txt" 2>&1
sync
EOS
  chmod +x /usr/local/bin/pi-diag.sh

  cat > /etc/systemd/system/pi-diag.service <<'EOS'
[Unit]
Description=Rapport de diagnostic sur la carte SD
After=multi-user.target NetworkManager.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/pi-diag.sh

[Install]
WantedBy=multi-user.target
EOS
  systemctl enable pi-diag.service 2>&1

  echo "=== Etape 1 terminee ==="
} > "$LOG" 2>&1

sync
exit 0
```

Ouvre **cmdline.txt** avec le Bloc-notes. Il ne contient qu’une seule ligne. Ajoute **à la fin de cette ligne, sans retour à la ligne**, avec un espace avant :

```bash
systemd.run=/boot/firmware/diag.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target
```

## Eteindre la led d'activité

Sur le RaspBerryPi Zero on a une led qui signale l'activité.

C’est la LED d’activité du Pi, appelée « ACT ». Le Pi Zero 2 W n’a pas de LED d’alimentation : c’est sa seule LED. Elle est verte en principe, mais elle paraît souvent jaune.

Ce qu’elle signifie

- Allumée fixe : le Pi est démarré et fonctionne normalement. C’est le cas chez toi, donc tout va bien.
- Elle clignote ou vacille : le Pi lit ou écrit sur la carte SD.
- Éteinte : le Pi est arrêté. Après un sudo shutdown now, attends qu’elle s’éteigne avant de débrancher, sinon tu risques d’abîmer la carte SD.
- Plusieurs clignotements répétés au démarrage : c’est un code d’erreur, par exemple une carte SD illisible.

Pour l’éteindre il suffit de modifier le fichier *config.txt*, soit depuis le Pi, soit depuis ton PC sur la partition bootfs de la carte SD.

Depuis le Pi :

``bash
vi /boot/firmware/config.txt
```

Ajoute ces deux lignes tout à la fin du fichier :

```
dtparam=act_led_trigger=none
dtparam=act_led_activelow=on
```
