Script Qualité de l'air (remplacement lcsqa)

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
Répondre
Domo89
Messages : 15
Enregistré le : 04 août 2015, 00:49

Script Qualité de l'air (remplacement lcsqa)

Message par Domo89 » 26 janv. 2017, 23:47

Bonjour,
Suite a l'indisponibilité du service lcsqa qu'utilisait le script perl,j'ai codé un nouveau script a partir des données du site prev'air.
Voici le script php qui se presente sous la forme d'une classe:

Code : Tout sélectionner

<?php


$class = new prevair();

$class->_isStation = true;
$class->_inseeCode = "yourInseeCode";
$class->_stationCode = "yourStationCode";
$class->_long = "yourLongitude";
$class->_lat = "yourLatitude";

echo "\n Station: ".$class->getCoStation();
echo "\n CO: ".$class->getCo();
echo "\n Max: ".$class->getCoMax();
echo "\n Station: ".$class->getNo2Station();
echo "\n NO2: ".$class->getNo2();
echo "\n Max: ".$class->getNo2Max();
echo "\n Station: ".$class->getSo2Station();
echo "\n SO2: ".$class->getSo2();
echo "\n Max: ".$class->getSo2Max();
echo "\n Station: ".$class->getO3Station();
echo "\n O3: ".$class->getO3();
echo "\n Max: ".$class->getO3Max();
echo "\n Station: ".$class->getPm10Station();
echo "\n PM10: ".$class->getPm10();
echo "\n Max: ".$class->getPm10Max();
echo "\n Station: ".$class->getPm25Station();
echo "\n PM2.5: ".$class->getPm25();
echo "\n Max: ".$class->getPm25Max();
echo "\n Station: ".$class->getAtmoIndiceStation();
echo "\n Atmo: ".$class->getAtmoIndice();
echo "\n  -NO2: ".$class->getAtmoNo2Indice();
echo "\n  -SO2: ".$class->getAtmoSo2Indice();
echo "\n  -O3: ".$class->getAtmoO3Indice();
echo "\n  -PM10: ".$class->getAtmoPm10Indice();
echo "\n  -Comment: ".$class->getAtmoIndiceComment();
echo "\n  -in 1 day: ".$class->getAtmoTomorrowIndice();
echo "\n  -in 2 days: ".$class->getAtmo2DayIndice();

echo "\n Station: ".$class->getStationCode("yourCity");
echo "\n Insee: ".$class->getInseeCode("yourCity")."\n";


//file_get_contents("http://192.168.1.xxx:8080/json.htm?type=command&param=udevice&idx=yyyyyyyy&nvalue=".zzzzz);


class prevair
{
	private $_base_url = "http://www2.prevair.org/ineris-web-services.php?url=mesureJourna&date=";
	private $_url_station = "http://www2.prevair.org/ineris-web-services.php?url=stations&date=";
	private $_atmo_url = "http://www2.prevair.org/ineris-web-services.php?url=atmo&date=";
	private $_atmo_data;
	private $_date;
	
	public $_isStation = false;
	public $_inseeCode;
	public $_stationCode;
	public $_long;
	public $_lat;
	
	
	public function __construct()
	{
		$this->_date = date("Y-m-d");
		$this->_base_url = $this->_base_url.$this->_date."&code_polluant=";
		$this->_atmo_data = json_decode(file_get_contents($this->_atmo_url.$this->_date),true);
	}
	
	private function getDistance($lat1, $lng1, $lat2, $lng2) {
		$earth_radius = 6378137;
		$rlo1 = deg2rad($lng1);
		$rla1 = deg2rad($lat1);
		$rlo2 = deg2rad($lng2);
		$rla2 = deg2rad($lat2);
		$dlo = ($rlo2 - $rlo1) / 2;
		$dla = ($rla2 - $rla1) / 2;
		$a = (sin($dla) * sin($dla)) + cos($rla1) * cos($rla2) * (sin($dlo) * sin($dlo));
		$d = 2 * atan2(sqrt($a), sqrt(1 - $a));
		return round(($earth_radius * $d)/1000);
	}
	
	private function findDataId($data,$isAtmo = false)
	{
		$i = 1;
		$distMin = 2000000;
		$minId = 0;
		$arrLen = count($data);
		
		if($isAtmo == true)
		{
			$longIndice = 2;
			$latIndice = 3;	
		}
		else
		{
			$longIndice = 2;
			$latIndice = 1;
		}
		
		if($this->_isStation != false)
		{
			while($i != $arrLen)
			{
				if($isAtmo != false)
				{
					if($data[$i][1] == $this->_inseeCode)
					{
						$minId = $i;
						break;
					}
				}
				else
				{
					if($data[$i][0] == $this->_stationCode)
					{
						$minId = $i;
						break;
					}
				}
				$i++;
			}
		}
		else
		{
			while($i != $arrLen)
			{
				$distance = $this->getDistance($this->_lat, $this->_long, $data[$i][$latIndice], $data[$i][$longIndice]);
				if($distMin > $distance)
				{
					$distMin = $distance;
					$minId = $i;
				}
			$i++;
			}
		}
		return $minId;
	}
	
