SMS w Home Assistant z własnego numeru: alarmy i komendy

Sprawdzone z dokumentacją:

Home Assistant wysyła SMS przez rest_command: w configuration.yaml definiujesz POST na https://smsportal.app/api/v1/gateway/send-sms z nagłówkiem x-api-key, a automatyzacja wywołuje akcję rest_command.send_sms. SMS wychodzi z Twojego telefonu z Androidem. SMS-y przychodzące odbiera automatyzacja z wyzwalaczem webhook, do której smsportal wysyła zdarzenie MESSAGE_RECEIVED.

Czego potrzebujesz

  • Home Assistant 2024.10 lub nowszy (składnia triggers: i action:; starsze wersje używają platform: i service:).
  • Dostęp do plików configuration.yaml i secrets.yaml (np. dodatek File editor albo Studio Code Server).
  • Konto smsportal z podłączonym telefonem z Androidem i kartą SIM oraz klucz API (Klucze API → Wygeneruj klucz API).
  • Do odbioru SMS-ów: Home Assistant dostępny z internetu po HTTPS (Home Assistant Cloud od Nabu Casa albo reverse proxy).

Jak wysłać SMS z Home Assistant

  1. Dodaj klucz i polecenie REST

    Klucz API wpisz do secrets.yaml, a w configuration.yaml dodaj rest_command o nazwie send_sms. Filtr to_json zamienia listę numerów i treść na poprawny JSON, więc cudzysłów albo polski znak w wiadomości nie zepsuje żądania. Nagłówek to x-api-key, nie Authorization.

    secrets.yaml i configuration.yaml
    # secrets.yaml
    smsportal_api_key: "TWOJ_KLUCZ_API"
    
    # configuration.yaml
    rest_command:
      send_sms:
        url: "https://smsportal.app/api/v1/gateway/send-sms"
        method: post
        headers:
          x-api-key: !secret smsportal_api_key
        content_type: "application/json"
        payload: '{"recipients": {{ recipients | to_json }}, "message": {{ message | to_json }}}'
        timeout: 15
  2. Sprawdź konfigurację i zrestartuj

    W Developer tools otwórz zakładkę YAML, kliknij Check configuration, a potem zrestartuj Home Assistant. Po restarcie pojawi się akcja rest_command.send_sms.

  3. Wyślij SMS testowy

    W Developer tools → Actions przełącz na tryb YAML, wklej poniższy kod i kliknij Perform action. Odpowiedź ze status: 200 oznacza, że wiadomość trafiła do kolejki telefonu. Numer podawaj z kierunkowym kraju.

    Akcja testowa
    action: rest_command.send_sms
    data:
      recipients: ["+48600100200"]
      message: "Test z Home Assistant"
  4. Podepnij SMS pod automatyzację

    Przykład wysyła SMS, gdy czujnik drzwi zmieni stan na otwarte przy uzbrojonym alarmie. response_variable zapisuje odpowiedź API: przy statusie 400 i wyżej (zły klucz, brak telefonu, wyczerpany limit) dostaniesz powiadomienie w Home Assistant. Podmień nazwy encji na swoje.

    Automatyzacja: alarm i drzwi
    # automations.yaml (w edytorze: menu ⋮ → Edit in YAML, bez myślnika na początku)
    - id: "sms_drzwi_alarm"
      alias: "SMS: drzwi otwarte przy uzbrojonym alarmie"
      triggers:
        - trigger: state
          entity_id: binary_sensor.drzwi_wejsciowe
          to: "on"
      conditions:
        - condition: state
          entity_id: alarm_control_panel.dom
          state: armed_away
      actions:
        - action: rest_command.send_sms
          data:
            recipients: ["+48600100200"]
            message: "Alarm: otwarte drzwi wejściowe o {{ now().strftime('%H:%M') }}"
          response_variable: sms
        - if:
            - condition: template
              value_template: "{{ sms['status'] >= 400 }}"
          then:
            - action: persistent_notification.create
              data:
                title: "SMS nie wyszedł"
                message: "smsportal odpowiedział {{ sms['status'] }}: {{ sms['content'] }}"

Jak sterować domem SMS-em (komenda STATUS)

Gdy telefon odbierze SMS, smsportal wysyła JSON na adres webhooka Home Assistant. W automatyzacji masz go w trigger.json: trigger.json.sender to numer nadawcy, trigger.json.message to treść. Home Assistant nie umie sprawdzić podpisu X-Signature, więc hasłem jest sam webhook_id: użyj długiego losowego ciągu (np. openssl rand -hex 16) i nikomu go nie pokazuj.

  1. Zapewnij publiczny adres HTTPS. Z Home Assistant Cloud włączasz webhook automatyzacji w ustawieniach chmury i dostajesz adres w domenie Nabu Casa (wtedy local_only może zostać true). Przy własnym reverse proxy ustaw local_only: false.
  2. Dodaj automatyzację z kodu poniżej. Zmień webhook_id na własny losowy ciąg i wpisz na liście numery, którym wolno wydawać komendy.
  3. W panelu smsportal otwórz Webhooki → Utwórz webhook, wklej adres https://twoj-dom.example.com/api/webhook/<webhook_id>, wpisz sekret podpisu (co najmniej 20 znaków; Home Assistant go nie sprawdza, ale pole jest wymagane) i zaznacz MESSAGE_RECEIVED.
  4. Wyślij słowo status z numeru z listy na numer telefonu-bramki. Odpowiedź przyjdzie po kilku sekundach.
