{"id":2824,"date":"2017-12-31T00:56:39","date_gmt":"2017-12-30T23:56:39","guid":{"rendered":"https:\/\/www.fanjoe.be\/?p=2824"},"modified":"2021-09-25T17:08:32","modified_gmt":"2021-09-25T15:08:32","slug":"tp-link-cloud-api-controle-dune-ampoule-lb120","status":"publish","type":"post","link":"https:\/\/www.fanjoe.be\/?p=2824","title":{"rendered":"TP-Link Cloud API : Contr\u00f4le d&rsquo;une ampoule LB120"},"content":{"rendered":"<h1>Introduction<\/h1>\n<h2>La lampe<\/h2>\n<p>Pour la No\u00ebl, j&rsquo;ai re\u00e7u une ampoule <a href=\"http:\/\/www.tp-link.fr\/products\/details\/cat-5609_LB120.html\" target=\"_blank\" rel=\"noopener\">TP-Link LB120<\/a>. C&rsquo;est une lampe autonome qui incorpore une connexion Wi-Fi et qui ne n\u00e9cessite pas de <a href=\"https:\/\/www.meethue.com\/fr-fr\/p\/hue-bridge\/8718696511800\" target=\"_blank\" rel=\"noopener\">bridge<\/a> comme la majorit\u00e9 de la gamme <a href=\"https:\/\/www.meethue.com\/fr-fr\" target=\"_blank\" rel=\"noopener\">Philips Hue<\/a> par exemple.<\/p>\n<div class=\"tiled-gallery type-rectangular tiled-gallery-unresized\" data-original-width=\"980\" data-carousel-extra='null' itemscope itemtype=\"http:\/\/schema.org\/ImageGallery\" > <div class=\"gallery-row\" style=\"width: 980px; height: 449px;\" data-original-width=\"980\" data-original-height=\"449\" > <div class=\"gallery-group images-1\" style=\"width: 336px; height: 449px;\" data-original-width=\"336\" data-original-height=\"449\" > <div class=\"tiled-gallery-item tiled-gallery-item-large\" itemprop=\"associatedMedia\" itemscope itemtype=\"http:\/\/schema.org\/ImageObject\"> <a href=\"https:\/\/i0.wp.com\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02.jpg?ssl=1\" border=\"0\" itemprop=\"url\"> <meta itemprop=\"width\" content=\"332\"> <meta itemprop=\"height\" content=\"445\"> <img decoding=\"async\" class=\"\" data-attachment-id=\"2829\" data-orig-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02.jpg\" data-orig-size=\"620,830\" data-comments-opened=\"1\" data-image-title=\"TP-Link-LB120-API-02\" data-image-description=\"\" data-medium-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02-300x402.jpg\" data-large-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02-620x830.jpg\" src=\"https:\/\/i0.wp.com\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02.jpg?w=332&#038;h=445&#038;ssl=1\" srcset=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02.jpg 620w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02-131x175.jpg 131w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-02-300x402.jpg 300w\" width=\"332\" height=\"445\" loading=\"lazy\" data-original-width=\"332\" data-original-height=\"445\" itemprop=\"http:\/\/schema.org\/image\" title=\"TP-Link-LB120-API-02\" alt=\"TP-Link-LB120-API-02\" style=\"width: 332px; height: 445px;\" \/> <\/a> <\/div> <\/div> <!-- close group --> <div class=\"gallery-group images-1\" style=\"width: 644px; height: 449px;\" data-original-width=\"644\" data-original-height=\"449\" > <div class=\"tiled-gallery-item tiled-gallery-item-large\" itemprop=\"associatedMedia\" itemscope itemtype=\"http:\/\/schema.org\/ImageObject\"> <a href=\"https:\/\/i0.wp.com\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01.jpg?ssl=1\" border=\"0\" itemprop=\"url\"> <meta itemprop=\"width\" content=\"640\"> <meta itemprop=\"height\" content=\"445\"> <img decoding=\"async\" class=\"\" data-attachment-id=\"2826\" data-orig-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01.jpg\" data-orig-size=\"788,548\" data-comments-opened=\"1\" data-image-title=\"TP-Link-LB120-API-01\" data-image-description=\"\" data-medium-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01-300x209.jpg\" data-large-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01-620x431.jpg\" src=\"https:\/\/i0.wp.com\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01.jpg?w=640&#038;h=445&#038;ssl=1\" srcset=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01.jpg 788w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01-175x122.jpg 175w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01-300x209.jpg 300w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-01-620x431.jpg 620w\" width=\"640\" height=\"445\" loading=\"lazy\" data-original-width=\"640\" data-original-height=\"445\" itemprop=\"http:\/\/schema.org\/image\" title=\"TP-Link-LB120-API-01\" alt=\"TP-Link-LB120-API-01\" style=\"width: 640px; height: 445px;\" \/> <\/a> <\/div> <\/div> <!-- close group --> <\/div> <!-- close row --> <\/div>\n<p>On la trouve sur <a href=\"http:\/\/amzn.to\/2zQLnF6\" target=\"_blank\" rel=\"noopener\">Amazon<\/a> \u00e0 un prix qui oscille entre 30\u20ac et 35\u20ac.<\/p>\n<h2>Les projets<\/h2>\n<p>Il existe diff\u00e9rents projets sur <a href=\"https:\/\/github.com\/\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> (et sans doute ailleurs) qui permettent de prendre le contr\u00f4le sur la lampe gr\u00e2ce \u00e0 du JavaScript, du Python ou autre&#8230; Et ce, sur le r\u00e9seau local en s&rsquo;adressant directement \u00e0 la lampe ou en en passant par l&rsquo;API de <a href=\"https:\/\/www.tplinkcloud.com\/\" target=\"_blank\" rel=\"noopener\">TP-Link Cloud<\/a>.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/konsumer\/tplink-lightbulb\" target=\"_blank\" rel=\"noopener\"><strong>tplink-lightbulb<\/strong><\/a> : Ce projet permet de contr\u00f4ler les p\u00e9riph\u00e9riques \u00ab\u00a0smart-home\u00a0\u00bb TP-Link \u00e0 partir de nodejs ou en ligne de commande.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/adumont\/tplink-cloud-api\">tplink-cloud-api<\/a><\/strong> : Ce module node.js npm permet de contr\u00f4ler \u00e0 distance les \u00ab\u00a0smartplugs\u00a0\u00bb TP-Link (HS100, HS110) et \u00ab\u00a0smartbulbs\u00a0\u00bb (LB100, LB110, LB120, LB130) \u00e0 l&rsquo;aide de leur \u00ab\u00a0cloud web service\u00a0\u00bb (sans avoir besoin d&rsquo;\u00eatre sur le m\u00eame wifi\/lan).<\/li>\n<\/ul>\n<h1>TP-Link Cloud API<\/h1>\n<h2>Local ou Cloud API ?<\/h2>\n<h3>Local<\/h3>\n<p>Il n&rsquo;est pas ais\u00e9 de communiquer directement avec la lampe sur le r\u00e9seau local.<\/p>\n<p>Ce <a href=\"https:\/\/github.com\/rfinnie\/smartthings\/tree\/master\/devicetypes\/rfinnie\/tplink-hs100-lan-web-proxy.src\" target=\"_blank\" rel=\"noopener\">d\u00e9p\u00f4t GitHub<\/a> consacr\u00e9 \u00e0 la prise Wi-Fi <em>TP-Link HS100<\/em> en explique les raisons de mani\u00e8re d\u00e9taill\u00e9e :<\/p>\n<blockquote><p>Le TP-Link HS100 (et la famille apparent\u00e9e) est une prise Wi-Fi intelligente. Par d\u00e9faut, elle se connecte au service Kasa par lequel elle est g\u00e9r\u00e9 \u00e0 distance. Cependant, elle dispose d&rsquo;une interface locale non document\u00e9e sur le port 9999, XOR-obfuscated JSON, mais qui est autrement compl\u00e8tement ouverte.<\/p>\n<p>Cet objet intelligent ne permet pas la communication TCP directe sur le LAN local, mais permet une communication HTTP sur ce LAN. Nous utiliserons donc un proxy HTTP pour lui parler. Ce proxy LAN local permet d&rsquo;envoyer des POST JSON au service et de recevoir des r\u00e9ponses JSON, avec lesquelles le gestionnaire de p\u00e9riph\u00e9riques peut travailler.<\/p><\/blockquote>\n<h3>Cloud API<\/h3>\n<p>Avec l&rsquo;API du Cloud de TP-Link, il est plus facile de communiquer avec la lampe. Pour ce faire, nous enverrons une requ\u00eate avec un POST dans une commande cURL vers le serveur https:\/\/eu-wap.tplinkcloud.com. Pour l\u2019anecdote, il s&rsquo;agit d&rsquo;un serveur <a href=\"http:\/\/fr.geoipview.com\/?q=52.31.131.60\" target=\"_blank\" rel=\"noopener\">Amazon AWS \u00e0 Dublin<\/a>.<\/p>\n<p>Une fois la requ\u00eate accept\u00e9e, le serveur TP-Link envoie un ordre \u00e0 la lampe.<\/p>\n<h2>cURL<\/h2>\n<h3>Token &amp; Device ID<\/h3>\n<h4>Token<\/h4>\n<p>Avant de pouvoir nous lancer et communiquer avec le serveur, nous allons r\u00e9cup\u00e9rer un TOKEN en fournissant l&rsquo;adresse mail (login) et le mot de passe qui ont servi \u00e0 nous enregistrer sur l&rsquo;application mobile \u00ab\u00a0Kasa\u00a0\u00bb ou sur le site web <a href=\"https:\/\/www.tplinkcloud.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.tplinkcloud.com\/<\/a> :<\/p>\n<pre>$ curl --silent --request POST \"https:\/\/eu-wap.tplinkcloud.com\/ HTTP\/1.1\" --data '{ \"method\": \"login\", \"params\": { \"appType\": \"Kasa_Android\", \"cloudUserName\": \"<span style=\"color: #ff6600;\">MonAdresseMail<\/span>\", \"cloudPassword\": \"<span style=\"color: #ff6600;\">MonPassword<\/span>\", \"terminalUUID\": \"\" } }' --header \"Content-Type: application\/json\"<\/pre>\n<hr \/>\n<p><span style=\"text-decoration: underline;\"><strong>EDIT 25\/09\/2021<\/strong><\/span><\/p>\n<p>De puis quelques jours, le requ\u00eate cURL requiert une valeur dans le champ <code>terminalUUID<\/code>.<\/p>\n<p>Vous pouvez en g\u00e9n\u00e9rer une al\u00e9atoirement via ce site : <a href=\"https:\/\/www.uuidgenerator.net\/version4\" target=\"_blank\" rel=\"noopener\">https:\/\/www.uuidgenerator.net\/version4<\/a><\/p>\n<p>Nous aurons donc une ligne similaire \u00e0 ceci :<\/p>\n<pre>$ curl --silent --request POST \"https:\/\/eu-wap.tplinkcloud.com\/ HTTP\/1.1\" --data '{ \"method\": \"login\", \"params\": { \"appType\": \"Kasa_Android\", \"cloudUserName\": \"<span style=\"color: #ff6600;\">MonAdresseMail<\/span>\", \"cloudPassword\": \"<span style=\"color: #ff6600;\">MonPassword<\/span>\", \"terminalUUID\": \"<span style=\"color: #ff6600;\">MonTerminalUUID<\/span>\" } }' --header \"Content-Type: application\/json\"<\/pre>\n<p><strong>R\u00e9f\u00e9rence :<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/itnerd.space\/2017\/06\/19\/how-to-authenticate-to-tp-link-cloud-api\/\" target=\"_blank\" rel=\"noopener\">https:\/\/itnerd.space\/<\/a><\/li>\n<\/ul>\n<hr \/>\n<p>Vous devriez obtenir ce genre de r\u00e9ponse :<\/p>\n<pre>{\"error_code\":0,\"result\":{\"regTime\":\"2017-12-21 03:05:33\",\"email\":\"monmail@mondomaine.tld\",\"token\":\"<span style=\"color: #ff6600;\">xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx<\/span>\"}}<\/pre>\n<h4>Device ID<\/h4>\n<p>Pour pouvoir s&rsquo;adresser au bon objet (si vous avez plusieur lampes et\/ou prises intelligentes), nous aurons besoin de son identifiant. Pour l&rsquo;obtenir, nous utiliserons la m\u00eame commande cURL, mais avec ces donn\u00e9es et en rempla\u00e7ant les xxxxx par le token obtenu \u00e0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente :<\/p>\n<pre>curl --silent --request POST \"https:\/\/wap.tplinkcloud.com?token=<span style=\"color: #ff6600;\">xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx<\/span> HTTP\/1.1\" --data '{\"method\":\"getDeviceList\"}' --header \"Content-Type: application\/json\"<\/pre>\n<p>Vous devriez obtenir ce genre de r\u00e9ponse :<\/p>\n<pre>{\"error_code\":0,\"result\":{\"deviceList\":[{\"fwVer\":\"1.6.0 Build 170703 Rel.141938\",\"deviceName\":\"Smart Wi-Fi LED Bulb with Tunable White Light\",\"status\":1,\"alias\":\"Mon ampoule intelligente\",\"deviceType\":\"IOT.SMARTBULB\",\"appServerUrl\":\"https:\/\/eu-wap.tplinkcloud.com\",\"deviceModel\":\"LB120(EU)\",\"deviceMac\":\"xxxxxxxxxxxx\",\"role\":0,\"isSameRegion\":true,\"hwId\":\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\"fwId\":\"00000000000000000000000000000000\",\"oemId\":\"F6A0ACBBD7B8B723AE1E32C273ACB5CE\",\"deviceId\":\"<span style=\"color: #ff6600;\">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<\/span>\",\"deviceHwVer\":\"1.0\"}]}}<\/pre>\n<p>L&rsquo;identifiant de l&rsquo;objet (DeviceID) se situe vers la fin de la ligne.<\/p>\n<h4>Script<\/h4>\n<p>Voici un petit script en BASH pour obtenir ces deux infos :<\/p>\n<pre>[bash]#!\/bin\/bash\n\nLogin=&quot;monmail@mondomaine.tld&quot;\nCloudPsw=&quot;MonPassword&quot;\n\n# On demande le TOKEN \u00e0 partir du login et du password enregistr\u00e9 avec l'App Kasa\n# --silent : Pour \u00e9viter la barre de progression.\nCurlResult=$(curl --silent --request POST &quot;https:\/\/eu-wap.tplinkcloud.com\/ HTTP\/1.1&quot; \\\n--data '{ &quot;method&quot;: &quot;login&quot;, &quot;params&quot;: { &quot;appType&quot;: &quot;Kasa_Android&quot;, &quot;cloudUserName&quot;: '$Login', &quot;cloudPassword&quot;: '$CloudPsw', &quot;terminalUUID&quot;: &quot;&quot; } }' \\\n--header &quot;Content-Type: application\/json&quot;)\n\n#echo R\u00e9ponse Curl compl\u00e8te : $CurlResult\n\n# On d\u00e9coupe la r\u00e9ponse pour ne grader de le TOKEN\n# Coupe apr\u00e8s le 15\u00e8me &quot;\nToken=$(echo $CurlResult | cut -d \\&quot; -f 16)\necho Token : $Token\n\n# On demande la liste des Devices\nCurlResult=$(curl --silent --request POST &quot;https:\/\/wap.tplinkcloud.com?token=$Token HTTP\/1.1&quot; \\\n--data '{&quot;method&quot;:&quot;getDeviceList&quot;}' \\\n--header &quot;Content-Type: application\/json&quot;)\n\n#echo R\u00e9ponse Curl compl\u00e8te : $CurlResult\n\n# On d\u00e9coupe la r\u00e9ponse pour ne grader de le DeviceID\n# Coupe apr\u00e8s le 55\u00e8me &quot;\nDeviceID=$(echo $CurlResult | cut -d \\&quot; -f 56)\necho&amp;amp;lt;span style=&quot;display: inline-block; width: 0px; overflow: hidden; line-height: 0;&quot; data-mce-type=&quot;bookmark&quot; class=&quot;mce_SELRES_start&quot;&amp;amp;gt;&amp;amp;lt;\/span&amp;amp;gt; Device ID : $DeviceID\n\n[\/bash]<\/pre>\n<p>Vous pouvez t\u00e9l\u00e9charger ce script en cliquant sur <a href=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Token+DeviceID_Request.sh.zip\">ce lien<\/a>.<\/p>\n<p>Pour le rendre ex\u00e9cutable :<\/p>\n<pre>chmod +x Token+DeviceID_Request.sh<\/pre>\n<p>Et pour l&rsquo;ex\u00e9cuter :<\/p>\n<pre>.\/Token+DeviceID_Request.sh<\/pre>\n<p>La r\u00e9ponse devrait ressembler \u00e0 ceci :<\/p>\n<pre>Token : <span style=\"color: #ff6600;\">xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx<\/span>\nDevice ID : <span style=\"color: #ff6600;\">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<\/span><\/pre>\n<h3>Action<\/h3>\n<h4>D\u00e9tail du data<\/h4>\n<p>Pour passer les donn\u00e9es par la commande cURL, voici les donn\u00e9es que nous devrons envoyer :<\/p>\n<pre>curl --silent --request POST \"https:\/\/eu-wap.tplinkcloud.com\/?token=<span style=\"color: #ff6600;\">$Token<\/span> HTTP\/1.1\" \\<\/pre>\n<pre> --data '{\"method\":\"passthrough\", \"params\": {\n     \"deviceId\": '<span style=\"color: #ff6600;\">$DeviceID<\/span>', \"requestData\": \"{\n         \\\"smartlife.iot.smartbulb.lightingservice\\\":{\n             \\\"transition_light_state\\\":{\n                 \\\"on_off\\\":'<span style=\"color: #ff6600;\">$LightState<\/span>',\n                 \\\"transition_period\\\":'<span style=\"color: #ff6600;\">$TransitionPeriod<\/span>',\n                 \\\"mode\\\":\\\"normal\\\",\n                 \\\"hue\\\":<span style=\"color: #ff6600;\">$Hue<\/span>,\n                 \\\"saturation\\\":<span style=\"color: #ff6600;\">$Saturation<\/span>,\n                 \\\"color_temp\\\":'<span style=\"color: #ff6600;\">$ColorTemp<\/span>',\n                 \\\"brightness\\\":'<span style=\"color: #ff6600;\">$Brightness<\/span>'\n                 }\n             }\n         }\"\n     }\n }' \\<\/pre>\n<pre> --header \"Content-Type: application\/json\"<\/pre>\n<p>J&rsquo;ai introduit quelques variables (en couleur) qui seront utilis\u00e9es dans le script ci-dessous :<\/p>\n<pre>$Token              # <span style=\"color: #ff6600;\">xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx<\/span>\n$DeviceID           # <span style=\"color: #ff6600;\">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<\/span>\n\n$LightState         # 1 = ON \/ 0 = OFF\n$TransitionPeriod   # Dur\u00e9e de transition en ms\n$Brightness         # Intensit\u00e9 limineuse en % : min = 1 \/ max = 100\n$ColorTemp          # Temp\u00e9rature de couleur en Kelvin : min = 2700 \/ max = 6500<\/pre>\n<p><code>$Hue<\/code> et <code>$Saturation<\/code> ne seront utilis\u00e9s qu&rsquo;avec la lampe TP-Link LB130 qui g\u00e8re la trichromie.<\/p>\n<p>J&rsquo;ignore \u00e0 quoi sert le paramettre <code>mode<\/code>. Peut-\u00eatre une s\u00e9lection entre \u00ab\u00a0normal\u00a0\u00bb et \u00ab\u00a0preset\u00a0\u00bb&#8230; Si vous le savez, indiquez-le dans les commentaires.<\/p>\n<h4>Script<\/h4>\n<p>Voici un petit script qui vous demandera d&rsquo;introduire chaque valeur \u00e0 assigner \u00e0 la lampe :<\/p>\n<pre>[bash]#!\/bin\/bash\n\nToken=xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx\nDeviceID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n\necho Token : $Token\necho Device ID : $DeviceID\necho\n\nread -p &quot;Etat ? 1=ON 0=OFF : &quot; LightState\nread -p &quot;Intensit\u00e9 ? Min=1 Max=100 : &quot; Brightness\nread -p &quot;T. de couleur en K ? Min=2700 Max=6500 : &quot; ColorTemp\nread -p &quot;T. de transfert en ms ? : &quot; TransitionPeriod\n\nCurlResult=$(curl --silent --request POST &quot;https:\/\/eu-wap.tplinkcloud.com\/?token=$Token HTTP\/1.1&quot; \\\n --data '{&quot;method&quot;:&quot;passthrough&quot;, &quot;params&quot;: {&quot;deviceId&quot;: '$DeviceID', &quot;requestData&quot;: &quot;{\\&quot;smartlife.iot.smartbulb.lightingservice\\&quot;:{\\&quot;transition_light_state\\&quot;:{\\&quot;on_off\\&quot;:'$LightState',\\&quot;transition_period\\&quot;:'$TransitionPeriod',\\&quot;mode\\&quot;:\\&quot;normal\\&quot;,\\&quot;hue\\&quot;:0,\\&quot;saturation\\&quot;:0,\\&quot;color_temp\\&quot;:'$ColorTemp',\\&quot;brightness\\&quot;:'$Brightness'}}}&quot; }}' \\\n --header &quot;Content-Type: application\/json&quot;)\n\n[\/bash]<\/pre>\n<p>Vous pouvez t\u00e9l\u00e9charger ce script en cliquant sur <a href=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/tpl-lb.sh.zip\">ce lien<\/a>.<\/p>\n<p>Pour le rendre ex\u00e9cutable :<\/p>\n<pre>chmod +x tpl-lb.sh<\/pre>\n<p>Et pour l&rsquo;ex\u00e9cuter :<\/p>\n<pre>.\/tpl-lb.sh<\/pre>\n<p>Voil\u00e0, la lampe devrait maintenant r\u00e9pondre \u00e0 vos commandes au clavier&#8230; \ud83d\ude42<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<ul>\n<li><a href=\"http:\/\/itnerd.space\/2017\/06\/19\/how-to-authenticate-to-tp-link-cloud-api\/\" target=\"_blank\" rel=\"noopener\">http:\/\/itnerd.space\/2017\/06\/19\/how-to-authenticate-to-tp-link-cloud-api\/<\/a><\/li>\n<li><a href=\"http:\/\/itnerd.space\/2017\/05\/21\/how-to-get-the-tp-link-hs100-cloud-end-point-url\/\" target=\"_blank\" rel=\"noopener\">http:\/\/itnerd.space\/2017\/05\/21\/how-to-get-the-tp-link-hs100-cloud-end-point-url\/<\/a><\/li>\n<li><a href=\"http:\/\/itnerd.space\/2017\/01\/22\/how-to-control-your-tp-link-hs100-smartplug-from-internet\/\" target=\"_blank\" rel=\"noopener\">http:\/\/itnerd.space\/2017\/01\/22\/how-to-control-your-tp-link-hs100-smartplug-from-internet\/<\/a><\/li>\n<li><a href=\"http:\/\/blaya.club\/SmartHome\/2017\/08\/15\/tp-link-api-same-hacks-on-php\/\" target=\"_blank\" rel=\"noopener\">http:\/\/blaya.club\/SmartHome\/2017\/08\/15\/tp-link-api-same-hacks-on-php\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introduction La lampe <\/p>\n<p>Pour la No\u00ebl, j&rsquo;ai re\u00e7u une ampoule <a href=\"http:\/\/www.tp-link.fr\/products\/details\/cat-5609_LB120.html\" target=\"_blank\" rel=\"noopener\">TP-Link LB120<\/a>. C&rsquo;est une lampe autonome qui&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2825,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[179,10,3,173,178,12],"tags":[302,303,202,17,304,301,300,74],"class_list":["post-2824","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-domotique","category-geek","category-informatique","category-linux","category-mac","category-raspberrypi","tag-api","tag-cloud","tag-curl","tag-domotique","tag-lampe","tag-lb120","tag-tp-link","tag-wifi","end"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/TP-Link-LB120-API-00.jpg","_links":{"self":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/2824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2824"}],"version-history":[{"count":0,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/2824\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/media\/2825"}],"wp:attachment":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2824"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}