FAQ Overview

Smilio Action

Why are you sending states of counters instead of number of buttons pressed ?

Skiply provides industrial solutions. Therefore, we can not afford to loose any customer data. LPWAN networks like Sigfox and LoRaWan are great. But, like any radio communication system, a frame can be corrupted or not transmitted. If you do not take this into consideration in your design, and send only "pulses", if it happens, you will loose data.

This is why we decided to provide a system that is robust enough to support bad or missing radio frames. Each time that a user presses a button, the corresponding index is incremented. Thus, depending of the parameters that you set on your device, the system will send the data at periodic interval, or a few seconds after an action. The application server will receive this state, and calculate the increment since last transmission. Even if a frame has been lost, the total number of buttons pressed will always be found.

From an intergration point of view, it seems to be more complex. This means that you have to store the last index values in a database (or persistent variable). If you do not feel confortable with that, we can provide an api that will make this job for you.

A pulse mode will be soon available in future version of the firmware, but we do not recommand to use this mode in production.

Author: Jérôme Chambard
Last update: 07/09/2018 14:26


I just received my Smilio Action. Where can I get my data ?

It depends on how you bought your Smilio Action.

If you bought the product without any service

You must subscribe to a LPWAN operator. It can be Sigfox, or any LoRaWan ready network (Orange in France, Machine-Q in the US, etc.). You will have to provision your device with the PAC code (Sigfox) or with the provided keys / id (LoRaWan).

Alternatively, you can use your own private LoRaWAN network. To make your connected buttons work, you need to provision the device on your Network Server (Orbiwise, Actility, TTN, etc.)

If you bought the product with the api service

We push the data directly to the endpoint that you gave us at the order.

Author: Jérôme Chambard
Last update: 15/07/2018 11:43


Where can I find the Sigfox End Product Certificate ?

In order to register your connected buttons Smilio Action on the Sigfox Network, you may require to enter the End Product Certificate.

It is: P_0056_99E6_01

Please find attached the full certificate.

Author: Jérôme Chambard
Last update: 15/07/2018 12:01


Download user manual Smilio Action

To install and ensure correct operation of your Smilio Action, please read carefully and follow the instructions contains in this user manual :

  • For Smilio Action bought after September 21st, 2018 (FW 2.0.1.x) : Download
  • For Smilio Action bought before September 21st, 2018 (FW 1.19) : Download 

Author: Estelle Marin-Lamellet
Last update: 18/02/2019 09:50


What is the “Skiply Push API” (SPA) ?

Principle

  • Each LPWAN operator sends data with different formats and/or protocols (REST, MQTT, Pub/Sub…): the SPA delivers a standard json payload to your server. It remains the same, independently from the Network Operator (Sigfox or LoRaWAN).
  • The SPA decodes the data whatever the Running mode / frame is (pulse, count, code, battery level), taking into consideration the version of your device’s firmware.
  • The SPA does the annoying job for you: calculation of the increments, checking the data consistency, and eliminating “bad frames”.
  • We POST data to the URL of your choice (you can include API key as parameter or custom header). See the Skiply API documentation to know how to manage this parameters.

Frame details

The buttons are numbered as follow: 

  • Button1 = top left
  • Button 2 = top right
  • Button 3 = middle
  • Button 4 = bottom left
  • Button 5 = bottom right

> Push API: normal mode

{
  "device": "SA000272",
  "groupId": 5,
  "time": "2018-06-21T20:14:31.394Z",
  "sq_num": 98,
  "frameType": "02",
  "data": {
    "index": [1,0,16,1,2],
    "increment": [0,0,0,0,2],
    "button_1": 0,
    "button_2": 0,
    "button_3": 0,
    "button_4": 0,
    "button_5": 2,
    "ack": 0
  },
  "negativeValue": 0
}

