[Integration externe] : National Weather Service

Pour info j’ai lancé le dev de l’intégration externe pour la méteo National Weather Service

Une image de test est disponible

Installation de l’image de test depuis le mode développeur:

l’image docker:

ghcr.io/william-de71/gladys-national-weather-service:dev

le manifest :

{
  "manifest_version": 1,
  "type": "weather",
  "name": "National Weather Service",
  "description": {
    "en": "Official US forecasts and alerts from the National Weather Service.",
    "fr": "Prévisions et alertes officielles du National Weather Service (États-Unis)."
  },
  "version": "0.1.0",
  "docker_image": "ghcr.io/william-de71/gladys-national-weather-service:dev",
  "gladys_version": ">=5.1.1",
  "categories": [
    "environment"
  ],
  "cover_image": "https://raw.githubusercontent.com/William-De71/gladys-national-weather-service/main/cover.jpg",
  "transports": [
    "cloud"
  ],
  "location": true,
  "config_schema": [
    {
      "key": "intro",
      "type": "section",
      "label": {
        "en": "Ready to use",
        "fr": "Prêt à l'emploi"
      },
      "description": {
        "en": "Forecasts and alerts work with no configuration: the National Weather Service API is free and needs no key. It covers the United States and its territories only — a house elsewhere gets its weather from another provider.",
        "fr": "Les prévisions et les alertes fonctionnent sans configuration : l'API du National Weather Service est gratuite et sans clé. Elle ne couvre que les États-Unis et leurs territoires — une maison située ailleurs reçoit sa météo d'un autre fournisseur."
      },
      "links": [
        {
          "url": "https://www.weather.gov/documentation/services-web-api",
          "label": {
            "en": "NWS API documentation",
            "fr": "Documentation de l'API NWS"
          }
        }
      ]
    },
    {
      "key": "contact",
      "type": "string",
      "label": {
        "en": "Contact email (optional)",
        "fr": "Email de contact (optionnel)"
      },
      "description": {
        "en": "Added to the identification the NWS requires from every application, so it can reach you before blocking traffic it finds abusive. Never shared with anyone else.",
        "fr": "Ajouté à l'identification que le NWS exige de chaque application, pour qu'il puisse vous prévenir avant de bloquer un trafic qu'il jugerait abusif. Jamais transmis à personne d'autre."
      },
      "required": false,
      "placeholder": {
        "en": "me@example.com",
        "fr": "moi@exemple.fr"
      }
    },
    {
      "key": "cache_duration",
      "type": "number",
      "label": {
        "en": "Cache duration (s)",
        "fr": "Durée du cache (s)"
      },
      "description": {
        "en": "In seconds, between 0 and 3600. How long a forecast is reused before calling the NWS again. The NWS refreshes its forecasts about once an hour: the default of 600 (10 min) costs no freshness. Set to 0 to always call the API. Alerts are not affected: they are checked on their own schedule.",
        "fr": "En secondes, entre 0 et 3600. Durée pendant laquelle une prévision est réutilisée avant de rappeler le NWS. Le NWS met à jour ses prévisions environ une fois par heure : la valeur par défaut de 600 (10 min) ne fait rien perdre en fraîcheur. Mettre 0 pour toujours appeler l'API. Les alertes ne sont pas concernées : elles sont vérifiées selon leur propre rythme."
      },
      "required": false,
      "default": 600,
      "min": 0,
      "max": 3600
    },
    {
      "key": "alert_check_interval",
      "type": "number",
      "label": {
        "en": "Alert check interval (s)",
        "fr": "Intervalle de vérification des alertes (s)"
      },
      "description": {
        "en": "In seconds, between 30 and 900. How often the official alerts of your houses are checked, for the scene triggers and the alerts widget. A Tornado Warning lasts about 30 minutes: the default of 60 s fires your scenes within a minute of its issuance.",
        "fr": "En secondes, entre 30 et 900. Fréquence de vérification des alertes officielles de vos maisons, pour les déclencheurs de scène et le widget des alertes. Une alerte tornade dure environ 30 minutes : la valeur par défaut de 60 s déclenche vos scènes moins d'une minute après son émission."
      },
      "required": false,
      "default": 60,
      "min": 30,
      "max": 900
    }
  ],
  "scene_triggers": [
    {
      "key": "alert_issued",
      "label": {
        "en": "NWS alert issued",
        "fr": "Alerte NWS émise"
      },
      "description": {
        "en": "A new watch, warning or advisory covers the house. Its updates do not fire again. Checked every minute by default.",
        "fr": "Une nouvelle veille, alerte ou un avis du NWS couvre la maison. Ses mises à jour ne redéclenchent pas. Vérifié chaque minute par défaut."
      },
      "fields": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, exactly as shown in Gladys. Leave empty for every house.",
            "fr": "Nom de la maison, exactement comme dans Gladys. Laissez vide pour toutes les maisons."
          },
          "required": false
        },
        {
          "key": "category",
          "type": "multi_select",
          "label": {
            "en": "Kind of alert",
            "fr": "Type d'alerte"
          },
          "description": {
            "en": "Leave empty for every kind.",
            "fr": "Laissez vide pour tous les types."
          },
          "required": false,
          "options": [
            {
              "value": "tornado",
              "label": {
                "en": "Tornado",
                "fr": "Tornade"
              }
            },
            {
              "value": "hurricane",
              "label": {
                "en": "Hurricane / tropical storm",
                "fr": "Ouragan / tempête tropicale"
              }
            },
            {
              "value": "thunderstorm",
              "label": {
                "en": "Severe thunderstorm",
                "fr": "Orage violent"
              }
            },
            {
              "value": "flood",
              "label": {
                "en": "Flood",
                "fr": "Inondation"
              }
            },
            {
              "value": "winter",
              "label": {
                "en": "Winter storm, snow, ice",
                "fr": "Tempête hivernale, neige, verglas"
              }
            },
            {
              "value": "cold",
              "label": {
                "en": "Cold, freeze, wind chill",
                "fr": "Froid, gel, refroidissement éolien"
              }
            },
            {
              "value": "heat",
              "label": {
                "en": "Heat",
                "fr": "Chaleur"
              }
            },
            {
              "value": "wind",
              "label": {
                "en": "Wind",
                "fr": "Vent"
              }
            },
            {
              "value": "fire",
              "label": {
                "en": "Fire weather (red flag)",
                "fr": "Risque d'incendie (red flag)"
              }
            },
            {
              "value": "fog",
              "label": {
                "en": "Fog",
                "fr": "Brouillard"
              }
            },
            {
              "value": "air",
              "label": {
                "en": "Air quality, smoke, dust",
                "fr": "Qualité de l'air, fumée, poussière"
              }
            },
            {
              "value": "marine",
              "label": {
                "en": "Marine, surf, rip currents",
                "fr": "Mer, houle, courants"
              }
            },
            {
              "value": "other",
              "label": {
                "en": "Other",
                "fr": "Autre"
              }
            }
          ]
        },
        {
          "key": "level",
          "type": "multi_select",
          "label": {
            "en": "Level",
            "fr": "Niveau"
          },
          "description": {
            "en": "Leave empty for every level. A Watch means conditions are favorable; a Warning means the hazard is happening or imminent.",
            "fr": "Laissez vide pour tous les niveaux. Une « Watch » signifie que les conditions sont réunies ; un « Warning » que le phénomène est en cours ou imminent."
          },
          "required": false,
          "options": [
            {
              "value": "warning",
              "label": {
                "en": "Warning (take action)",
                "fr": "Warning – alerte (agir)"
              }
            },
            {
              "value": "watch",
              "label": {
                "en": "Watch (be prepared)",
                "fr": "Watch – veille (se préparer)"
              }
            },
            {
              "value": "advisory",
              "label": {
                "en": "Advisory",
                "fr": "Advisory – avis"
              }
            },
            {
              "value": "statement",
              "label": {
                "en": "Statement",
                "fr": "Statement – bulletin"
              }
            },
            {
              "value": "other",
              "label": {
                "en": "Other notice",
                "fr": "Autre information"
              }
            }
          ]
        },
        {
          "key": "severity",
          "type": "multi_select",
          "label": {
            "en": "Severity",
            "fr": "Sévérité"
          },
          "description": {
            "en": "Official CAP severity. Leave empty for any.",
            "fr": "Sévérité officielle (CAP). Laissez vide pour toutes."
          },
          "required": false,
          "options": [
            {
              "value": "extreme",
              "label": {
                "en": "Extreme",
                "fr": "Extrême"
              }
            },
            {
              "value": "severe",
              "label": {
                "en": "Severe",
                "fr": "Sévère"
              }
            },
            {
              "value": "moderate",
              "label": {
                "en": "Moderate",
                "fr": "Modéré"
              }
            },
            {
              "value": "minor",
              "label": {
                "en": "Minor",
                "fr": "Mineur"
              }
            },
            {
              "value": "unknown",
              "label": {
                "en": "Unknown",
                "fr": "Inconnu"
              }
            }
          ]
        }
      ],
      "variables": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          }
        },
        {
          "key": "event",
          "type": "string",
          "label": {
            "en": "Event (e.g. Tornado Warning)",
            "fr": "Événement (ex. Tornado Warning)"
          }
        },
        {
          "key": "category",
          "type": "string",
          "label": {
            "en": "Kind (key)",
            "fr": "Type (clé)"
          }
        },
        {
          "key": "category_label",
          "type": "string",
          "label": {
            "en": "Kind",
            "fr": "Type"
          }
        },
        {
          "key": "level",
          "type": "string",
          "label": {
            "en": "Level (warning, watch, advisory, statement, other)",
            "fr": "Niveau (warning, watch, advisory, statement, other)"
          }
        },
        {
          "key": "level_label",
          "type": "string",
          "label": {
            "en": "Level label",
            "fr": "Libellé du niveau"
          }
        },
        {
          "key": "severity",
          "type": "string",
          "label": {
            "en": "Severity (extreme, severe, moderate, minor, unknown)",
            "fr": "Sévérité (extreme, severe, moderate, minor, unknown)"
          }
        },
        {
          "key": "urgency",
          "type": "string",
          "label": {
            "en": "Urgency",
            "fr": "Urgence"
          }
        },
        {
          "key": "certainty",
          "type": "string",
          "label": {
            "en": "Certainty",
            "fr": "Certitude"
          }
        },
        {
          "key": "headline",
          "type": "string",
          "label": {
            "en": "Headline",
            "fr": "Titre"
          }
        },
        {
          "key": "area",
          "type": "string",
          "label": {
            "en": "Area",
            "fr": "Zone"
          }
        },
        {
          "key": "onset",
          "type": "string",
          "label": {
            "en": "Start (local time)",
            "fr": "Début (heure locale)"
          }
        },
        {
          "key": "ends",
          "type": "string",
          "label": {
            "en": "End (local time)",
            "fr": "Fin (heure locale)"
          }
        },
        {
          "key": "instruction",
          "type": "string",
          "label": {
            "en": "Instructions",
            "fr": "Consignes"
          }
        },
        {
          "key": "description",
          "type": "string",
          "label": {
            "en": "Description",
            "fr": "Description"
          }
        },
        {
          "key": "summary",
          "type": "string",
          "label": {
            "en": "Summary",
            "fr": "Résumé"
          },
          "description": {
            "en": "A sentence ready to put in a message.",
            "fr": "Une phrase prête à mettre dans un message."
          }
        }
      ]
    },
    {
      "key": "alert_ended",
      "label": {
        "en": "NWS alert ended",
        "fr": "Fin d'une alerte NWS"
      },
      "description": {
        "en": "A watch, warning or advisory covering the house expired or was cancelled.",
        "fr": "Une veille, alerte ou un avis du NWS couvrant la maison a expiré ou a été annulé."
      },
      "fields": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, exactly as shown in Gladys. Leave empty for every house.",
            "fr": "Nom de la maison, exactement comme dans Gladys. Laissez vide pour toutes les maisons."
          },
          "required": false
        },
        {
          "key": "category",
          "type": "multi_select",
          "label": {
            "en": "Kind of alert",
            "fr": "Type d'alerte"
          },
          "description": {
            "en": "Leave empty for every kind.",
            "fr": "Laissez vide pour tous les types."
          },
          "required": false,
          "options": [
            {
              "value": "tornado",
              "label": {
                "en": "Tornado",
                "fr": "Tornade"
              }
            },
            {
              "value": "hurricane",
              "label": {
                "en": "Hurricane / tropical storm",
                "fr": "Ouragan / tempête tropicale"
              }
            },
            {
              "value": "thunderstorm",
              "label": {
                "en": "Severe thunderstorm",
                "fr": "Orage violent"
              }
            },
            {
              "value": "flood",
              "label": {
                "en": "Flood",
                "fr": "Inondation"
              }
            },
            {
              "value": "winter",
              "label": {
                "en": "Winter storm, snow, ice",
                "fr": "Tempête hivernale, neige, verglas"
              }
            },
            {
              "value": "cold",
              "label": {
                "en": "Cold, freeze, wind chill",
                "fr": "Froid, gel, refroidissement éolien"
              }
            },
            {
              "value": "heat",
              "label": {
                "en": "Heat",
                "fr": "Chaleur"
              }
            },
            {
              "value": "wind",
              "label": {
                "en": "Wind",
                "fr": "Vent"
              }
            },
            {
              "value": "fire",
              "label": {
                "en": "Fire weather (red flag)",
                "fr": "Risque d'incendie (red flag)"
              }
            },
            {
              "value": "fog",
              "label": {
                "en": "Fog",
                "fr": "Brouillard"
              }
            },
            {
              "value": "air",
              "label": {
                "en": "Air quality, smoke, dust",
                "fr": "Qualité de l'air, fumée, poussière"
              }
            },
            {
              "value": "marine",
              "label": {
                "en": "Marine, surf, rip currents",
                "fr": "Mer, houle, courants"
              }
            },
            {
              "value": "other",
              "label": {
                "en": "Other",
                "fr": "Autre"
              }
            }
          ]
        },
        {
          "key": "level",
          "type": "multi_select",
          "label": {
            "en": "Level",
            "fr": "Niveau"
          },
          "description": {
            "en": "Leave empty for every level. A Watch means conditions are favorable; a Warning means the hazard is happening or imminent.",
            "fr": "Laissez vide pour tous les niveaux. Une « Watch » signifie que les conditions sont réunies ; un « Warning » que le phénomène est en cours ou imminent."
          },
          "required": false,
          "options": [
            {
              "value": "warning",
              "label": {
                "en": "Warning (take action)",
                "fr": "Warning – alerte (agir)"
              }
            },
            {
              "value": "watch",
              "label": {
                "en": "Watch (be prepared)",
                "fr": "Watch – veille (se préparer)"
              }
            },
            {
              "value": "advisory",
              "label": {
                "en": "Advisory",
                "fr": "Advisory – avis"
              }
            },
            {
              "value": "statement",
              "label": {
                "en": "Statement",
                "fr": "Statement – bulletin"
              }
            },
            {
              "value": "other",
              "label": {
                "en": "Other notice",
                "fr": "Autre information"
              }
            }
          ]
        }
      ],
      "variables": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          }
        },
        {
          "key": "event",
          "type": "string",
          "label": {
            "en": "Event",
            "fr": "Événement"
          }
        },
        {
          "key": "category",
          "type": "string",
          "label": {
            "en": "Kind (key)",
            "fr": "Type (clé)"
          }
        },
        {
          "key": "category_label",
          "type": "string",
          "label": {
            "en": "Kind",
            "fr": "Type"
          }
        },
        {
          "key": "level",
          "type": "string",
          "label": {
            "en": "Level",
            "fr": "Niveau"
          }
        },
        {
          "key": "level_label",
          "type": "string",
          "label": {
            "en": "Level label",
            "fr": "Libellé du niveau"
          }
        },
        {
          "key": "severity",
          "type": "string",
          "label": {
            "en": "Severity",
            "fr": "Sévérité"
          }
        },
        {
          "key": "area",
          "type": "string",
          "label": {
            "en": "Area",
            "fr": "Zone"
          }
        },
        {
          "key": "summary",
          "type": "string",
          "label": {
            "en": "Summary",
            "fr": "Résumé"
          },
          "description": {
            "en": "A sentence ready to put in a message.",
            "fr": "Une phrase prête à mettre dans un message."
          }
        }
      ]
    }
  ],
  "scene_actions": [
    {
      "key": "get_alerts",
      "label": {
        "en": "Get the NWS alerts",
        "fr": "Obtenir les alertes NWS"
      },
      "description": {
        "en": "The watches, warnings and advisories in force at the house, the most serious first.",
        "fr": "Les veilles, alertes et avis en cours pour la maison, le plus grave en premier."
      },
      "timeout_seconds": 30,
      "fields": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, as shown in Gladys. Leave empty for the first house with a location.",
            "fr": "Nom de la maison, tel qu'affiché dans Gladys. Laissez vide pour la première maison localisée."
          },
          "required": false
        }
      ],
      "outputs": [
        {
          "key": "count",
          "type": "number",
          "label": {
            "en": "Number of alerts",
            "fr": "Nombre d'alertes"
          }
        },
        {
          "key": "has_alert",
          "type": "boolean",
          "label": {
            "en": "Alert in force",
            "fr": "Alerte en cours"
          }
        },
        {
          "key": "has_warning",
          "type": "boolean",
          "label": {
            "en": "Warning in force",
            "fr": "Warning en cours"
          }
        },
        {
          "key": "warnings",
          "type": "number",
          "label": {
            "en": "Warnings",
            "fr": "Warnings"
          }
        },
        {
          "key": "watches",
          "type": "number",
          "label": {
            "en": "Watches",
            "fr": "Watches"
          }
        },
        {
          "key": "advisories",
          "type": "number",
          "label": {
            "en": "Advisories",
            "fr": "Advisories"
          }
        },
        {
          "key": "events",
          "type": "string",
          "label": {
            "en": "Events",
            "fr": "Événements"
          }
        },
        {
          "key": "top_event",
          "type": "string",
          "label": {
            "en": "Most serious: event",
            "fr": "Plus grave : événement"
          }
        },
        {
          "key": "top_category",
          "type": "string",
          "label": {
            "en": "Most serious: kind (key)",
            "fr": "Plus grave : type (clé)"
          }
        },
        {
          "key": "top_category_label",
          "type": "string",
          "label": {
            "en": "Most serious: kind",
            "fr": "Plus grave : type"
          }
        },
        {
          "key": "top_level",
          "type": "string",
          "label": {
            "en": "Most serious: level",
            "fr": "Plus grave : niveau"
          }
        },
        {
          "key": "top_level_label",
          "type": "string",
          "label": {
            "en": "Most serious: level label",
            "fr": "Plus grave : libellé du niveau"
          }
        },
        {
          "key": "top_severity",
          "type": "string",
          "label": {
            "en": "Most serious: severity",
            "fr": "Plus grave : sévérité"
          }
        },
        {
          "key": "top_severity_label",
          "type": "string",
          "label": {
            "en": "Most serious: severity label",
            "fr": "Plus grave : libellé de la sévérité"
          }
        },
        {
          "key": "top_headline",
          "type": "string",
          "label": {
            "en": "Most serious: headline",
            "fr": "Plus grave : titre"
          }
        },
        {
          "key": "top_instruction",
          "type": "string",
          "label": {
            "en": "Most serious: instructions",
            "fr": "Plus grave : consignes"
          }
        },
        {
          "key": "top_ends",
          "type": "string",
          "label": {
            "en": "Most serious: end (local time)",
            "fr": "Plus grave : fin (heure locale)"
          }
        },
        {
          "key": "summary",
          "type": "string",
          "label": {
            "en": "Summary",
            "fr": "Résumé"
          },
          "description": {
            "en": "A sentence ready to put in a message.",
            "fr": "Une phrase prête à mettre dans un message."
          }
        }
      ]
    },
    {
      "key": "get_forecast",
      "label": {
        "en": "Get the NWS forecast of a day",
        "fr": "Obtenir la prévision NWS d'un jour"
      },
      "description": {
        "en": "High, low, sky, chance of rain and wind of one day, with the forecaster's text.",
        "fr": "Maximum, minimum, ciel, risque de pluie et vent d'une journée, avec le texte du prévisionniste."
      },
      "timeout_seconds": 30,
      "fields": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, as shown in Gladys. Leave empty for the first house with a location.",
            "fr": "Nom de la maison, tel qu'affiché dans Gladys. Laissez vide pour la première maison localisée."
          },
          "required": false
        },
        {
          "key": "day",
          "type": "select",
          "label": {
            "en": "Day",
            "fr": "Jour"
          },
          "required": false,
          "default": "0",
          "options": [
            {
              "value": "0",
              "label": {
                "en": "Today",
                "fr": "Aujourd'hui"
              }
            },
            {
              "value": "1",
              "label": {
                "en": "Tomorrow",
                "fr": "Demain"
              }
            },
            {
              "value": "2",
              "label": {
                "en": "In 2 days",
                "fr": "Dans 2 jours"
              }
            },
            {
              "value": "3",
              "label": {
                "en": "In 3 days",
                "fr": "Dans 3 jours"
              }
            },
            {
              "value": "4",
              "label": {
                "en": "In 4 days",
                "fr": "Dans 4 jours"
              }
            },
            {
              "value": "5",
              "label": {
                "en": "In 5 days",
                "fr": "Dans 5 jours"
              }
            },
            {
              "value": "6",
              "label": {
                "en": "In 6 days",
                "fr": "Dans 6 jours"
              }
            }
          ]
        }
      ],
      "outputs": [
        {
          "key": "date",
          "type": "string",
          "label": {
            "en": "Date (YYYY-MM-DD)",
            "fr": "Date (AAAA-MM-JJ)"
          }
        },
        {
          "key": "name",
          "type": "string",
          "label": {
            "en": "Period name",
            "fr": "Nom de la période"
          }
        },
        {
          "key": "condition",
          "type": "string",
          "label": {
            "en": "Sky (key)",
            "fr": "Ciel (clé)"
          }
        },
        {
          "key": "condition_label",
          "type": "string",
          "label": {
            "en": "Sky",
            "fr": "Ciel"
          }
        },
        {
          "key": "short_forecast",
          "type": "string",
          "label": {
            "en": "NWS short forecast",
            "fr": "Prévision courte NWS"
          }
        },
        {
          "key": "temperature_max",
          "type": "number",
          "label": {
            "en": "High",
            "fr": "Maximum"
          }
        },
        {
          "key": "temperature_min",
          "type": "number",
          "label": {
            "en": "Low",
            "fr": "Minimum"
          }
        },
        {
          "key": "precipitation_probability",
          "type": "number",
          "label": {
            "en": "Chance of rain (%)",
            "fr": "Risque de pluie (%)"
          }
        },
        {
          "key": "wind_speed",
          "type": "number",
          "label": {
            "en": "Wind (km/h or mph)",
            "fr": "Vent (km/h ou mph)"
          }
        },
        {
          "key": "wind_direction",
          "type": "string",
          "label": {
            "en": "Wind direction",
            "fr": "Direction du vent"
          }
        },
        {
          "key": "detailed_forecast",
          "type": "string",
          "label": {
            "en": "Forecast text, day (English)",
            "fr": "Texte de la prévision, jour (anglais)"
          }
        },
        {
          "key": "detailed_forecast_night",
          "type": "string",
          "label": {
            "en": "Forecast text, night (English)",
            "fr": "Texte de la prévision, nuit (anglais)"
          }
        },
        {
          "key": "summary",
          "type": "string",
          "label": {
            "en": "Summary",
            "fr": "Résumé"
          },
          "description": {
            "en": "A sentence ready to put in a message.",
            "fr": "Une phrase prête à mettre dans un message."
          }
        }
      ]
    },
    {
      "key": "get_current",
      "label": {
        "en": "Get the current NWS conditions",
        "fr": "Obtenir les conditions actuelles NWS"
      },
      "description": {
        "en": "The conditions measured at the nearest weather station, or forecast when it has not reported recently.",
        "fr": "Les conditions mesurées à la station météo la plus proche, ou prévues quand elle n'a rien transmis récemment."
      },
      "timeout_seconds": 30,
      "fields": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, as shown in Gladys. Leave empty for the first house with a location.",
            "fr": "Nom de la maison, tel qu'affiché dans Gladys. Laissez vide pour la première maison localisée."
          },
          "required": false
        }
      ],
      "outputs": [
        {
          "key": "temperature",
          "type": "number",
          "label": {
            "en": "Temperature",
            "fr": "Température"
          }
        },
        {
          "key": "apparent_temperature",
          "type": "number",
          "label": {
            "en": "Feels like",
            "fr": "Ressenti"
          }
        },
        {
          "key": "humidity",
          "type": "number",
          "label": {
            "en": "Humidity (%)",
            "fr": "Humidité (%)"
          }
        },
        {
          "key": "dew_point",
          "type": "number",
          "label": {
            "en": "Dew point",
            "fr": "Point de rosée"
          }
        },
        {
          "key": "pressure",
          "type": "number",
          "label": {
            "en": "Pressure (hPa)",
            "fr": "Pression (hPa)"
          }
        },
        {
          "key": "wind_speed",
          "type": "number",
          "label": {
            "en": "Wind (km/h or mph)",
            "fr": "Vent (km/h ou mph)"
          }
        },
        {
          "key": "wind_gust",
          "type": "number",
          "label": {
            "en": "Gusts (km/h or mph)",
            "fr": "Rafales (km/h ou mph)"
          }
        },
        {
          "key": "wind_direction",
          "type": "string",
          "label": {
            "en": "Wind direction",
            "fr": "Direction du vent"
          }
        },
        {
          "key": "visibility",
          "type": "number",
          "label": {
            "en": "Visibility (km or mi)",
            "fr": "Visibilité (km ou mi)"
          }
        },
        {
          "key": "condition",
          "type": "string",
          "label": {
            "en": "Sky (key)",
            "fr": "Ciel (clé)"
          }
        },
        {
          "key": "condition_label",
          "type": "string",
          "label": {
            "en": "Sky",
            "fr": "Ciel"
          }
        },
        {
          "key": "observed",
          "type": "boolean",
          "label": {
            "en": "Measured by a station",
            "fr": "Mesuré par une station"
          }
        },
        {
          "key": "station",
          "type": "string",
          "label": {
            "en": "Station",
            "fr": "Station"
          }
        },
        {
          "key": "observed_at",
          "type": "string",
          "label": {
            "en": "Observed at (local time)",
            "fr": "Relevé à (heure locale)"
          }
        },
        {
          "key": "summary",
          "type": "string",
          "label": {
            "en": "Summary",
            "fr": "Résumé"
          },
          "description": {
            "en": "A sentence ready to put in a message.",
            "fr": "Une phrase prête à mettre dans un message."
          }
        }
      ]
    }
  ],
  "widgets": [
    {
      "key": "alerts",
      "label": {
        "en": "NWS alerts",
        "fr": "Alertes NWS"
      },
      "description": {
        "en": "Watches, warnings and advisories in force, with their full text.",
        "fr": "Veilles, alertes et avis en cours, avec leur texte complet."
      },
      "icon": "alert-triangle",
      "settings": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, as shown in Gladys. Leave empty for the first house with a location.",
            "fr": "Nom de la maison, tel qu'affiché dans Gladys. Laissez vide pour la première maison localisée."
          },
          "required": false
        }
      ]
    },
    {
      "key": "forecast",
      "label": {
        "en": "NWS text forecast",
        "fr": "Prévision NWS détaillée"
      },
      "description": {
        "en": "The forecaster's narrative, period by period, with the NWS icons.",
        "fr": "Le texte du prévisionniste, période par période, avec les icônes NWS."
      },
      "icon": "file-text",
      "settings": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, as shown in Gladys. Leave empty for the first house with a location.",
            "fr": "Nom de la maison, tel qu'affiché dans Gladys. Laissez vide pour la première maison localisée."
          },
          "required": false
        },
        {
          "key": "show_icons",
          "type": "boolean",
          "label": {
            "en": "Show the icons",
            "fr": "Afficher les icônes"
          },
          "default": true
        }
      ]
    },
    {
      "key": "hourly",
      "label": {
        "en": "NWS next hours",
        "fr": "NWS heure par heure"
      },
      "description": {
        "en": "Temperature, chance of rain or wind of the next hours, as a curve.",
        "fr": "Température, risque de pluie ou vent des prochaines heures, en courbe."
      },
      "icon": "trending-up",
      "settings": [
        {
          "key": "house",
          "type": "string",
          "label": {
            "en": "House",
            "fr": "Maison"
          },
          "description": {
            "en": "Name of the house, as shown in Gladys. Leave empty for the first house with a location.",
            "fr": "Nom de la maison, tel qu'affiché dans Gladys. Laissez vide pour la première maison localisée."
          },
          "required": false
        },
        {
          "key": "metric",
          "type": "select",
          "label": {
            "en": "Show",
            "fr": "Afficher"
          },
          "default": "temperature",
          "options": [
            {
              "value": "temperature",
              "label": {
                "en": "Temperature and feels like",
                "fr": "Température et ressenti"
              }
            },
            {
              "value": "precipitation",
              "label": {
                "en": "Chance of rain",
                "fr": "Risque de pluie"
              }
            },
            {
              "value": "wind",
              "label": {
                "en": "Wind and gusts",
                "fr": "Vent et rafales"
              }
            }
          ]
        },
        {
          "key": "hours",
          "type": "select",
          "label": {
            "en": "Period",
            "fr": "Période"
          },
          "default": "24",
          "options": [
            {
              "value": "12",
              "label": {
                "en": "12 hours",
                "fr": "12 heures"
              }
            },
            {
              "value": "24",
              "label": {
                "en": "24 hours",
                "fr": "24 heures"
              }
            },
            {
              "value": "48",
              "label": {
                "en": "48 hours",
                "fr": "48 heures"
              }
            }
          ]
        }
      ]
    }
  ]
}

