Files
allmende_ems/main.py
2025-04-17 16:11:28 +02:00

76 lines
2.3 KiB
Python

from pymodbus.client import ModbusTcpClient
import pandas as pd
import struct
import time
import csv
import os
# Excel-Datei mit den Input-Registerinformationen
excel_path = "data/ModBus TCPIP 1.17(1).xlsx"
xls = pd.ExcelFile(excel_path)
df_input_registers = xls.parse('04 Input Register')
# Relevante Spalten bereinigen
df_clean = df_input_registers[['MB Adresse', 'Variable', 'Beschreibung', 'Variabel Typ']].dropna()
df_clean['MB Adresse'] = df_clean['MB Adresse'].astype(int)
# Dictionary aus Excel erzeugen
registers = {
row['MB Adresse']: {
'desc': row['Beschreibung'],
'type': 'REAL' if row['Variabel Typ'] == 'REAL' else 'INT'
}
for _, row in df_clean.iterrows()
}
# CSV-Datei vorbereiten
csv_filename = "modbus_log.csv"
csv_exists = os.path.isfile(csv_filename)
# Verbindung zur Wärmepumpe
ip = '10.0.0.10'
port = 502
unit_id = 1
client = ModbusTcpClient(ip, port=port)
try:
if not client.connect():
print("Verbindung zur Wärmepumpe fehlgeschlagen.")
exit(1)
print("Verbindung zur Wärmepumpe erfolgreich.")
with open(csv_filename, mode='a', newline='') as file:
writer = csv.writer(file)
if not csv_exists:
header = ['Zeit'] + [f"{address} - {info['desc']}" for address, info in registers.items()]
writer.writerow(header)
while True:
print(f"\n--- Neue Abfrage --- {time.strftime('%Y-%m-%d %H:%M:%S')} ---")
row = [time.strftime('%Y-%m-%d %H:%M:%S')]
for address, info in registers.items():
reg_type = info['type']
result = client.read_input_registers(address, count=2 if reg_type == 'REAL' else 1)
if result.isError():
print(f"Fehler beim Lesen von Adresse {address}: {result}")
row.append('Fehler')
continue
if reg_type == 'REAL':
value = result.registers[0] / 10.0
else:
value = result.registers[0]
print(f"Adresse {address} - {info['desc']}: {value}")
row.append(value)
writer.writerow(row)
file.flush()
time.sleep(10)
except KeyboardInterrupt:
print("Beendet durch Benutzer (Ctrl+C).")
finally:
client.close()