

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Reservieren Sie Kontakte mit benutzerdefinierten Ephemeriden
<a name="reserving-contacts-with-custom-ephemeris"></a>

## -Übersicht
<a name="w2aac28c19b3"></a>

 Wenn Sie benutzerdefinierte Ephemeriden (TLE, OEM oder Azimut-Elevation) verwenden, können Sie Kontakte über die API reservieren. [ReserveContact](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ReserveContact.html) In diesem Abschnitt werden zwei gängige Workflows für die Reservierung von Kontakten sowie wichtige Überlegungen zur Sicherstellung einer erfolgreichen Kontaktplanung beschrieben. 

 AWS Ground Station Antennen sind Ressourcen, die von mehreren Kunden gemeinsam genutzt werden. Das bedeutet, dass selbst wenn ein Kontaktfenster verfügbar erscheint, wenn Sie Kontakte auflisten, ein anderer Kunde es möglicherweise vor Ihnen reserviert. Daher ist es wichtig, sicherzustellen, dass Ihr Kontakt den `SCHEDULED` Status nach der Reservierung erreicht hat, und für eine angemessene Überwachung bei Änderungen des Kontaktstatus zu sorgen. 

**Wichtig**  
 Bei azimutalen Elevations-Ephemeriden kann der `satelliteArn` Parameter in der `ReserveContact` Anfrage weggelassen werden und Sie müssen die Ephemeriden-ID angeben`trackingOverrides`. Für TLE- und OEM-Ephemeriden müssen Sie dennoch die angeben. `satelliteArn` 

## Workflows zur Kontaktreservierung
<a name="w2aac28c19b5"></a>

 Es gibt zwei Hauptworkflows für die Reservierung von Kontakten mit benutzerdefinierten Ephemeriden: 

1. *List-then-reserve Arbeitsablauf:* Zuerst die verfügbaren Kontaktfenster mithilfe auflisten [ListContacts](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ListContacts.html), dann ein bestimmtes Fenster auswählen und reservieren. Dieser Ansatz ist nützlich, wenn Sie alle verfügbaren Möglichkeiten sehen möchten, bevor Sie eine Auswahl treffen.

1. *Direkter Reservierungsablauf:* Reservieren Sie einen Kontakt direkt für ein bestimmtes Zeitfenster, ohne zuerst die verfügbaren Kontakte aufzulisten. Dieser Ansatz ist nützlich, wenn Sie Ihre gewünschte Kontaktzeit bereits kennen oder mit festgelegten Zeitplänen arbeiten.

 Beide Workflows sind gültig und die Wahl hängt von Ihren betrieblichen Anforderungen ab. Die folgenden Abschnitte enthalten Beispiele für jeden Ansatz. 

## Arbeitsablauf 1: Verfügbare Kontakte auflisten und dann reservieren
<a name="w2aac28c19b7"></a>

 Dieser Workflow fragt zuerst nach verfügbaren Kontaktfenstern und reserviert dann ein bestimmtes Fenster. Dies ist nützlich, wenn Sie alle verfügbaren Opportunities sehen möchten, bevor Sie eine Auswahl treffen. 

### Beispiel: Ephemeriden mit Azimut-Elevation auflisten und reservieren
<a name="w2aac28c19b7b5"></a>

```
import boto3
from datetime import datetime, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

# Create azimuth elevation ephemeris
print("Creating azimuth elevation ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="AzEl Ephemeris for Contact",
    ephemeris={
        "azEl": {
            "groundStation": "Ohio 1",
            "data": {
                "azElData": {
                    "angleUnit": "DEGREE_ANGLE",
                    "azElSegmentList": [
                        {
                            "referenceEpoch": "2024-03-15T10:00:00Z",
                            "validTimeRange": {
                                "startTime": "2024-03-15T10:00:00Z",
                                "endTime": "2024-03-15T10:15:00Z",
                            },
                            "azElList": [
                                {"dt": 0.0, "az": 45.0, "el": 10.0},
                                {"dt": 180.0, "az": 50.0, "el": 15.0},
                                {"dt": 360.0, "az": 55.0, "el": 20.0},
                                {"dt": 540.0, "az": 60.0, "el": 25.0},
                                {"dt": 720.0, "az": 65.0, "el": 30.0},
                                {"dt": 900.0, "az": 70.0, "el": 35.0},
                            ],
                        }
                    ],
                }
            },
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# List available contacts
print("Listing available contacts...")
contacts = ground_station_client.list_contacts(
    # Note: satelliteArn is omitted for azimuth elevation ephemeris
    groundStation="Ohio 1",
    missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile",
    startTime=datetime(2024, 3, 15, 10, 0, 0, tzinfo=timezone.utc),
    endTime=datetime(2024, 3, 15, 10, 15, 0, tzinfo=timezone.utc),
    statusList=["AVAILABLE"],
    ephemeris={"azEl": {"id": ephemeris_id}},
)

if contacts["contactList"]:
    # Reserve the first available contact
    contact = contacts["contactList"][0]
    print(f"Reserving contact from {contact['startTime']} to {contact['endTime']}...")

    reservation = ground_station_client.reserve_contact(
        # Note: satelliteArn is omitted when using azimuth elevation ephemeris
        missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile",
        groundStation="Ohio 1",
        startTime=contact["startTime"],
        endTime=contact["endTime"],
        trackingOverrides={
            "programTrackSettings": {"azEl": {"ephemerisId": ephemeris_id}}
        },
    )

    print(f"Reserved contact: {reservation['contactId']}")
else:
    print("No available contacts found")
```

