EVRIKA! Cum am conectat un PLC Siemens S7 la Home Assistant


Acesta a fost un mini-proiect în interiorul proiectului. Scopul: să leg sistemul meu de “smart home” Home Assistant de creierul de automatizare industrială, un PLC Siemens S7-1200. Voiam să pot citi senzori (temperaturi, stări) și, cel mai important, să pot da comenzi (să pornesc un motor) direct de pe telefon.

Am reușit, dar drumul a fost plin de erori “tăcute” și capcane de configurare. Iată ghidul complet și detaliat, inclusiv toate eșecurile.

Prerechizitele: Ce ai nevoie

  1. Home Assistant: O instanță funcțională (HA Container).
  2. HACS: Magazinul comunitar, necesar pentru a instala integrarea.
  3. PLC Siemens S7: Un S7-1200 (IP-ul 192.168.1.57).
  4. TIA Portal: Software-ul de la Siemens, pentru a face o setare de securitate critică.
  5. Răbdare.

Capcana #1 (Eșecul Tăcut): “Optimized block access”

Am început prin a instala integrarea “Siemens S7” (ID: s7plc) din HACS și a o reporni. Conform documentației, am adăugat un bloc de test s7: în configuration.yaml. Am repornit HA.

Rezultat: Nimic.

Nicio entitate nouă, nicio eroare în jurnal. Un eșec tăcut.

Soluția: Problema este în TIA Portal. Implicit, Siemens optimizează blocurile de date (DB-uri) pentru viteză internă, ceea ce le face ilizibile pentru orice sistem extern care folosește adresarea clasică (ex. “dă-mi byte-ul 4”).

Trebuie să dezactivezi manual optimizarea pentru fiecare DB pe care vrei să-l citești.

  1. În TIA Portal, găsește blocul de date (ex: DB21).

  2. Clic-dreapta pe el → Properties (Proprietăți).

  3. Mergi la tab-ul “Attributes” (Atribute).

  4. DEBIFEAZĂ căsuța “Optimized block access”.

  5. Compilează și încarcă (Download) modificările în PLC.


Capcana #2 (Eșecul Tăcut): “Permit PUT/GET”

Chiar și după ce am rezolvat optimizarea, tot nu mergea. Există o a doua setare de securitate, la nivel de hardware-ul PLC-ului.

Soluția:

  1. În TIA Portal, dă dublu-clic pe PLC în arborele de proiect.
  2. Mergi la Protection & SecurityConnection mechanisms.
  3. BIFEAZĂ căsuța: “Permit access with PUT/GET communication from remote partner”.
  4. Compilează și încarcă (Download) din nou în PLC.

Capcana #3 (Metoda Învechită): configuration.yaml este IGNORAT

Am setat corect PLC-ul. Am corectat IP-ul, rack-ul și slot-ul. Am definit entitățile în configuration.yaml așa cum am crezut că e corect:

# AȘA AM CREZUT CĂ E CORECT (ȘI ESTE GREȘIT!)
s7:
  - name: "PLC_Productie"
    ip_address: 192.168.1.57
    rack: 0
    slot: 1
    entities:
      - name: "Comanda Pompa"
        type: switch
        db_number: 21
        start_offset: 4
        bit_offset: 1
        data_type: BOOL

Am repornit. Tot nimic.

Soluția: După ore de depanare, am descărcat fișierul de diagnostic al integrării din Home Assistant (Setări → Dispozitive → Siemens S7 → Diagnostic) și am găsit indiciul:


"integration_manifest": {
    "config_flow": true
}

“config_flow”: true înseamnă că această versiune a integrării ignoră complet configuration.yaml pentru definirea entităților. Totul se face acum prin interfața grafică (UI).

Am șters tot blocul s7: din configuration.yaml și am repornit HA.

EVRIKA! Configurarea Corectă (prin UI)

Odată ce ai integrarea instalată (din HACS) și PLC-ul configurat (Capcana #1 și #2), procesul corect este acesta:

Mergi la Setări → Dispozitive și Servicii.

Apasă "+ Adaugă Integrare" și caută "Siemens S7".

Completează detaliile de conexiune:

    Name: S7 PLC (sau cum vrei tu)

    Host: 192.168.1.57

    Port: 102 (implicit)

    Rack: 0

    Slot: 1

Dacă conexiunea reușește, vei vedea un nou card "Siemens S7" cu "1 Dispozitiv, 0 Entități".

Pe acest card, apasă link-ul albastru "Adaugă Entitate" (Add Entity).

Capcana #4 (Formatarea): “Invalid address format”

Când am încercat să adaug switch.comanda_pompa, am încercat să scriu adresa ca DB21.DBX4.1. A eșuat.

Soluția: Integrarea folosește o sintaxă specifică și pretențioasă.

Iată “dicționarul de traducere” de la TIA Portal la Home Assistant:

1. Pentru un Switch (Comanda Pompa)

    TIA Portal: DB21, Offset: 4.1 (BOOL)

    HA UI:

        Type: Switch

        State address: DB21,X4.1

        Command address: DB21,X4.1

        Name: Comanda Pompa

2. Pentru un Binary Sensor (Stare Pompa)

    TIA Portal: DB21, Offset: 4.0 (BOOL)

    HA UI:

        Type: Binary Sensor

        Address: DB21,X4.0

        Name: Stare Pompa

3. Pentru un Sensor (Temperatura)

    TIA Portal: DB21, Offset: 0.0 (REAL)

    HA UI:

        Type: Sensor

        Address: DB21,D0 (sau DB21,R0)

        Data Type: REAL

        Name: Temperatura_centrala

După ce am adăugat aceste entități, ele au apărut instantaneu în lista de entități și am putut să le adaug în dashboard.

Unealtă Bonus: Scriptul de Test Python

În timpul depanării, nu știam dacă problema era HA sau PLC-ul. Am scris acest script Python (folosind biblioteca python-snap7) și l-am rulat direct de pe serverul meu Pi pentru a confirma că PLC-ul este configurat corect. A fost testul care a confirmat că problema era în Home Assistant.

Dacă ești blocat, instalează pip install python-snap7 și rulează asta: Python

import snap7
from snap7.util import get_bool, get_real, set_bool

PLC_IP = '192.168.1.57'
PLC_RACK = 0
PLC_SLOT = 1
DB_NUMBER = 21

client = snap7.client.Client()
try:
    print(f"--- Încercare conexiune la {PLC_IP} (Slot={PLC_SLOT}) ---")
    client.connect(PLC_IP, PLC_RACK, PLC_SLOT)
    print("[✓] SUCCES: Conexiune stabilită.")
    
    # Test citire
    print(f"--- Încercare citire 6 bytes din DB {DB_NUMBER} ---")
    data = client.db_read(DB_NUMBER, 0, 6) 
    print(f"[✓] SUCCES: Date citite: {data.hex()}")

    temp = get_real(data, 0)
    stare = get_bool(data, 4, 0)
    print(f"   Temperatura: {temp:.2f}")
    print(f"   Stare Pompa: {stare}")
    
except snap7.exceptions.Snap7Exception as e:
    print(f"\n[X] EROARE SNAP7: {e}")
    print("   Verifică: 1. 'Permit PUT/GET' 2. 'Optimized block access' 3. Slot-ul")
finally:
    if client.get_connected():
        client.disconnect()
    print("--- Test încheiat. ---")