From 3bee28d8814da7cb51cb3423b867c2a0e87cf6f5 Mon Sep 17 00:00:00 2001 From: KiboOst Date: Sun, 25 Feb 2018 22:46:11 +0100 Subject: [PATCH] =?UTF-8?q?1=C3=A8re=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 105 ++++++++++++++- assets/linky.png | Bin 0 -> 36954 bytes phpLinkyAPI.php | 328 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 431 insertions(+), 2 deletions(-) create mode 100644 assets/linky.png create mode 100644 phpLinkyAPI.php diff --git a/README.md b/README.md index 90b0514..8ef8e7b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,103 @@ -# phpLinkyAPI -API php pour récupérer vos données de consommations Linky + + +# php-LinkyAPI + +--- + +*This API being essentially to collect our french electricity consumption, this page is in ... French!* + +--- + +## API php pour récupérer vos données de consommations Linky + +Voici une API simple d'utilisation pour récupérer vos données de consommations du compteur Linky, sous forme json, lisible ! + +J'utilise personnellement cette API avec une tâche planifiée (cron) toutes les 8h pour enregistrer l'ensemble des données dans un fichier json. Ce qui me permet de conserver mes données, et de les afficher avec Plotly par exemple, pour faire des corrélations avec le chauffage ([Qivivo](https://github.com/KiboOst/php-simpleQivivoAPI/tree/master/DailyOverview)), les relevés Netatmo, etc. + +## Pré-requis +- Un compteur Linky ! +- Un compte Enedis. Vous pouvez le créer [ici](https://espace-client-particuliers.enedis.fr/web/espace-particuliers/accueil). Vous devez attendre quelques semaines après l'installation du Linky pour voir vos données sur le site Enedis. Une fois ces données disponible, vous pouvez utiliser cette API. +- Un serveur php avec accès à internet (mutualisé sur hébergement, NAS Synology, etc.) + +## Utilisation +- Téléchargez le fichier phpLinkyAPI.php sur votre serveur.. +- Créez un script php avec vos identifiants/mot de passe Enedis et un include de l'API. + +#### Connection + +```php +require("phpLinkyAPI.php"); //Linky custom API + +$_Linky = new Linky($enedis_user, $enedis_pass, false); +if (isset($_Linky->error)) echo '__ERROR__: ', $_Linky->error, "
"; +``` +--- + +*La connexion au site Enedis est assez lente, de l'ordre de 5sec...* + +--- +Une fois connecté, ajoutez les fonctions désirées dans votre script. +A noter que les données du Linky ne sont disponibles que le lendemain. La date d'hier servira donc de date de fin dans la plupart des cas. + +#### OPERATIONS
+ +```php +//Si nous sommes le 25 Février 2018: + +//Consommation par demi-heure: +$data = $_Linky->getData_perhour('24/02/2018'); +echo "
getData_perhour:
".json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)."

"; + +//Vous pouvez aussi le faire automatiquement: +$today = new DateTime('NOW', new DateTimeZone('Europe/Paris')); +$yesterday = $today->sub(new DateInterval('P1D')); +$data = $_Linky->getData_perhour($yesterday->format('d/m/Y')); +echo "
getData_perhour:
".json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)."

"; + +//Consommation par jour: +//Utilisez toujours des dates d'un mois glissant, sinon les données renvoyées peuvent être décalées, surtout pour le mois courant. +$data = $_Linky->getData_perday('01/01/2018', '31/01/2018'); +echo "
getData_perday:
".json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)."

"; + +//Consommation par mois: +//Même si les données n'existent pas, il faut donner une année glissante: +$data = $_Linky->getData_permonth('01/02/2017', '24/02/2018'); +echo "
getData_permonth:
".json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)."

"; + +//Consommation par année: +$data = $_Linky->getData_peryear(); +echo "
getData_peryear:
".json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)."

"; + +//Vous pouvez aussi directement appeller cette fonction pour récupérer l'ensemble des données jusqu'à hier: +$_Linky->getAll(); +echo "
getAll:
".json_encode($_Linky->_data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)."

"; +``` + +## Version history + +#### v0.1 (2018-02-25) +- Première version ! + +## License + +The MIT License (MIT) + +Copyright (c) 2018 KiboOst + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/assets/linky.png b/assets/linky.png new file mode 100644 index 0000000000000000000000000000000000000000..1310b41829274e6bdd2397268c109a1c97c4bef0 GIT binary patch literal 36954 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 literal 0 HcmV?d00001 diff --git a/phpLinkyAPI.php b/phpLinkyAPI.php new file mode 100644 index 0000000..a353399 --- /dev/null +++ b/phpLinkyAPI.php @@ -0,0 +1,328 @@ +add(new DateInterval('P1D')); + $endDate = $endDate->format('d/m/Y'); + $startDate = DateTime::createFromFormat('d/m/Y', $date); + $startDate->sub(new DateInterval('P2D')); + $startDate = $startDate->format('d/m/Y'); + + $resource_id = 'urlCdcHeure'; + $result = $this->getData($resource_id, $startDate, $endDate); + + //format this correctly: + $returnData = array(); + $startHour = new DateTime('23:30'); + + $data = $result['graphe']['data']; + $end = count($data); + for($i=$end-1; $i>=$end-48; $i--) + { + $valeur = $data[$i]['valeur'].'kW'; + + $thisHour = clone $startHour; + $thisHour = $thisHour->format('H:i'); + + $returnData[$thisHour] = $valeur; + $startHour->modify('-30 min'); + } + + $returnData = array_reverse($returnData); + $this->_data['hours'][$date] = $returnData; + return array($date=>$returnData); + } + + public function getData_perday($startDate, $endDate) + { + //max 31days: + $date1 = DateTime::createFromFormat('d/m/Y', $startDate); + $date2 = DateTime::createFromFormat('d/m/Y', $endDate); + $nbr_ts = $date2->getTimestamp() - $date1->getTimestamp(); + $nbr_days = $nbr_ts/86400; + if ($nbr_days > 31) return array('etat'=>null, 'error' => 'Max number of days can not exceed 31 days'); + + $resource_id = 'urlCdcJour'; + $result = $this->getData($resource_id, $startDate, $endDate); + + //format this correctly: + $returnData = array(); + + $data = $result['graphe']['data']; + foreach ($data as $day) + { + $valeur = $day['valeur']; + if ($valeur == -2) $valeur = null; + else $valeur .= 'kWh'; + + $date = $date1; + $date = $date1->format("d/m/Y"); + $returnData[$date] = $valeur; + $date1->modify('+1 day'); + } + + $this->_data['days'] = $returnData; + return $returnData; + } + + public function getData_permonth($startDate, $endDate) + { + $resource_id = 'urlCdcMois'; + $result = $this->getData($resource_id, $startDate, $endDate); + + //format this correctly: + $fromMonth = DateTime::createFromFormat('d/m/Y', $startDate); + $returnData = array(); + + $data = $result['graphe']['data']; + foreach ($data as $month) + { + $valeur = $month['valeur']; + if ($valeur == -2) $valeur = null; + else $valeur .= 'kW'; + + $thisMonth = $fromMonth; + $thisMonth = $thisMonth->format('M/Y'); + + $returnData[$thisMonth] = $valeur; + $fromMonth->modify('+1 month'); + } + + $this->_data['months'] = $returnData; + return $returnData; + } + + public function getData_peryear() + { + $resource_id = 'urlCdcAn'; + $result = $this->getData($resource_id, null, null); + + //format this correctly: + $fromYear = new DateTime(); + $returnData = array(); + + $data = $result['graphe']['data']; + $c = count($data)-1; + $fromYear->modify('- '.$c.' year'); + foreach ($data as $year) + { + $valeur = $year['valeur']; + if ($valeur == -2) $valeur = null; + else $valeur .= 'kW'; + + $thisYear = $fromYear; + $thisYear = $thisYear->format('Y'); + + $returnData[$thisYear] = $valeur; + $fromYear->modify('+1 year'); + } + + $this->_data['years'] = $returnData; + return $returnData; + } + + + //INTERNAL FUNCTIONS================================================== + public function getAll() + { + //____Initialize datas: + $timezone = 'Europe/Paris'; + $today = new DateTime('NOW', new DateTimeZone($timezone)); + $today->sub(new DateInterval('P1D')); //Enedis last data are yesterday + + //____Get per hour for yesterday: + $yesterday = $today->format('d/m/Y'); + $this->getData_perhour($yesterday); + + //____Get per day + $var = clone $today; + $fromMonth = $var->sub(new DateInterval('P1M')); + $fromMonth = $fromMonth->format('d/m/Y'); + $this->getData_perday($fromMonth, $yesterday); + + //____Get per month + $var = clone $today; + $fromYear = $var->sub(new DateInterval('P1Y')); + $fromYear = $fromYear->format('01/'.'m/Y'); + $this->getData_permonth($fromYear, $yesterday); + + //____Get per year + $this->getData_peryear(); + } + + + + //______________________calling functions + protected function _request($method, $url, $postdata=null) //standard function handling all get/post request with curl | return string + { + if (!isset($this->_curlHdl)) + { + $this->_curlHdl = curl_init(); + curl_setopt($this->_curlHdl, CURLOPT_COOKIEJAR, $this->_cookFile); + curl_setopt($this->_curlHdl, CURLOPT_COOKIEFILE, $this->_cookFile); + + curl_setopt($this->_curlHdl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($this->_curlHdl, CURLOPT_SSL_VERIFYPEER, false); + + curl_setopt($this->_curlHdl, CURLOPT_HEADER, true); + curl_setopt($this->_curlHdl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($this->_curlHdl, CURLOPT_FOLLOWLOCATION, true); + + curl_setopt($this->_curlHdl, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'); + } + + $url = filter_var($url, FILTER_SANITIZE_URL); + //echo 'url: ', $url, "
"; + curl_setopt($this->_curlHdl, CURLOPT_URL, $url); + + if ($method == 'POST') + { + curl_setopt($this->_curlHdl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($this->_curlHdl, CURLOPT_POST, true); + } + else + { + curl_setopt($this->_curlHdl, CURLOPT_POST, false); + } + + if ( isset($postdata) ) + { + curl_setopt($this->_curlHdl, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($this->_curlHdl, CURLOPT_POSTFIELDS, $postdata); + } + + $response = curl_exec($this->_curlHdl); + + //$info = curl_getinfo($this->_curlHdl); + //echo "
cURL info".json_encode($info, JSON_PRETTY_PRINT)."