### Beispiel: Mit TLE-Ephemeriden auflisten und reservieren
<a name="w2aac28c19b7b7"></a>

```
import boto3
from datetime import datetime, timedelta, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

satellite_id = "12345678-1234-1234-1234-123456789012"
satellite_arn = f"arn:aws:groundstation::111122223333:satellite/{satellite_id}"

# Create TLE ephemeris
print("Creating TLE ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="TLE Ephemeris for Contact",
    satelliteId=satellite_id,
    enabled=True,
    expirationTime=datetime.now(timezone.utc) + timedelta(days=7),
    priority=1,  # Higher priority than default ephemeris
    ephemeris={
        "tle": {
            "tleData": [
                {
                    "tleLine1": "1 25994U 99068A   24075.54719794  .00000075  00000-0  26688-4 0  9997",
                    "tleLine2": "2 25994  98.2007  30.6589 0001234  89.2782  18.9934 14.57114995111906",
                    "validTimeRange": {
                        "startTime": datetime.now(timezone.utc),
                        "endTime": datetime.now(timezone.utc) + timedelta(days=7),
                    },
                }
            ]
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# List available contacts
print("Listing available contacts...")
start_time = datetime.now(timezone.utc) + timedelta(hours=1)
end_time = start_time + timedelta(days=1)

contacts = ground_station_client.list_contacts(
    satelliteArn=satellite_arn,  # Required for TLE/OEM ephemeris
    groundStation="Hawaii 1",
    missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile",
    startTime=start_time,
    endTime=end_time,
    statusList=["AVAILABLE"],
)

if contacts["contactList"]:
    # Reserve the first available contact
    contact = contacts["contactList"][0]
    print(f"Reserving contact from {contact['startTime']} to {contact['endTime']}...")

    reservation = ground_station_client.reserve_contact(
        satelliteArn=satellite_arn,  # Required for TLE/OEM ephemeris
        missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile",
        groundStation="Hawaii 1",
        startTime=contact["startTime"],
        endTime=contact["endTime"],
        # Note: trackingOverrides is optional for TLE/OEM
        # The system will use the highest priority ephemeris automatically
    )

    print(f"Reserved contact: {reservation['contactId']}")
else:
    print("No available contacts found")
```

## Workflow 2: Direkte Kontaktreservierung
<a name="w2aac28c19b9"></a>

 Dieser Workflow reserviert direkt einen Kontakt, ohne zuerst die verfügbaren Fenster aufzulisten. Dieser Ansatz ist nützlich, wenn Sie Ihre gewünschte Kontaktzeit bereits kennen oder eine automatisierte Terminplanung implementieren. 

### Beispiel: Direkte Reservierung mit azimutaler Elevations-Ephemeride
<a name="w2aac28c19b9b5"></a>

```
import boto3
from datetime import datetime, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

# Define contact window
contact_start = datetime(2024, 3, 20, 14, 0, 0, tzinfo=timezone.utc)
contact_end = datetime(2024, 3, 20, 14, 15, 0, tzinfo=timezone.utc)

# Create azimuth elevation ephemeris for the specific contact time
print("Creating azimuth elevation ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="Direct Contact AzEl Ephemeris",
    ephemeris={
        "azEl": {
            "groundStation": "Ohio 1",
            "data": {
                "azElData": {
                    "angleUnit": "DEGREE_ANGLE",
                    "azElSegmentList": [
                        {
                            "referenceEpoch": contact_start.isoformat(),
                            "validTimeRange": {
                                "startTime": contact_start.isoformat(),
                                "endTime": contact_end.isoformat(),
                            },
                            "azElList": [
                                {"dt": 0.0, "az": 45.0, "el": 10.0},
                                {"dt": 180.0, "az": 50.0, "el": 15.0},
                                {"dt": 360.0, "az": 55.0, "el": 20.0},
                                {"dt": 540.0, "az": 60.0, "el": 25.0},
                                {"dt": 720.0, "az": 65.0, "el": 30.0},
                                {"dt": 900.0, "az": 70.0, "el": 35.0},
                            ],
                        }
                    ],
                }
            },
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# Directly reserve the contact
print(f"Reserving contact from {contact_start} to {contact_end}...")

reservation = ground_station_client.reserve_contact(
    # Note: satelliteArn is omitted for azimuth elevation
    missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile",
    groundStation="Ohio 1",
    startTime=contact_start,
    endTime=contact_end,
    trackingOverrides={"programTrackSettings": {"azEl": {"ephemerisId": ephemeris_id}}},
)

print(f"Reserved contact: {reservation['contactId']}")
```

