Afficher vos tâches Todoist sur un Yocto-MaxiDisplay

Afficher vos tâches Todoist sur un Yocto-MaxiDisplay

Il y a quelques années, nous avions intégré un Yocto-MaxiDisplay dans une cuisine. Ce dispositif affichait les évènements à venir en se connectant à un calendrier Google. 8 ans plus tard, le système fonctionne toujours, mais au lieu d'afficher le calendrier on aimerait plutôt qu'il affiche les entrées d'une liste de tâches Todoist.




Pour ce bricolage, nous allons réutiliser le matériel que nous avions monté il y 8 ans. C'est-à-dire un YoctoHub-Wireless-SR et un Yocto-MaxiDisplay.

L’YoctoHub-Wireless-SR n'est plus en vente et a été remplacé par YoctoHub-Wireless-n, mais toutes les mises à jour et nouvelles fonctionnalités qui ont été ajoutées aux nouveaux modèles de YoctoHub ont aussi été backportées sur nos anciens modules. Cela veut dire que notre YoctoHub-Wireless-SR avec un firmware à jour a les mêmes fonctionnalités qu'un YoctoHub-Wireless-n neuf.

Le principe de fonctionnement reste le même, le YoctoHub utilise un callback HTTP pour se connecter à un script PHP. Le script PHP récupère la liste des tâches en utilisant l'API de Todoist et affiche les tâches courantes sur le YoctoMaxi-Display.

le YoctoHub utilise un callback HTTP pour se connecter à un script PHP qui récupère la liste des tâches
le YoctoHub utilise un callback HTTP pour se connecter à un script PHP qui récupère la liste des tâches



L'API Todoist


Todoist est un service cloud qui permet de créer et gérer des listes de tâches (to-do list). Une fois un compte créé, il est possible d'ajouter des tâches. Il est aussi possible de les classer dans différents projets pour organiser ces tâches. Bref, des fonctionnalités traditionnelles pour une application de to-do list. Notez que nous ne sommes d'aucune manière affiliés ou sponsorisés par Todoist. Il se trouve que nous utilisons ce service dans le privé, c'est tout.

Ce service offre une API REST qui permet de consulter et modifier la liste des tâches. Contrairement à d'autres services, l'API est très simple d'usage et ne requiert pas d'authentification OAuth2. Pour s'authentifier auprès de Todoist, il faut simplement passer en paramètre une clef qui est accessible dans les paramètres de votre compte.

La clef d'authentification pour utiliser l'API est disponible dans les paramètres
La clef d'authentification pour utiliser l'API est disponible dans les paramètres



Todoist ne propose pas encore de SDK en PHP (actuellement seuls Python et JavaScript sont supportés). Nous avons donc créé une classe TodoistAPI qui forge les requêtes HTTP pour accéder à l'API.

Le constructeur prend en paramètre la clef d'authentification. Cette clef est ajoutée aux headers HTTP de toutes les requêtes envoyées au serveur Todoist.

La méthode get_active_tasks effectue une requête à l'API pour obtenir la liste des tâches et les retourne dans un tableau PHP avec les tâches dans le bon ordre.

class TodoistAPI
{

  private $api_key;
  private $project_id = -1;

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

  private function request($url, bool $post_request = false)
  {
    $ch = curl_init();
    try {
      curl_setopt($ch, CURLOPT_URL, $url);
      if ($post_request) {
        curl_setopt($ch, CURLOPT_POST, true);
      }
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Authorization: Bearer " . $this->api_key
      ));

      $response = curl_exec($ch);
      if ($response === false && curl_errno($ch)) {
        print_r(curl_error($ch));
        die();
      }
    } catch (\Throwable $th) {
      throw $th;
    } finally {
      curl_close($ch);
    }
    return json_decode($response, true);
  }

  public function get_active_tasks()
  {
    $all_tasks = $this->request("https://api.todoist.com/rest/v2/tasks");
    $res = [];
    foreach ($all_tasks as $task) {
      if ($this->project_id < 0 ||
          $task['project_id'] == $this->project_id) {
        $res[] = $task;
      }
    }
    uasort($res, function ($a, $b) {
        if ($a['order'] == $b['order']) {
            return 0;
        }
        return ($a['order'] < $b['order']) ? -1 : 1;
    });

    return $res;
  }

  ....
}



Cette classe est prévue pour fonctionner indépendamment de la librairie Yoctopuce et est stockée dans le fichier TodoistAPI.php.

Le callback PHP


Maintenant que nous avons un code PHP qui permet d'interagir avec la list de tâches, il ne reste plus qu'à implémenter le callback PHP qui doit être appelé par le YoctoHub.

