Praxisabschnitt: Mit Dialogflow und Actions on Google eine TV-Guide-Aktion für Google Assistant erstellen

1. Einführung

Sie sehen fernsehen, können aber die Fernbedienung nicht finden oder vielleicht möchten Sie nicht die einzelnen Fernsehsender aufrufen, um herauszufinden, ob etwas im Fernsehen läuft. Fragen wir Google Assistant, was gerade auf dem Fernseher läuft. In diesem Lab erstellen Sie mit Dialogflow eine einfache Aktion und lernen, wie Sie diese in Google Assistant einbinden.

Die Reihenfolge der Übungen orientiert sich am üblichen Vorgehen bei der Cloud-Entwicklung:

  1. Dialogflow v2-Agent erstellen
  2. Benutzerdefinierte Entität erstellen
  3. Intents erstellen
  4. Webhook mit Firebase Functions einrichten
  5. Chatbot testen
  6. Google Assistant-Integration aktivieren

Überblick

Wir werden einen interaktiven TV-Guide-Chatbot-Agent für Google Assistant erstellen. Du kannst in der Programmübersicht fragen, was gerade auf einem bestimmten Kanal ausgestrahlt wird. Beispiel: „Was läuft auf MTV?“ Mit der Aktion „TV Guide“ erfährst du, was gerade läuft und was als Nächstes läuft.

Aufgaben in diesem Lab

  • So erstellen Sie einen Chatbot mit Dialogflow v2
  • Benutzerdefinierte Entitäten mit Dialogflow erstellen
  • Lineare Unterhaltung mit Dialogflow erstellen
  • Webhook-Auftragsausführungen mit Dialogflow und Firebase Functions einrichten
  • Anwendung mit Actions on Google in Google Assistant bereitstellen

Vorbereitung

  • Sie benötigen eine Google Identity-/Gmail-Adresse, um einen Dialogflow-Agent zu erstellen.
  • Grundkenntnisse in JavaScript sind nicht erforderlich, können aber praktisch sein, wenn Sie den Auftragsausführungscode des Webhooks ändern möchten.

2. Einrichtung

Webaktivitäten im Browser aktivieren

  1. Klicken Sie auf http://myaccount.google.com/activitycontrols.

  1. Stellen Sie sicher, dass Web- und Die App-Aktivitäten sind aktiviert:

bf8d16b828d6f79a.png

Dialogflow-Agent erstellen

  1. Öffnen: https://console.dialogflow.com

  1. Wählen Sie in der linken Leiste direkt unter dem Logo Create New Agent (Neuen Agent erstellen) aus. Wenn Sie bereits Agents haben, klicken Sie zuerst auf das Drop-down-Menü.

1d7c2b56a1ab95b8.png

  1. Geben Sie einen Agent-Namen an: your-name-tvguide (verwenden Sie Ihren eigenen Namen)

35237b5c5c539ecc.png

  1. Wählen Sie als Standardsprache Folgendes aus: Englisch – en
  2. Wählen Sie als Standardzeitzone die nächstgelegene Zeitzone aus.
  3. Klicken Sie auf Erstellen.

Dialogflow konfigurieren

  1. Klicken Sie im linken Menü neben dem Projektnamen auf das Zahnradsymbol.

1d7c2b56a1ab95b8.png

  1. Gib die folgende Agent-Beschreibung ein: My TV Guide.

26f262d359c49075.png

  1. Scrollen Sie nach unten zu Log Settings (Logeinstellungen) und stellen Sie die beiden Schalter auf "Log the Interaktionen of Dialogflow" (Interaktionen von Dialogflow protokollieren) und um alle Interaktionen in Google Cloud Stackdriver zu protokollieren. Wir benötigen ihn später für den Fall, dass wir unsere Aktion debuggen möchten.

e80c17acc3cce993.png

  1. Klicken Sie auf Speichern.

Actions on Google konfigurieren

  1. Klicken Sie im rechten Seitenbereich unter So funktioniert Google Assistant auf den Link Google Assistant.

