thomaskekeisen.de

Aus dem Leben eines Bildschirmarbyters

Achtung: Diese Seite enthält Partner- und Werbe-Links. Daher ist diese Seite im Gesamten als Werbeanzeige zu verstehen!

Sprachgesteuerte Einkaufsliste

In unserer Wohnung stehen mittlerweile fünf Echo Dots, die auch in reger Benutzung sind. Seit mir David den Tipp gegeben hat, dass ich mit IFTTT auf neue Einträge in der Alexa-Einkaufsliste hören und diese vollautomatisch in das Trello-Board kopieren kann, über das ich mit meiner Freundin schon länger zu erledigende Einkäufe verwalte, brüllen wir unsere Einkäufe eigentlich nur noch in den smarten Lautsprecher.

Das Problem: Ich füge so ständig doppelte Einträge hinzu, weil man eben gerne während dem Kochen eine zur Neige gehende Zutat auf die Einkaufsliste zitiert. Gepaart mit der Tatsache, dass alle Einträge nur kleingeschrieben auf der Liste landen und mir der Aufwand, beim Einkaufen drei total verstreute "Bananen"-Einträge von der Liste zu nehmen, zu groß war, musste eine Lösung her.

Screenshot: Unsere Trello-Einkaufsliste

PHP-Script räumt auf

Da weder Trello noch IFTTT über eine Standardlösung verfügen, Einträge mit gleichem Titel zu vermeiden, habe ich kurzerhand ein PHP-Script geschrieben, das regelmäßig alle Karten iteriert, Dopplungen löscht und in diesem Zuge auch den ersten Buchstaben, sofern er kleingeschrieben ist, in einen Großbuchstaben umwandelt. Dieses gleich genauer beschriebene Script habe ich auf meinem Webspace abgelegt. Ein Cronjob führt diesen Code alle 15 Minuten aus. Außerdem habe ich eine "Webhook"-Aktion bei IFTTT eingerichtet, die das Script auch jedes Mal, wenn ein neuer Einkaufslisten-Eintrag über mein Echo Dot erstellt wurde, aufruft.

Das Script selbst ist klein gehalten und hat keine weiteren Abhängigkeiten wie beispielsweise zu php-trello-api. Damit es funktioniert, müssen die Parameter TRELLO_API_KEY , TRELLO_API_TOKEN , TRELLO_BOARD_ID sowie TRELLO_LIST_ID manuell in die Konfigurationsdatei eingetragen werden:

            config.php
            
                <?php

                const TRELLO_API_BASE_PATH = 'https://api.trello.com/1/';
                const TRELLO_API_KEY       = '';
                const TRELLO_API_TOKEN     = '';
                const TRELLO_BOARD_ID      = '';
                const TRELLO_LIST_ID       = '';
            
        

Die Werte für TRELLO_API_KEY und TRELLO_API_TOKEN können direkt auf der Seite API-Schlüssel für Entwickler bezogen werden. Die TRELLO_BOARD_ID und TRELLO_LIST_ID müssen über die Trello-API durch das Ersetzen der eben genannten Parameter sowie anschließendem Aufrufen folgender Links herausgefunden werden. Der Wert für TRELLO_USERNAME entspricht dem eigenen Trello-Nutzernamen - in meinem Fall thomaskekeisen :

            TRELLO_BOARD_ID
            
                https://api.trello.com/1/members/TRELLO_USERNAME/boards?key=TRELLO_API_KEY&token=TRELLO_API_TOKEN
            
        
            TRELLO_LIST_ID
            
                https://api.trello.com/1/board/TRELLO_BOARD_ID/lists?key=TRELLO_API_KEY&token=TRELLO_API_TOKEN
            
        

Sind alle Parameter eingetragen, muss nur noch folgender Code mit dem Dateinamen cronjob.php in das selbe Verzeichnis wie die gerade erstellte config.php mit folgendem Code erstellt werden:

            cronjob.php
            
                <?php
                
                require_once('config.php');
                
                function beautifyName($id, $name)
                {
                    $urlPart    = getCardUrlPart($id);
                    $newName    = ucfirst($name);
                    $parameters = [
                        'name' => $newName,
                    ];
                
                    return put($urlPart, $parameters);
                }
                
                function buildUrl($urlPart, $optionalQueryParts = [])
                {
                    $baseQueryParts = [
                        'key'   => TRELLO_API_KEY,
                        'token' => TRELLO_API_TOKEN,
                    ];
                    $queryParts     = array_merge($baseQueryParts, $optionalQueryParts);
                    $queryString    = http_build_query($queryParts);
                    $absoluteUrl    = TRELLO_API_BASE_PATH . $urlPart . '?' . $queryString;
                
                    return $absoluteUrl;
                }
                
                function delete($urlPart)
                {
                    return request($urlPart, [], 'DELETE');
                }
                
                function deleteCard($id)
                {
                    $urlPart = getCardUrlPart($id);
                
                    return delete($urlPart);
                }
                
                function firstCharacterIsLowerCase($string)
                {
                    return strlen($string) > 0 && ctype_lower($string[0]);
                }
                
                function getCardUrlPart($id)
                {
                    $urlPart = 'cards/' . $id;
                
                    return $urlPart;
                }
                
                function getListUrlPart()
                {
                    $parts      = [
                        'lists',
                        TRELLO_LIST_ID,
                        'cards',
                    ];
                    $partString = implode('/', $parts);
                
                    return $partString;
                }
                
                function get($urlPart)
                {
                    return request($urlPart);
                }
                
                function put($urlPart, $fields)
                {
                    return request($urlPart, $fields, 'PUT');
                }
                
                function request($urlPart, $queryParts = [], $customRequest = false)
                {
                    $absoluteUrl = buildUrl($urlPart, $queryParts);
                    $resource    = curl_init($absoluteUrl);
                
                    if ($customRequest) {
                        curl_setopt($resource, CURLOPT_CUSTOMREQUEST, $customRequest);
                    }
                
                    curl_setopt($resource, CURLOPT_RETURNTRANSFER, true);
                
                    $response     = curl_exec($resource);
                    $responseJSON = json_decode($response);
                
                    return $responseJSON;
                }
                
                $listUrlPart = getListUrlPart();
                $knownCards  = [];
                $cards       = get($listUrlPart);
                
                foreach ($cards as $card) {
                    $name = $card->name;
                    $id   = $card->id;
                    $key  = md5(strtolower(trim($name)));
                
                    if (!isset($knownCards[$key])) {
                        $knownCards[$key] = $id;
                
                        if (firstCharacterIsLowerCase($name)) {
                            $response = beautifyName($id, $name);
                        }
                    } else {
                        $response = deleteCard($id);
                    }
                }
                
                echo 1;
            
        

Das Script kann jetzt über die URL des Webspaces- beispielhaft: http://beispiel.de/cronjob.php - aufgerufen werden und sollte innerhalb weniger Sekunden die über TRELLO_BOARD_ID und TRELLO_LIST_ID ausgewählte Trello-Liste aufräumen.

Teilen

Kommentare