Correction des valeurs par défaut dans les tables de la BDD

Chargement d'une base de données depuis les fichiers *.dat des stations La Crosse Technology WS3600 et WS3650

Modérateurs : jturlier, Météo Villarzel

Répondre
Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Correction des valeurs par défaut dans les tables de la BDD

Message par PascalWMR » 28 sept. 2014, 16:10

Lorsque la base d'une station LCT sans fil perd la connexion avec ses capteurs extérieurs, une valeur par défaut est enregistrée dans le fichier history.dat.
Elle est de
110 % pour l'humidité relative,
81.1 °C pour la température, le windchill et le point de rosée
360 ° pour la direction du vent.
0 pour la force du vent et la pluvio instantannée

Lorsque WS3600SQL calcule les données à enregistrer dans les tables data et MiniMaxidata, on se retrouve, bien normalement d'ailleur, avec des valeurs totalement incohérentes et cela empêche l'affichage normal des graphiques et fausse les statistiques :cry: .
(En effet, je ne me sert plus de graphweather pour faire les statistiques journalière, mensuelle, annuelle et totale. Elle sont générées en PHP)

Les champs impactés sont winddir, outdoorhumidity, outdoortemperature, windchill, outdoorheatindex, dewpoint, pressurealtitude, cloudbase dans la table data et les champs maxi et moy de certains de ces paramètres dans la table MiniMaxidata.

:idea: La solution que j'ai trouvé pour pallier à ce problème, est de

1. Forcer la valeur des données erronées de la table data à "null", comme cela elle ne sont pas affichées dans les graphiques highcharts, :)
2. Recalculer :geek: pour les valeurs erronées de la table MiniMaxidata les valeurs maxi, TStamp_maxi, recdate_maxi, recdateTZ_maxi et moy en fonction des valeurs non erronées de la table data.
Pour cela j'ai fait un script en PHP que je met ici.

Code : Tout sélectionner

<?php
// appel du script de connexion
require("../meteo/GraphDynamic/mysqli_connect.php");   
                  
// Test primaire pour savoir s'il y a des erreurs non encore corrigées
// Test pour savoir si des erreurs ont déja été corrigées
$sql="SELECT count(*) AS NbErreur FROM data WHERE winddir='360'";
$query = mysqli_query($conn,$sql);                   
$list=mysqli_fetch_array($query);
$NbErreur=$list['NbErreur']*1;
if ($NbErreur==0) {
	exit("Il n'y a pas d'erreurs dans votre base de données");}
elseif ($NbErreur>0) {
	$msg="$NbErreur erreurs ont déja été corrigées dans votre base de données";
	// test pour savoir s'il reste encore des erreurs à corriger
	$sql="SELECT count(*) AS NbErreur FROM data WHERE winddir='360' AND outdoortemperature='81.1'";
	$query = mysqli_query($conn,$sql);                   
	$list=mysqli_fetch_array($query);
	$NbErreur2=$list['NbErreur'];
	if ($NbErreur2==0) {
		exit($msg);}
}

// Récupération des jours en erreur
echo "Recupération des jours en erreur". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$sql = "SELECT SUBSTR(recdateTZ,1,8) AS JourErreur FROM data WHERE winddir='360' AND outdoortemperature='81.1' GROUP BY 1 ORDER BY 1 ASC";  
$query = mysqli_query($conn,$sql);                   
$j=0;
while ($list = mysqli_fetch_assoc($query)) {
	$JourEnErreur[$j]=$list['JourErreur'];
	$NbJourEnErreur=$j*1;
	$j++;
	}
// Exécution de la requete de correction de la table data
echo "Correction des données dans la table data". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$sql = "UPDATE data SET outdoorhumidity=null, outdoortemperature=null, windchill=null, outdoorheatindex=null, dewpoint=null, pressurealtitude=null, cloudbase=null WHERE winddir='360'";
$query = mysqli_query($conn,$sql);                   

// Requete pour correction de t_out_maxi de la table MiniMaxidata
echo "Correction des données t_out_maxi dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur maxi dans la table data
	$sql="SELECT tstamp, recdateUTC, recdateTZ, outdoortemperature FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]' ORDER BY 4 DESC , 1 DESC LIMIT 1";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newtstamp[$x]=$list['tstamp']*1;
		$NewrecdateUTC[$x]=$list['recdateUTC']*1;
		$NewrecdateTZ[$x]=$list['recdateTZ']*1;
		$Newoutdoortemperature[$x]=$list['outdoortemperature']*1;
		// Correction de t_out_maxi de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET t_out_maxi=$Newoutdoortemperature[$x], TStamp_t_out_maxi=$Newtstamp[$x], recdate_t_out_maxi=$NewrecdateUTC[$x], recdateTZ_t_out_maxi=$NewrecdateTZ[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
