Lidl Parkside robotmaaier bedienen met PHP of Domoticz
In dit artikel leggen we uit hoe je de Parkside PMRDA 20-Li A1 Robotmaaier kunt bedienen middels een PHP-script.
Uitgangpunten:
- Je heb de Tuya Smart app (Playstore of App store) geinstalleerd, een Tuya account aangemaakt en de robotmaaier gekoppeld aan de app. Test even of je de robotmaaier met de app kunt bedienen!
- Je hebt een webserver met PHP (liefst versie 8.0 of hoger) draaien.
Het stappenplan bestaat uit verschillende stappen:
- Tuya Cloud Project aanmaken
- Tuya Smart app koppelen aan het cloud project
- PHP-scripts om informatie op te halen of de robotmaaier te bedienen
- Tuya API-service verlengen
Tuya Cloud Project aanmaken
Ga naar de developer site van Tuya en maak een account aan.
Log nu in met het account dat je zojuist gemaakt hebt:
Je krijgt nu een vraag over het account type. Klik op Skip this step. You can continue the setting in User Center later:
Klik nu aan de linkerkant op Cloud en vervolgens aan de rechterkant op Create Cloud Project:
Verzin zelf een Project Name. Bij Industry en Development Method moet je voor Smart Home kiezen. Het Data Center moet overeenkomen met het account dat je in de Tuya Smart app hebt. Bij mij was dat Central Europe Data Center. Klik tot slot op Create:
Zorg dat in het volgende scherm IoT Core en Smart Home Scene Linkage geselecteerd zijn. Klik op Authorize:
Je project is nu aangemaakt. De belangrijkste gegevens zijn Access ID/Client ID en Acces Secret/Client Secret. Noteer deze gegevens goed, later heb je ze nodig!
Tuya Smart app koppelen aan het cloud project
Het Tuya cloud project is nu aangemaakt. We gaan nu het account van de Tuya Smart app koppelen aan het cloud project.
Klik nu op Devices, daarna op Link Tuya App Account en tot slot op Add App Account:
Je krijgt nu een QR-code te zien. Scan de code met de Tuya Smart app op je telefoon (rechtsonder Profiel en daarna rechtsboven op scan-icoontje):
Nadat je met de telefoon gescand en bevestigd hebt zie je onderstaand scherm. Kies voor Automatic Link en klik op OK:
Je krijgt de melding dat 1 device vanuit de app gelinkt wordt met het aangemaakte proces. Dat is precies wat we willen 🙂
Als alles goed gegaan is zie je nu jouw device. Noteer het Device ID, dit ID hebben we later nodig!
Klik nu op Robot lawn mower:
Kies hier voor DP Instruction en klik op Save Configuration:
Je krijgt nog de vraag of je zeker bent. Klik op OK:
Nu zijn alle voorbereidingen getroffen om data uit de robotmaaier te lezen én de robotmaaier te kunnen aansturen vanuit een PHP-script!
PHP-scripts om informatie op te halen of de robotmaaier te bedienen
Onderstaand een PHP-script waarmee je informatie uit de robotmaaier kunt lezen. Zelf vind ik vooral de laatste 7 regels van de output interessant:
Active time: 2024-04-19 19:10:05
Biz_type: 0
Category: gcj
Create time: 2024-04-19 19:10:05
Icon: smart/icon/ay1559701439060fw6BY/cd5d1eb275462c33b3ea5f52672fe535.png
ID: **********************
Public IP: XX.XXX.XX.XXX
Latitude.: XX.XXXX
Local key: ***************
Longitude: X.XXXX
Model:
Naam: Robotmaaier
Online: 1
Owner ID: ********
Product ID: *************
Product name: Robot lawn mower PMRDA 20-Li A1
Batterij-percentage: 100
Status maairobot: STANDBY
Foutcode maairobot: 0
Waarschuwing maairobot: MOWER_LEAN
Regenmodus:
Aantal werkuren maairobot: 1
Pincode maairobot: 1111
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
<?php $baseUrl = 'https://openapi.tuyaeu.com/'; $clientId = '********************'; $secret_key = '******************************'; $getToken = "v1.0/token?grant_type=1"; $t = round(microtime(true) * 1000); $aDevices = 'v1.0/devices/'; $device_id = '**********************'; ////// GET TOKEN //////// function get_token() { global $baseUrl; global $clientId; global $getToken; global $t; $headers = array( 'sign_method: HMAC-SHA256', 'client_id: '.$clientId, 't: '.$t, 'Content-Type: application/json', 'access_token:' ); $url = $baseUrl . $getToken; $sign = build_sign('GET', $url, [], []); $headers[] = "sign: " . $sign; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers )); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } ////// GET INFORMATION //////// function get_device_information($device_id, $access_token) { global $baseUrl; global $aDevices; global $clientId; $t = round(microtime(true) * 1000); $headers = array( 'sign_method: HMAC-SHA256', 'client_id: '.$clientId, 't: '.$t, 'Content-Type: application/json', 'access_token: ' . $access_token ); $method = 'GET'; $payload = array( 'device_id' => $device_id ); $url = $baseUrl . $aDevices . $device_id . '/'; $sign = build_sign($method, $url, [], [], $access_token); $headers[] = "sign: " . $sign; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $headers )); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } function build_sign($method, $url ,$payload, $headers, $token = "") { global $clientId; global $secret_key; $t = round(microtime(true) * 1000); $str_header = ""; if ($headers) { $str_header = implode("\n", $headers); } $str_payload = ""; if ($payload) { $str_payload = json_encode($payload); } $content_SHA256 = hash('sha256', $str_payload); $parse_url = parse_url($url); $part_url = empty($parse_url['path']) ? "" : $parse_url['path']; $query_url = empty($parse_url['query']) ? "" : "?" . $parse_url['query']; $str_to_sign = $method . "\n" . $content_SHA256 . "\n" . $str_header . "\n" . $part_url . $query_url; $sign = strtoupper(hash_hmac('SHA256', $clientId . $token . $t . $str_to_sign, $secret_key)); return $sign; } $output = get_token(); $access_token = $output['result']['access_token']; //print_r(get_device_information($device_id, $access_token)); echo 'Active time: '.date("Y-m-d H:i:s", substr(get_device_information($device_id, $access_token)['result']['active_time'], 0, 10)).PHP_EOL; echo 'Biz_type: '.get_device_information($device_id, $access_token)['result']['biz_type'].PHP_EOL; echo 'Category: '.get_device_information($device_id, $access_token)['result']['category'].PHP_EOL; echo 'Create time: '.date("Y-m-d H:i:s", substr(get_device_information($device_id, $access_token)['result']['create_time'], 0, 10)).PHP_EOL; echo 'Icon: '.get_device_information($device_id, $access_token)['result']['icon'].PHP_EOL; echo 'ID: '.get_device_information($device_id, $access_token)['result']['id'].PHP_EOL; echo 'Public IP: '.get_device_information($device_id, $access_token)['result']['ip'].PHP_EOL; echo 'Latitude.: '.get_device_information($device_id, $access_token)['result']['lat'].PHP_EOL; echo 'Local key: '.get_device_information($device_id, $access_token)['result']['local_key'].PHP_EOL; echo 'Longitude: '.get_device_information($device_id, $access_token)['result']['lon'].PHP_EOL; echo 'Model: '.get_device_information($device_id, $access_token)['result']['model'].PHP_EOL; echo 'Naam: '.get_device_information($device_id, $access_token)['result']['name'].PHP_EOL; echo 'Online: '.get_device_information($device_id, $access_token)['result']['online'].PHP_EOL; echo 'Owner ID: '.get_device_information($device_id, $access_token)['result']['owner_id'].PHP_EOL; echo 'Product ID: '.get_device_information($device_id, $access_token)['result']['product_id'].PHP_EOL; echo 'Product name: '.get_device_information($device_id, $access_token)['result']['product_name'].PHP_EOL.PHP_EOL; echo 'Batterij-percentage: '.get_device_information($device_id, $access_token)['result']['status'][0]['value'].PHP_EOL; echo 'Status maairobot: '.get_device_information($device_id, $access_token)['result']['status'][1]['value'].PHP_EOL; echo 'Foutcode maairobot: '.get_device_information($device_id, $access_token)['result']['status'][2]['value'].PHP_EOL; echo 'Waarschuwing maairobot: '.get_device_information($device_id, $access_token)['result']['status'][3]['value'].PHP_EOL; echo 'Regenmodus: '.get_device_information($device_id, $access_token)['result']['status'][4]['value'].PHP_EOL; echo 'Aantal werkuren maairobot: '.get_device_information($device_id, $access_token)['result']['status'][5]['value'].PHP_EOL; echo 'Pincode maairobot: '.get_device_information($device_id, $access_token)['result']['status'][6]['value'].PHP_EOL; ?> |
Hieronder vind je een PHP-script, waarmee je de robotmaaier kunt laten beginnen met maaien. Op regel 3,4 en 8 vul je de waarden in die je eerder in het cloud project bent tegengekomen. De waarde “StartMowing” op regel 9 zorgt ervoor dat de robot begint maaien. Als je “StartMowing” vervangt door “PauseWork” dan zal de robot pauzeren. Op regel 14 t/m 19 vind je alle mogelijkheden. Merk hierbij op dat als je het maaien wil afbreken de juiste volgorde StartMowing -> PauseWork -> CancelWork -> StartReturnStation is. Je kunt dus niet van StartMowing direct naar StartReturnStation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
<?php $baseUrl = 'https://openapi.tuyaeu.com/'; $clientId = '********************'; $secret_key = '******************************'; $getToken = "v1.0/token?grant_type=1"; $t = round(microtime(true) * 1000); $fDevices = 'v1.0/iot-03/devices/'; $device_id = '**********************'; $machineControlCmd = 'StartMowing'; $commands = '"code":"MachineControlCmd","value":"'.$machineControlCmd.'"'; /* Mogelijk waarden voor MachineControlCmd: PauseWork CancelWork ContinueWork StartMowing StartFixedMowing StartReturnStation */ ////// GET TOKEN //////// function get_token() { global $baseUrl; global $clientId; global $getToken; global $t; $headers = array( 'sign_method: HMAC-SHA256', 'client_id: '.$clientId, 't: '.$t, 'Content-Type: application/json', 'access_token:' ); $url = $baseUrl . $getToken; $sign = build_sign('GET', $url, [], []); $headers[] = "sign: " . $sign; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers )); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } ////// SEND COMMAND //////// function send_commands($device_id, $commands ,$access_token) { $t = round(microtime(true) * 1000); global $baseUrl; global $clientId; global $fDevices; global $device_id; global $machineControlCmd; $headers = array( 'sign_method: HMAC-SHA256', 'client_id: '.$clientId, 't: '.$t, 'Content-Type: application/json', 'access_token: ' . $access_token ); $method = 'POST'; if (empty($commands)) { return false; } $payload = array( "commands" => array( array( "code" => "MachineControlCmd", "value" => $machineControlCmd ) ) ); $url = $baseUrl . $fDevices . $device_id . '/commands'; $sign = build_sign($method, $url, $payload, [], $access_token); $headers[] = "sign: " . $sign; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_POSTFIELDS =>json_encode($payload), CURLOPT_HTTPHEADER => $headers )); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } function build_sign($method, $url ,$payload, $headers, $token = "") { global $clientId; global $secret_key; $t = round(microtime(true) * 1000); $str_header = ""; if ($headers) { $str_header = implode("\n", $headers); } $str_payload = ""; if ($payload) { $str_payload = json_encode($payload); } $content_SHA256 = hash('sha256', $str_payload); $parse_url = parse_url($url); $part_url = empty($parse_url['path']) ? "" : $parse_url['path']; $query_url = empty($parse_url['query']) ? "" : "?" . $parse_url['query']; $str_to_sign = $method . "\n" . $content_SHA256 . "\n" . $str_header . "\n" . $part_url . $query_url; $sign = strtoupper(hash_hmac('SHA256', $clientId . $token . $t . $str_to_sign, $secret_key)); return $sign; } $output = get_token(); $access_token = $output['result']['access_token']; send_commands($device_id, $commands ,$access_token); ?> |
Tuya API-service verlengen
Standaard kun je de Tuya API-service 6 maanden gratis gebruiken. Gelukkig kun je dit telkens met 6 maanden verlengen, zodat het gebruik van de API gratis is (en blijft).
Ga naar Cloud en vervolgens naar Cloud Services:
bij IoT Core klik je rechts op View Details:
Klik op Extend Trial Period:
Vul het formulier in en klik op Submit:
Na 1 à 2 dagen krijg je bericht je dat de trial met 6 maanden verlengd is!