"; + + $this->error = null; + if ($response === false) $this->error = curl_error($this->_curlHdl); + + if ($this->_isAuth == true) + { + $header_size = curl_getinfo($this->_curlHdl, CURLINFO_HEADER_SIZE); + $header = substr($response, 0, $header_size); + $response = substr($response, $header_size); + } + return $response; + } + + + //______________________Internal cooking + protected function getData($resource_id, $startDate, $endDate) + { + $p_p_id = 'lincspartdisplaycdc_WAR_lincspartcdcportlet'; + + $url = $this->_APIBaseUrl.$this->_APIDataUrl; + $url .= '?p_p_id='.$p_p_id; + $url .= '&p_p_lifecycle=2'; + $url .= '&p_p_mode=view'; + $url .= '&p_p_resource_id='.$resource_id; + $url .= '&p_p_cacheability=cacheLevelPage'; + $url .= '&p_p_col_id=column-1'; + $url .= '&p_p_col_count=2'; + + $postdata = null; + if ($startDate) + { + $postdata = http_build_query( + array( + '_'.$p_p_id.'_dateDebut' => $startDate, + '_'.$p_p_id.'_dateFin' => $endDate + ) + ); + } + + $response = $this->_request('GET', $url, $postdata); + $jsonArray = json_decode($response, true); + return $jsonArray; + } + + public $error = null; + public $_isAuth = false; + + public $_data = array(); + + //authentication: + protected $_login; + protected $_password; + + protected $_cookFile = ''; + + protected $_loginBaseUrl = 'https://espace-client-connexion.enedis.fr'; + protected $_APIBaseUrl = 'https://espace-client-particuliers.enedis.fr/group/espace-particuliers'; + protected $_APILoginUrl = '/auth/UI/Login'; + protected $_APIHomeUrl = '/home'; + protected $_APIDataUrl = '/suivi-de-consommation'; + + protected $_curlHdl = null; + + protected function auth() + { + $postdata = http_build_query( + array( + 'IDToken1' => $this->_login, + 'IDToken2' => $this->_password, + 'SunQueryParamsString' => base64_encode('realm=particuliers'), + 'encoded' => 'true', + 'gx_charset' => 'UTF-8' + ) + ); + + $url = $this->_loginBaseUrl.$this->_APILoginUrl; + $response = $this->_request('POST', $url, $postdata); + + //connected ? + preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $response, $matches); + $cookies = array(); + foreach($matches[1] as $item) + { + parse_str($item, $cookie); + $cookies = array_merge($cookies, $cookie); + } + if (!array_key_exists('iPlanetDirectoryPro', $cookies)) + { + $this->error = 'Sorry, could not connect. Check your credentials.'; + return false; + } + + $this->_isAuth = true; + + $url = 'https://espace-client-particuliers.enedis.fr/group/espace-particuliers/accueil'; + $response = $this->_request('GET', $url); + + return true; + } + + function __construct($login, $password, $getAll=false) + { + $this->_login = $login; + $this->_password = $password; + + if ($this->auth() == false) + { + return $this->error; + } + + if ($getAll) + { + $this->getAll(); + } + } + +//Linky end +} + +?> \ No newline at end of file