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()