	public function getStationName($long,$lat)
	{
		$data = file_get_contents($this->_url_station.$this->_date);
		$data = json_decode($data,true);
		$len = count($data);
		$i = 0;
		$name = false;
		while($i != $len)
		{
			if($data[$i][5] == $lat && $data[$i][6] == $long)
			{
				$name = $data[$i][1];
				break;
			}
			$i++;
		}
		return $data[$i][2]." - ".$data[$i][4];
	}
	
	public function getStationCode($city)
	{
		$data = file_get_contents($this->_url_station.$this->_date);
		$data = json_decode($data,true);
		$len = count($data);
		$i = 0;
		$long = false;
		$lat = false;
		while($i != $len)
		{
			if(strcasecmp($data[$i][4],$city) == 0)
			{
				$code = $data[$i][0];
				break;
			}
			$i++;
		}
		return $code;
	}
	
	public function getInseeCode($city)
	{
		$data = file_get_contents($this->_url_station.$this->_date);
		$data = json_decode($data,true);
		$len = count($data);
		$i = 0;
		$long = false;
		$lat = false;
		while($i != $len)
		{
			if(strcasecmp($data[$i][4],$city) == 0)
			{
				$code = $data[$i][3];
				break;
			}
			$i++;
		}
		return $code;
	}
	
	public function getNo2()
	{
		$data = json_decode(file_get_contents($this->_base_url."03"),true);
		$id = $this->findDataId($data);
		return $data[$id][6];
	}
	
	public function getSo2()
	{
		$data = json_decode(file_get_contents($this->_base_url."01"),true);
		$id = $this->findDataId($data);
		return $data[$id][6];
	}
	
	public function getO3()
	{
		$data = json_decode(file_get_contents($this->_base_url."08"),true);
		$id = $this->findDataId($data);
		return $data[$id][6];
	}
	
	public function getPm10()
	{
		$data = json_decode(file_get_contents($this->_base_url."24"),true);
		$id = $this->findDataId($data);
		return $data[$id][6];
	}
	
	public function getPm25()
	{
		$data = json_decode(file_get_contents($this->_base_url."39"),true);
		$id = $this->findDataId($data);
		return $data[$id][6];
	}
	
	public function getCo()
	{
		$data = json_decode(file_get_contents($this->_base_url."04"),true);
		$id = $this->findDataId($data);
		return $data[$id][6];
	}
	
	public function getNo2Max()
	{
		$data = json_decode(file_get_contents($this->_base_url."03"),true);
		$id = $this->findDataId($data);
		return $data[$id][5];
	}
	
	public function getSo2Max()
	{
		$data = json_decode(file_get_contents($this->_base_url."01"),true);
		$id = $this->findDataId($data);
		return $data[$id][5];
	}
	
	public function getO3Max()
	{
		$data = json_decode(file_get_contents($this->_base_url."08"),true);
		$id = $this->findDataId($data);
		return $data[$id][5];
	}
	
	public function getPm10Max()
	{
		$data = json_decode(file_get_contents($this->_base_url."24"),true);
		$id = $this->findDataId($data);
		return $data[$id][5];
	}
	
	public function getPm25Max()
	{
		$data = json_decode(file_get_contents($this->_base_url."39"),true);
		$id = $this->findDataId($data);
		return $data[$id][5];
	}
	
	public function getCoMax()
	{
		$data = json_decode(file_get_contents($this->_base_url."04"),true);
		$id = $this->findDataId($data);
		return $data[$id][5];
	}
	
	public function getNo2Station()
	{
		$data = json_decode(file_get_contents($this->_base_url."03"),true);
		$id = $this->findDataId($data);
		return $this->getStationName($data[$id][2],$data[$id][1]);
	}
	
	public function getSo2Station()
	{
		$data = json_decode(file_get_contents($this->_base_url."01"),true);
		$id = $this->findDataId($data);
		return $this->getStationName($data[$id][2],$data[$id][1]);
	}
	
	public function getO3Station()
	{
		$data = json_decode(file_get_contents($this->_base_url."08"),true);
		$id = $this->findDataId($data);
		return $this->getStationName($data[$id][2],$data[$id][1]);
	}
	