5a4940338fc351e3.png

Daraufhin wird diese Seite geöffnet: http://console.actions.google.com.

Wenn Sie neu bei Actions on Google sind, müssen Sie zuerst dieses Formular ausfüllen:

3fd4e594fa169072.png

  1. Versuchen Sie, die Aktion im Simulator** zu öffnen. Klicken Sie dazu auf den Projektnamen.**
  2. Wählen Sie in der Menüleiste Testen aus.

6adb83ffb7adeb78.png

  1. Achten Sie darauf, dass der Simulator auf English eingestellt ist, und klicken Sie auf Talk to my test-app (Mit meiner Test-App sprechen).

Die Aktion wird Sie mit dem grundlegenden Dialogflow-Standard-Intent begrüßt. Die Einbindung in Action on Google hat also funktioniert.

3. Benutzerdefinierte Entitäten

Entitäten sind Objekte, für die Ihre App oder Ihr Gerät Aktionen ausführt. Stellen Sie sich das als Parameter / Variablen vor. In unserem Fernsehprogramm fragen wir Sie: "Was gibt es auf MTV?" MTV ist die Entität und Variable. Ich könnte auch nach anderen Kanälen fragen, wie z. B. nach "National Geographic". oder „Comedy Central“. Die erfasste Entität wird als Parameter in meiner Anfrage an den TV Guide API-Webdienst verwendet.

Weitere Informationen zu Dialogflow-Entitäten

Kanalentität erstellen

  1. Klicken Sie in der Dialogflow-Konsole im Menüpunkt Entities (Entitäten) auf.
  2. Klicken Sie auf Create Entity (Entität erstellen).
  3. Entitätsname: channel (nur Kleinbuchstaben)
  4. Übergib einen Kanalnamen. Für einige Kanäle ist ein Synonym erforderlich, falls Google Assistant etwas anderes versteht. Sie können während der Eingabe die Tabulatortaste und die Eingabetasten verwenden. Gib die Kanalnummer als Referenzwert ein. und die Kanalnamen als Synonyme, z. B.:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

5**.** Wechseln Sie in den **RAW-Bearbeitungsmodus**, indem Sie neben der blauen Schaltfläche zum Speichern auf die Menüschaltfläche klicken.

e294b49b123e034f.png

  1. Kopieren und fügen Sie die anderen Entitäten im CSV-Format ein:
"2","2","Net 2, Net Station 2"
"3","3","Net 3, Net Station 3"
"4","4","RTL 4"
"5","5","Movie Channel"
"6","6","Sports Channel"
"7","7","Comedy Central"
"8","8","Cartoon Network"
"9","9","National Geographic"
"10","10","MTV"

ed78514afd5badef.png

  1. Klicke auf Speichern.

4. Intents

Dialogflow verwendet Intents, um die Absichten von Nutzern zu kategorisieren. Intents haben Trainingsformulierungen, die Beispiele dafür sind, was ein Nutzer dem Agent sagen könnte. Ein Nutzer, der wissen möchte, was gerade im Fernsehen läuft, könnte beispielsweise fragen: "Was läuft heute im Fernsehen?", „Was läuft gerade?“ oder sag einfach „TV-Programm“.

Wenn ein Nutzer etwas schreibt oder sagt (dies wird als Nutzerausdruck bezeichnet), ordnet Dialogflow den Nutzerausdruck dem besten Intent im Agent zu. Der Abgleich eines Intents wird auch als Intent-Klassifizierung bezeichnet.

Weitere Informationen zu Dialogflow-Intents

Standard-Begrüßungs-Intent ändern

Wenn Sie einen neuen Dialogflow-Agent erstellen, werden automatisch zwei Standard-Intents erstellt. Der Standard-Begrüßungs-Intent ist der erste Ablauf, den Sie aufrufen, wenn Sie eine Unterhaltung mit dem Agent starten. Der Standard-Fallback-Intent ist der Ablauf, den Sie erhalten, wenn der Agent Sie nicht verstehen oder einen Intent nicht dem gerade Gesagten zuordnen kann.

  1. Klicken Sie auf Default Welcome Intent (Standard-Begrüßungs-Intent)