// Requete pour correction de t_out_moy de la table MiniMaxidata
echo "Correction des données t_out_moy dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur moyenne dans la table data
	$sql="SELECT AVG(outdoortemperature) FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newt_out_moy[$x]=number_format($list['AVG(outdoortemperature)']*1,1);
		// Correction de h_out_moy de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET t_out_moy=$Newt_out_moy[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}

// Requete pour correction de h_out_maxi de la table MiniMaxidata
echo "Correction des données h_out_maxi dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur maxi dans la table data
	$sql="SELECT tstamp, recdateUTC, recdateTZ, outdoorhumidity FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]' ORDER BY 4 DESC , 1 DESC LIMIT 1";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newtstamp[$x]=$list['tstamp']*1;
		$NewrecdateUTC[$x]=$list['recdateUTC']*1;
		$NewrecdateTZ[$x]=$list['recdateTZ']*1;
		$Newoutdoorhumidity[$x]=$list['outdoorhumidity']*1;
		// Correction de h_out_maxi de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET h_out_maxi=$Newoutdoorhumidity[$x], TStamp_h_out_maxi=$Newtstamp[$x], recdate_h_out_maxi=$NewrecdateUTC[$x], recdateTZ_h_out_maxi=$NewrecdateTZ[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
// Requete pour correction de h_out_moy de la table MiniMaxidata
echo "Correction des données h_out_moy dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur moyenne dans la table data
	$sql="SELECT AVG(outdoorhumidity) FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newh_out_moy[$x]=number_format($list['AVG(outdoorhumidity)']*1,1);
		// Correction de h_out_moy de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET h_out_moy=$Newh_out_moy[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
// Requete pour correction de chill_maxi de la table MiniMaxidata
echo "Correction des données chill_maxi dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur maxi dans la table data
	$sql="SELECT tstamp, recdateUTC, recdateTZ, windchill FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]' ORDER BY 4 DESC , 1 DESC LIMIT 1";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newtstamp[$x]=$list['tstamp']*1;
		$NewrecdateUTC[$x]=$list['recdateUTC']*1;
		$NewrecdateTZ[$x]=$list['recdateTZ']*1;
		$Newchill_maxi[$x]=$list['windchill']*1;
		// Correction de chill_maxi de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET chill_maxi=$Newchill_maxi[$x], TStamp_chill_maxi=$Newtstamp[$x], recdate_chill_maxi=$NewrecdateUTC[$x], recdateTZ_chill_maxi=$NewrecdateTZ[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
// Requete pour correction de chill_moy de la table MiniMaxidata
echo "Correction des données chill_moy dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur moyenne dans la table data
	$sql="SELECT AVG(windchill) FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newchill_moy[$x]=number_format($list['AVG(windchill)']*1,1);
		// Correction de chill_moy de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET chill_moy=$Newchill_moy[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
// Requete pour correction de dew_maxi de la table MiniMaxidata
echo "Correction des données dew_maxi dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur maxi dans la table data
	$sql="SELECT tstamp, recdateUTC, recdateTZ, dewpoint FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]' ORDER BY 4 DESC , 1 DESC LIMIT 1";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newtstamp[$x]=$list['tstamp']*1;
		$NewrecdateUTC[$x]=$list['recdateUTC']*1;
		$NewrecdateTZ[$x]=$list['recdateTZ']*1;
		$Newdew_maxi[$x]=$list['dewpoint']*1;
		// Correction de chill_maxi de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET dew_maxi=$Newdew_maxi[$x], TStamp_dew_maxi=$Newtstamp[$x], recdate_dew_maxi=$NewrecdateUTC[$x], recdateTZ_dew_maxi=$NewrecdateTZ[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
// Requete pour correction de dew_moy de la table MiniMaxidata
echo "Correction des données dew_moy dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur moyenne dans la table data
	$sql="SELECT AVG(dewpoint) FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newdew_moy[$x]=number_format($list['AVG(dewpoint)']*1,1);
		// Correction de dew_moy de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET dew_moy=$Newdew_moy[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