Where:

  • device = serial number of the product
  • groupId = group of the device. Can be usefull to facilitate to consolidate device data, for instance in the context of live visualisation
  • time = timestamp from the network
  • sq_num = frame sequence number, to identify if a frame has been missed
  • frameType = "02" or "03" (with ack)
  • ack = 1 if the frame has been send due to a magnetic detection instead of normal operation (badge)
  • index = state of the internal counters : [button1, button2, ... , button5]
  • increment = variation of the index between to frames received by our servers : [button1, button2, ... , button5]
    code = type of frame
  • negativeValue = return 1 if a negative increment has been detected (reset). Increment is [0,0,0,0,0] in this case to avoid bad counts

> Push API: code mode

{
  "device":"SA000272",
  "groupId": 5,
  "time":"2018-06-21T20:14:31.394Z",
  "dc_delay": 0,
  "sq_num": 98,
  "frameType": "11",
  "data": {
    "code": "021214",
    "increment": [2,2,0,1,0],
    "button_1": 2,
    "button_2": 2,
    "button_3": 0,
    "button_4": 1,
    "button_5": 2,
    "ack": 0
  },
  "previous": {
    "code": "012334",
    "increment": [1,1,2,1,0],
    "button_1": 1,
    "button_2": 1,
    "button_3": 2,
    "button_4": 1,
    "button_5": 0,
    "ack":1,
    "previous_time": 21
  }	
};

Where:

  • frameType = "11" or "13" or "31" for code mode
  • dc_delay: potential delay from the Duty Cycle protection in minutes
  • data: code entered by the user
    • code: value of the code (1 to 5, max. 6 digits)
    • increment (button 1 to 5, number of presses per button)
    • ack = 1 if the code has been validated by magnetic detection (badge)
  • previous: code entered previously by the user
    • previous_time: time since last code what entered

 

> Push API: keep alive (sent every 24h)

{
  "device": "SA000272",
  "groupId": 5,
  "time": "2018-06-21T20:14:31.394Z",
  "sq_num": 99,
  "frameType": "01",
  "data": {
    "battery_level": 3.35
  }
}

Where:

  • device = serial number of the product
  • time = timestamp from the network
  • sq_num = frame sequence number, to identify if a frame has been missed
  • frameType = "01"
  • ack = always 0 for this frame type
  • battery_level = in volts
  • code = type of frame

Author: Jérôme Chambard
Last update: 20/03/2019 08:06


How can I send different messages depending on the button pressed in Zapier, without having to use Path (only available from Professional Plan)?

Path is perfect if you are afraid to write code. But you can spare a lot of steps in your zap using the "Run Javascript" Action in Zapier.

Let's take an example. The following code in the "Run Javacript" Action will change the message depending on a combination of buttons pressed:

if ((inputData.button1 == "1") && (inputData.button3 == "1")) {
    output = {message: "Nettoyage demandé"};
} else if ((inputData.button2 == "1") && (inputData.button3 == "1")) {
    output = {message: "Rangement demandé"};
} else if ((inputData.button4 == "1") && (inputData.button3 == "1")) {
    output = {message: "Vider les poubelles"};
} else if ((inputData.button5 == "1") && (inputData.button3 == "1")) {
    output = {message: "Urgence"};
} else if (inputData.badge == "1") {
    output = {message: "Demande traitée"};
} else {
    output = {message:"void"};
}

The following action (for instance a SMS with Twilio) will be able to use the new "message" variable generated by this script.

If you want to change the destination number for each device, you can use the Google Sheet lookup action, using a variable "Action" to retrieve the correct number.