Im Fall von Google Assistant startet er automatisch mit dem Standard-Begrüßungs-Intent. Das liegt daran, dass Dialogflow das Willkommensereignis überwacht. Sie können den Intent aber auch aufrufen, indem Sie eine der eingegebenen Trainingsformulierungen sagen.

6beee64e8910b85d.png

Hier ist die Begrüßungsnachricht für den Standard-Begrüßungs-Intent:

Nutzer

Kundenservicemitarbeiter

„Hey Google, sprich mit deinem Namen-tvguide.“

„Willkommen, ich bin der Agent von TV Guide. Ich kann dir sagen, was gerade auf einem Fernsehkanal läuft. Du kannst mich zum Beispiel fragen: Was läuft auf MTV.“

  1. Scrollen Sie nach unten zu Antworten.
  2. Alle Textantworten löschen.
  3. Erstellen Sie eine neue Textantwort, die die folgende Begrüßung enthält:

Welcome, I am the TV Guide agent. I can tell you what's currently playing on a TV channel. For example, you can ask me: What's on MTV?

84a1110a7f7edba2.png

  1. Klicken Sie auf Speichern.

Temporären Test-Intent erstellen

Zu Testzwecken erstellen wir einen temporären Test-Intent, damit wir den Webhook später testen können.

  1. Klicken Sie noch einmal auf den Menüpunkt Intents.
  2. Klicken Sie auf Create Intent (Intent erstellen).
  3. Geben Sie den Intent-Namen ein: Test Intent. (Verwenden Sie ein großes T und ein großes I. – Wenn Sie den Intent anders schreiben, funktioniert der Backend-Dienst nicht.)

925e02caa4de6b99.png

  1. Klicken Sie auf Trainingsformulierungen hinzufügen.
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. Klicken Sie auf Fulfillment > Auftragsausführung aktivieren

7eb73ba04d76140e.png

Diesmal wird eine Antwort nicht hartcodiert. Die Antwort kommt von einer Cloud Functions-Funktion.

  1. Stellen Sie den Schalter für Webhook-Aufruf für diesen Intent aktivieren auf „Ein“.

748a82d9b4d7d253.png

  1. Klicke auf Speichern.

Kanal-Intent erstellen

Der Kanal-Intent wird diesen Teil der Unterhaltung enthalten:

Nutzer

Kundenservicemitarbeiter

„Was gibt es auf Comedy Central?“

„Derzeit auf Comedy Central ab 18 Uhr: Die Simpsons spielen. Um 19:00 Uhr beginnt Family Guy.“

  1. Klicken Sie noch einmal auf den Menüpunkt Intents.
  2. Klicken Sie auf Create Intent (Intent erstellen).
  3. Geben Sie den Intent-Namen ein: Channel Intent. Verwenden Sie ein großes T und ein großes I. – Wenn Sie den Intent anders schreiben, funktioniert der Backend-Dienst nicht.)
  4. Klicken Sie auf Trainingsformulierungen hinzufügen und geben Sie Folgendes ein:
  • What's on MTV?
  • What's playing on Comedy Central?
  • What show will start at 8 PM on National Geographic?
  • What is currently on TV?
  • What is airing now.
  • Anything airing on Net Station 1 right now?
  • What can I watch at 7 PM?
  • What's on channel MTV?
  • What's on TV?
  • Please give me the tv guide.
  • Tell me what is on television.
  • What's on Comedy Central from 10 AM?
  • What will be on tv at noon?
  • Anything on National Geographic?
  • TV Guide

6eee02db02831397.png

  1. Scrollen Sie nach unten zu Aktion und Parameter.

b7e917026760218a.png

