Benutzer-Werkzeuge

Webseiten-Werkzeuge


php:tado

Dies ist eine alte Version des Dokuments!


Tado° ReST-API - Heizungssteuerung mit PHP

Mit dieser PHP-Klasse ist es möglich, die Heizthermostate der Firma Tado mit PHP zu steuern. Hier sind noch Benutzername und Passwort zu ergänzen, wobei der Benutzername der E-Mail-Adresse, mit der Ihr Konto bei Tado angelegt wurde, entspricht.

classTado.php
class Tado
{
    private $token      = '';
    private $homeId      = 0;
    private $zones      = [];
 
    private $password   = '';
    private $username   = '';
 
    public function __construct()
    {
        $content = file_get_contents( 'https://my.tado.com/webapp/env.js' );
 
        foreach( [ 'apiEndpoint', 'clientId', 'clientSecret' ] as $var )
        {
            preg_match( sprintf( "/%s: '(.*)'/", $var ), $content, $matches );
 
            if( count( $matches ) === 2 )
            {
                $parameter[] = $matches[1];
            }
        }
 
        $this->setBearerToken( $parameter );
        $this->setHomeId();
        $this->setZones();
    }
 
    private function setBearerToken( $parameter )
    {
        $data['client_id']      = $parameter[1];
        $data['client_secret']  = $parameter[2];
        $data['grant_type']     = 'password';
        $data['scope']          = 'home.user';
        $data['username']       = $this->username;
        $data['password']       = $this->password;
 
        $result = $this->curl( $parameter[0] . '/token', 'POST', $data );
 
        if( isset( $result->access_token ) )
        {
            $this->token = $result->access_token;
        }
    }
 
    private function setHomeId()
    {
        $result = $this->curl( 'https://my.tado.com/api/v1/me', 'GET' );
        $this->homeId = $result->homeId;
    }
 
 
    private function setZones()
    {
        $result = $this->curl( sprintf( 'https://my.tado.com/api/v2/homes/%s/zones', $this->homeId ), 'GET' );
        $this->zones = $result;
    }
 
    /**
     * @param $name
     * @return integer|false
     */
    private function getZoneId( $name )
    {
        foreach( $this->zones as $zone )
        {
            if( utf8_decode( $zone->name ) === $name )
            {
                return $zone->id;
            }
        }
 
        return false;
    }
 
    public function getSetting( $zone )
    {
        $path = sprintf( 'https://my.tado.com/api/v2/homes/%s/zones/%d/state', $this->homeId, $zone );
        $result = $this->curl( $path, 'GET' );
        unset( $result->setting->temperature->fahrenheit );
        return $result->setting;
    }
 
    /**
     * @param string $room
     * @param float $grad
     */
    public function updateTemperature( string $room, float $grad )
    {
        $zone = $this->getZoneId( $room );
 
        if( $zone === false )
        {
            return;
        }
 
        $setting = $this->getSetting( $zone );
        $setting->type = 'HEATING';
        $setting->temperature->celsius = $grad;
 
        $data = new stdClass();
        $data->setting = $setting;
        $data->termination = new stdClass();
        $data->termination->type = 'MANUAL';
        $this->curl( sprintf( 'https://my.tado.com/api/v2/homes/%s/zones/%d/overlay', $this->homeId, $zone ), 'PUT', json_encode( $data ) );
    }
 
    public function curl( $path, $method, $data = '' )
    {
        $ch = curl_init( $path );
 
        if( ! empty( $this->token ) )
        {
            $header[] ='Authorization: Bearer ' . $this->token;
 
            if( $method === 'PUT' )
            {
                $header[] ='Content-Type:application/json;charset=UTF-8';
            }
 
            curl_setopt ($ch, CURLOPT_HTTPHEADER, $header );
        }
 
        curl_setopt( $ch, CURLOPT_URL, $path );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, $method );
 
        if( ! empty( $data ) )
        {
            if( $method === 'PUT' )
            {
                curl_setopt( $ch, CURLOPT_POSTFIELDS, $data );
            }
            else
            {
                curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data ) );
            }
        }
 
        $json = curl_exec( $ch );
        curl_close( $ch );
        return json_decode( $json );
    }
}

Funktionsaufruf

Mit diesem Aufruf wird die Temperatur von Zone 1 auf 17 Grad gestellt:

$tado = new Tado;
$tado->updateTemperature( 'Büro', 16 );
php/tado.1609942048.txt.gz · Zuletzt geändert: 2021/01/06 15:07 von webproducer