### Beispiel: Direktreservierung mit TLE-Ephemeriden
<a name="w2aac28c19b9b7"></a>

```
import boto3
from datetime import datetime, timedelta, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

satellite_id = "12345678-1234-1234-1234-123456789012"
satellite_arn = f"arn:aws:groundstation::111122223333:satellite/{satellite_id}"

# Define contact window (based on predicted pass)
contact_start = datetime(2024, 3, 21, 10, 30, 0, tzinfo=timezone.utc)
contact_end = datetime(2024, 3, 21, 10, 42, 0, tzinfo=timezone.utc)

# Create TLE ephemeris
print("Creating TLE ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="Direct Contact TLE Ephemeris",
    satelliteId=satellite_id,
    enabled=True,
    expirationTime=contact_end + timedelta(days=1),
    priority=1,
    ephemeris={
        "tle": {
            "tleData": [
                {
                    "tleLine1": "1 25994U 99068A   24080.50000000  .00000075  00000-0  26688-4 0  9999",
                    "tleLine2": "2 25994  98.2007  35.6589 0001234  89.2782  18.9934 14.57114995112000",
                    "validTimeRange": {
                        "startTime": (contact_start - timedelta(hours=1)).isoformat(),
                        "endTime": (contact_end + timedelta(hours=1)).isoformat(),
                    },
                }
            ]
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# Directly reserve the contact
print(f"Reserving contact from {contact_start} to {contact_end}...")

reservation = ground_station_client.reserve_contact(
    satelliteArn=satellite_arn,  # Required for TLE ephemeris
    missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile",
    groundStation="Hawaii 1",
    startTime=contact_start,
    endTime=contact_end,
    # Note: trackingOverrides is optional for TLE
    # The system will use the highest priority ephemeris automatically
)

print(f"Reserved contact: {reservation['contactId']}")
```

## Überwachung von Änderungen des Kontaktstatus
<a name="w2aac28c19c11"></a>

 Nach der Reservierung eines Kontakts ist es wichtig, seinen Status zu überwachen, um sicherzustellen, dass der Übergang erfolgreich ist, `SCHEDULED` und um bei Problemen benachrichtigt zu werden. AWS Ground Station sendet Ereignisse an Amazon EventBridge für alle Änderungen des Kontaktstatus. 

 Kontaktstatus folgen diesem Lebenszyklus: 
+ `SCHEDULING`- Der Kontakt wird gerade für die Terminplanung bearbeitet
+ `SCHEDULED`- Der Kontakt wurde erfolgreich geplant und wird ausgeführt
+ `FAILED_TO_SCHEDULE`- Der Kontakt konnte nicht geplant werden (Terminalstatus)

 Weitere Informationen zu Kontaktstatus und Lebenszyklus finden Sie unter[Verstehen Sie den Lebenszyklus von Kontakten](contacts.lifecycle.md). 

### Implementierung der Kontaktstatusüberwachung mit EventBridge
<a name="w2aac28c19c11c11"></a>

 Um Änderungen des Kontaktstatus in Echtzeit zu überwachen, können Sie eine EventBridge Amazon-Regel einrichten, die eine Lambda-Funktion auslöst, wenn sich der Status eines Bodenstationskontakts ändert. Dieser Ansatz ist effizienter und skalierbarer als die Abfrage des Kontaktstatus. 

#### Implementierungsschritte
<a name="w2aac28c19c11c11b5"></a>

1. Erstellen Sie eine Lambda-Funktion zur Verarbeitung von Ereignissen zur Änderung des Kontaktstatus

1. Erstellen Sie eine EventBridge Regel, die den Ereignissen zur Änderung des Kontaktstatus der Ground Station entspricht

1. Fügen Sie die Lambda-Funktion als Ziel für die Regel hinzu