if ((inputData.button1 == "1") && (inputData.button3 == "1")) {
    output = {message: "Nettoyage demandé", action: "action1"};
} else if ((inputData.button2 == "1") && (inputData.button3 == "1")) {
    output = {message: "Rangement demandé, action: "action2"};
} else if ((inputData.button4 == "1") && (inputData.button3 == "1")) {
output = {message: "Vider les poubelles, action: "action3"};
} else if ((inputData.button5 == "1") && (inputData.button3 == "1")) {
    output = {message: "Urgence", action: "action4"};
} else if (inputData.badge == "1") {
    output = {message: "Demande traitée", action: "action5"};
} else {
    output = {message:"void"};
}

Author: Jérôme Chambard
Last update: 28/02/2019 08:40


Zapier indicate a check interval from 5 to 15 minutes , but I need an immediate action after pressing a button. How can I do?

The check interval applies only when Zapier needs to collect data periodically. In the case of use with Skiply API, the webhook will trigger the Zap as soon as it receives data. That means that there is no waiting time.

Author: Jérôme Chambard
Last update: 28/02/2019 09:44


Smilio Satisfaction

Why are you sending states of counters instead of number of buttons pressed ?

Skiply provides industrial solutions. Therefore, we can not afford to loose any customer data. LPWAN networks like Sigfox and LoRaWan are great. But, like any radio communication system, a frame can be corrupted or not transmitted. If you do not take this into consideration in your design, and send only "pulses", if it happens, you will loose data.

This is why we decided to provide a system that is robust enough to support bad or missing radio frames. Each time that a user presses a button, the corresponding index is incremented. Thus, depending of the parameters that you set on your device, the system will send the data at periodic interval, or a few seconds after an action. The application server will receive this state, and calculate the increment since last transmission. Even if a frame has been lost, the total number of buttons pressed will always be found.

From an intergration point of view, it seems to be more complex. This means that you have to store the last index values in a database (or persistent variable). If you do not feel confortable with that, we can provide an api that will make this job for you.

A pulse mode will be soon available in future version of the firmware, but we do not recommand to use this mode in production.

Author: Jérôme Chambard
Last update: 07/09/2018 14:26


How to remove a Smilio terminal attached with double-sided adhesive?

To remove your Smilio terminal from a vertical support, you have to be equipped with a thin and robust cable (iron wire or fishing line). 

Unroll a sufficient length to tighten the wire and pass it behind the device (start on the top of the box). Then, make lateral moves (back and forth movements) in order to saw the resin located between the wall and the Smilio terminal.

Repeat the movement until you have completely removed the terminal from its adhesive part (ensure that it does not fall at the end). 
If there are still some traces of adhesive on your wall, they can easily be removed with a clean cloth and surgical spirit. (90° of alcohol).

Author: Aurélie Fontaine
Last update: 04/02/2019 14:39


API Skiply

What is the “Skiply Push API” (SPA) ?

Principle

  • Each LPWAN operator sends data with different formats and/or protocols (REST, MQTT, Pub/Sub…): the SPA delivers a standard json payload to your server. It remains the same, independently from the Network Operator (Sigfox or LoRaWAN).
  • The SPA decodes the data whatever the Running mode / frame is (pulse, count, code, battery level), taking into consideration the version of your device’s firmware.
  • The SPA does the annoying job for you: calculation of the increments, checking the data consistency, and eliminating “bad frames”.
  • We POST data to the URL of your choice (you can include API key as parameter or custom header). See the Skiply API documentation to know how to manage this parameters.

Frame details

The buttons are numbered as follow: 

  • Button1 = top left
  • Button 2 = top right
  • Button 3 = middle
  • Button 4 = bottom left
  • Button 5 = bottom right

> Push API: normal mode

{
  "device": "SA000272",
  "groupId": 5,
  "time": "2018-06-21T20:14:31.394Z",
  "sq_num": 98,
  "frameType": "02",
  "data": {
    "index": [1,0,16,1,2],
    "increment": [0,0,0,0,2],
    "button_1": 0,
    "button_2": 0,
    "button_3": 0,
    "button_4": 0,
    "button_5": 2,
    "ack": 0
  },
  "negativeValue": 0
}

Where:

  • device = serial number of the product
  • groupId = group of the device. Can be usefull to facilitate to consolidate device data, for instance in the context of live visualisation
  • time = timestamp from the network
  • sq_num = frame sequence number, to identify if a frame has been missed
  • frameType = "02" or "03" (with ack)
  • ack = 1 if the frame has been send due to a magnetic detection instead of normal operation (badge)
  • index = state of the internal counters : [button1, button2, ... , button5]
  • increment = variation of the index between to frames received by our servers : [button1, button2, ... , button5]
    code = type of frame
  • negativeValue = return 1 if a negative increment has been detected (reset). Increment is [0,0,0,0,0] in this case to avoid bad counts

> Push API: code mode

{
  "device":"SA000272",
  "groupId": 5,
  "time":"2018-06-21T20:14:31.394Z",
  "dc_delay": 0,
  "sq_num": 98,
  "frameType": "11",
  "data": {
    "code": "021214",
    "increment": [2,2,0,1,0],
    "button_1": 2,
    "button_2": 2,
    "button_3": 0,
    "button_4": 1,
    "button_5": 2,
    "ack": 0
  },
  "previous": {
    "code": "012334",
    "increment": [1,1,2,1,0],
    "button_1": 1,
    "button_2": 1,
    "button_3": 2,
    "button_4": 1,
    "button_5": 0,
    "ack":1,
    "previous_time": 21
  }	
};

Where:

  • frameType = "11" or "13" or "31" for code mode
  • dc_delay: potential delay from the Duty Cycle protection in minutes
  • data: code entered by the user
    • code: value of the code (1 to 5, max. 6 digits)
    • increment (button 1 to 5, number of presses per button)
    • ack = 1 if the code has been validated by magnetic detection (badge)
  • previous: code entered previously by the user
    • previous_time: time since last code what entered

 

> Push API: keep alive (sent every 24h)

{
  "device": "SA000272",
  "groupId": 5,
  "time": "2018-06-21T20:14:31.394Z",
  "sq_num": 99,
  "frameType": "01",
  "data": {
    "battery_level": 3.35
  }
}

Where:

  • device = serial number of the product
  • time = timestamp from the network
  • sq_num = frame sequence number, to identify if a frame has been missed
  • frameType = "01"
  • ack = always 0 for this frame type
  • battery_level = in volts
  • code = type of frame

Author: Jérôme Chambard
Last update: 20/03/2019 08:06


How can I send different messages depending on the button pressed in Zapier, without having to use Path (only available from Professional Plan)?

Path is perfect if you are afraid to write code. But you can spare a lot of steps in your zap using the "Run Javascript" Action in Zapier.

Let's take an example. The following code in the "Run Javacript" Action will change the message depending on a combination of buttons pressed:

if ((inputData.button1 == "1") && (inputData.button3 == "1")) {
    output = {message: "Nettoyage demandé"};
} else if ((inputData.button2 == "1") && (inputData.button3 == "1")) {
    output = {message: "Rangement demandé"};
} else if ((inputData.button4 == "1") && (inputData.button3 == "1")) {
    output = {message: "Vider les poubelles"};
} else if ((inputData.button5 == "1") && (inputData.button3 == "1")) {
    output = {message: "Urgence"};
} else if (inputData.badge == "1") {
    output = {message: "Demande traitée"};
} else {
    output = {message:"void"};
}

The following action (for instance a SMS with Twilio) will be able to use the new "message" variable generated by this script.

If you want to change the destination number for each device, you can use the Google Sheet lookup action, using a variable "Action" to retrieve the correct number.

if ((inputData.button1 == "1") && (inputData.button3 == "1")) {
    output = {message: "Nettoyage demandé", action: "action1"};
} else if ((inputData.button2 == "1") && (inputData.button3 == "1")) {
    output = {message: "Rangement demandé, action: "action2"};
} else if ((inputData.button4 == "1") && (inputData.button3 == "1")) {
output = {message: "Vider les poubelles, action: "action3"};
} else if ((inputData.button5 == "1") && (inputData.button3 == "1")) {
    output = {message: "Urgence", action: "action4"};
} else if (inputData.badge == "1") {
    output = {message: "Demande traitée", action: "action5"};
} else {
    output = {message:"void"};
}

Author: Jérôme Chambard
Last update: 28/02/2019 08:40


Zapier indicate a check interval from 5 to 15 minutes , but I need an immediate action after pressing a button. How can I do?

The check interval applies only when Zapier needs to collect data periodically. In the case of use with Skiply API, the webhook will trigger the Zap as soon as it receives data. That means that there is no waiting time.

Author: Jérôme Chambard
Last update: 28/02/2019 09:44