Nous allons passer assez rapidement sur les détails du callback HTTP, car nous avons déjà un grand nombre d'articles et de tutoriels qui expliquent en détails le fonctionnement du mode callback HTTP ainsi que sa mise en place.


Le code principal du script PHP est le suivant:

const CALLBACK_PASS = "change_this";
const TODOIST_API_KEY = "REPLACE WITH YOUR API KEY";
const TODOIST_PROJECT = "";

$error = "";
$url = 'md5:' . CALLBACK_PASS . '@callback';
if (YAPI::TestHub($url, 10, $error) == YAPI::SUCCESS) {
    YAPI::RegisterHub($url);
    $todoist = new TodoistAPI(TODOIST_API_KEY);
    $display = YDisplay::FirstDisplay();
    if ($display != null){
        if (TODOIST_PROJECT!=''){
            $todoist->fiter_project(TODOIST_PROJECT);
        }
        update_display($todoist, $display);
        print("All done.");
    } else {
        print("No Yoctopuce display connected.");
    }
    die();
}



La méthode YAPI::TestHub permet de tester si la requête vient bien d'un YoctoHub. Si c'est le cas, on initialise la connexion avec le YoctoHub à l'aide de la méthode YAPI::RegisterHub.

On initialise notre objet TodoistAPI en lui passant la clef de l'API. Si un écran est présent, on appelle la fonction update_display qui met à jour le Yocto-MaxiDisplay.

Cette fonction rafraîchit l'écran en utilisant la technique du double buffering afin d'éviter les potentiels scintillements lors de la mise à jour des informations. C'est-à-dire que l'on écrit sur le layer 0 qui est caché, et à la fin on inverse le layer 0 avec le layer 1.

function update_display(TodoistAPI $todoist, YDisplay $display): void
{
    $tasks = $todoist->get_active_tasks();

    $layer0 = $display->get_displayLayer(0);
    $layer0->hide();
    $layer0->clear();

    if (sizeof($tasks) == 0) {
        $layer0->selectFont("Medium.yfm");
        $layer0->drawText(64, 32, YDisplayLayer::ALIGN_CENTER, "empty :-)");
    } else {
        $is_first = true;
        $v_pos = 0;
        foreach ($tasks as $t) {
            if ($is_first) {
                $layer0->selectFont("Medium.yfm");
                $layer0->drawText(2, $v_pos,
                            YDisplayLayer::ALIGN_TOP_LEFT,
                            $t['content']);
                $layer0->drawRect(0, 0, 127, 15);
                $is_first = false;
                $v_pos += 18;
            } else {
                $layer0->selectFont("Small.yfm");
                $layer0->drawCircle(3, $v_pos + 4, 2);
                $layer0->drawText(8, $v_pos,
                            YDisplayLayer::ALIGN_TOP_LEFT,
                            $t['content']);
                $v_pos += 10;
            }
            if ($v_pos > 64) {
                break;
            }
        }
    }
    $display->swapLayerContent(0, 1);
    $layer1 = $display->get_displayLayer(1);
    $layer1->unhide();
}



Comme d'habitude, le code source complet est disponible sur GitHub: https://github.com/yoctopuce-examples/todoist_display

Installation


Pour installer ce script sur votre serveur, il faut copier les fichiers dans votre répertoire et éditer le fichier index.php pour mettre à jour les trois variables suivantes:

const CALLBACK_MD5_PASS = "change_this";
const TODOIST_API_KEY = "REPLACE WITH YOUR API KEY";
const TODOIST_PROJECT = "";



La variable CALLBACK_MD5_PASS correspond le mot de passe qui est utilisé pour la signature MD5. TODOIST_API_KEY est la clef d’authentification Todoist. Enfin, TODOIST_PROJECT permet de filtrer les tâches pour utiliser uniquement celles d'un projet. Si cette valeur est une chaîne vide, les tâches de tous les projets sont affichées.

Enfin, pour que le mode callback HTTP fonctionne, l'option de PHP allow_url_fopen doit être activée. Si cette option n'est pas activée, le YAPI::RegisterHub va retourner une erreur "URL file-access is disabled in the server configuration". Dans ce cas, vous pouvez consulter notre article sur le mode callback HTTP qui explique comment activer cette option.

Il ne reste plus qu'à configurer le callback HTTP du YoctoHub pour qu'il se connecte à notre script PHP, en prenant soin d'utiliser le mot de passe que nous avons défini plus haut.

Et voilà! Nous avons notre liste de tâche qui est affichée dans notre cuisine.  


La todolist dans Todoist  La todolist sur le Yocto-MaxiDisplay



On vous donne rendez-vous dans 8 ans pour voir si les modules fonctionnent toujours et si on utilise toujours ce service :-D

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.