Nest API, при нажатии кнопки запустите функцию PHP, которая изменяет данные, затем перезагрузите данные - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть веб-сайт, взаимодействующий с моим термостатом Nest.Я пытаюсь, чтобы кнопки «вверх» и «вниз» в HTML вызывали функцию, которая измеряет целевую температуру термостата, увеличивает или уменьшает ее на один градус, настраивает термостат и затем отображает вновь установленную температуру термостата.

Я могу заставить его работать (без AJAX), но это не красиво и добавляет теги «tempUp / Dn = 1» к URL моих сайтов, что приводит к путанице.Ниже показана текущая настройка.Как я могу использовать AJAX с этой настройкой, чтобы я мог просматривать index.php и увеличивать / уменьшать температуру, не выходя из index.php?

Я предполагаю, что мне нужно что-то вроде этого, но я не делаюзнать, где его разместить:

$.ajax({
   type: "POST",
   url: "something.php",
   success: function(msg){
      alert( 'something' );
   }
 });

index.php:

Главный портал для моего сайта.Делает много вещей.Только часть, где находится, приносит в мой плагин термостата

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
$(function(){
        // Load at thermostat 
        $.ajax({
            url: "./thermostat/thermostat.php",
            type: "POST",
            dataType: "text",
            success: function(data){
                $("#thermostat_div").html(data);
            }
        })
 });
 </script>
 <div id=thermostat_div>
     Loading the thermostat...
 </div>

thermostat.php:

Показывает целевую температуру от термостата.Также отображаются кнопки «вверх» и «вниз», предназначенные для увеличения или уменьшения температуры.

Если я загружаю эту страницу непосредственно в браузере, она работает.Это работает путем добавления «& tempUp = 1» или «& tempDn = 1» URL-адреса и перезагрузки страницы.Но когда я загружаю свой основной index.php, кнопки срабатывают при нажатии, но температура не обновляется.Мне нужно что-то, чтобы я мог загрузить index.php, щелкнуть по кнопкам, запустить соответствующую функцию увеличения / уменьшения, а затем каким-то образом обновить thermometer_div, чтобы показать новую установленную температуру без добавления дерьма в URL.

     <?php 
     // Import the function to adjust the target temp
     include '/var/www/thermostat/functions.php

     // Display the temp the thermostat stat is set to 
     echo "<div class='targetTemp'>".$targetTemp."</div>"; 

    if($_GET['tempDn']){
        $targetTemp = $targetTemp - 1;
        $newTemp = '{"target_temperature_f": ' . $targetTemp . '}';
        changeTemp($newTemp);
    }
    if($_GET['tempUp']){
        $targetTemp = $targetTemp + 1;
        $newTemp = '{"target_temperature_f": ' . $targetTemp . '}';
        changeTemp($newTemp);
    }

    ?>

    <button class="btndn orange" type="button" onClick='location.href="?tempDn=1"'>ᐁ</button>
    <button class="btnup orange" type="button" onClick='location.href="?tempUp=1"'>ᐃ</button>

functions.php:

<?php
function changeTemp($changeTempTo) {
    include '/var/www/config.php';
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://developer-api.nest.com/devices/thermostats/secretcode",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_CUSTOMREQUEST => "PUT",
        CURLOPT_POSTFIELDS => $changeTempTo,
        CURLOPT_HTTPHEADER => array(
            "authorization: Bearer ".$nestAccessToken,
            "cache-control: no-cache",
            "content-type: application/x-www-form-urlencoded",
            "content-length: ".strlen($changeTempTo)
        ),
    ));
    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    if ($err) {
        echo "cURL Error #:" . $err;
    }
}


//Get all the other status off the thermostat
include '/var/www/config.php';
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => "https://developer-api.nest.com/devices/thermostats/secretkey",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_POSTFIELDS => "client_id=".$nestClientID."&client_secret=".$nestClientSecret."&grant_type=authorization_code&code=".$nestAuthCode,
    CURLOPT_HTTPHEADER => array(
        "authorization: Bearer ".$nestAccessToken,
        "cache-control: no-cache",
        "content-type: application/x-www-form-urlencoded"
    ),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
    echo "cURL Error #:" . $err;
} else {
    $parsed_json = json_decode($response);
    $targetTemp = $parsed_json->{'target_temperature_f'};     
}

?>

1 Ответ

0 голосов
/ 23 февраля 2019

Привет, вы можете сделать это следующим образом:

в вашем php-файле обработайте подобные вещи:

if (isset($_POST["action"])) {
        $action = $_POST["action"];
        switch ($action) {
            case 'update':
                if (isset($_POST["request"])) {
                    $request= $_POST["request"];
                    if ($request == "temperature") {
                       //do your curl here and fill your response then send it
                       echo json_encode($response);
                    }
                }
                break;

        }
    }

Где действие - это команда, которую вы хотите выполнить, и параметр что-то для запускаопределенная служебная функция

, затем в вашем ajax:

function getInfo(action,request) {
   return $.ajax({
        type: "POST",
        url: "getInfo.php",
        data: {action:action, request: request}
    })

}

вызовите ее следующим образом:

$("#myButtonId").on('click',function(){
getInfo('update','temperature').done(function(response){
var data=JSON.parse(response);
if (data != null) {
//fill your forms using your data e.g
$("#yourInput").val(data.temperature);
}
})

})

Надеюсь, это поможет

...