API problème foreach

Default
,

Voila je rencontre un petit problème avec mon code. J'utilise le cours "Utiliser une API avec cURL" afin de m'aider mais j'ai un problème vers la fin de la vidéo il y a un foreach pour récupérer les valeurs souhaitées et je veux en faire de même mais rien ne fonctionne..

Voici le JSON récupéré de l'API Home Assistant

{
  "attributes": {
    "friendly_name": "Applique Salon",
    "max_mireds": 370,
    "min_mireds": 153,
    "supported_features": 43
  },
  "context": {
    "id": "ca94630f8dc0431caf70f7a97f943cba",
    "user_id": null
  },
  "entity_id": "light.applique_salon",
  "last_changed": "2019-03-31T10:13:32.795918+00:00",
  "last_updated": "2019-03-31T10:13:32.795918+00:00",
  "state": "off"
}

Ce que je veux

C'est récupéré le "friendly_name" ainsi que "state"

Ce que j'obtiens

homeassistant.php :

class HomeAssistant{

    private $apiKey;

    public function __construct(string $apiKey){
        $this->apiKey = $apiKey;
    }

    public function getTemperature(string $entity): ?array{
        $curl = curl_init("http://hassio.local:8123/api/states/{$entity}");

        $headers = array(
            "Authorization: Bearer {$this->apiKey}",
            "Content-Type: application/json",
        );

        curl_setopt_array($curl, [
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => false,
            CURLOPT_TIMEOUT => 1
        ]);

        $data = curl_exec($curl);

        if($data === false || curl_getinfo($curl, CURLINFO_HTTP_CODE) !== 200){
            return null;              
        }

        $results = [];

        $data = json_decode($data, true);

        return $results;
    }

}

index.php

ini_set('display_errors', 'On');

require_once 'HomeAssistant.php';

$hassio = new HomeAssistant("xxxxCléAPIxxx");
$temperature = $hassio->getTemperature('light.applique_salon');

merci d'avance !

5 Réponse

17162
,

Bonsoir.
Il y a un problème dans ta fonction getTemperature de la classe HomeAssistant.
Tu définis la variable $results que tu ne remplies à aucun moment et tu retourne celle-ci, sauf du coup tu te retrouve avec un tableau vide en retour de ta fonction.
Il te faudrait donc modifier par :

$results = json_decode($data, true);
return $results;

Ou directement :

return json_decode($data, true);
Default
,

Dans le tutoriel il remplit la variable results à l'aide d'un foreach mais dans mon cas cela ne fonctionne pas, j'aimerais retourner uniquement 'state' et 'friendly_name' comment puis-je faire ?

17162
,

Dans le tutoriel il remplit la variable results à l'aide d'un foreach mais dans mon cas cela ne fonctionne pas, j'aimerais retourner uniquement 'state' et 'friendly_name' comment puis-je faire ?

Vu que tu ne récupère qu'un seul enregistrement, il t'es inutile de faire une boucle, il te suffit par exemple de faire :

$data = json_decode($data, true);
$result = [
    'state'         =>  $data['state'],
    'friendly_name' =>  $data['attributes']['friendly_name']
];
return $result;
Default
,

sa me retourne NULL... voici l'affichage dans le navigateur :

{"attributes": {"friendly_name": "Applique Salon", "max_mireds": 370, "min_mireds": 153, "supported_features": 43}, "context": {"id": "716cff9017d34598b3675e5b98115309", "user_id": null}, "entity_id": "light.applique_salon", "last_changed": "2019-04-01T05:45:06.123132+00:00", "last_updated": "2019-04-01T05:45:06.123132+00:00", "state": "off"}array(2) {
  ["state"]=>
  NULL
  ["friendly_name"]=>
  NULL
}
Default
,

Pourquoi le json est affiché également ?

le fichier qui affiche :

ini_set('display_errors', 'On');

require_once 'HomeAssistant.php';

$hassio = new HomeAssistant("myKeyAPI");
$temperature = $hassio->getTemperature('light.applique_salon');

var_dump($temperature);