

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Réservez des contacts avec des éphémérides personnalisées
<a name="reserving-contacts-with-custom-ephemeris"></a>

## Présentation de
<a name="w2aac28c19b3"></a>

 Lorsque vous utilisez des éphémérides personnalisées (TLE, OEM ou élévation d'azimut), vous pouvez réserver des contacts à l'aide de l'API. [ReserveContact](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ReserveContact.html) Cette section décrit deux flux de travail courants pour la réservation de contacts et les points importants à prendre en compte pour garantir une planification des contacts réussie. 

 AWS Ground Station les antennes sont des ressources partagées entre plusieurs clients. Cela signifie que même si une fenêtre de contact apparaît disponible lorsque vous listez des contacts, un autre client peut la réserver avant vous. Il est donc essentiel de vérifier que votre contact arrive dans l'`SCHEDULED`État après la réservation et de mettre en place un suivi approprié des changements d'état du contact. 

**Important**  
 Pour les éphémérides d'altitude azimutale, le `satelliteArn` paramètre peut être omis dans la `ReserveContact` demande, et vous devez fournir l'identifiant de l'éphéméride. `trackingOverrides` Pour les éphémérides TLE et OEM, vous devez toujours fournir le. `satelliteArn` 

## Flux de travail de réservation de contacts
<a name="w2aac28c19b5"></a>

 Il existe deux flux de travail principaux pour réserver des contacts avec des éphémérides personnalisées : 

1. *List-then-reserve flux de travail :* Répertoriez d'abord les fenêtres de contact disponibles en utilisant [ListContacts](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ListContacts.html), puis sélectionnez et réservez une fenêtre spécifique. Cette approche est utile lorsque vous souhaitez voir toutes les opportunités disponibles avant de faire une sélection.

1. *Processus de réservation directe :* réservez directement un contact pour un créneau horaire spécifique sans avoir d'abord répertorié les contacts disponibles. Cette approche est utile lorsque vous connaissez déjà l'heure de contact souhaitée ou que vous travaillez avec des horaires prédéterminés.

 Les deux flux de travail sont valides et le choix dépend de vos exigences opérationnelles. Les sections suivantes fournissent des exemples de chaque approche. 

## Flux de travail 1 : Répertorier les contacts disponibles puis réserver
<a name="w2aac28c19b7"></a>

 Ce flux de travail recherche d'abord les fenêtres de contact disponibles, puis réserve une fenêtre spécifique. Cela est utile lorsque vous souhaitez voir toutes les opportunités disponibles avant de faire une sélection. 

### Exemple : liste et réserve avec éphémérides d'altitude azimutale
<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")
```

### Exemple : Répertorier et réserver avec les éphémérides TLE
<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 : réservation par contact direct
<a name="w2aac28c19b9"></a>

 Ce flux de travail réserve directement un contact sans répertorier au préalable les fenêtres disponibles. Cette approche est utile lorsque vous connaissez déjà l'heure de contact souhaitée ou que vous implémentez une planification automatisée. 

### Exemple : réservation directe avec éphémérides d'élévation d'azimut
<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']}")
```

### Exemple : réservation directe avec TLE ephemeris
<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']}")
```

## Surveillance des changements d'état des contacts
<a name="w2aac28c19c11"></a>

 Après avoir réservé un contact, il est important de surveiller son état afin de s'assurer qu'il effectue une transition réussie `SCHEDULED` et d'être informé de tout problème. AWS Ground Station envoie des événements à Amazon EventBridge pour tous les changements d'état des contacts. 

 Les états de contact suivent ce cycle de vie : 
+ `SCHEDULING`- Le contact est en cours de traitement pour la planification
+ `SCHEDULED`- Le contact a été planifié avec succès et sera exécuté
+ `FAILED_TO_SCHEDULE`- Le contact n'a pas pu être planifié (état du terminal)

 Pour plus d'informations sur les états et le cycle de vie des contacts, consultez[Comprendre le cycle de vie des contacts](contacts.lifecycle.md). 

### Mettre en œuvre le suivi de l'état des contacts avec EventBridge
<a name="w2aac28c19c11c11"></a>

 Pour surveiller les changements d'état des contacts en temps réel, vous pouvez configurer une EventBridge règle Amazon qui déclenche une fonction Lambda chaque fois qu'un contact de la Ground Station change d'état. Cette approche est plus efficace et plus évolutive que l'interrogation de l'état du contact. 

#### Étapes d’implémentation
<a name="w2aac28c19c11c11b5"></a>

1. Création d'une fonction Lambda pour traiter les événements de changement d'état des contacts

1. Créez une EventBridge règle qui correspond aux événements de changement d'état des contacts de la Ground Station

1. Ajouter la fonction Lambda comme cible pour la règle

#### Exemple de gestionnaire de fonctions Lambda
<a name="w2aac28c19c11c11b7"></a>

 Pour un exemple complet de fonction Lambda qui traite les événements de changement d'état des contacts, consultez la `GroundStationCloudWatchEventHandlerLambda` ressource du modèle. `AquaSnppJpssTerraDigIF.yml` CloudFormation Ce modèle est disponible dans le compartiment Amazon S3 d'accueil du AWS Ground Station client. Pour obtenir des instructions sur l'accès à ce modèle, consultez la [Assemblage](examples.pbs-data-dataflow-endpoint.md#examples.pbs-dataflow-endpoint.putting-it-together) section de l'exemple de point de terminaison du flux de données. 

#### EventBridge configuration des règles
<a name="w2aac28c19c11c11b9"></a>

 La EventBridge règle doit utiliser le modèle d'événement suivant pour correspondre à tous les changements d'état des contacts de la Ground Station : 

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

 Pour filtrer uniquement des états spécifiques (par exemple, les défaillances), vous pouvez ajouter un filtre détaillé : 

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

 Pour obtenir des instructions détaillées sur la création de EventBridge règles avec des cibles Lambda, consultez la section [Création de règles qui réagissent aux événements](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html) dans le guide de EventBridge l'utilisateur Amazon. 

### Configuration de EventBridge règles pour l'automatisation
<a name="w2aac28c19c11c13"></a>

 Vous pouvez créer des EventBridge règles pour répondre automatiquement aux changements d'état des contacts. Par exemple : 
+ Envoyer des notifications lorsqu'un contact ne parvient pas à planifier
+ Déclenchez des fonctions Lambda pour préparer les ressources lorsqu'un contact entre `PREPASS`
+ Enregistrez les contacts complétés à des fins d'audit

 Pour obtenir des informations détaillées sur la configuration EventBridge des règles relatives aux AWS Ground Station événements, consultez[Automatisez AWS Ground Station avec des événements](monitoring.automating-events.md). 

## Bonnes pratiques et considérations
<a name="w2aac28c19c13"></a>

### Gestion des conflits de planification
<a name="w2aac28c19c13b3"></a>

 Les AWS Ground Station antennes étant des ressources partagées, une fenêtre de contact qui apparaît disponible `ListContacts` peut être réservée par un autre client avant que vous ne puissiez la réserver. Pour gérer cela : 

1. Vérifiez toujours l'état du contact après la réservation

1. Implémenter une logique de nouvelle tentative avec des fenêtres temporelles alternatives

1. Envisagez de réserver des contacts bien à l'avance, dans la mesure du possible

1. Utiliser EventBridge les événements pour surveiller les `FAILED_TO_SCHEDULE` états

### Calendrier de validation des éphémérides
<a name="w2aac28c19c13b5"></a>

 N'oubliez pas que les éphémérides doivent être en `ENABLED` état avant de pouvoir les utiliser pour réserver des contacts. Le processus de validation prend généralement de quelques secondes à quelques minutes selon le type et la taille des éphémérides. Vérifiez toujours le statut des éphémérides avant de tenter de réserver des contacts. 

### Considérations relatives au calendrier des contacts
<a name="w2aac28c19c13b7"></a>

 Lorsque vous utilisez des éphémérides personnalisées : 
+ Assurez-vous que votre éphéméride couvre toute la durée du contact
+ [Pour les éphémérides d'élévation d'azimut, vérifiez que les angles maintiennent l'antenne au-dessus du masque de site pendant tout le contact](https://docs.aws.amazon.com/ground-station/latest/ug/locations.site-masks.html)
+ Tenez compte des délais d'expiration des éphémérides lors de la planification de futurs contacts

### Différences entre les API par type d'éphéméride
<a name="w2aac28c19c13b9"></a>

 L'`ReserveContact`API se comporte différemment selon le type d'éphéméride : 


| Type d'éphéméride | Learn par satellite requis | Suivi des annulations requis | 
| --- | --- | --- | 
| TLE | Oui | Non (facultatif) | 
| OEM | Oui | Non (facultatif) | 
| Élévation de l'azimut | Non (facultatif) | Oui | 