:united_states: Nouvelle intégration : National Weather Service (météo et alertes officielles aux États-Unis)

National Weather Service

Bonjour à tous,

Je vous présente une nouvelle intégration externe pour Gladys : National Weather Service (NWS), le service météo officiel des États-Unis. Elle fournit à Gladys les prévisions et surtout les alertes officielles (tornades, ouragans, orages violents, inondations, tempêtes de neige, canicules…).

Elle ne concerne que les maisons situées aux États-Unis et dans leurs territoires (Alaska, Hawaï, Porto Rico, Guam…). Pour une maison ailleurs, Gladys passe automatiquement au fournisseur météo suivant.

:white_check_mark: Aucune configuration

L’API du NWS est gratuite et sans clé : vous installez l’intégration et elle fonctionne tout de suite. Il suffit que la position de la maison soit renseignée dans ses réglages.

:sun_behind_small_cloud: Ce qu’elle apporte

  • Conditions actuelles mesurées par la station la plus proche : température, ressenti, humidité, point de rosée, pression, vent, rafales, visibilité.
  • Prévisions heure par heure sur 24 h et prévisions journalières sur 7 jours.
  • Lever et coucher du soleil.
  • Alertes officielles avec leur texte complet et les consignes de sécurité.

Tout cela alimente le widget météo du tableau de bord, l’assistant et les déclencheurs « Alerte météo » de Gladys.

