Files
aurora_pv_tcp_integration/local_test.py
T
2026-07-12 10:54:42 +02:00

403 lines
18 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from aurorapy.client import AuroraTCPClient, AuroraError
import json
from datetime import datetime, timedelta
import time
# Konfiguration
TARGET_IP = "192.168.250.245"
TARGET_PORT = 5000
INVERTER_ADDRESS = 2 # Slave-ID deines Wechselrichters
def measure_with_retry(client, code, retries=2):
for attempt in range(retries + 1):
try:
value = client.measure(code)
# Filtere nur extrem kleine oder extrem große Werte, die offensichtlich unplausibel sind
if (abs(value) < 1e-30 and value != 0.0) or abs(value) > 1e10:
return "Wert unplausibel"
return value
except AuroraError as e:
if "Reading Timeout" in str(e) and attempt < retries:
time.sleep(1) # Warte 1 Sekunde vor dem nächsten Versuch
continue
return f"Fehler: {str(e)}"
return "Maximale Anzahl von Wiederholungen erreicht"
def test_comprehensive_data_all_measures():
try:
client = AuroraTCPClient(ip=TARGET_IP, port=TARGET_PORT, address=INVERTER_ADDRESS, timeout=10)
client.connect()
# Daten abfragen
data = {}
# 50: State Request
try:
data["global_state"] = client.state(1)
except AttributeError:
data["global_state"] = "Methode nicht verfügbar"
try:
data["inverter_state"] = client.state(2)
except AttributeError:
data["inverter_state"] = "Methode nicht verfügbar"
try:
data["DCDC_ch1_state"] = client.state(3)
except AttributeError:
data["DCDC_ch1_state"] = "Methode nicht verfügbar"
try:
data["DCDC_ch2_state"] = client.state(4)
except AttributeError:
data["DCDC_ch2_state"] = "Methode nicht verfügbar"
try:
data["alarm_state"] = client.state(5)
except AttributeError:
data["alarm_state"] = "Methode nicht verfügbar"
# 58: Version Reading
try:
data["version"] = client.version()
except AttributeError:
data["version"] = "Methode nicht verfügbar"
# 63: Serial Number Reading
try:
data["serial_number"] = client.serial_number()
except AttributeError:
data["serial_number"] = "Methode nicht verfügbar"
# 65: Manufacturing Week and Year
try:
data["manufacturing_week_year"] = client.manufacturing_week_year()
except AttributeError:
try:
data["manufacturing_week_year"] = client.manufacturing_date()
except AttributeError:
data["manufacturing_week_year"] = "Methode nicht verfügbar"
# 68: Cumulated Float Energy Readings
try:
data["daily_energy_float"] = client.cumulated_energy(period=1)
data["week_energy_float"] = client.cumulated_energy(period=2)
data["month_energy_float"] = client.cumulated_energy(period=3)
except AttributeError:
data["cumulated_float_energy"] = "Methode nicht verfügbar"
# 70: Time/Date Reading
try:
seconds_since_2000 = client.time_date()
data["time_date"] = (datetime(2000, 1, 1) + timedelta(seconds=seconds_since_2000)).strftime("%Y-%m-%d %H:%M:%S")
except AttributeError:
data["time_date"] = "Methode nicht verfügbar"
# 72: Firmware Release Reading
try:
data["firmware_micro_release_C"] = client.firmware(3)
except AttributeError:
data["firmware_micro_release_C"] = "Methode nicht verfügbar"
# 78: Cumulated Energy Readings
try:
data["daily_energy"] = client.cumulated_energy(1)
data["week_energy"] = client.cumulated_energy(2)
data["month_energy"] = client.cumulated_energy(3)
data["year_energy"] = client.cumulated_energy(4)
data["total_energy"] = client.cumulated_energy(5)
except AttributeError:
data["cumulated_energy"] = "Methode nicht verfügbar"
# 86: Last Four Alarms
try:
data["last_four_alarms"] = client.alarms()
except AttributeError:
data["last_four_alarms"] = "Methode nicht verfügbar"
# 59: Measure Requests
measure_codes = {
1: "grid_voltage",
2: "grid_current",
3: "grid_power",
4: "frequency",
5: "vbulk",
6: "ileak_dc_dc",
7: "ileak_inverter",
8: "pin1",
9: "pin2",
21: "inverter_temperature",
22: "booster_temperature",
23: "input_1_voltage",
25: "input_1_current",
26: "input_2_voltage",
27: "input_2_current",
28: "grid_voltage_dc_dc",
29: "grid_frequency_dc_dc",
30: "isolation_resistance",
31: "vbulk_dc_dc",
32: "average_grid_voltage",
33: "vbulk_mid",
34: "power_peak",
35: "power_peak_today",
36: "grid_voltage_neutral",
37: "wind_generator_frequency",
38: "grid_voltage_neutral_phase",
39: "grid_current_phase_r",
40: "grid_current_phase_s",
41: "grid_current_phase_t",
42: "frequency_phase_r",
43: "frequency_phase_s",
44: "frequency_phase_t",
45: "vbulk_plus",
46: "vbulk_minus",
47: "supervisor_temperature",
48: "alim_temperature",
49: "heat_sink_temperature",
50: "temperature_1",
51: "temperature_2",
52: "temperature_3",
53: "fan_1_speed",
54: "fan_2_speed",
55: "fan_3_speed",
56: "fan_4_speed",
57: "fan_5_speed",
58: "power_saturation_limit",
59: "riferimento_anello_bulk",
60: "vpanel_micro",
61: "grid_voltage_phase_r",
62: "grid_voltage_phase_s",
63: "grid_voltage_phase_t"
}
for code, name in measure_codes.items():
try:
data[name] = measure_with_retry(client, code)
except AttributeError:
data[name] = "Methode nicht verfügbar"
except Exception as e:
data[name] = f"Fehler: {str(e)}"
client.close()
# Daten als JSON speichern
with open('comprehensive_data_all_measures.json', 'w') as f:
json.dump(data, f, indent=4)
print("Daten erfolgreich in 'comprehensive_data_all_measures.json' gespeichert.")
except AuroraError as e:
print(f"Fehler bei der Kommunikation: {str(e)}")
except Exception as e:
print(f"Allgemeiner Fehler: {str(e)}")
def test_all_sensor_parameters():
"""Testet alle Parameter aus sensor.py, sortiert nach Kategorien."""
try:
client = AuroraTCPClient(ip=TARGET_IP, port=TARGET_PORT, address=INVERTER_ADDRESS, timeout=10)
client.connect()
# Symbol-Mapping für die Ausgabe
icon_mapping = {
"DSP_GRID_POWER": "🌞",
"DSP_DAILY_ENERGY": "🌞",
"DSP_TOTAL_ENERGY": "📊",
"DSP_DC_POWER": "🌞",
"DSP_MPPT_POWER": "🌞",
"DSP_POWER_PEAK": "🌞",
"DSP_POWER_PEAK_TODAY": "🌞",
"DSP_PIN1": "🌞",
"DSP_PIN2": "🌞",
"DSP_GRID_VOLTAGE": "",
"DSP_GRID_CURRENT": "🔌",
"DSP_GRID_FREQUENCY": "🔄",
"DSP_PF": "🔄",
"DSP_AVERAGE_GRID_VOLTAGE": "",
"DSP_DC_VOLTAGE": "",
"DSP_DC_CURRENT": "🔌",
"DSP_INPUT_2_VOLTAGE": "",
"DSP_INPUT_2_CURRENT": "🔌",
"DSP_VBULK": "",
"DSP_VBULK_DC_DC": "",
"DSP_VBULK_MID": "",
"DSP_VBULK_PLUS": "",
"DSP_VBULK_MINUS": "",
"DSP_GRID_VOLTAGE_DC_DC": "",
"DSP_GRID_VOLTAGE_NEUTRAL": "",
"DSP_GRID_VOLTAGE_NEUTRAL_PHASE": "",
"DSP_VPANEL_MICRO": "",
"DSP_GRID_CURRENT_PHASE_R": "🔌",
"DSP_GRID_CURRENT_PHASE_S": "🔌",
"DSP_GRID_CURRENT_PHASE_T": "🔌",
"DSP_FREQUENCY_PHASE_R": "🔄",
"DSP_FREQUENCY_PHASE_S": "🔄",
"DSP_FREQUENCY_PHASE_T": "🔄",
"DSP_GRID_VOLTAGE_PHASE_R": "",
"DSP_GRID_VOLTAGE_PHASE_S": "",
"DSP_GRID_VOLTAGE_PHASE_T": "",
"DSP_TEMPERATURE": "🌡️",
"DSP_RADIATOR_TEMP": "🌡️",
"DSP_AMBIENT_TEMP": "🌡️",
"DSP_SUPERVISOR_TEMPERATURE": "🌡️",
"DSP_ALIM_TEMPERATURE": "🌡️",
"DSP_HEAT_SINK_TEMPERATURE": "🌡️",
"DSP_TEMPERATURE_1": "🌡️",
"DSP_TEMPERATURE_2": "🌡️",
"DSP_TEMPERATURE_3": "🌡️",
"DSP_FAN_1_SPEED": "💨",
"DSP_FAN_2_SPEED": "💨",
"DSP_FAN_3_SPEED": "💨",
"DSP_FAN_4_SPEED": "💨",
"DSP_FAN_5_SPEED": "💨",
"DSP_ILEAK_DC_DC": "🔌",
"DSP_ILEAK_INVERTER": "🔌",
"DSP_ISOLATION": "🔌",
"DSP_OPERATING_HOURS": "⏱️",
"DSP_POWER_SATURATION_LIMIT": "🌞",
"DSP_RIFERIMENTO_ANELLO_BULK": "🔄",
"DSP_ALARMS": "⚠️",
"DSP_FAULT_CODE": "⚠️",
"DSP_STATUS": "",
"DSP_EVENTS": "",
"DSP_LAST_ERROR": "⚠️",
"DSP_SERIAL_NUMBER": "🆔",
"DSP_MODEL": "📋",
"DSP_VERSION": "📋",
"DSP_GRID_FREQUENCY_DC_DC": "🔄",
"DSP_WIND_GENERATOR_FREQUENCY": "🔄",
}
# Strukturierte Daten nach Kategorien
structured_data = {
"1. Leistung und Energie": {},
"2. Netzparameter": {},
"3. Gleichstromkreis": {},
"4. Spannungen": {},
"5. Phasenbezogene Werte": {},
"6. Temperaturen": {},
"7. Lüftergeschwindigkeiten": {},
"8. Leckströme": {},
"9. Diagnose": {},
"10. Status und Alarme": {},
"11. Metadaten": {},
}
# 1. Leistung und Energie
structured_data["1. Leistung und Energie"]["DSP_GRID_POWER"] = measure_with_retry(client, 3)
structured_data["1. Leistung und Energie"]["DSP_DAILY_ENERGY"] = client.cumulated_energy(0)
structured_data["1. Leistung und Energie"]["DSP_TOTAL_ENERGY"] = client.cumulated_energy(1) * 0.1
structured_data["1. Leistung und Energie"]["DSP_DC_POWER"] = measure_with_retry(client, 12)
structured_data["1. Leistung und Energie"]["DSP_MPPT_POWER"] = measure_with_retry(client, 16)
structured_data["1. Leistung und Energie"]["DSP_POWER_PEAK"] = measure_with_retry(client, 34)
structured_data["1. Leistung und Energie"]["DSP_POWER_PEAK_TODAY"] = measure_with_retry(client, 35)
structured_data["1. Leistung und Energie"]["DSP_PIN1"] = measure_with_retry(client, 8)
structured_data["1. Leistung und Energie"]["DSP_PIN2"] = measure_with_retry(client, 9)
# 2. Netzparameter
structured_data["2. Netzparameter"]["DSP_GRID_VOLTAGE"] = measure_with_retry(client, 1)
structured_data["2. Netzparameter"]["DSP_GRID_CURRENT"] = measure_with_retry(client, 2)
structured_data["2. Netzparameter"]["DSP_GRID_FREQUENCY"] = measure_with_retry(client, 4)
structured_data["2. Netzparameter"]["DSP_PF"] = measure_with_retry(client, 9)
structured_data["2. Netzparameter"]["DSP_AVERAGE_GRID_VOLTAGE"] = measure_with_retry(client, 32)
# 3. Gleichstromkreis
structured_data["3. Gleichstromkreis"]["DSP_DC_VOLTAGE"] = measure_with_retry(client, 23)
structured_data["3. Gleichstromkreis"]["DSP_DC_CURRENT"] = measure_with_retry(client, 25)
structured_data["3. Gleichstromkreis"]["DSP_INPUT_2_VOLTAGE"] = measure_with_retry(client, 26)
structured_data["3. Gleichstromkreis"]["DSP_INPUT_2_CURRENT"] = measure_with_retry(client, 27)
# 4. Spannungen
structured_data["4. Spannungen"]["DSP_VBULK"] = measure_with_retry(client, 5)
structured_data["4. Spannungen"]["DSP_VBULK_DC_DC"] = measure_with_retry(client, 31)
structured_data["4. Spannungen"]["DSP_VBULK_MID"] = measure_with_retry(client, 33)
structured_data["4. Spannungen"]["DSP_VBULK_PLUS"] = measure_with_retry(client, 45)
structured_data["4. Spannungen"]["DSP_VBULK_MINUS"] = measure_with_retry(client, 46)
structured_data["4. Spannungen"]["DSP_GRID_VOLTAGE_DC_DC"] = measure_with_retry(client, 28)
structured_data["4. Spannungen"]["DSP_GRID_VOLTAGE_NEUTRAL"] = measure_with_retry(client, 36)
structured_data["4. Spannungen"]["DSP_GRID_VOLTAGE_NEUTRAL_PHASE"] = measure_with_retry(client, 38)
structured_data["4. Spannungen"]["DSP_VPANEL_MICRO"] = measure_with_retry(client, 60)
# 5. Phasenbezogene Werte
structured_data["5. Phasenbezogene Werte"]["DSP_GRID_CURRENT_PHASE_R"] = measure_with_retry(client, 39)
structured_data["5. Phasenbezogene Werte"]["DSP_GRID_CURRENT_PHASE_S"] = measure_with_retry(client, 40)
structured_data["5. Phasenbezogene Werte"]["DSP_GRID_CURRENT_PHASE_T"] = measure_with_retry(client, 41)
structured_data["5. Phasenbezogene Werte"]["DSP_FREQUENCY_PHASE_R"] = measure_with_retry(client, 42)
structured_data["5. Phasenbezogene Werte"]["DSP_FREQUENCY_PHASE_S"] = measure_with_retry(client, 43)
structured_data["5. Phasenbezogene Werte"]["DSP_FREQUENCY_PHASE_T"] = measure_with_retry(client, 44)
structured_data["5. Phasenbezogene Werte"]["DSP_GRID_VOLTAGE_PHASE_R"] = measure_with_retry(client, 61)
structured_data["5. Phasenbezogene Werte"]["DSP_GRID_VOLTAGE_PHASE_S"] = measure_with_retry(client, 62)
structured_data["5. Phasenbezogene Werte"]["DSP_GRID_VOLTAGE_PHASE_T"] = measure_with_retry(client, 63)
# 6. Temperaturen
structured_data["6. Temperaturen"]["DSP_TEMPERATURE"] = measure_with_retry(client, 21)
structured_data["6. Temperaturen"]["DSP_RADIATOR_TEMP"] = measure_with_retry(client, 22)
structured_data["6. Temperaturen"]["DSP_AMBIENT_TEMP"] = measure_with_retry(client, 15)
structured_data["6. Temperaturen"]["DSP_SUPERVISOR_TEMPERATURE"] = measure_with_retry(client, 47)
structured_data["6. Temperaturen"]["DSP_ALIM_TEMPERATURE"] = measure_with_retry(client, 48)
structured_data["6. Temperaturen"]["DSP_HEAT_SINK_TEMPERATURE"] = measure_with_retry(client, 49)
structured_data["6. Temperaturen"]["DSP_TEMPERATURE_1"] = measure_with_retry(client, 50)
structured_data["6. Temperaturen"]["DSP_TEMPERATURE_2"] = measure_with_retry(client, 51)
structured_data["6. Temperaturen"]["DSP_TEMPERATURE_3"] = measure_with_retry(client, 52)
# 7. Lüftergeschwindigkeiten
structured_data["7. Lüftergeschwindigkeiten"]["DSP_FAN_1_SPEED"] = measure_with_retry(client, 53)
structured_data["7. Lüftergeschwindigkeiten"]["DSP_FAN_2_SPEED"] = measure_with_retry(client, 54)
structured_data["7. Lüftergeschwindigkeiten"]["DSP_FAN_3_SPEED"] = measure_with_retry(client, 55)
structured_data["7. Lüftergeschwindigkeiten"]["DSP_FAN_4_SPEED"] = measure_with_retry(client, 56)
structured_data["7. Lüftergeschwindigkeiten"]["DSP_FAN_5_SPEED"] = measure_with_retry(client, 57)
# 8. Leckströme
structured_data["8. Leckströme"]["DSP_ILEAK_DC_DC"] = measure_with_retry(client, 6)
structured_data["8. Leckströme"]["DSP_ILEAK_INVERTER"] = measure_with_retry(client, 7)
# 9. Diagnose
structured_data["9. Diagnose"]["DSP_ISOLATION"] = measure_with_retry(client, 30)
structured_data["9. Diagnose"]["DSP_OPERATING_HOURS"] = measure_with_retry(client, 18)
structured_data["9. Diagnose"]["DSP_POWER_SATURATION_LIMIT"] = measure_with_retry(client, 58)
structured_data["9. Diagnose"]["DSP_RIFERIMENTO_ANELLO_BULK"] = measure_with_retry(client, 59)
# 10. Status und Alarme
structured_data["10. Status und Alarme"]["DSP_ALARMS"] = client.alarms()
structured_data["10. Status und Alarme"]["DSP_FAULT_CODE"] = measure_with_retry(client, 20)
structured_data["10. Status und Alarme"]["DSP_STATUS"] = measure_with_retry(client, 23)
structured_data["10. Status und Alarme"]["DSP_EVENTS"] = measure_with_retry(client, 21)
structured_data["10. Status und Alarme"]["DSP_LAST_ERROR"] = measure_with_retry(client, 22)
# 11. Metadaten
structured_data["11. Metadaten"]["DSP_SERIAL_NUMBER"] = client.serial_number()
structured_data["11. Metadaten"]["DSP_MODEL"] = client.version()
structured_data["11. Metadaten"]["DSP_VERSION"] = client.version()
structured_data["11. Metadaten"]["DSP_GRID_FREQUENCY_DC_DC"] = measure_with_retry(client, 29)
structured_data["11. Metadaten"]["DSP_WIND_GENERATOR_FREQUENCY"] = measure_with_retry(client, 37)
client.close()
# Speichere die Daten in einer strukturierten JSON-Datei
with open('all_sensor_parameters_structured.json', 'w') as f:
json.dump(structured_data, f, indent=4)
# Erstelle eine lesbare Ausgabe mit Symbolen
print("\n" + "="*80)
print("Aurora Wechselrichter - Alle Sensorparameter")
print("="*80 + "\n")
for category, values in structured_data.items():
print(f"{category}")
print("-" * len(category))
for key, value in values.items():
icon = icon_mapping.get(key, "🔹")
print(f" {icon} {key}: {value}")
print()
print("="*80)
print("Daten wurden in 'all_sensor_parameters_structured.json' gespeichert.")
print("="*80 + "\n")
except AuroraError as e:
print(f"Fehler bei der Kommunikation: {str(e)}")
except Exception as e:
print(f"Allgemeiner Fehler: {str(e)}")
if __name__ == "__main__":
test_all_sensor_parameters()