#### Beispiel für einen Lambda-Funktionshandler
<a name="w2aac28c19c11c11b7"></a>

 Ein vollständiges Beispiel für eine Lambda-Funktion, die Ereignisse zur Änderung des Kontaktstatus verarbeitet, finden Sie in der `GroundStationCloudWatchEventHandlerLambda` Ressource in der `AquaSnppJpssTerraDigIF.yml` CloudFormation Vorlage. Diese Vorlage ist im Amazon S3 S3-Bucket für AWS Ground Station Kunden verfügbar. Anweisungen zum Zugriff auf diese Vorlage finden Sie im [Es zusammensetzen](examples.pbs-data-dataflow-endpoint.md#examples.pbs-dataflow-endpoint.putting-it-together) Abschnitt des Beispiels für einen Datenfluss-Endpunkt. 

#### EventBridge Konfiguration der Regeln
<a name="w2aac28c19c11c11b9"></a>

 Die EventBridge Regel sollte das folgende Ereignismuster verwenden, um allen Änderungen des Kontaktstatus der Ground Station Rechnung zu tragen: 

```
{
  "source": ["aws.groundstation"],
  "detail-type": ["Ground Station Contact State Change"]
}
```

 Um nur nach bestimmten Zuständen zu filtern (z. B. nach Ausfällen), können Sie einen Detailfilter hinzufügen: 

```
{
  "source": ["aws.groundstation"],
  "detail-type": ["Ground Station Contact State Change"],
  "detail": {
    "contactStatus": [
      "FAILED_TO_SCHEDULE",
      "FAILED",
      "AWS_FAILED",
      "AWS_CANCELLED"
    ]
  }
}
```

 Ausführliche Anweisungen zum Erstellen von EventBridge Regeln mit Lambda-Zielen finden Sie unter [Erstellen von Regeln, die auf Ereignisse reagieren](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html) im EventBridge Amazon-Benutzerhandbuch. 

### EventBridge Regeln für die Automatisierung einrichten
<a name="w2aac28c19c11c13"></a>

 Sie können EventBridge Regeln erstellen, um automatisch auf Änderungen des Kontaktstatus zu reagieren. Beispiel: 
+ Senden Sie Benachrichtigungen, wenn ein Kontakt den Terminplan nicht einhält
+ Lambda-Funktionen auslösen, um Ressourcen vorzubereiten, wenn ein Kontakt eintritt `PREPASS`
+ Protokollieren Sie den Abschluss von Kontakten zu Prüfungszwecken

 Ausführliche Informationen zum Einrichten von EventBridge Regeln für AWS Ground Station Ereignisse finden Sie unter[Automatisieren Sie AWS Ground Station mit Ereignissen](monitoring.automating-events.md). 

## Bewährte Methoden und Überlegungen
<a name="w2aac28c19c13"></a>

### Umgang mit Terminkonflikten
<a name="w2aac28c19c13b3"></a>

 Da es sich bei AWS Ground Station Antennen um gemeinsam genutzte Ressourcen handelt, wurde ein Kontaktfenster, das unter verfügbar angezeigt wird, `ListContacts` möglicherweise von einem anderen Kunden reserviert, bevor Sie es reservieren können. Um das zu handhaben: 

1. Überprüfen Sie nach der Reservierung immer den Kontaktstatus

1. Implementieren Sie die Wiederholungslogik mit alternativen Zeitfenstern

1. Erwägen Sie, Kontakte möglichst weit im Voraus zu reservieren

1. Verwenden Sie EventBridge Ereignisse, um nach Staaten Ausschau zu halten `FAILED_TO_SCHEDULE`

### Zeitplan für die Validierung von Ephemeriden
<a name="w2aac28c19c13b5"></a>

 Denken Sie daran, dass die Ephemeride aktiviert sein muss, bevor `ENABLED` Sie sie zum Reservieren von Kontakten verwenden können. Der Validierungsprozess dauert je nach Art und Größe der Ephemeriden in der Regel einige Sekunden bis einige Minuten. Überprüfen Sie immer den Status der Ephemeriden, bevor Sie versuchen, Kontakte zu reservieren. 

### Überlegungen zum Zeitpunkt der Kontaktaufnahme
<a name="w2aac28c19c13b7"></a>

 Wenn Sie benutzerdefinierte Ephemeriden verwenden: 
+ Stellen Sie sicher, dass Ihre Ephemeride die gesamte Kontaktdauer abdeckt
+ [Stellen Sie bei Azimut-Ephemeriden sicher, dass die Antenne aufgrund der Winkel während des gesamten Kontakts über der Ortsmaske bleibt](https://docs.aws.amazon.com/ground-station/latest/ug/locations.site-masks.html)
+ Berücksichtigen Sie bei der Planung future Kontakte die Ablaufzeiten von Ephemeriden

### API-Unterschiede je nach Ephemeridentyp
<a name="w2aac28c19c13b9"></a>

 Die `ReserveContact` API verhält sich je nach Ephemeridentyp unterschiedlich: 


| Ephemeriden-Typ | SatellitERN erforderlich | TrackingOverrides erforderlich | 
| --- | --- | --- | 
| TEL | Ja | Nein (fakultativ) | 
| OEM | Ja | Nein (fakultativ) | 
| Azimut-Elevation | Nein (fakultativ) | Ja | 