Here I want to define a custom Google Assistant action, which will recognize a phrase with an argument, for example ok google, make me [a pizza] , and send both the action ( make ) and the argument ( a pizza ) as a JSON object to an MQTT topic.

There’s a very easy way to recognize custom phrases in Google Assistant, by using the Google Assistant and IFTTT integration: there’s a Google Assistant trigger in IFTTT which guides you to do that, I won’t cover it here.

But, while IFTTT is a very useful service, with plenty of integrations available, to date, there’s no action that will publish to an MQTT.

Why use MQTT anyway? Well, I love MQTT because it’s very flexible, and it can be used in a lot of ways, to exchange messages and integrate things at home or across the Internet.

MQTT supports a lot of different clients, from libraries in you favorite programming language (search for paho), to command line (mosquitto) to implementations in higher level tools like one of my favorite: Node-Red.

The piece I’ll use to glue IFTTT to MQTT together is Beebotte, which has an excelent free plan for developers.

How will it work? in Beebotte we will create a channel and a resource. Data of any form (strings, numbers,…) can be published to a resource via a webhook (API). It is also possible to suscribe to the channel/resource via MQTT.

Create a channel in Beebotte:

Now let’s enter in the channel, and take note of the token that has been assigned: token_XXXXXXXXXXXXXXXX.

The key: How to subscribe to the Beebotte channel/resource via MQTT

HOST: mqtt.beebotte.com

PORT: 1883

Username: token:token_XXXXXXXXXXXXXXXX

Password: blank (don’t set password)

TOPIC: channel/resource, here ifttt/ga

Read more here about MQTT - Beebotte Bridge and the Considerations)

Now back in IFFFF, I’ll skip right to the point of creating the Action:

We’ll choose action type Webhooks, then “Make a web request” and use these fields:

URL: https://api.beebotte.com/v1/data/publish/ ifttt/ga ?token=token_XXXXXXXXXXXXXXXX

?token=token_XXXXXXXXXXXXXXXX METHOD: POST

Content Type: application/json

BODY: {"data":[{"action":"make","what":"{{TextField}}"}]}

What is important is the format of the body. It expects a data field, with an object. In the object, you can put whatever you want.

Here is an example of what is received on the MQTT end:

$ mosquitto_sub -h mqtt.beebotte.com -u token:token_XXXXXXXXXXXXXXXX -t ifttt/ga -v ifttt/ga {"data":[{"action":"make","what":"a pizza"}],"ispublic":true,"ts":1532185262619}

Now we can do whatever we want, for example from Node-Red. Each time I say “ok google, make me —” I’ll receive it as a message in the MQTT topic! Endless possibilities ahead!