Sie sehen, dass die Felder @channel und @sys.time-Entitäten, die Dialogflow bekannt sind. Später im Webhook werden der Parametername und der Parameterwert an Ihren Webdienst gesendet. Beispiel:

channel=8

time=2020-01-29T19:00:00+01:00

  1. Markieren Sie den Kanal als erforderlich.

Wenn Sie eine Unterhaltung mit dem TV Guide-Agenten führen, müssen Sie immer den Slot-Parameternamen channel ausfüllen. Wenn der Kanalname zu Beginn der Unterhaltung nicht erwähnt wurde, fragt Dialogflow Sie nach, bis alle Parameterslots ausgefüllt wurden. 6f36973fd789c182.png

Geben Sie zur Eingabeaufforderung Folgendes ein:

  • For which TV channel do you want to hear the tv guide information?
  • In which TV channel are you interested?

cdb5601ead9423f8.png

  1. Legen Sie den Parameter „time“ nicht wie erforderlich fest.

Die Zeit ist optional. Wenn keine Uhrzeit angegeben ist, gibt der Webdienst die aktuelle Uhrzeit zurück.

  1. Klicken Sie auf Fulfillment (Auftragsausführung).

Diesmal wird eine Antwort nicht hartcodiert. Die Antwort kommt von der Cloud Functions-Funktion. Stellen Sie daher den Schalter für Webhook-Aufruf für diesen Intent aktivieren auf „Ein“.

  1. Klicke auf Speichern.

5. Webhook-Auftragsausführung

Wenn der Agent mehr als statische Intent-Antworten benötigt, müssen Sie die Auftragsausführung verwenden, um Ihren Webdienst mit dem Agent zu verbinden. Wenn Sie Ihren Webdienst verbinden, können Sie Aktionen basierend auf Nutzerausdrücken ausführen und dynamische Antworten an den Nutzer zurücksenden. Wenn ein Nutzer beispielsweise den TV-Zeitplan für MTV erhalten möchte, kann Ihr Webdienst in Ihrer Datenbank einchecken und dem Nutzer den Zeitplan für MTV antworten.

  1. Klicken Sie im Hauptmenü auf Fulfillment (Auftragsausführung).
  2. Aktivieren Sie den Schalter Inline Editor (Inline-Editor).

cc84351f0d03ab6f.png

Für das einfache Testen und Implementieren von Webhooks können Sie den Inline-Editor verwenden. Dabei werden serverlose Cloud Functions for Firebase genutzt.

  1. Klicken Sie im Editor auf den Tab index.js und fügen Sie diesen JavaScript-Code für Node.js ein:
'use strict';

process.env.DEBUG = 'dialogflow:debug';

const {
  dialogflow,
  BasicCard,
  Button,
  Image,
  List
 } = require('actions-on-google');

const functions = require('firebase-functions');
const moment = require('moment');
const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
const { WebhookClient } = require('dialogflow-fulfillment');
var spokenText = '';
var results = null;


