Skip to content

Instantly share code, notes, and snippets.

@RaphaelChochon
Created March 16, 2018 15:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RaphaelChochon/d686e9c6573fd19f39c5cb6553358ba5 to your computer and use it in GitHub Desktop.
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
<?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