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
- Home Assistant: O instanță funcțională (HA Container).
- HACS: Magazinul comunitar, necesar pentru a instala integrarea.
- PLC Siemens S7: Un S7-1200 (IP-ul
192.168.1.57). - TIA Portal: Software-ul de la Siemens, pentru a face o setare de securitate critică.
- 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.
-
În TIA Portal, găsește blocul de date (ex:
DB21). -
Clic-dreapta pe el → Properties (Proprietăți).
-
Mergi la tab-ul “Attributes” (Atribute).
-
DEBIFEAZĂ căsuța “Optimized block access”.
-
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:
- În TIA Portal, dă dublu-clic pe PLC în arborele de proiect.
- Mergi la Protection & Security → Connection mechanisms.
- BIFEAZĂ căsuța: “Permit access with PUT/GET communication from remote partner”.
- 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. ---")