/* When the Test Intent gets invoked. */
function testHandler(agent) {
    let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';

    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new BasicCard({
            title: `Test Message`,
            subTitle: `Dialogflow Test`,
            image: new Image({
                url: 'https://dummyimage.com/600x400/000/fff',
                alt: 'Image alternate text',
            }),
            text: spokenText,
            buttons: new Button({
                title: 'This is a button',
                url: 'https://assistant.google.com/',
            }),
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
    var jsonResponse = `{"ID":10,"Listings":[{"Title":"Catfish Marathon","Date":"2018-07-13","Time":"11:00:00"},{"Title":"Videoclips","Date":"2018-07-13","Time":"12:00:00"},{"Title":"Pimp my ride","Date":"2018-07-13","Time":"12:30:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:30:00"},{"Title":"Daria","Date":"2018-07-13","Time":"13:45:00"},{"Title":"The Real World","Date":"2018-07-13","Time":"14:00:00"},{"Title":"The Osbournes","Date":"2018-07-13","Time":"15:00:00"},{"Title":"Teenwolf","Date":"2018-07-13","Time":"16:00:00"},{"Title":"MTV Unplugged","Date":"2018-07-13","Time":"16:30:00"},{"Title":"Rupauls Drag Race","Date":"2018-07-13","Time":"17:30:00"},{"Title":"Ridiculousness","Date":"2018-07-13","Time":"18:00:00"},{"Title":"Punk'd","Date":"2018-07-13","Time":"19:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"20:00:00"},{"Title":"MTV Awards","Date":"2018-07-13","Time":"20:30:00"},{"Title":"Beavis & Butthead","Date":"2018-07-13","Time":"22:00:00"}],"Name":"MTV"}`;
    var results = JSON.parse(jsonResponse);
    var listItems = {};
    spokenText = getSpeech(results);

    for (var i = 0; i < results['Listings'].length; i++) {
        listItems[`SELECT_${i}`] = {
            title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
            description: `Channel: ${results['Name']}`
        }
    }
    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new List({
            title: 'TV Guide',
            items: listItems
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/**
 * Return a text string to be spoken out by the Google Assistant
 * @param {object} JSON tv results
 */
var getSpeech = function(tvresults) {
    let s = "";
    if(tvresults['Listings'][0]) {
        let channelName = tvresults['Name'];
        let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
        let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
        s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
        Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
    }

    return s;
}

/**
 * Return a natural spoken time
 * @param {string} time in 'HH:mm:ss' format
 * @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
 */
var getSpokenTime = function(time){
    let datetime = moment(time, 'HH:mm:ss');
    let min = moment(datetime).format('m');
    let hour = moment(datetime).format('h');
    let partOfTheDay = moment(datetime).format('a');

    if (min == '0') {
        min = '';
    }

    return `${hour} ${min} ${partOfTheDay}`;
};

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    var agent = new WebhookClient({ request, response });

    console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
    console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
   
    let channelInput = request.body.queryResult.parameters.channel;
    let requestedTime = request.body.queryResult.parameters.time;
    let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;

    var intentMap = new Map();
    intentMap.set('Test Intent', testHandler);
    intentMap.set('Channel Intent', channelHandler);
    agent.handleRequest(intentMap);
});

cc84351f0d03ab6f.png

  1. Klicken Sie im Editor auf den Tab package.json und fügen Sie diesen JSON-Code ein. Damit werden alle Node.js Package Manager-Bibliotheken (NPM) importiert:
{
  "name": "tvGuideFulfillment",
  "description": "Requesting TV Guide information from a web service.",
  "version": "1.0.0",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "^2.2.0",
    "firebase-admin": "^5.13.1",
    "firebase-functions": "^2.0.2",
    "request": "^2.85.0",
    "request-promise": "^4.2.5",
    "moment" : "^2.24.0",
    "dialogflow-fulfillment": "^0.6.1"
  }
}

af01460c2a023e68.png

  1. Klicken Sie auf die Schaltfläche Bereitstellen. Das dauert einen Moment, da Ihre serverlose Funktion bereitgestellt wird. Unten auf dem Bildschirm wird ein Pop-up-Fenster mit Ihrem Status angezeigt.
  2. Lassen Sie uns den Webhook testen, um zu sehen, ob der Code funktioniert. Geben Sie im Simulator rechts Folgendes ein:

Test my agent.

Wenn alles korrekt ist, sollten Sie die Meldung „Dies ist eine Testnachricht“ sehen.

  1. Testen wir nun die Kanalabsicht. Stell dir jetzt folgende Frage:

What's on MTV?

Wenn alles korrekt ist, sollten Sie Folgendes sehen:

„Ab 16:30 Uhr läuft MTV Unplugged auf MTV. Um 17:30 Uhr beginnt das Rupauls Drag Race.“

Optionale Schritte – Firebase

Wenn Sie dies mit einem anderen Kanal testen, werden Sie feststellen, dass die TV-Ergebnisse identisch sind. Das liegt daran, dass die Cloud Functions-Funktion noch keine Daten von einem echten Webserver abruft.

Dazu muss eine ausgehende Netzwerkverbindung hergestellt werden.

Wenn Sie diese Anwendung mit einem Webdienst testen möchten, führen Sie ein Upgrade Ihres Firebase-Tarifs auf Blaze aus. Hinweis: Diese Schritte sind optional. Sie können auch mit den nächsten Schritten dieses Labs fortfahren, um Ihre Anwendung in Actions on Google zu testen.

  1. Rufen Sie die Firebase Console auf: https://console.firebase.google.com

  1. Klicken Sie unten auf dem Bildschirm auf die Schaltfläche Upgrade.

ad38bc6d07462abf.png

Wählen Sie im Pop-up-Fenster den Tarif Blaze aus.

  1. Da wir nun wissen, dass der Webhook funktioniert, können wir fortfahren und den Code von index.js durch den folgenden Code ersetzen. Dadurch stellst du sicher, dass du Informationen zu TV-Programmen vom Webdienst anfordern kannst:
'use strict';

process.env.DEBUG = 'dialogflow:debug';

const {
  dialogflow,
  BasicCard,
  Button,
  Image,
  List
 } = require('actions-on-google');

const functions = require('firebase-functions');
const moment = require('moment');
const { WebhookClient } = require('dialogflow-fulfillment');
const rp = require('request-promise');

const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
var spokenText = '';
var results = null;


/* When the Test Intent gets invoked. */
function testHandler(agent) {
    let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';

    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new BasicCard({
            title: `Test Message`,
            subTitle: `Dialogflow Test`,
            image: new Image({
                url: 'https://dummyimage.com/600x400/000/fff',
                alt: 'Image alternate text',
            }),
            text: spokenText,
            buttons: new Button({
                title: 'This is a button',
                url: 'https://assistant.google.com/',
            }),
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
    var listItems = {};
    spokenText = getSpeech(results);

    for (var i = 0; i < results['Listings'].length; i++) {
        listItems[`SELECT_${i}`] = {
            title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
            description: `Channel: ${results['Name']}`

        }
    }
    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new List({
            title: 'TV Guide',
            items: listItems
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/**
 * Return a text string to be spoken out by the Google Assistant
 * @param {object} JSON tv results
 */
var getSpeech = function(tvresults) {
    let s = "";
    if(tvresults && tvresults['Listings'][0]) {
        let channelName = tvresults['Name'];
        let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
        let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
        s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
        Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
    }

    return s;
}

/**
 * Return a natural spoken time
 * @param {string} time in 'HH:mm:ss' format
 * @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
 */
var getSpokenTime = function(time){
    let datetime = moment(time, 'HH:mm:ss');
    let min = moment(datetime).format('m');
    let hour = moment(datetime).format('h');
    let partOfTheDay = moment(datetime).format('a');

    if (min == '0') {
        min = '';
    }

    return `${hour} ${min} ${partOfTheDay}`;
};

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    var agent = new WebhookClient({ request, response });

    console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
    console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
   
    let channelInput = request.body.queryResult.parameters.channel;
    let requestedTime = request.body.queryResult.parameters.time;
    let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;

    if (requestedTime) {
        console.log(requestedTime);
        let offsetMin = moment().utcOffset(requestedTime)._offset;
        console.log(offsetMin);
        let time = moment(requestedTime).utc().add(offsetMin,'m').format('HH:mm:ss');
        url = `${TVGUIDE_WEBSERVICE}/${channelInput}/${time}`;
      }
    
      console.log(url);
  
      var options = {
          uri: encodeURI(url),
          json: true
      };
       
      // request promise calls an URL and returns the JSON response.
      rp(options)
        .then(function(tvresults) {
            console.log(tvresults);
            // the JSON response, will need to be formatted in 'spoken' text strings.
            spokenText = getSpeech(tvresults);
            results = tvresults;
        })
        .catch(function (err) {
            console.error(err);
        })
        .finally(function(){
            // kick start the Dialogflow app
            // based on an intent match, execute
            var intentMap = new Map();
            intentMap.set('Test Intent', testHandler);
            intentMap.set('Channel Intent', channelHandler);
            agent.handleRequest(intentMap);
        });
});

6. Actions on Google

Actions on Google ist eine Entwicklungsplattform für Google Assistant. Drittanbieter können damit „Aktionen“ entwickeln – Applets für Google Assistant, die erweiterte Funktionen bieten.

Du musst eine Google Action aufrufen, indem du Google bittest, eine App zu öffnen oder mit ihr zu sprechen.

Dadurch wird Ihre Aktion geöffnet, die Stimme wird geändert und Sie lassen die native Anzeige unverändert. den Umfang von Google Assistant. Das bedeutet, dass alles, was Sie den Agent ab jetzt fragen, von Ihnen erstellt werden muss. Sie können Google Assistant nicht plötzlich nach dem Wetter von Google fragen, wenn Sie das möchten. sollten Sie zuerst den Umfang Ihrer Aktion (Ihre App) schließen.

Aktion im Google Assistant-Simulator testen

Lassen Sie uns die folgende Unterhaltung testen:

Nutzer

Google Assistant

„Hey Google, sprich mit your-name-tv-guide.“

„Gerne. Ich hole dir mal your-name-tv-guide."

Nutzer

Dein Name-TV-Guide

-

„Willkommen, ich bin der Fernsehführer...“

Agent testen

„Dies ist eine Testnachricht. Wenn Sie diese sehen, bedeutet dies, dass die Webhook-Auftragsausführung erfolgreich war.“

Was läuft bei MTV?

Ab 16:30 Uhr läuft MTV Unplugged auf MTV. Um 17:30 Uhr beginnt das Rupauls Drag Race.

  1. Zurück zum Google Assistant-Simulator

Öffnen Sie https://console.actions.google.com.

  1. Klicken Sie auf das Mikrofonsymbol und fragen Sie Folgendes:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Google Assistant sollte so antworten:

5d93c6d037c8c8eb.png

  1. Fragen wir nun:
  • What's on Comedy Central?

In diesem Fall sollte Folgendes zurückgegeben werden:

Derzeit auf Comedy Central ab 18:00 Uhr „The Simpsons“. Um 19:00 Uhr geht es dann mit Family Guy los.

7. Glückwunsch

Sie haben Ihre erste Google Assistant-Aktion mit Dialogflow erstellt. Gut gemacht!

Wie Sie vielleicht bemerkt haben, wurde Ihre Aktion im Testmodus ausgeführt, der mit Ihrem Google-Konto verknüpft ist. Wenn Sie sich auf Ihrem Nest-Gerät oder in der Google Assistant App auf Ihrem iOS- oder Android-Smartphone mit demselben Konto anmelden. Sie können auch Ihre Aktion testen.

Das ist jetzt eine Workshop-Demo. Wenn du aber echte Anwendungen für Google Assistant entwickelst, könntest du deine Aktion zur Genehmigung einreichen. Weitere Informationen finden Sie in diesem Leitfaden.

Behandelte Themen

  • So erstellen Sie einen Chatbot mit Dialogflow v2
  • Benutzerdefinierte Entitäten mit Dialogflow erstellen
  • Lineare Unterhaltung mit Dialogflow erstellen
  • Webhook-Auftragsausführungen mit Dialogflow und Firebase Functions einrichten
  • Anwendung mit Actions on Google in Google Assistant bereitstellen

Was liegt als Nächstes an?

Hat Ihnen dieses Code-Lab gefallen? Werfen Sie einen Blick auf diese tollen Labs!

Setzen Sie dieses Code-Lab fort, indem Sie es in Google Chat einbinden:

Google Chat-TV-Guide mit der G Suite und Dialogflow erstellen