Automatyzacja: odpowiedź na SMS „status”
- id: "sms_komenda_status"
  alias: "SMS: komenda STATUS"
  mode: queued
  triggers:
    - trigger: webhook
      webhook_id: "sms-c4f1e9a27b8d4e3f96a05b1d2e7c8f40"
      allowed_methods: [POST]
      local_only: false
  conditions:
    - condition: template
      value_template: >-
        {{ trigger.json.webhookEvent == 'MESSAGE_RECEIVED'
           and trigger.json.sender in ['+48600100200', '+48600100201']
           and (trigger.json.message | trim | lower) == 'status' }}
  actions:
    - action: rest_command.send_sms
      data:
        recipients: ["{{ trigger.json.sender }}"]
        message: >-
          Alarm: {{ states('alarm_control_panel.dom') }},
          drzwi: {{ states('binary_sensor.drzwi_wejsciowe') }},
          salon: {{ states('sensor.salon_temperatura') }} C

Gotowe scenariusze

  • Alarm i czujnik drzwi

    Czujnik otwarcia albo ruchu przy uzbrojonym alarmie wysyła SMS na Twój numer i numer domownika (recipients przyjmuje listę). SMS dotrze nawet wtedy, gdy telefon nie ma internetu, a powiadomienia push z aplikacji nie przyjdą.

  • Komenda SMS do domu

    SMS status z numeru z listy zwraca stan alarmu, drzwi i temperaturę. Numer nadawcy da się podrobić, więc SMS-em tylko odczytuj stan albo włączaj rzeczy bezpieczne, jak ogrzewanie. Nie rozbrajaj alarmu i nie otwieraj bramy SMS-em.

  • Zanik prądu

    Gdy integracja UPS zgłosi pracę na baterii, automatyzacja wysyła SMS. Żądanie idzie z Home Assistant przez internet do smsportal, więc serwer Home Assistant i router muszą być na UPS. Telefon-bramka działa na baterii i danych komórkowych, więc nie potrzebuje domowego Wi-Fi.

Błędy i rozwiązania

Brak akcji rest_command.send_sms
Przyczyna: Home Assistant nie wczytał nowej sekcji rest_command albo YAML ma błąd wcięcia.
Co zrobić: Uruchom Check configuration w Developer tools → YAML, popraw błąd i zrestartuj Home Assistant.
W logu Error. Url: ... Status code 401
Przyczyna: Brak nagłówka x-api-key, literówka w secrets.yaml albo nagłówek Authorization zamiast x-api-key.
Co zrobić: Sprawdź nazwę klucza w secrets.yaml i w !secret. Wygeneruj nowy klucz w panelu, jeśli stary został usunięty.
Status 400
Przyczyna: Niepoprawny JSON (treść wklejona bez to_json), brak włączonego telefonu albo niezweryfikowany e-mail konta.
Co zrobić: Użyj payload z przepisu, z filtrem to_json. W panelu sprawdź, czy telefon jest włączony i czy e-mail jest potwierdzony.
Webhook nie uruchamia automatyzacji
Przyczyna: Adres z localhost albo z sieci domowej, local_only: true przy reverse proxy albo inny webhook_id w panelu niż w automatyzacji.
Co zrobić: Wklej publiczny adres HTTPS z /api/webhook/<webhook_id>. Przy reverse proxy ustaw local_only: false. Ślady automatyzacji (Traces) pokażą, czy żądanie dotarło.
Komenda przychodzi, ale nic się nie dzieje
Przyczyna: Numer na liście jest zapisany inaczej niż sender (np. bez +48) albo treść ma dodatkowe słowa.
Co zrobić: Zapisuj numery w formacie +48600100200. Sprawdź w Traces automatyzacji, co przyszło w trigger.json.

Najczęstsze pytania

Czy smsportal ma integrację w Home Assistant?

Nie ma osobnej integracji. Wbudowane `rest_command` do wysyłki i wyzwalacz `webhook` do odbioru wystarczą i nie wymagają instalowania niczego z HACS.

Czy SMS przyjdzie, gdy w domu nie ma internetu?

Nie, jeśli nie ma go Home Assistant. Żądanie wysyłki idzie z Home Assistant przez internet do smsportal, a dopiero stamtąd do telefonu. Router i serwer na UPS z zapasowym łączem komórkowym rozwiązują ten problem.

Jak szybko dochodzi SMS?

Zwykle w kilka sekund. Telefon wysyła wiadomości po kolei, domyślnie z 5-sekundową przerwą. Jeśli jest offline, SMS czeka w kolejce do 72 godzin, a potem wygasa. Stan telefonu sprawdzisz w panelu.

Czy mogę sprawdzić podpis webhooka w Home Assistant?

Nie. Wyzwalacz `webhook` nie liczy HMAC, więc `X-Signature` zostaje niesprawdzony. Chroni Cię długi, losowy `webhook_id` i lista dozwolonych numerów w warunku. Jeśli potrzebujesz weryfikacji podpisu, odbierz webhook w n8n i dopiero stamtąd wywołaj Home Assistant.

Czy to zastąpi powiadomienia push z aplikacji?

Uzupełni je. SMS dochodzi bez internetu w telefonie odbiorcy i bez aplikacji, więc nadaje się do alarmów. Codzienne informacje zostaw w powiadomieniach push.

Źródła

  1. Home Assistant: RESTful Command
  2. Home Assistant: wyzwalacze automatyzacji (Webhook trigger)
  3. Home Assistant: przechowywanie sekretów
  4. smsportal: dokumentacja API

Więcej w poradnikach

Wyślij pierwszego SMS-a jeszcze dziś

Załóż darmowe konto, podłącz telefon i sprawdź, jak klienci reagują na wiadomości z Twojego numeru.