Created
March 16, 2018 15:11
-
-
Save RaphaelChochon/d686e9c6573fd19f39c5cb6553358ba5 to your computer and use it in GitHub Desktop.
Génération d'un fichier texte pour l'intégration d'une station météo (Davis VP2) sous Weewx et MySQL au réseau de l'association ROMMA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* Script permettant de générer un fichier texte selon les recommandations de l'association ROMMA | |
* (Réseau d'Observation Météo du Massif Alpin) pour une intégration à leur réseau d'une station | |
* météo (Davis VP2) fonctionnant sous le logiciel WEEWX sur une base de données MySQL. | |
* | |
* Dérivé d'un script issu du travail de XavierJ du forum d'Infoclimat et | |
* disponible ici : https://github.com/xavfmp/meteo | |
* Fonction pour la moyenne d'angles : https://gist.github.com/carloscabo/96e70853f1bb6b6a4d33e4c5c90c6cbb | |
* Fonction pour l'angle cardinal : https://gist.github.com/smallindine/d227743c28418f3426ed36b8969ded1a | |
* | |
* Repris modifié et adapté par Raphael CHOCHON pour l'association Nice Météo 06 | |
* https://meteo06.fr https://nice-pessicart.meteo06.fr http://romma.fr/station_24.php?id=136 | |
*/ | |
/* | |
* Parametres de connexion à la base de données Weewx | |
*/ | |
$db_host='host'; | |
$db_user='user'; | |
$db_pass='pass'; | |
$db_name='weewx'; | |
$db_table='archive'; | |
/* | |
* Informations relatives à la station | |
*/ | |
$id_station = "ID"; | |
$lieu = ""; | |
$secteur = ""; | |
$altitude = ""; | |
$longitude = ""; | |
$latitude = ""; | |
$responsable = ""; | |
$logiciel = "Weewx - Script Meteo06 V2"; | |
/* | |
* Ne plus rien changer ci-dessous | |
*/ | |
$con = mysqli_connect($db_host,$db_user,$db_pass,$db_name); | |
$sql="SELECT max(dateTime) FROM $db_name.$db_table"; | |
$query=$con->query($sql); | |
$list=mysqli_fetch_array($query); | |
$stop=$list[0]; | |
$minutes10=$stop-(600); | |
// Requete et récupération de la dernière ligne de la BDD | |
$sql="SELECT * FROM $db_name.$db_table ORDER BY dateTime desc limit 1;"; | |
$query=$con->query($sql); | |
$row = mysqli_fetch_row($query); | |
// Etablissement de la date et l'heure du dernier relevé de la station disponible | |
// en base de données et qui servira d'heure inscrite dans le fichier TXT | |
$dateTime = $row[0]; | |
$date=date('d/m/Y',$dateTime); | |
$heure=date('H:i',$dateTime); | |
// Récupération des conditions actuelles et vérification que les valeurs | |
// ne soit pas NULL avant d'en faire une moyenne (évite les erreurs ou incohérences) | |
// pression | |
$pression_check = $row[3]; | |
if ($pression_check == null){ | |
$pression = ''; | |
}else{ | |
$pression = round($row[3],1); | |
} | |
// temperature | |
$temp_check = $row[7]; | |
if ($temp_check == null){ | |
$temp = ''; | |
}else{ | |
$temp = round($row[7],1); | |
} | |
// hygro | |
$hygro_check = $row[9]; | |
if ($hygro_check == null){ | |
$hygro = ''; | |
}else{ | |
$hygro = round($row[9],1); | |
} | |
// vent moyen | |
$wind_check = $row[10]; | |
if ($wind_check == null){ | |
$vent = ''; | |
}else{ | |
$vent = round($row[10],1); | |
} | |
// intensite pluie | |
$rainrate_check = $row[14]; | |
if ($rainrate_check == null){ | |
$rainrate = ''; | |
}else{ | |
$rainrate = round($row[14]*10,1); | |
} | |
// rosee | |
$dewpoint_check = $row[16]; | |
if($dewpoint_check == null){ | |
$rose = ''; | |
}else{ | |
$rose = round($row[16],1); | |
} | |
// refroidissement eolien - windchill | |
$windchill_check = $row[17]; | |
if ($windchill_check == null){ | |
$windchill = ''; | |
}else{ | |
$windchill = round($row[17],1); | |
} | |
// indice de chaleur - heatindex | |
$heatindex_check = $row[18]; | |
if ($heatindex_check == null){ | |
$heatindex = ''; | |
}else{ | |
$heatindex = round($row[18],1); | |
} | |
// rayonnement solaire | |
$radiation_check = $row[20]; | |
if ($radiation_check == null){ | |
$solar = ''; | |
}else{ | |
$solar = $row[20]; | |
} | |
// rayonnement UV | |
$uv_check = $row[21]; | |
if($row[21]== null){ | |
$uv = ''; | |
}else{ | |
$uv = $row[21]; | |
} | |
// Calcul du cumul de pluie de la journee (depuis 00h) | |
$today = strtotime('today midnight'); | |
$sql = "SELECT sum(rain) FROM $db_name.$db_table WHERE dateTime>'$today';"; | |
$rain = $con->query($sql); | |
$he = mysqli_fetch_row($rain); | |
$cumul = round($he[0]*10,1); | |
// Récupération de la température maximale et minimale dans la table `_day_` | |
$sql = "SELECT * FROM ".$db_table."_day_outTemp ORDER BY dateTime DESC limit 1;"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$mintemptime = date('H:i',$row[2]); | |
$mintemp = round($row[1],1); | |
$maxtemp = round($row[3],1); | |
$maxtemptime = date('H:i',$row[4]); | |
// Récupération de la pression maximale et minimale dans la table `_day_` | |
$sql = "SELECT * FROM ".$db_table."_day_barometer ORDER BY dateTime DESC limit 1;"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$minbarotime = date('H:i',$row[2]); | |
$minbaro = round($row[1],1); | |
$maxbaro = round($row[3],1); | |
$maxbarotime = date('H:i',$row[4]); | |
// Récupération et calcul de la vitesse moyenne du vent moyen des 10 dernières minutes | |
$sql = "SELECT AVG(windSpeed) FROM $db_name.$db_table WHERE dateTime>='$minutes10' AND dateTime <= '$stop';"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$avg_wind_10 = round($row[0],1); | |
/* | |
* Récupération et calcul de la moyenne de la direction du vent | |
*/ | |
// Dans un premier temps, on définit une fonction qui permettra de calculer | |
// la moyenne de plusieurs angles en degrées | |
function mean_of_angles( $angles, $degrees = true ) { | |
if ( $degrees ) { | |
$angles = array_map("deg2rad", $angles); // Convert to radians | |
} | |
$s_ = 0; | |
$c_ = 0; | |
$len = count( $angles ); | |
for ($i = 0; $i < $len; $i++) { | |
$s_ += sin( $angles[$i] ); | |
$c_ += cos( $angles[$i] ); | |
} | |
// $s_ /= $len; | |
// $c_ /= $len; | |
$mean = atan2( $s_, $c_ ); | |
if ( $degrees ) { | |
$mean = rad2deg( $mean ); // Convert to degrees | |
} | |
if ($mean < 0) { | |
$mean_ok = $mean + 360; | |
} else { | |
$mean_ok = $mean; | |
} | |
return $mean_ok; | |
} | |
// Maintenant, on définit une fonction qui servira à nous donner | |
// la position cardinale du vent (en texte plutôt qu'en degrés) | |
function wind_cardinals($deg) { | |
$cardinalDirections = array( | |
'N' => array(348.75, 361), | |
'N2' => array(0, 11.25), | |
'NNE' => array(11.25, 33.75), | |
'NE' => array(33.75, 56.25), | |
'ENE' => array(56.25, 78.75), | |
'E' => array(78.75, 101.25), | |
'ESE' => array(101.25, 123.75), | |
'SE' => array(123.75, 146.25), | |
'SSE' => array(146.25, 168.75), | |
'S' => array(168.75, 191.25), | |
'SSW' => array(191.25, 213.75), | |
'SW' => array(213.75, 236.25), | |
'WSW' => array(236.25, 258.75), | |
'W' => array(258.75, 281.25), | |
'WNW' => array(281.25, 303.75), | |
'NW' => array(303.75, 326.25), | |
'NNW' => array(326.25, 348.75) | |
); | |
foreach ($cardinalDirections as $dir => $angles) { | |
if ($deg >= $angles[0] && $deg < $angles[1]) { | |
$cardinal = str_replace("2", "", $dir); | |
} | |
} | |
return $cardinal; | |
}; | |
// Récupération des valeurs de direction du vent moyen des 10 dernières minutes | |
$sql = "SELECT windDir FROM $db_name.$db_table WHERE dateTime>='$minutes10' AND dateTime <= '$stop';"; | |
// Requete + mise en tableau de la réponse | |
$windDirArray = array(); | |
foreach ($con->query($sql) as $row) { | |
// le `!is_null` permet de vérifier qu'il n'y est pas de valeur NULL dans le calcul | |
// sinon c'était pris en comme une direction à 0 degrés | |
if (!is_null ($row['windDir'])) { | |
$windDirArray[] = $row['windDir']; | |
} | |
} | |
// Calcul de la moyenne avec la fonction `mean_of_angles` et le tableau | |
$avg_windDir_10 = mean_of_angles($windDirArray); | |
// Maintenant on vérifie que la moyenne ne soit pas NULL | |
// si elle est NULL ou si la chaine est vide, on renvoie une chaine vide | |
// sinon on execute la fonction pour la convertir en position cardinale | |
$avg_windDir_10_check = $avg_windDir_10; | |
if ($avg_windDir_10_check == null){ | |
$cardinalDir = ''; | |
}else if($avg_windDir_10_check == ''){ | |
$cardinalDir = ''; | |
} | |
else{ | |
$cardinalDir = wind_cardinals($avg_windDir_10); | |
} | |
/* | |
* FIN DE CALCUL DE LA DIRECTION DU VENT | |
*/ | |
// Récupération de la rafale maximale sur les 10 dernières minutes | |
$sql = "SELECT max(windGust) FROM $db_name.$db_table WHERE dateTime>'$minutes10';"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$max_windGust_10 = round($row[0],1); | |
// Récupération de la rafale maximale de la journée dans la table `_day_` | |
$sql = "SELECT * FROM ".$db_table."_day_windGust ORDER BY dateTime DESC limit 1;"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$max_windGust_day = round($row[3],1); | |
$max_windGust_day_time = date('H:i',$row[4]); | |
// Récupération du rayonnement solaire maximal de la journée dans la table `_day_` | |
$sql = "SELECT * FROM ".$db_table."_day_radiation ORDER BY dateTime DESC limit 1;"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$maxsolar = round($row[3],1); | |
$maxsolartime = date('H:i',$row[4]); | |
// Récupération de l'hygrométrie maximale et minimale de la journée dans la table `_day_` | |
$sql = "SELECT * FROM ".$db_table."_day_outHumidity ORDER BY dateTime DESC LIMIT 1;"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$minhygrotime = date('H:i',$row[2]); | |
$minhygro = round($row[1],1); | |
$maxhygro = round($row[3],1); | |
$maxhygrotime = date('H:i',$row[4]); | |
// Récupération de l'intensite maximale de précipitations de la journée dans la table `_day_` | |
$sql = "SELECT * FROM $db_name.archive_day_rainRate ORDER BY dateTime DESC LIMIT 1;"; | |
$res = $con->query($sql); | |
$row = mysqli_fetch_row($res); | |
$hiRainRateToday = round($row[3]*10,1); | |
$hiRainRateTodayTime = date('H:i',$row[4]); | |
// Création du fichier | |
$romma_txt= | |
"# INFORMATIONS #\n" | |
."id_station=$id_station\n" | |
."lieu=$lieu\n" | |
."secteur=$secteur\n" | |
."altitude=$altitude\n" | |
."longitude=$longitude\n" | |
."latitude=$latitude\n" | |
."responsable=$responsable\n" | |
."vws_version=$logiciel\n" | |
."# PARAMETRES TEMPS REEL #\n" | |
."date=$date\n" | |
."heure=$heure\n" | |
."temperature=$temp\n" | |
."tempe_mini_jour=$mintemp\n" | |
."tempe_mini_heure=$mintemptime\n" | |
."tempe_maxi_jour=$maxtemp\n" | |
."tempe_maxi_heure=$maxtemptime\n" | |
."humidite=$hygro\n" | |
."pression=$pression\n" | |
."pression_mini_jour=$minbaro\n" | |
."pression_mini_heure=$minbarotime\n" | |
."pression_maxi_jour=$maxbaro\n" | |
."pression_maxi_heure=$maxbarotime\n" | |
."pluie_cumul_jour=$cumul\n" | |
."pluie_intensite=$rainrate\n" | |
."pluie_intensite_max_jour=$hiRainRateToday\n" | |
."pluie_intensite_max_heure=$hiRainRateTodayTime\n" | |
."vent_moyen_10=$avg_wind_10\n" | |
."vent_dir=$cardinalDir\n" | |
."rafale_max_10=$max_windGust_10\n" | |
."rafale_max_jour=$max_windGust_day\n" | |
."rafale_max_jour_heure=$max_windGust_day_time\n" | |
."windchill=$windchill\n" | |
."point_rose=$rose\n" | |
."heat_index=$heatindex\n" | |
."tendance=\n" | |
."radiation_solaire=$solar\n" | |
."radiation_solaire_max=$maxsolar\n" | |
."radiation_solaire_max_heure=$maxsolartime\n" | |
."humidite_mini_jour=$minhygro\n" | |
."humidite_mini_heure=$minhygrotime\n" | |
."humidite_maxi_jour=$maxhygro\n" | |
."humidite_maxi_heure=$maxhygrotime\n" | |
."# FIN #\n"; | |
// Push du fichier dans un répertoire accessible avec l'ID de la station dans le nom | |
$file = "/var/www/ROMMA/dataSA".$id_station.".txt"; | |
$fp=fopen($file,'w'); | |
fwrite($fp,$romma_txt); | |
fclose($fp); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment