Webhooks limit of 20?

xenon
Tags: #<Tag:0x00007fe22078da98>

#1

Hi,

I have a dozen Xenons connected to two separate Mesh networks using two Argons. Each Xenon publishes data such as Temperature, Humidity and Pressure as individual events to the cloud (via the Argon hub) and all is well!

To track and visualize the data and I am using the Adafruit.io feeds which provide a URL target for the Particle.io Webhook URL which I enter for each Integration. Each value such as temp, humidity etc. has a unique Particle.io Integration to trigger the action of sending data…

It seems there is a limit of 20 Integrations that I can create from the console. When I try to add the 21st Integration it says, “Bummer! Integration creation failed: Too many integrations for this user”

I will need more than 20 Integrations for the small fleet I am building - how best should I proceed? Is my process incorrect?

Thanks
philly


#2

With a single target URL that’s usually not how it’s done.

Have you considered incorporating your individual feeds into a single “intelligent” webhook?
I’m pretty sure there are common parts to your URL that can be reused to target mulitple enpoints/paths.

If you could post to or three exemplary (sanitised for privacy) webhook definitions we may be able to suggest a few options.


#3

Here are three example Integrations as listed in the CLI for my user account. I have obfuscated the middle bits with X’s but note that the:

– Hook ID 's are unique
– the URL’s are to each feed as defined by Adafruit.io
– The device ID’s are the same fro these there webhooks.

2.) Hook ID 5dfe5a8fb5ca4XXXXXXXX81 is watching for "C"
    and sending to: https://io.adafruit.com/api/v2/webhooks/feed/5kshAbgESXXXXXXXXVGGRdn
    for device e00fXXXXXXXXa42
    created at 2019-12-21T17:46:55.656Z

3.) Hook ID 5dfe5c3902638500012ec248 is watching for "P"
    and sending to: https://io.adafruit.com/api/v2/webhooks/feed/ZbkLXXXXXXXXV2huF
    for device e00fXXXXXXXXa42
    created at 2019-12-21T17:54:01.541Z

4.) Hook ID 5dfe5da375ba590001533bb6 is watching for "A"
    and sending to: https://io.adafruit.com/api/v2/webhooks/feed/5SbZXXXXXXXX7RfLW2hWB
    for device e00fXXXXXXXXa42
    created at 2019-12-21T18:00:03.254Z

The event sends a “form-urlencoded” request with this data:
{
“value”: “{{{PARTICLE_EVENT_VALUE}}}”
}

I have looked into “intelligent” Webhooks but I’m not sure Adafruit.io supports Feeds with multiple values unless they are wrapped in JSON and cannot be graphed or listed individually which is why each data point is an Integration that sends one data value per device. This can add up!

Thanks for your assistance.
philly


#4

You can have the feed ID (e.g. 5kshAbgESXXXXXXXXVGGRdn) be sent from the originating device and substitute that part of the path with {{feedID}}, set the source Device to ANY, opt for a common event prefix (e.g. adafruit_) to watch for adafruit_C, adafruit_P, … and finally use a custom JSON body to send the value as dedicated JSON field instead of the blanket {{{PARTICLE_EVENT_VALUE}}}.

This way one Particle Integration will serve all your feeds.


#5

I will try the above suggestions - it makes sense at first read. I will report back shortly.

Thanks!


#6

I thought I’d share the results of the Adafruit.io Integration Limit question - took me a little bit to figure out the process so I thought someone else may have the same question…

In Adafruit.io (and perhaps other IO’s) each sensors output data (e.g. Temperature or Humidity) is a unique Feed. Each Feed can be displayed on a graph, chart or map depending on the type of data. Each Feed has a unique URL for sending and receiving data which Adafruit.io calls a “WebHook” which is an address that needs to be created for each Feed. A WebHook URL looks something like: https://io.adafruit.com/api/v2/webhooks/feed/BRdUSGmQUNbciybXXXXXXog.

The data point is sent as a name/value pair in the Request - I was using the Request Format ‘Form’ but as per ScruffR’s advice I tried JSON and that worked also. The result was an Integration with a specific Event Name that sends data to a specific WebHook URL with data as “value”: “{{value}}” and yes this does work…

But what I was doing inefficiently was making a separate Integration for each Event and each with a unique WebHook URL. A better method, as pointed out, is to make the Integration more of a template with ‘moustache’ variable substitution! So here’s a recap of the process…

It starts with the device firmware sending a Particle.publish as usual. I send the name of the Event and the Data (obfuscated in this example):

feedName = "QCYC-XXXXX";
celsiusString = "20";
feedID = "fdaUk4bcrypXXXXXXXXX3XZ";
feedData = "{ \"value\": \"" + celsiusString + "\", \"feedID\": \"" + feedID + "\"}";

Particle.publish(feedName, feedData, 60, PRIVATE);

This Particle.publish command triggers an “Integration” with ANY event prefix “QCYC-” from ANY device in my small fleet.

What I initially forgot was that Integrations can respond to ‘Event Names’ starting with the first letters of the event name - so all my QCYC published events can now start with a ‘QCYC-’ prefix. Instead of separate Integrations for ‘QCYC-C’ and ‘QCYC-H’ I now have one Integration that responds to both events using the Event Name “QCYC-”.

In the Integration ‘Full URL’ I now use “https://io.adafruit.com/api/v2/webhooks/feed/{{{feedID}}}” where the ‘feedID’ hash is passed to the Integration from the device firmware. The data is passed as usual using the Custom JSON object {“value”: “{{value}}”}. The name ‘value’ is an Adafruit.io requirement; in addition, GPS location data can be passed (Lat and Long) in order to map the results.

I now have one Integration that, as ScruffR points out, does all the Events under one event banner: “QCYC-” and the URL is substituted by the {{feedID}} variable. I do have other groups of devices for different clients so they can have their own Event names (‘Garden-’, ‘CityOfToronto-’, etc.) but each only requires one Integration now!

Thanks ScruffR!


#7

I have been running into the same issue. I never realized you could use a variable in the URL address for the integration. Thanks ScruffR for the education.