source: spip-zone/_plugins_/rainette/trunk/inc/normaliser.php @ 96102

Last change on this file since 96102 was 96102, checked in by eric@…, 4 years ago

Correction de la page de démo pour les infos et les conditions.

  • Property svn:eol-style set to native
File size: 10.6 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7$GLOBALS['rainette_config']['infos'] = array(
8        // Lieu
9        'ville'          => array('origine' => 'service', 'type_php' => 'string'),
10        'pays'           => array('origine' => 'service', 'type_php' => 'string'),
11        'pays_iso2'      => array('origine' => 'service', 'type_php' => 'string'),
12        'region'         => array('origine' => 'service', 'type_php' => 'string'),
13        // Coordonnées
14        'longitude'      => array('origine' => 'service', 'type_php' => 'float'),
15        'latitude'       => array('origine' => 'service', 'type_php' => 'float'),
16        // Informations complémentaires
17        'max_previsions' => array('origine' => 'calcul', 'type_php' => 'int'),
18);
19
20$GLOBALS['rainette_config']['conditions'] = array(
21        // Données d'observation
22        'derniere_maj'          => array('origine' => 'service', 'type_php' => 'date'),
23        'station'               => array('origine' => 'service', 'type_php' => 'string'),
24        // Températures
25        'temperature_reelle'    => array('origine' => 'service', 'type_php' => 'float'),
26        'temperature_ressentie' => array('origine' => 'service', 'type_php' => 'float'),
27        // Données anémométriques
28        'vitesse_vent'          => array('origine' => 'service', 'type_php' => 'float'),
29        'angle_vent'            => array('origine' => 'service', 'type_php' => 'int'),
30        'direction_vent'        => array('origine' => 'service', 'type_php' => 'string'),
31        // Données atmosphériques
32        'precipitation'         => array('origine' => 'service', 'type_php' => 'float'),
33        'humidite'              => array('origine' => 'service', 'type_php' => 'int'),
34        'point_rosee'           => array('origine' => 'service', 'type_php' => 'int'),
35        'pression'              => array('origine' => 'service', 'type_php' => 'float'),
36        'tendance_pression'     => array('origine' => 'service', 'type_php' => 'string'),
37        'visibilite'            => array('origine' => 'service', 'type_php' => 'float'),
38        'indice_uv'             => array('origine' => 'service', 'type_php' => 'int'),
39        'risque_uv'             => array('origine' => 'calcul', 'type_php' => 'string'),
40        // Etats météorologiques natifs
41        'code_meteo'            => array('origine' => 'service', 'type_php' => 'string'),
42        'icon_meteo'            => array('origine' => 'service', 'type_php' => 'string'),
43        'desc_meteo'            => array('origine' => 'service', 'type_php' => 'string'),
44        // Etats météorologiques calculés
45        'resume'                => array('origine' => 'calcul', 'type_php' => 'mixed'),
46        'icone'                 => array('origine' => 'calcul', 'type_php' => 'mixed'),
47        'periode'               => array('origine' => 'calcul', 'type_php' => 'int'),
48);
49
50$GLOBALS['rainette_config']['previsions'] = array(
51        // Données d'observation
52        'date'                 => array('origine' => 'service', 'type_php' => 'date', 'rangement' => 'jour'),
53        'heure'                => array('origine' => 'service', 'type_php' => 'heure', 'rangement' => 'heure'),
54        // Données astronomiques
55        'lever_soleil'         => array('origine' => 'service', 'type_php' => 'date', 'rangement' => 'jour'),
56        'coucher_soleil'       => array('origine' => 'service', 'type_php' => 'date', 'rangement' => 'jour'),
57        // Températures
58        'temperature'          => array('origine' => 'service', 'type_php' => 'float', 'rangement' => 'heure'),
59        'temperature_max'      => array('origine' => 'service', 'type_php' => 'float', 'rangement' => 'jour'),
60        'temperature_min'      => array('origine' => 'service', 'type_php' => 'float', 'rangement' => 'jour'),
61        // Données anémométriques
62        'vitesse_vent'         => array('origine' => 'service', 'type_php' => 'float', 'rangement' => 'heure'),
63        'angle_vent'           => array('origine' => 'service', 'type_php' => 'int', 'rangement' => 'heure'),
64        'direction_vent'       => array('origine' => 'service', 'type_php' => 'string', 'rangement' => 'heure'),
65        // Données atmosphériques
66        'risque_precipitation' => array('origine' => 'service', 'type_php' => 'int', 'rangement' => 'heure'),
67        'precipitation'        => array('origine' => 'service', 'type_php' => 'float', 'rangement' => 'heure'),
68        'humidite'             => array('origine' => 'service', 'type_php' => 'int', 'rangement' => 'heure'),
69        'point_rosee'          => array('origine' => 'service', 'type_php' => 'int', 'rangement' => 'heure'),
70        'pression'             => array('origine' => 'service', 'type_php' => 'float', 'rangement' => 'heure'),
71        'visibilite'           => array('origine' => 'service', 'type_php' => 'float', 'rangement' => 'heure'),
72        'indice_uv'            => array('origine' => 'service', 'type_php' => 'int', 'rangement' => 'heure'),
73        'risque_uv'            => array('origine' => 'calcul', 'type_php' => 'string', 'rangement' => 'heure'),
74        // Etats météorologiques natifs
75        'code_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'rangement' => 'heure'),
76        'icon_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'rangement' => 'heure'),
77        'desc_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'rangement' => 'heure'),
78        // Etats météorologiques calculés
79        'icone'                => array('origine' => 'calcul', 'type_php' => 'mixed', 'rangement' => 'heure'),
80        'resume'               => array('origine' => 'calcul', 'type_php' => 'mixed', 'rangement' => 'heure'),
81        'periode'              => array('origine' => 'calcul', 'type_php' => 'int', 'rangement' => 'heure'),
82        // Informations complémentaires
83);
84
85$GLOBALS['rainette_config']['periodicite'] = array(
86        24 => array(24, 12),
87        12 => array(12),
88        1  => array(1,3,6)
89);
90
91
92
93/**
94 * @param $config_service
95 * @param $mode
96 * @param $flux
97 * @param $periode
98 *
99 * @return array
100 */
101function service2donnees($config_service, $mode, $flux, $periode) {
102        $tableau = array();
103
104        include_spip('inc/filtres');
105        if ($flux !== null) {
106                // Le service a renvoyé des données, on boucle sur les clés du tableau normalisé
107                // Néanmoins, en fonction de la période fournie en argument on filtre les données uniquement
108                // utiles à cette période.
109                foreach (array_keys($GLOBALS['rainette_config'][$mode]) as $_donnee) {
110                        if ((($periode == -1)
111                                and (empty($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'])
112                                        or ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'jour')))
113                        or (($periode > -1)     and ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'heure'))) {
114                                if ($GLOBALS['rainette_config'][$mode][$_donnee]['origine'] == 'service') {
115                                        // La donnée est fournie par le service. Elle n'est jamais calculée par le plugin
116                                        // Néanmoins, elle peut-être indisponible temporairement
117                                        if ($cle_service = $config_service['donnees'][$_donnee]['cle']) {
118                                                // La donnée est normalement fournie par le service car elle possède une configuration de clé
119                                                // On traite le cas où le nom de la clé varie suivant le système d'unité choisi.
120                                                // La clé de base peut être vide, le suffixe contenant dès lors toute la clé.
121                                                if (!empty($config_service['donnees'][$_donnee]['suffixe'])) {
122                                                        $systeme_unite = $config_service['unite'];
123                                                        $id_suffixee = $config_service['donnees'][$_donnee]['suffixe']['id_cle'];
124                                                        $cle_service[$id_suffixee] .= $config_service['donnees'][$_donnee]['suffixe'][$systeme_unite];
125                                                }
126
127                                                // On utilise donc la clé pour calculer la valeur du service.
128                                                // Si la valeur est disponible on la stocke sinon on met la donnée à chaine vide pour
129                                                // montrer l'indisponibilité temporaire.
130                                                $donnee = '';
131                                                $valeur_service = empty($cle_service)
132                                                        ? $flux
133                                                        : table_valeur($flux, implode('/', $cle_service), '');
134                                                if ($valeur_service !== '') {
135                                                        $typer = donnee2typage($mode, $_donnee);
136                                                        $donnee = $typer($valeur_service);
137                                                }
138                                        } else {
139                                                // La donnée météo n'est jamais fournie par le service. On la positionne à null pour
140                                                // la distinguer avec une donnée vide car indisponible temporairement.
141                                                $donnee = null;
142                                        }
143                                } else {
144                                        // La données météo est toujours calculée à posteriori par le plugin indépendamment
145                                        // du service. On l'initialise temporairement à la chaine vide.
146                                        $donnee = '';
147                                }
148
149                                $tableau[$_donnee] = $donnee;
150                        }
151                }
152        }
153
154        return $tableau;
155}
156
157
158/**
159 * @param $mode
160 * @param $donnee
161 *
162 * @return string
163 */
164function donnee2typage($mode, $donnee) {
165        $fonction = '';
166
167        $type_php = isset($GLOBALS['rainette_config'][$mode][$donnee]['type_php'])
168                ? $GLOBALS['rainette_config'][$mode][$donnee]['type_php']
169                : '';
170        if ($type_php) {
171                switch ($type_php) {
172                        case 'float':
173                                $fonction = 'floatval';
174                                break;
175                        case 'int':
176                                $fonction = 'intval';
177                                break;
178                        case 'string':
179                                $fonction = 'strval';
180                                break;
181                        case 'date':
182                                $fonction = 'donnee2date';
183                                break;
184                        case 'heure':
185                                $fonction = 'donnee2heure';
186                                break;
187                        default:
188                                $fonction = '';
189                }
190        }
191
192        return $fonction;
193}
194
195
196/**
197 * @param $donnee
198 *
199 * @return string
200 */
201function donnee2date($donnee) {
202        if (is_numeric($donnee)) {
203                $date = date('Y-m-d H:i:s', $donnee);
204        } else {
205                $date = date_create($donnee);
206                if (!$date) {
207                        $elements_date = explode(' ', $donnee);
208                        array_pop($elements_date);
209                        $donnee = implode(' ', $elements_date);
210                        $date = date_create($donnee);
211                }
212                $date = date_format($date, 'Y-m-d H:i:s');
213        }
214
215        return $date;
216}
217
218/**
219 * @param $donnee
220 *
221 * @return string
222 */
223function donnee2heure($donnee) {
224        if (is_numeric($donnee)) {
225                $taille = strlen($donnee);
226                if ($taille < 3) {
227                        $m = '00';
228                        $h = $donnee;
229                } else {
230                        $m = substr($donnee, -2);
231                        $h = strlen($donnee) == 3
232                                ? substr($donnee, 0, 1)
233                                : substr($donnee, 0, 2);
234                }
235                $heure = "${h}:${m}";
236        } else {
237                $heure = $donnee;
238        }
239
240        return $heure;
241}
242
243function trouver_periodicite($type_modele, $service) {
244
245        // Périodicité initialisée à "non trouvée"
246        $periodicite = 0;
247
248        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])) {
249                // Acquérir la configuration statique du service pour connaitre les périodicités horaires supportées
250                // pour le mode prévisions
251                include_spip("services/${service}");
252                $configurer = "${service}_service2configuration";
253                $configuration = $configurer('previsions');
254                $periodicites_service = array_keys($configuration['periodicites']);
255
256                $periodicites_modele = $GLOBALS['rainette_config']['periodicite'][$type_modele];
257                foreach ($periodicites_modele as $_periodicite_modele) {
258                        if (in_array($_periodicite_modele, $periodicites_service)) {
259                                $periodicite = $_periodicite_modele;
260                                break;
261                        }
262                }
263        }
264
265        return $periodicite;
266}
267
268
269function periodicite_compatible($type_modele, $periodicite) {
270
271        // Périodicité initialisée à "non trouvée"
272        $compatible = false;
273
274        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])
275        and in_array($periodicite, $GLOBALS['rainette_config']['periodicite'][$type_modele])) {
276                $compatible = true;
277        }
278
279        return $compatible;
280}
281
Note: See TracBrowser for help on using the repository browser.