:high_voltage: Des alertes en quelques secondes

Une Tornado Warning dure souvent 30 à 45 minutes, alors que Gladys vérifie les alertes météo toutes les 30 minutes. L’intégration surveille donc les alertes chaque minute (c’est réglable) et prévient Gladys dès qu’une alerte change. Votre scène se déclenche en quelques secondes.

Elle ajoute aussi deux déclencheurs dédiés, Alerte NWS émise et Fin d’une alerte NWS, avec des filtres :

  • type d’alerte : tornade, ouragan, orage violent, inondation, tempête hivernale, froid, chaleur, vent, incendie, brouillard, qualité de l’air, mer… ;
  • niveau, selon l’échelle américaine : Warning (agir maintenant), Watch (se préparer), Advisory, Statement ;
  • sévérité et maison.

L’intégration suit chaque alerte tout au long de sa vie :

  • une alerte prolongée ou mise à jour ne redéclenche pas la scène ;
  • une alerte qui monte de niveau (par exemple une Hurricane Watch qui devient Hurricane Warning) la redéclenche ;
  • une coupure brève de l’API ne termine pas l’alerte par erreur.

Exemple : Alerte NWS émise, type Tornade, niveau Warning → envoyer un message contenant les variables Résumé et Consignes.

:clapper_board: Actions de scène

  • Obtenir les alertes NWS : le nombre d’alertes, la plus grave, ses consignes.
  • Obtenir la prévision NWS d’un jour : de aujourd’hui à J+6, avec le texte du prévisionniste.
  • Obtenir les conditions actuelles NWS.