	public function getPm10Station()
	{
		$data = json_decode(file_get_contents($this->_base_url."24"),true);
		$id = $this->findDataId($data);
		return $this->getStationName($data[$id][2],$data[$id][1]);
	}
	
	public function getPm25Station()
	{
		$data = json_decode(file_get_contents($this->_base_url."39"),true);
		$id = $this->findDataId($data);
		return $this->getStationName($data[$id][2],$data[$id][1]);
	}
	
	public function getCoStation()
	{
		$data = json_decode(file_get_contents($this->_base_url."04"),true);
		$id = $this->findDataId($data);
		return $this->getStationName($data[$id][2],$data[$id][1]);
	}
	
	public function getAtmoIndice()
	{
		$id = $this->findDataId($this->_atmo_data,true);
		return $this->_atmo_data[$id][7];
	}
	
	public function getAtmoSo2Indice()
	{
		$id = $this->findDataId($this->_atmo_data,true);
		return $this->_atmo_data[$id][8];
	}
	
	public function getAtmoNo2Indice()
	{
		$id = $this->findDataId($this->_atmo_data,true);
		return $this->_atmo_data[$id][9];
	}
	
	public function getAtmoO3Indice()
	{
		$id = $this->findDataId($this->_atmo_data,true);
		return $this->_atmo_data[$id][10];
	}
	
	public function getAtmoPm10Indice()
	{
		$id = $this->findDataId($this->_atmo_data,true);
		return $this->_atmo_data[$id][11];
	}
	
	public function getAtmoIndiceStation()
	{
		$id = $this->findDataId($this->_atmo_data,true);
		return $this->_atmo_data[$id][4]." - ".$this->_atmo_data[$id][5]." - ".$this->_atmo_data[$id][6]." - ".$this->_atmo_data[$id][13];
	}
	
	public function getAtmoIndiceComment()
	{
		$id = $this->findDataId($this->_atmo_data,true);
		return $this->_atmo_data[$id][12];
	}
	
	public function getAtmoTomorrowIndice()
	{
		$date = date("Y-m-d", strtotime("+1 day"));
		$data = json_decode(file_get_contents($this->_atmo_url.$date),true);
		$id = $this->findDataId($data,true);
		return $data[$id][7];
	}
	
	public function getAtmo2DayIndice()
	{
		$date = date("Y-m-d", strtotime("+2 day"));
		$data = json_decode(file_get_contents($this->_atmo_url.$date),true);
		$id = $this->findDataId($data,true);
		return $data[$id][7];
	}
}

?>
C'est assez long mais on recupere pas mal de données.
Pour executer le script un sipmle "php fichier.php" suffit.
Le script est parametrable de 2 facons:
-une premiere ou vous indiquez votre longitude et latitude (en haut du script) et cela calcule la station la plus proche

Code : Tout sélectionner

$class->_isStation = false;
$class->_long = "yourLongitude";
$class->_lat = "yourLatitude";
-une seconde ou vous pouvez specifier un code insee (pour l'indice atmo) et un code station (pour les autres données)

Code : Tout sélectionner

$class->_isStation = true;
$class->_inseeCode = "yourInseeCode";
$class->_stationCode = "yourStationCode";
(vous pouvez obtenir ces codes en remplacant yourCity par votre ville)

Code : Tout sélectionner

echo "\n Station: ".$class->getStationCode("yourCity");
echo "\n Insee: ".$class->getInseeCode("yourCity")."\n";
Pour le lien avec domoticz,il faut mettre des lignes comme celle ci avec xxxxx l'ip de domoticz,yyyy l'idx du device et zzzzz une fonction

Code : Tout sélectionner

file_get_contents("http://192.168.1.xxxxx:8080/json.htm?type=command&param=udevice&idx=yyyyyyyy&nvalue=".zzzzz);
exemple:

Code : Tout sélectionner

file_get_contents("http://192.168.1.147:8080/json.htm?type=command&param=udevice&idx=125&nvalue=".$class->getCo());

Code : Tout sélectionner

file_get_contents("http://192.168.1.147:8080/json.htm?type=command&param=udevice&idx=126&nvalue=".$class->getAtmoNo2Indice());
Voila ! :D


PS: si vous obtenez des resultats comme ceux-ci,c'est que ces valeurs ne sont pas disponibles pour votre station.

Code : Tout sélectionner

 Station: AASQA - Commune
 SO2: Moyenne journaliere
 Max: Max moyenne horaire

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Souti
Messages : 6
Enregistré le : 13 févr. 2017, 13:14

Re: Script Qualité de l'air (remplacement lcsqa)

Message par Souti » 13 févr. 2017, 13:16

Bravo beau travail.

J'ai mis du temps à comprendre comment trouver les codes Insee et station mais en fait c'est simple quand on lit correctement. :oops:

Répondre