Update wegen ID-Länge!!!
…also nochmals danke, Fonzo! Bin beeindruckt - das Skript hat sofort funktioniert! :)
Zwei Dinge noch als kurzer Hinweis für alle Nutzer:
- Die IDs vom Gateway und den TapLinkern darf man nicht mit den in der App angezeigten Bindestrichen in die u.g. Variablen eintragen, da sonst Fehlermeldung
- App/Webportal zeigen die IDs anonymisiert an (letzten 4 Stellen mit xxxx); Achtung: Die IDs sind auch auf den Geräten mit 20 Digits angegeben, aber die API verträgt nur die ersten 16 Digits! Also nur die ersten 16 Stellen (ohne Bindestrich) im Script eintragen. Die API-Funktion getWateringStatus reagiert in der V1.1 dummerweise bei einer zu langen ID mit dem falschen Status…
Hier noch eine um einige weitere Funktionen ergänzte Version, die restlichen Funktionen baue ich bei Bedarf ein.
$gatewayID = 'xxx'; // ohne Bindestriche, 16 Digits
$taplinker1 = 'xxx'; // ohne Bindestriche, 16 Digits
$link_tap = new LinkTap('xxx', 'xxx', $gatewayID, $taplinker1);
// $result = $link_tap->Watering_On(20);
// echo $result.PHP_EOL;
// var_dump($result);
$result = $link_tap->Get_All_Devices();
$status = json_decode($result);
print_r($status);
class LinkTap
{
private const LINK_TAP_BASE_URL = 'https://www.link-tap.com/api/';
private const ACTIVATE_INSTANT_MODE = 'activateInstantMode';
private const ACTIVATE_INTERVAL_MODE = 'activateIntervalMode';
private const QUERY_WATERING_STATUS = 'getWateringStatus';
private const GET_ALL_DEVICES = 'getAllDevices';
public $username; // String type. Your LinkTap account's username
public $apiKey; // String type. Your API key
public $gatewayId; // String type. Your LinkTap Gateway's first 16-digits/letters ID, case insensitive, no dash symbol, e,g, 3F7A23FE004B1200
public $taplinkerId; // String type. Your LinkTap Taplinker's first 16-digits/letters ID, case insensitive, no dash symbol, e,g, 67ABCDEF004B1200
function __construct(string $username, string $api_key, string $gatewayId, string $taplinkerId)
{
$this->username = $username;
$this->apiKey = $api_key;
$this->gatewayId = $gatewayId;
$this->taplinkerId = $taplinkerId;
}
/** Watering On
* @param int $duration The watering duration (unit is minute) the range is from 1 minute to 1439 minutes.
* @return string
*/
public function Watering_On(int $duration)
{
$url = self::LINK_TAP_BASE_URL . self::ACTIVATE_INSTANT_MODE;
$data = json_encode([
'username' => $this->username,
'apiKey' => $this->apiKey,
'gatewayId' => $this->gatewayId,
'taplinkerId' => $this->taplinkerId,
'action' => true,
'duration' => $duration,
'eco' => true,
'ecoOn' => 1,
'ecoOff' => 2
]);
$response = $this->PostData($url, $data);
return $response;
}
/** Watering Off
* @param int $duration
* @return string
*/
public function Watering_Off()
{
$url = self::LINK_TAP_BASE_URL . self::ACTIVATE_INSTANT_MODE;
$data = json_encode([
'username' => $this->username,
'apiKey' => $this->apiKey,
'gatewayId' => $this->gatewayId,
'taplinkerId' => $this->taplinkerId,
'action' => false,
'duration' => 0
]);
$response = $this->PostData($url, $data);
return $response;
}
/** Watering Status of a single Taplinker
* @param (string $taplinkerId)
* @return string
*/
public function Watering_Status()
{
$url = self::LINK_TAP_BASE_URL . self::QUERY_WATERING_STATUS;
$data = json_encode([
'username' => $this->username,
'apiKey' => $this->apiKey,
'taplinkerId' => $this->taplinkerId
]);
$response = $this->PostData($url, $data);
return $response;
}
/** Get All Devices
* @param (string $gatewayId)
* @return string
*/
public function Get_All_Devices()
{
$url = self::LINK_TAP_BASE_URL . self::GET_ALL_DEVICES;
$data = json_encode([
'username' => $this->username,
'apiKey' => $this->apiKey,
'gatewayId' => $this->gatewayId,
]);
$response = $this->PostData($url, $data);
return $response;
}
protected function PostData($url, $data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false); // geändert von true damit json_decode() von result funkioniert; falls Header von Interesse, dann curl_getinfo($ch, CURLINFO_HTTP_CODE)
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
if (curl_errno($ch)) {
trigger_error('Error:' . curl_error($ch));
}
$info = curl_getinfo($ch);
// var_dump($info);
$header_out = curl_getinfo($ch, CURLINFO_HEADER_OUT);
// var_dump($header_out);
curl_close($ch);
return $result;
}
}