Chaque action renvoie une phrase Résumé prête à envoyer dans un message.

:bar_chart: Trois widgets

  • Alertes NWS : compteurs warnings / watches / avis, et le texte complet de chaque alerte. Le widget se met à jour dès qu’une alerte change, ce qui est pratique sur une tablette murale.
  • Prévision NWS détaillée : le texte du prévisionniste période par période, avec les icônes du NWS.
  • NWS heure par heure : une courbe sur 12, 24 ou 48 h, au choix pour la température et le ressenti, le risque de pluie, ou le vent et les rafales.

:gear: Réglages facultatifs

  • Email de contact : le NWS demande à chaque application de s’identifier, et cet email lui permet de vous prévenir plutôt que de bloquer votre accès.
  • Durée du cache (600 s par défaut).
  • Intervalle de vérification des alertes (60 s par défaut, de 30 à 900 s).

:information_source: Bon à savoir

  • Le NWS rédige ses textes en anglais uniquement : noms d’alertes, bulletins, textes des prévisionnistes. Tout le reste suit la langue de Gladys (français ou anglais).
  • Le NWS ne publie pas d’indice UV.
  • Le champ Maison doit contenir le nom de la maison exactement comme dans Gladys, majuscules comprises. Laissez-le vide pour toutes les maisons.
  • Il faut Gladys 5.1.1 ou plus récent.

:link: Liens

C’est la première version. Si vous habitez aux États-Unis, ou si vous voulez simplement l’essayer avec une maison placée là-bas, vos retours m’intéressent beaucoup, en particulier pendant un vrai épisode d’alertes :tornado: