[SOLVED] Detect display for Echo device


#1

I’m making a skill and I want it to work in Echos without screen, as well as the Show and the Dot which do have a screen, but if I include the screen directives in the response, then the skill doesn’t work in devices without a screen; I know I could just remove the directives, but I want the skill response to look beautiful in devices with a screen.

I’m still learning how to code, and I pretty much have everything ready, except that I can’t make my code detect when the incoming call comes from an echo with a display, and when it comes from an echo with a display.

I have to response cards, one with the display directives, and one without it.
I also know I need a conditional, but I’m not really sure how to write it.

Here’s an example of an incoming call from a device with display:

{
  "time": "2018-04-03T01:46:33.567Z",
  "data": {
    "path": "/",
    "method": "post",
    "headers": {
      "x-real-ip": "72.21.217.110",
      "x-forwarded-proto": "https",
      "x-forwarded-for": "72.21.217.110",
      "x-queue-start": "1522719993.566",
      "content-length": "2702",
      "content-type": "application/json; charset=utf-8",
      "accept": "application/json",
      "accept-charset": "utf-8",
      "signature": "a+erhxHLwl/F/JXzJYjZJ6Q8WDUp717ixYf8fjn2rRyXCnaj0EfyN3j5qXLfthhNV8b4DstVP2Hx0Ye0ffPUSx0jN2R4BfwUVs27wDYwm7q/nkuUYPFHhzmGkPX3cTKgUv7f37VqkZ+bqnBKB4qo4YcOhqWr+Vscj9jwK9NBm27kt2nS5OHdPGUOPTnKVZv8+d+IgnqG5xVlNXQvYz/Rn6iYGnvAjTZDccgjy6u7/B4rumuSe43mdc3jstAakfSNWvVWyGl7f3ZKQD0jrcO3CmHgmPDneOJ3BLFb/8D89ski4KMaCchMaqeZVR4cnMab45WmnQT8YLEakUMG8KGZ6A==",
      "signaturecertchainurl": "https://s3.amazonaws.com/echo.api/echo-api-cert-5.pem",
      "user-agent": "Apache-HttpClient/4.5.x (Java/1.8.0_131)"
    },
    "query": {},
    "body": {
      "version": "1.0",
      "session": {
        "new": true,
        "sessionId": "amzn1.echo-api.session.396854fa-3504-4cfb-9a23-343530768022",
        "application": {
          "applicationId": "amzn1.ask.skill.5f428de1-7673-4cbc-9866-a71820a93fa5"
        },
        "user": {
          "userId": "amzn1.ask.account.AGZDI5NYAJ3OBE36OFQF2OK5B5KBBG53OBNF5QLJHM5AFRGJAYRG3SVRDLRXW3CGIR5DVPGV54OTIG5B6I4BZ6RICLR7PEGFBC4IHZIHZIHHFHWKNTGYDAVVLG6DQUZKEHAI5CVTOVO6VX5ZGRYFNXEDBHTPMFFQM3X44IZVDKVIWT5W63W5LQORZ7Y3HA75IZGGFKURMEBI7QQ"
        }
      },
      "context": {
        "AudioPlayer": {
          "playerActivity": "FINISHED"
        },
        "Display": {
          "token": "*****REDACTED*****"
        },
        "System": {
          "application": {
            "applicationId": "amzn1.ask.skill.5f428de1-7673-4cbc-9866-a71820a93fa5"
          },
          "user": {
            "userId": "amzn1.ask.account.AGZDI5NYAJ3OBE36OFQF2OK5B5KBBG53OBNF5QLJHM5AFRGJAYRG3SVRDLRXW3CGIR5DVPGV54OTIG5B6I4BZ6RICLR7PEGFBC4IHZIHZIHHFHWKNTGYDAVVLG6DQUZKEHAI5CVTOVO6VX5ZGRYFNXEDBHTPMFFQM3X44IZVDKVIWT5W63W5LQORZ7Y3HA75IZGGFKURMEBI7QQ"
          },
          "device": {
            "deviceId": "amzn1.ask.device.AHRWA4XFXSJEL2DCPDNVSCF34IXEHQRTOW6K73XC5ZKBGW3KY42SSWFGJXUZUZC62OQMDZFIU2AWHBCIZGBCJ5ZW75JF7IPGVHOJMVYG6OUQ2YOUSVMBRKIX2UIR4NSL4FAROKYTQE57AQWQIKE2KCM76H3A",
            "supportedInterfaces": {
              "AudioPlayer": {},
              "Display": {
                "templateVersion": "1.0",
                "markupVersion": "1.0"
              },
              "VideoApp": {}
            }
          },
          "apiEndpoint": "https://api.amazonalexa.com",
          "apiAccessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLjVmNDI4ZGUxLTc2NzMtNGNiYy05ODY2LWE3MTgyMGE5M2ZhNSIsImV4cCI6MTUyMjcyMzU5MywiaWF0IjoxNTIyNzE5OTkzLCJuYmYiOjE1MjI3MTk5OTMsInByaXZhdGVDbGFpbXMiOnsiY29uc2VudFRva2VuIjpudWxsLCJkZXZpY2VJZCI6ImFtem4xLmFzay5kZXZpY2UuQUhSV0E0WEZYU0pFTDJEQ1BETlZTQ0YzNElYRUhRUlRPVzZLNzNYQzVaS0JHVzNLWTQyU1NXRkdKWFVaVVpDNjJPUU1EWkZJVTJBV0hCQ0laR0JDSjVaVzc1SkY3SVBHVkhPSk1WWUc2T1VRMllPVVNWTUJSS0lYMlVJUjROU0w0RkFST0tZVFFFNTdBUVdRSUtFMktDTTc2SDNBIiwidXNlcklkIjoiYW16bjEuYXNrLmFjY291bnQuQUdaREk1TllBSjNPQkUzNk9GUUYyT0s1QjVLQkJHNTNPQk5GNVFMSkhNNUFGUkdKQVlSRzNTVlJETFJYVzNDR0lSNURWUEdWNTRPVElHNUI2STRCWjZSSUNMUjdQRUdGQkM0SUhaSUhaSUhIRkhXS05UR1lEQVZWTEc2RFFVWktFSEFJNUNWVE9WTzZWWDVaR1JZRk5YRURCSFRQTUZGUU0zWDQ0SVpWREtWSVdUNVc2M1c1TFFPUlo3WTNIQTc1SVpHR0ZLVVJNRUJJN1FRIn19.YlmmiWwxOHCJiDhDykKugnwjYUD_HuqU4nULDSBPnNHIVSYBQhgKgLFdX0Z9N1Q2kaJv89nkvPVTRHMFCnDPffitvxQ_ncHh987snjnCGARCEshF3_TwQNTqPPLasFNmEiVlevycmADX3X3d84ma18YDhbdkKObXVQwUXFRunEyENXdjCtqxwm9YShDDXhi-JKto7MmQr8h3_1OBFAxoprcSKuRDsawgk6R1jFL-WC-6pZZGW2LS7BkOyddm9HcflDoivl9Hu1mwaYdfmDhXfsk59-SPjOcfQ322Wo9bTIVu5go_yzaCSsimDFYkjIuBzy38gZM9rFL9GFwpvnXemw"
        }
      },
      "request": {
        "type": "IntentRequest",
        "requestId": "amzn1.echo-api.request.1da964e8-b90e-496d-89c8-f5c8faf53fe8",
        "timestamp": "2018-04-03T01:46:33Z",
        "locale": "en-US",
        "intent": {
          "name": "bothPorts",
          "confirmationStatus": "NONE"
        }
      }
    },
    "replyId": "5aa1c418f1d49b000b74a770.aBQF~ekUsukHGvjgeOT9v.p9bEfq5RxJEocqFkkQqnYW"
  },
  "applicationId": "5aa1c3e1c98fb4000624f621",
  "triggerId": "5aa1c418f1d49b000b74a770",
  "triggerType": "webhook",
  "relayId": "000000000000000000000000",
  "relayType": "public",
  "flowVersion": "develop",
  "flowId": "5aa1c4c560f07c00077f274b",
  "flowName": "Border Wait",
  "applicationName": "Border Wait",
  "globals": {}
}

And one from a device without:

{
  "time": "2018-04-03T02:53:09.142Z",
  "data": {
    "path": "/",
    "method": "post",
    "headers": {
      "x-real-ip": "72.21.217.133",
      "x-forwarded-proto": "https",
      "x-forwarded-for": "72.21.217.133",
      "x-queue-start": "1522723989.138",
      "content-length": "2583",
      "content-type": "application/json; charset=utf-8",
      "accept": "application/json",
      "accept-charset": "utf-8",
      "signature": "Wmpaz5kUoGjO6hTBHNkQ0LhF/qpzbcagqZ0KGNboMjpgpA3shweWicJiI/b9AyZZhq0ihNwE5nR9GQmDbVrjTyPBpeXFMX3Tk3GY3rKn0kpYkQfGu6vbgajz9+jgNDI5RzsIOEu2lnHYfAzFS++HQ6WF0NgLJZs738bekYkPPa5HhvxBYlOaCewRsF5JmtkP1xeYBv2ccMRZvySWqOis0pZeOda6HFo/xMcosW4cws3VqroXuAjhN6ubMq/l5+8pJaoiBRL87W75Y6DHt+KInXU3qFHTaNExZWat6U8S6IZ2ach14dYitN7Aqur4ZlQRufeEBbGq71/qzxyRBuPtbQ==",
      "signaturecertchainurl": "https://s3.amazonaws.com/echo.api/echo-api-cert-5.pem",
      "user-agent": "Apache-HttpClient/4.5.x (Java/1.8.0_131)"
    },
    "query": {},
    "body": {
      "version": "1.0",
      "session": {
        "new": true,
        "sessionId": "amzn1.echo-api.session.2ad38269-cd79-45ac-b2ba-839a57f5672e",
        "application": {
          "applicationId": "amzn1.ask.skill.5f428de1-7673-4cbc-9866-a71820a93fa5"
        },
        "user": {
          "userId": "amzn1.ask.account.AGRE3J6SFU5GGB3AH27YHNEAYIHUPA4YMFG3TUHR6SP5WJ6KDFKKBT2NJFBWZRJPPCTF3UVD2BIHGJB3CBA5JER3JRFJOEBZP525DKEZJBIW6AWXTU6MAEKZRCB5MG32KFXYW7RRYBWJGSJDMXEZBPY4FW4NY7JNQ43ZXJD3LJSBPNYRF7DQC3NIVKJG6QJEEVXYG2Z7GCI3KEA"
        }
      },
      "context": {
        "AudioPlayer": {
          "playerActivity": "STOPPED"
        },
        "System": {
          "application": {
            "applicationId": "amzn1.ask.skill.5f428de1-7673-4cbc-9866-a71820a93fa5"
          },
          "user": {
            "userId": "amzn1.ask.account.AGRE3J6SFU5GGB3AH27YHNEAYIHUPA4YMFG3TUHR6SP5WJ6KDFKKBT2NJFBWZRJPPCTF3UVD2BIHGJB3CBA5JER3JRFJOEBZP525DKEZJBIW6AWXTU6MAEKZRCB5MG32KFXYW7RRYBWJGSJDMXEZBPY4FW4NY7JNQ43ZXJD3LJSBPNYRF7DQC3NIVKJG6QJEEVXYG2Z7GCI3KEA"
          },
          "device": {
            "deviceId": "amzn1.ask.device.AFFQH5XGRO2AG72EJZTSVSPUVEN6DW7VX6WXQ43P5XZO4MRJQC2DFMWIJOYOC3BKBNGPGINAMY4PE5ILKGZL2P3KRKWMASJOPHFECNCVFKSX2K5V3QBRYXGFMH7F4GZ3QBNNW2Y36NYKVXOENBYQHCAX375A",
            "supportedInterfaces": {
              "AudioPlayer": {}
            }
          },
          "apiEndpoint": "https://api.amazonalexa.com",
          "apiAccessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLjVmNDI4ZGUxLTc2NzMtNGNiYy05ODY2LWE3MTgyMGE5M2ZhNSIsImV4cCI6MTUyMjcyNzU4OCwiaWF0IjoxNTIyNzIzOTg4LCJuYmYiOjE1MjI3MjM5ODgsInByaXZhdGVDbGFpbXMiOnsiY29uc2VudFRva2VuIjpudWxsLCJkZXZpY2VJZCI6ImFtem4xLmFzay5kZXZpY2UuQUZGUUg1WEdSTzJBRzcyRUpaVFNWU1BVVkVONkRXN1ZYNldYUTQzUDVYWk80TVJKUUMyREZNV0lKT1lPQzNCS0JOR1BHSU5BTVk0UEU1SUxLR1pMMlAzS1JLV01BU0pPUEhGRUNOQ1ZGS1NYMks1VjNRQlJZWEdGTUg3RjRHWjNRQk5OVzJZMzZOWUtWWE9FTkJZUUhDQVgzNzVBIiwidXNlcklkIjoiYW16bjEuYXNrLmFjY291bnQuQUdSRTNKNlNGVTVHR0IzQUgyN1lITkVBWUlIVVBBNFlNRkczVFVIUjZTUDVXSjZLREZLS0JUMk5KRkJXWlJKUFBDVEYzVVZEMkJJSEdKQjNDQkE1SkVSM0pSRkpPRUJaUDUyNURLRVpKQklXNkFXWFRVNk1BRUtaUkNCNU1HMzJLRlhZVzdSUllCV0pHU0pETVhFWkJQWTRGVzROWTdKTlE0M1pYSkQzTEpTQlBOWVJGN0RRQzNOSVZLSkc2UUpFRVZYWUcyWjdHQ0kzS0VBIn19.HPOO9_aAA8oFrcHddOS5-iszK-K4KQRkgE8OoI7lsP0ROxz0YVp5_U-A57XL2j5lcekZBsVlKVKux9zAEeIq33AKamq_LJiL5IxP6vnxYfZ059sNXRZPA-Nf4w0oq33S3lLIhoQqY_k-n32aGIrsZYVSK9STBBFPDa0y0S7rYoT2ZxDkyRRSUKDodOUq5vTDsMk6XGGfURD5dhHoTOkY-F3pKAy35Y_n3DLSdwvtwPpYha2C9wyyjNmfS0xVd1BYy2V3iOdkHN7MD5Y0gQShpQt0oeKQj50VZ80l_y2x51IoFXijabNU1Eyvk7ipwtnP8ggupizkGUwzEUI7Qwqj8Q"
        }
      },
      "request": {
        "type": "LaunchRequest",
        "requestId": "amzn1.echo-api.request.76f9857c-f713-4c67-a9e3-4a5750042694",
        "timestamp": "2018-04-03T02:53:08Z",
        "locale": "en-US",
        "shouldLinkResultBeReturned": false
      }
    },
    "replyId": "5aa1c418f1d49b000b74a770.aBQF~ekUsukHGvjgeOT9v.CzsQrcuXN_IF50eD9KCmHW"
  },
  "applicationId": "5aa1c3e1c98fb4000624f621",
  "triggerId": "5aa1c418f1d49b000b74a770",
  "triggerType": "webhook",
  "relayId": "000000000000000000000000",
  "relayType": "public",
  "flowVersion": "develop",
  "flowId": "5aa1c4c560f07c00077f274b",
  "flowName": "Border Wait",
  "applicationName": "Border Wait",
  "globals": {}
}

#2

It looks like data.body.context.device.supportedInterfaces has some state that you can branch from. You could just look for the presence of the data.body.context.device.supportedInterfaces.Display object with a conditional node and branch your eventual response based on that. Perhaps we’ll need to parse the request a bit further, but give that a shot and let me know if that is sufficient.


#3

That’s what I initially did.
Right now I have a conditional node before the response nodes with this code:

{{data.body.System.device.supportedInterfaces.Display}} == 'true'

The problem is that it keeps sending the response to the “no display” response like if the result was false, doesn’t matter if the call comes from a device with or without display.


#4

I believe the issue with your conditional is that data.body.context.device.supportedInterfaces.Display is an object and you’re comparing it against the string “true”. That would be evaluated as false.

Try using:

{{ data.body.context.device.supportedInterfaces.Display  }} !== undefined

The above is simply checking something exists at that path.


#5

Sorry for taking days to continue with the discussion… crazy week at work.

I tried that bit of code and still not working. No matter which device I use, with our without display, it always goes to “false”


#6

It works!!!

I checked again in detail the call and changed the path. I used:

{{data.body.context.Display}} !== undefined

So now my skill works in all kind of devices.
Thanks for your help and fast responses!!