// Requete pour correction de heat_maxi de la table MiniMaxidata
echo "Correction des données heat_maxi dans la table MiniMaxidata". "<br />\n"."Patientez SVP". "<br />\n";
ob_flush();
flush();
ob_flush();
flush();
$i=0;
for ($i=0; $i <= $NbJourEnErreur; $i++) {
	// 1 Récupération de la valeur maxi dans la table data
	$sql="SELECT tstamp, recdateUTC, recdateTZ, outdoorheatindex FROM data WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]' ORDER BY 4 DESC , 1 DESC LIMIT 1";
	$query = mysqli_query($conn,$sql);                   
	$x=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$Newtstamp[$x]=$list['tstamp']*1;
		$NewrecdateUTC[$x]=$list['recdateUTC']*1;
		$NewrecdateTZ[$x]=$list['recdateTZ']*1;
		$Newheat_maxi[$x]=$list['outdoorheatindex']*1;
		// Correction de chill_maxi de la table MiniMaxidata
		$sql2="UPDATE MiniMaxidata SET heat_maxi=$Newheat_maxi[$x], TStamp_heat_maxi=$Newtstamp[$x], recdate_heat_maxi=$NewrecdateUTC[$x], recdateTZ_heat_maxi=$NewrecdateTZ[$x] WHERE SUBSTR(recdateTZ,1,8)='$JourEnErreur[$i]'";
		$query2 = mysqli_query($conn,$sql2);                   
		$x++;
		}
	}
$FermerConnexion= mysqli_close($conn);

Echo "Mise à  jour des corrections terminée";
?>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="iso-8859-1">
<title>Document sans titre</title>
</head>

<body>
</body>
</html>
Notez que je ne corrige pas la valeur par défaut de winddir car 360 ou 0, à moins que je me trompe, c'est pareil pour l'affichage de la direction du vent. C'est le NNNNOOORD :roll:
De plus, c'est cette valeur qui me sert à trouver les enregistrements en erreur.
Voila, voila. :lol:

A+
Pascal
Modifié en dernier par PascalWMR le 29 sept. 2014, 19:21, modifié 2 fois.
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Avatar du membre
Météo Villarzel
Administrateur du site
Messages : 524
Enregistré le : 06 févr. 2014, 09:48
Contact :

Re: Correction des valeurs par défaut dans les tables de la

Message par Météo Villarzel » 28 sept. 2014, 19:36

Salut Pascal,

Alors là, chapeau bas pour ce script, je vais tester ça une fois ma BDD remplie.

Merci

A+
Station Vantage Pro2+ avec station agricole - Weatherlink - GraphWeather 3.0.15b - Cumulus 1.9.4 - Windows 7/64
Graphique dynamique à partir d'une bd MySql - VP2SQL

Image

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: Correction des valeurs par défaut dans les tables de la

Message par PascalWMR » 29 sept. 2014, 19:20

Bonjour

Un truc m'a turlupiner toute la journée.

Je me suis dit, et je l'ai vérifier en le faisant, que si on exécutait plusieurs fois le code que j'ai mi ci-dessus, il corrigeait inutilement à chaque fois toute la base de données.

Alors vite fait ce soir j'ai ajouter ce code au début du premier pour faire un test et savoir si des données devait encore être corrigées.

// Test primaire pour savoir s'il y a des erreurs non encore corrigées
// Test pour savoir si des erreurs ont déja été corrigées
$sql="SELECT count(*) AS NbErreur FROM data WHERE winddir='360'";
$query = mysqli_query($conn,$sql);
$list=mysqli_fetch_array($query);
$NbErreur=$list['NbErreur']*1;
if ($NbErreur==0) {
exit("Il n'y a pas d'erreurs dans votre base de données");}
elseif ($NbErreur>0) {
$msg="$NbErreur erreurs ont déja été corrigées dans votre base de données";
// test pour savoir s'il reste encore des erreurs à corriger
$sql="SELECT count(*) AS NbErreur FROM data WHERE winddir='360' AND outdoortemperature='81.1'";
$query = mysqli_query($conn,$sql);
$list=mysqli_fetch_array($query);
$NbErreur2=$list['NbErreur'];
if ($NbErreur2==0) {
exit($msg);}
}


J'ai également corrigé la requête sql de récuperation des jours d'erreur pour ne corriger que les nouvelles erreurs.
Elle devient SELECT SUBSTR(recdateTZ,1,8) AS JourErreur FROM data WHERE winddir='360' AND outdoortemperature='81.1' GROUP BY 1 ORDER BY 1 ASC
au lieu de SELECT SUBSTR(recdateTZ,1,8) AS JourErreur FROM data WHERE winddir='360' GROUP BY 1 ORDER BY 1 ASC
Voila voila

A+
Pascal
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Avatar du membre
Météo Villarzel
Administrateur du site
Messages : 524
Enregistré le : 06 févr. 2014, 09:48
Contact :

Re: Correction des valeurs par défaut dans les tables de la

Message par Météo Villarzel » 29 sept. 2014, 19:57

tu apprends le PHP à vitesse grand V :lol:
Station Vantage Pro2+ avec station agricole - Weatherlink - GraphWeather 3.0.15b - Cumulus 1.9.4 - Windows 7/64
Graphique dynamique à partir d'une bd MySql - VP2SQL

Image

Répondre