From 38852197134a1921a366de68f3e5cd6a0bc0a9c0 Mon Sep 17 00:00:00 2001 From: Nadz Mangandog <61860661+nadzpogi@users.noreply.github.com> Date: Fri, 17 Jan 2025 19:50:23 +0800 Subject: [PATCH] National Weather Service (NWS) module for Emergency Alerts (#2859) relates to xibosignageltd/xibo-private#902 --- ...al_weather_service_connector_migration.php | 41 ++ .../NationalWeatherServiceConnector.php | 389 ++++++++++++++++++ modules/national-weather-service.xml | 187 +++++++++ ...ational-weather-service-form-settings.twig | 42 ++ web/theme/default/img/connectors/xibo-nws.png | Bin 0 -> 43329 bytes 5 files changed, 659 insertions(+) create mode 100644 db/migrations/20250115120000_add_national_weather_service_connector_migration.php create mode 100644 lib/Connector/NationalWeatherServiceConnector.php create mode 100644 modules/national-weather-service.xml create mode 100644 views/national-weather-service-form-settings.twig create mode 100644 web/theme/default/img/connectors/xibo-nws.png diff --git a/db/migrations/20250115120000_add_national_weather_service_connector_migration.php b/db/migrations/20250115120000_add_national_weather_service_connector_migration.php new file mode 100644 index 0000000000..f3ac48a55b --- /dev/null +++ b/db/migrations/20250115120000_add_national_weather_service_connector_migration.php @@ -0,0 +1,41 @@ +. + */ + +use Phinx\Migration\AbstractMigration; + +/** + * Add a new connector (National Weather Service - NWS) to connectors table + * @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace + */ +class AddNationalWeatherServiceConnectorMigration extends AbstractMigration +{ + public function change() + { + $this->table('connectors') + ->insert([ + 'className' => '\\Xibo\\Connector\\NationalWeatherServiceConnector', + 'isEnabled' => 0, + 'isVisible' => 1 + ]) + ->save(); + } +} diff --git a/lib/Connector/NationalWeatherServiceConnector.php b/lib/Connector/NationalWeatherServiceConnector.php new file mode 100644 index 0000000000..4505d1ad38 --- /dev/null +++ b/lib/Connector/NationalWeatherServiceConnector.php @@ -0,0 +1,389 @@ +. + */ + +namespace Xibo\Connector; + +use Carbon\Carbon; +use DOMDocument; +use DOMElement; +use Exception; +use GuzzleHttp\Exception\GuzzleException; +use GuzzleHttp\Exception\RequestException; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; +use Psr\Container\NotFoundExceptionInterface; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Xibo\Event\WidgetDataRequestEvent; +use Xibo\Factory\DisplayFactory; +use Xibo\Support\Sanitizer\SanitizerInterface; +use Xibo\Widget\Provider\DataProviderInterface; +use Xibo\XMR\ScheduleCriteriaUpdateAction; + +/** + * A connector to process National Weather Alert (NWS) - Atom feed data + */ +class NationalWeatherServiceConnector implements ConnectorInterface, EmergencyAlertInterface +{ + use ConnectorTrait; + + /** @var DOMDocument */ + protected DOMDocument $atomFeedXML; + + /** @var DOMElement */ + protected DOMElement $feedNode; + + /** @var DOMElement */ + protected DOMElement $entryNode; + + /** @var DisplayFactory */ + private DisplayFactory $displayFactory; + + /** + * @param ContainerInterface $container + * @return ConnectorInterface + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function setFactories(ContainerInterface $container): ConnectorInterface + { + $this->displayFactory = $container->get('displayFactory'); + return $this; + } + + public function registerWithDispatcher(EventDispatcherInterface $dispatcher): ConnectorInterface + { + $dispatcher->addListener(WidgetDataRequestEvent::$NAME, [$this, 'onDataRequest']); + return $this; + } + + public function getSourceName(): string + { + return 'national-weather-service-connector'; + } + + public function getTitle(): string + { + return 'National Weather Service Connector'; + } + + public function getDescription(): string + { + return 'National Weather Service (NWS)'; + } + + public function getThumbnail(): string + { + return 'theme/default/img/connectors/xibo-nws.png'; + } + + public function getSettingsFormTwig(): string + { + return 'national-weather-service-form-settings'; + } + + public function processSettingsForm(SanitizerInterface $params, array $settings): array + { + if (!$this->isProviderSetting('atomFeedUri')) { + $settings['atomFeedUri'] = $params->getString('atomFeedUri'); + } + return $settings; + } + + /** + * If the requested dataSource is national-weather-service, get the data, process it and add to dataProvider + * + * @param WidgetDataRequestEvent $event + * @return void + * @throws GuzzleException + */ + public function onDataRequest(WidgetDataRequestEvent $event): void + { + if ($event->getDataProvider()->getDataSource() === 'national-weather-service') { + if (empty($this->getSetting('atomFeedUri'))) { + $this->getLogger()->debug('onDataRequest: National Weather Service Connector not configured.'); + return; + } + + $event->stopPropagation(); + + try { + // Set cache expiry date to 3 minutes from now + $cacheExpire = Carbon::now()->addMinutes(3); + + // Fetch the Atom Feed XML content + $xmlContent = $this->getFeedFromUrl($event->getDataProvider(), $cacheExpire); + + // Initialize DOMDocument and load the XML content + $this->atomFeedXML = new DOMDocument(); + $this->atomFeedXML->loadXML($xmlContent); + + // Ensure the root element is + $feedNode = $this->atomFeedXML->getElementsByTagName('feed')->item(0); + if ($feedNode instanceof DOMElement) { + $this->feedNode = $feedNode; + } else { + throw new \Exception('The root element is missing.'); + } + + // Get all nodes within the element + $entryNodes = $this->feedNode->getElementsByTagName('entry'); + + // Are there any? + if ($entryNodes->length) { + // Process and initialize Atom Feed data + $this->processAtomFeedData($event->getDataProvider()); + + // Initialize update interval + $updateIntervalMinute = $event->getDataProvider()->getProperty('updateInterval'); + + // Convert the $updateIntervalMinute to seconds + $updateInterval = $updateIntervalMinute * 60; + + // If we've got data, then set our cache period. + $event->getDataProvider()->setCacheTtl($updateInterval); + $event->getDataProvider()->setIsHandled(); + + // Define priority arrays for status (higher priority = lower index) + $statusPriority = ['Actual', 'Exercise', 'System', 'Test', 'Draft']; + + $highestStatus = null; + + // Iterate through each node to find the highest-priority status + foreach ($entryNodes as $entryNode) { + $this->entryNode = $entryNode; + + // Get the status for the current entry + $entryStatus = $this->getEntryData('status'); + + // Check if the current status has a higher priority + if ($entryStatus !== null && ( + $highestStatus === null || + array_search($entryStatus, $statusPriority) < array_search($highestStatus, $statusPriority) + )) { + $highestStatus = $entryStatus; + } + } + + $capStatus = $highestStatus; + $category = 'Met'; + } else { + $capStatus = 'No Alerts'; + $category = ''; + $event->getDataProvider()->addError(__('No alerts are available for the selected area at the + moment.')); + } + + // initialize status for schedule criteria push message + if ($capStatus == 'Actual') { + $status = self::ACTUAL_ALERT; + } elseif ($capStatus == 'No Alerts') { + $status = self::NO_ALERT; + } else { + $status = self::TEST_ALERT; + } + + $this->getLogger()->debug('Schedule criteria push message: status = ' . $status + . ', category = ' . $category); + + // Set schedule criteria update + $action = new ScheduleCriteriaUpdateAction(); + $action->setCriteriaUpdates([ + 'isNwsActive' => 1, + 'emergency_alert_status' => $status, + 'emergency_alert_category' => $category + ]); + + // Initialize the display + $displayId = $event->getDataProvider()->getDisplayId(); + $display = $this->displayFactory->getById($displayId); + + // Criteria push message + $this->getPlayerActionService()->sendAction($display, $action); + } catch (Exception $exception) { + $this->getLogger() + ->error('onDataRequest: Failed to get results. e = ' . $exception->getMessage()); + } + } + } + + /** + * Get and process the NWS Atom Feed data + * + * @throws Exception + */ + private function processAtomFeedData(DataProviderInterface $dataProvider): void + { + // Array to store configuration data + $config = []; + + // Initialize configuration data + $config['status'] = $dataProvider->getProperty('status'); + $config['msgType'] = $dataProvider->getProperty('msgType'); + $config['urgency'] = $dataProvider->getProperty('urgency'); + $config['severity'] = $dataProvider->getProperty('severity'); + $config['certainty'] = $dataProvider->getProperty('certainty'); + + // Get all nodes within the element + $entryNodes = $this->feedNode->getElementsByTagName('entry'); + + // Iterate through each node + foreach ($entryNodes as $entryNode) { + $this->entryNode = $entryNode; + + // Retrieve specific values from the CAP XML for filtering + $status = $this->getEntryData('status'); + $msgType = $this->getEntryData('msgType'); + $urgency = $this->getEntryData('urgency'); + $severity = $this->getEntryData('severity'); + $certainty = $this->getEntryData('certainty'); + + // Check if the retrieved CAP data matches the configuration filters + if (!$this->matchesFilter($status, $config['status']) || + !$this->matchesFilter($msgType, $config['msgType']) || + !$this->matchesFilter($urgency, $config['urgency']) || + !$this->matchesFilter($severity, $config['severity']) || + !$this->matchesFilter($certainty, $config['certainty']) + ) { + continue; + } + + // Array to store CAP values + $cap = []; + + // Initialize CAP values + $cap['source'] = $this->getEntryData('source'); + $cap['note'] = $this->getEntryData('note'); + $cap['event'] = $this->getEntryData('event'); + $cap['urgency'] = $this->getEntryData('urgency'); + $cap['severity'] = $this->getEntryData('severity'); + $cap['certainty'] = $this->getEntryData('certainty'); + $cap['dateTimeEffective'] = $this->getEntryData('effective'); + $cap['dateTimeOnset'] = $this->getEntryData('onset'); + $cap['dateTimeExpires'] = $this->getEntryData('expires'); + $cap['headline'] = $this->getEntryData('headline'); + $cap['description'] = $this->getEntryData('summary'); + $cap['instruction'] = $this->getEntryData('instruction'); + $cap['contact'] = $this->getEntryData('contact'); + $cap['areaDesc'] = $this->getEntryData('areaDesc'); + + // Add CAP data to data provider + $dataProvider->addItem($cap); + } + } + + + /** + * Fetches the National Weather Service's Atom Feed XML data from the Atom Feed URL provided by the connector. + * + * @param DataProviderInterface $dataProvider + * @param Carbon $cacheExpiresAt + * + * @return string|null + * @throws GuzzleException + */ + private function getFeedFromUrl(DataProviderInterface $dataProvider, Carbon $cacheExpiresAt): string|null + { + $atomFeedUri = $this->getSetting('atomFeedUri'); + $area = $dataProvider->getProperty('area'); + + // Construct the Atom feed url + if (empty($area)) { + $url = $atomFeedUri; + } else { + $url = $atomFeedUri . '?area=' . $area; + } + + $cache = $this->pool->getItem('/national-weather-service/alerts/' . md5($url)); + $data = $cache->get(); + + if ($cache->isMiss()) { + $cache->lock(); + $this->getLogger()->debug('Getting alerts from National Weather Service Atom feed'); + + $httpOptions = [ + 'timeout' => 20, // Wait no more than 20 seconds + ]; + + try { + // Make a GET request to the Atom Feed URL using Guzzle HTTP client with defined options + $response = $dataProvider + ->getGuzzleClient($httpOptions) + ->get($url); + + $this->getLogger()->debug('NWS Atom Feed uri: ' . $url . ' httpOptions: ' + . json_encode($httpOptions)); + + // Get the response body as a string + $data = $response->getBody()->getContents(); + + // Cache + $cache->set($data); + $cache->expiresAt($cacheExpiresAt); + $this->pool->saveDeferred($cache); + } catch (RequestException $e) { + // Log the error with a message specific to NWS Alert data fetching + $this->getLogger()->error('Unable to reach the NWS Atom feed URL: ' + . $url . ' Error: ' . $e->getMessage()); + + // Throw a more specific exception message + $dataProvider->addError(__('Failed to retrieve NWS alerts from specified Atom Feed URL.')); + } + } else { + $this->getLogger()->debug('Getting NWS Alert data from cache'); + } + + return $data; + } + + /** + * Get the value of a specified tag from the current node. + * + * @param string $tagName + * @return string|null + */ + private function getEntryData(string $tagName): ?string + { + // Ensure the tag exists within the provided node + $node = $this->entryNode->getElementsByTagName($tagName)->item(0); + + // Return the node value if the node exists, otherwise return an empty string + return $node ? $node->nodeValue : ''; + } + + /** + * Check if the value of XML element matches the expected filter value. + * + * @param string $actualValue + * @param string $expectedValue + * + * @return bool + */ + private function matchesFilter(string $actualValue, string $expectedValue): bool + { + // If the expected value is 'Any' (empty string) or matches the actual value, the filter passes + if (empty($expectedValue) || $expectedValue == $actualValue) { + return true; + } + + return false; + } +} diff --git a/modules/national-weather-service.xml b/modules/national-weather-service.xml new file mode 100644 index 0000000000..2da1a31481 --- /dev/null +++ b/modules/national-weather-service.xml @@ -0,0 +1,187 @@ + + + core-national-weather-service + National Weather Service + Core + A module for displaying weather alert elements based on National Weather Service's Atom feed + fa fa-exclamation-circle + + %area%_%status%_%msgType%_%urgency%_%severity%_%certainty% + national-weather-service + emergency-alert + 1 + 1 + 1 + html + 60 + + + + Filter by Area + Only show Emergency Alerts in this layout if the status matches the selected option. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Filter by Status + Only show Emergency Alerts in this layout if the status matches the selected option. + + + + + + + + + + + + Filter by Message Type + Only show Emergency Alerts in this layout if the message type matches the selected option. + + + + + + + + + + + + Filter by Urgency + Only show Emergency Alerts in this layout if the urgency matches the selected option. + + + + + + + + + + + + Filter by Severity + Only show Emergency Alerts in this layout if the severity matches the selected option. + + + + + + + + + + + + Filter by certainty + Only show Emergency Alerts in this layout if the certainty matches the selected option. + + + + + + + + + + + + Update Interval (mins) + Please enter the update interval in minutes. This should be kept as high as possible. For example, if the data will only change once per hour this could be set to 60. + 1 + + + + + + + + + + + + + diff --git a/views/national-weather-service-form-settings.twig b/views/national-weather-service-form-settings.twig new file mode 100644 index 0000000000..919c28ae74 --- /dev/null +++ b/views/national-weather-service-form-settings.twig @@ -0,0 +1,42 @@ +{# +/** + * Copyright (C) 2025 Xibo Signage Ltd + * + * Xibo - Digital Signage - http://www.xibo.org.uk + * + * This file is part of Xibo. + * + * Xibo is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * Xibo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Xibo. If not, see . + */ +#} + +{% extends "connector-form-edit.twig" %} +{% import "forms.twig" as forms %} + +{% block connectorFormFields %} +

National Weather Service

+

Access real-time weather alerts provided by the National Weather Service (NWS).

+

The data includes weather warnings, watches, and advisories delivered in Atom feed format.

+

Weather alert data is sourced directly from the National Weather Service.

+ + {% if interface.isProviderSetting("atomFeedUri") %} +

{{ "Your platform provider has configured this connector for you."|trans }}

+ {% else %} + {% set title %}{% trans "NWS Atom Feed URL" %}{% endset %} + {% set helpText %}{% trans "This is the default URL for the NWS Atom Feed. You can update + it if the URL changes in the future." %}{% endset %} + {{ forms.input("atomFeedUri", title, interface.getSetting("atomFeedUri", + "https://api.weather.gov/alerts/active.atom"), helpText) }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/web/theme/default/img/connectors/xibo-nws.png b/web/theme/default/img/connectors/xibo-nws.png new file mode 100644 index 0000000000000000000000000000000000000000..93ab07a997d598c99f8a471bba16880aa8048240 GIT binary patch literal 43329 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 CGbri+ literal 0 HcmV?d00001