Aller au contenu

SMS via SIM800 sur Raspberry Pi

Vue d'ensemble

Le Raspberry Pi 3 est équipé d'un module GSM permettant l'envoi et la réception de SMS pour les alertes domotiques, via le daemon Gammu-SMSD.

Statut : ✅ Opérationnel (migration boot NFS 2026-03-07)

Matériel

Raspberry Pi

  • Modèle : Raspberry Pi 3 Model B
  • IP : 192.168.1.26 (DHCP réservé)
  • OS : Raspberry Pi OS Bookworm (boot NFS)

Module SIM800

  • Type : SIM800L ou SIM800C
  • Interface : UART (GPIO)
  • Alimentation : 3.7-4.2V (attention au 5V)
  • Carte SIM : Mini SIM ou adaptateur

Câblage

SIM800 Raspberry Pi
VCC Alimentation externe 4V
GND GND (Pin 6)
TXD RXD (GPIO15, Pin 10)
RXD TXD (GPIO14, Pin 8)

Important : Le SIM800 nécessite une alimentation externe de 4V avec courant suffisant (2A). Ne pas alimenter directement depuis les GPIO 5V du Pi.

Configuration

Activer le port série

sudo raspi-config
# Interface Options → Serial Port
# Login shell over serial: No
# Serial port hardware enabled: Yes

Installation des dépendances

sudo apt update
sudo apt install python3-serial minicom

Test avec minicom

minicom -b 9600 -D /dev/serial0
# Taper: AT (réponse attendue: OK)
# Taper: AT+CSQ (signal quality)

Script Python d'envoi SMS

#!/usr/bin/env python3
"""
Envoi de SMS via SIM800
Usage: python3 send_sms.py "+33612345678" "Message"
"""

import serial
import time
import sys

def send_sms(phone_number, message, port='/dev/serial0', baudrate=9600):
    """Envoie un SMS via le module SIM800"""

    try:
        ser = serial.Serial(port, baudrate, timeout=1)
        time.sleep(1)

        # Mode texte
        ser.write(b'AT+CMGF=1\r')
        time.sleep(0.5)

        # Numéro destinataire
        cmd = f'AT+CMGS="{phone_number}"\r'
        ser.write(cmd.encode())
        time.sleep(0.5)

        # Message + Ctrl+Z
        ser.write(message.encode() + b'\x1A')
        time.sleep(3)

        response = ser.read(100)
        ser.close()

        return b'OK' in response

    except Exception as e:
        print(f"Erreur: {e}")
        return False

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("Usage: send_sms.py <numéro> <message>")
        sys.exit(1)

    success = send_sms(sys.argv[1], sys.argv[2])
    sys.exit(0 if success else 1)

Intégration Home Assistant

Configuration via shell_command

# configuration.yaml
shell_command:
  send_sms: 'ssh pi@<IP_RPI> "python3 /home/pi/scripts/send_sms.py {{ phone }} \"{{ message }}\""'

Automatisation d'alerte

automation:
  - alias: "Alerte intrusion SMS"
    trigger:
      - platform: state
        entity_id: binary_sensor.intrusion
        to: 'on'
    action:
      - service: shell_command.send_sms
        data:
          phone: "+33612345678"
          message: "ALERTE: Intrusion détectée!"

Commandes AT utiles

Commande Description
AT Test de connexion
AT+CSQ Qualité du signal (0-31)
AT+CREG? État enregistrement réseau
AT+CMGF=1 Mode texte SMS
AT+CMGS="..." Envoi SMS
AT+CMGR=1 Lire SMS slot 1
AT+CMGD=1 Supprimer SMS slot 1

Dépannage

Pas de réponse aux commandes AT

  1. Vérifier le câblage
  2. Vérifier l'alimentation (LED clignotante)
  3. Tester différentes vitesses (9600, 115200)

Signal faible

  1. Vérifier l'antenne
  2. Positionner près d'une fenêtre
  3. Vérifier la carte SIM (activation, crédit)

SMS non envoyés

  1. Vérifier le code PIN (AT+CPIN?)
  2. Vérifier l'enregistrement réseau (AT+CREG?)
  3. Vérifier le format du numéro (+33...)

Statut

Statut : ✅ Opérationnel


Configuration Actuelle

Matériel en place

  • Modem : Module GSM avec puce CH340 USB-série
  • Interface : USB (ID 1a86:7523)
  • Port USB physique : 1-1.3
  • Symlink : /dev/sms
  • Numéro : 0685397996

Service Gammu-SMSD

# /etc/systemd/system/gammu-smsd.service
[Unit]
Description=Gammu SMS Daemon
After=network.target dev-sms.device
Wants=dev-sms.device
StartLimitIntervalSec=300
StartLimitBurst=5

[Service]
Type=simple
ExecStartPre=/bin/sleep 3
ExecStart=/usr/bin/gammu-smsd --config /etc/gammu-smsdrc
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

Configuration Gammu (/etc/gammu-smsdrc)

[gammu]
port = /dev/sms
connection = at
synchronizetime = yes

[smsd]
PhoneId = 0685397996
Service = files
RunOnReceive = /var/www/html/sms/receive.sh
RunOnFailure = /var/www/html/sms/error.sh

# Répertoires spool
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/

Scripts

Réception SMS (/var/www/html/sms/receive.sh) : - Envoie webhook vers Home Assistant - Notification Telegram

Envoi SMS (/var/www/html/sms/send.php) : - API PHP : http://192.168.1.26/sms/send.php?numero=XXX&texte=YYY

Commandes utiles

# Statut service
systemctl status gammu-smsd

# Envoi SMS manuel
gammu-smsd-inject TEXT 0612345678 -text "Test SMS"

# Vérifier le modem
gammu --identify

# Logs
journalctl -u gammu-smsd -f

Intégration Home Assistant

Via rest_command ou shell_command :

rest_command:
  send_sms:
    url: "http://192.168.1.26/sms/send.php"
    method: GET
    params:
      numero: "{{ numero }}"
      texte: "{{ message }}"