Review: Wio Link Plug-and-Play IoT Board

What if I told you that you could connect any sensor you wanted to the internet without a single bit of code or wiring for less than $30? What if I told you that you could also control connected outputs with your phone from anywhere?

Well, you better believe me because the Wio Link is an internet-connected plug-and-play board that delivers all of that for an unbelievably small price tag.

Seeed Studio’s Kickstarter labels it as an ESP8266-based open-source WiFi solution to simplify IoT development by virtualizing plug-and-play modules to the Web of Things. The lowest price tier for the Wio Link gives it to you for just $9. NINE DOLLARS. This super low price is mainly due to the fact that the Wio uses the increasingly popular ESP8266 WiFi module.

Now, I’ve had some experience with the ESP8266 and, while it’s cheap, it can be a real pain to program. The Wio Link completely removes code from the picture (not to say that you can’t still write your own programs to interface with it to get fancy – more on that below).

The board also removes the need for circuit-building and wiring. I’ve reviewed Grove sensors before (also made by Seeed) which use the same universal 4 pin connectors that the Wio interfaces with. Everything just plugs in and is immediately accessible.

Seeed claims that with the Wio Link you can build an IoT application in just 5 minutes and that is not just Kickstarter hype. They actually sent me one to play with and it is just as incredible as it sounds. The device itself is super easy to use and the companion app is very impressive.


I put together a mini tutorial on hooking up the Wio Link to stream to Initial State (create an account here) to show exactly how it works. I stream two different ways – with IFTTT and with Python.

Setting up the Wio Link


Getting the Wio up and running is super easy. You just plug in the Wio, open the Wio Link app (after you’ve created an account), and do as it says. When you first reset the Wio, it acts as an access point. You then connect to it to configure your desired WiFi settings.

Once it’s done connecting to WiFi, you’re ready start attaching sensors.

Click on the desired Wio in the list of connected Wios to go to a screen where you can update what’s attached to the board and where.





Select which slot you’d like to connect something to and you’ll be taken to a list of which sensors are compatible with that pin type.

There’s already an extensive list of sensors that Seeed has fitted with the universal 4 pin connector, so you’ll probably find what you’re looking for.

Select your sensor – in my case I attached a DHT11 temperature and humidity sensor to the Digital0 port and a DHT22 pro temperature and humidity sensor to the Digital1 port.


Once you’ve attached and selected the correct sensors and ports, you update the boards firmware from the app by pressing the Update Firmware link on the top right corner of the app window. Over-the-Air firmware updates are another cool feature of the Wio Link.

Now to actually test if data is being read correctly.

Go back out to the list of Wio Link devices, swipe left, and click on API.




What you’ll see is a long list of URLs, followed by a Request Method and examples of Returns. The Wio Link is interesting because it communicates it’s data by broadcasting a URL that, when visited, returns information in a JSON format. If all of that sounds foreign to you, no worries – the Wio also has an IFTTT connection.

Streaming Wio Sensor Data to Initial State (IFTTT)

If This Then That is a service that lets you setup triggers between services like email and Google Sheets. Seeed has setup a Wio Link integration, which makes getting the sensor data from the Wio really easy.

I went through and created a “recipe” to stream data to Initial State (you’ll have to do this for every signal you want to send):

  1. Create an IFTTT account
  2. Create a Recipe
  3. Click on “this” then search for and select “Seeed”Screen Shot 2015-12-08 at 11.04.40 AM
  4. Select “Monitor a sensor value”
  5. Under “Which sensor value?” you’ll find a dropdown that lists valid sensor readings you can get from your Wio. For temperature, I select “greater or equal” for my “Compare condition” and then entered zero so that any temperature reading over 0 degrees would trigger a response (in this case stream to Initial State).Screen Shot 2015-12-08 at 11.07.09 AM
  6. Click on “that” then search for and select the “Maker” channel
  7. Select “Make a web request”
  8. This is the part where we stream to Initial State. In the URL box, we are sending to the Initial State API. Be sure to put your Initial State access key after “accessKey=” and change your bucket key to whatever you want. I set mine to “wio-ifttt”. The Method is “POST”, and Content Type is “application/json”. The Body is where we specify what we want the signal name to look like in our Initial State dashboard and which value to stream. If you click the little flask in the upper right corner of the box, you can see what Seeed ingredients you can insert. I have “GroveName”, “SensorName”, and “SensorValue” in mine, though really “SensorValue” is the only necessary one. “key” is the name of the signal and “value” is the sensor reading.Screen Shot 2015-12-08 at 11.38.02 AM
  9. Create the recipe!
  10. The last step is to create our Initial State bucket (it holds our data according to bucket key) so we can actually see the data coming in. You can do this a couple ways, but the easiest is just to create one directly from the bucket shelf. Click the +cloud icon at the top of your bucket shelf to create a new bucket. Be sure to name the bucket, then check the “Configure Endpoint Keys” checkbox to change the bucket key. Make this the same bucket key that you used in Step 8 (in my example, “wio-ifttt”). 

Go to Initial State to check out your data! I’ve been running this Recipe for about a week now and it seems to poll anywhere between every 3-15 minutes. WioIFTTTIS I wanted to compare the DHT11 vs the DHT22 (Pro). You can see the resolution difference just by looking at the graphs!

Streaming Wio Sensor Data to Initial State (Python)

I also wrote a Python script to parse the Wio Link’s JSON output and stream it to Initial State. You can run this script on any device with an internet connection like your laptop or a Raspberry Pi.

  1. First you’ll need to install the Initial State Python Streamer
  2. Then just run a script like this that has your Wio Link Access Token and Initial State Access Key. Certain parts will need to be changed depending on what sensors you have attached to the Wio and where (marked in comments), but those are easy changes to make!

I also wrote one for the IR distance interruptor.

Here’s what the data looks like in Initial State:


This is polling every 5 minutes and also displays error messages when they occur.  You can see that the data is a bit more “noisy” because there are more data points than in the IFTTT stream. You’ll notice that the maximum and minimum values are basically the same, though.

As you can see, the Wio Link is a super affordable and easy way to put internet connected sensors wherever you want! And getting that data into something like Initial State for collection and visualization is also very easy.

The Wio Link Kickstarter has already reached full funding, but it’s open until January 6th, so be sure to back a Wio Link while you still can!

Back the Wio Link

19 comments On Review: Wio Link Plug-and-Play IoT Board

  • I’ve been looking at various hardware to enable IoT. The WIO looks interesting, and made me look into the ESP8266. However, my understanding is that the ESP8266 does not support SSL, so I’m curious how it is able to connect to https? Has this changed? Can you confirm that in fact the ESP8266 can do secure http posts (via HTTPS / SSL)?

    • Hey Nick,

      As far as I know the ESP8266 does NOT have the capability to do secure http posts. I’m not sure exactly what kind of magic the Wio Link might be doing before sending the data (or if it does any magic at all). The link you retrieve your data from is https but I think the Wio is just sending to their API. That being said, the ESP8266 is not secure, but I can’t speak for what the Wio has done in terms of adding security.

      • Ok, I understand that; however Initialstate explicitly calls out the ESP8266 as “works with”:

        My only guess is that for it to work, it requires some sort of “Hub” which is encrypting the data further on ( If that’s the case, then it is disappointing, and if I’m honest, that’s pretty misleading.

        In my view, for a device to be truly “IoT”, it needs to be able to handle the communications without any reliance on intermediary handlers.

        • You actually can use an ESP8266 directly with Initial State. An example of this is the example code used to connect a Cactus Micro at The problem with this is that you can’t use TLS and have to send data to an insecure endpoint that we do not openly document b/c we strongly believe all of the data you stream should be secure by default. We have made this endpoint available specifically for people developing for devices like the ESP8266:

          // https can’t be handled by the ESP8266, thus “insecure”
          #define ISDestURL “”

          • Gottcha! Thanks for that. Interestingly, it looks like the latest firmware (as of 12/21/2015) for the ESP8266 claims SSL Support, so I’m wondering if HTTPS connections will be possible in the future.

  • Hi, I’m having some issues with Step 8 for the “Body” section of my recipe on IFTTT. Can you explain in a bit more detail how you are supposed to put your details in there? Some explanation of what each bit is for? Any help appreciated.

    • Hey Mark,
      Inside the “URL” box, you just need to copy exactly what I have but be sure to substitute your unique Streaming Access Key (found on your Account page inside of Initial State) and make sure that your Bucket Key matches that of the bucket you created: “”
      Like I mentioned in Step 8, the Method is POST because you are creating an HTTP POST to Initial State, and the Content Type is “application/json” because that is the Body format.
      In the “Body” box, the “key” is your signal name and the “value” is the reading from the Wio (or Pion One). By clicking the little flask, you can get the ingredient presets like “GroveName”, “SensorName”, and “SensorValue” as shown in the screenshot. So my formula, {“key”:”GroveName”:sweat_drops::”SensorName”,”value”:”SensorValue”}, sends the name of my Pion One (which is “Grove”), the sweatdrops emoji, and the name of the sensor that I chose to read from in Step 5 as my signal name. The sensor value is sent as my signal value.
      Hope that helps!

  • {“key”:”GroveName:sweat_drops:SensorName”,”value”:”SensorValue”}

  • It didn’t worked for me after copying the body from the picture. I had to replace all the parameters through the ones supplied with the IFTTT app.
    This worked:

  • Hi

    I am trying to save battery life by putting the board into sleep for 23.5 hours since I only need to take one reading per day., however, when high sleep times are set like 86000 seconds, the broad only sleeps for 1.5 mins …does anyone have an idea how I can get the sleep closer to the 24 hours?


  • I need your Help 🙁

    I’have a error in the script :
    File “”, line 56
    if (tempReading’status’ != 205):
    SyntaxError: invalid syntax

    That can I do? Plz
    Thx you

  • Hi,
    I have a problem with the script PY.
    File “”, line 56
    if (tempReading’status’ != 205):
    SyntaxError: invalid syntax

    Can you help me plz ? 🙁

  • Pingback: Proyectos asombrosos con sensores GROVE. - Blog TB | TeslaBEM ()

Leave a reply:

Your email address will not be published.

Site Footer