diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/3rd-party-support.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/3rd-party-support.png new file mode 100644 index 0000000000..1eefcc9df9 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/3rd-party-support.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/dashboard1.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/dashboard1.png new file mode 100644 index 0000000000..445cb0146e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/dashboard1.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/endimg.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/endimg.png new file mode 100644 index 0000000000..fda897fa11 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/endimg.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-access.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-access.png new file mode 100644 index 0000000000..6638be9b51 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-access.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboard-link.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboard-link.png new file mode 100644 index 0000000000..b86f1c3cd0 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboard-link.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboard-widgets.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboard-widgets.png new file mode 100644 index 0000000000..d29f8cf4de Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboard-widgets.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboards.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboards.png new file mode 100644 index 0000000000..c16fc8cb17 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-dashboards.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-device-attach.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-device-attach.png new file mode 100644 index 0000000000..5ec3ac4047 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-device-attach.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-device-overview.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-device-overview.png new file mode 100644 index 0000000000..74a6d2d176 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-device-overview.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-serial-monitor.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-serial-monitor.png new file mode 100644 index 0000000000..763d200b81 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-serial-monitor.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-editor.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-editor.png new file mode 100644 index 0000000000..ad0a238a44 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-editor.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-network.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-network.png new file mode 100644 index 0000000000..57568f9ab1 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-network.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-overview.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-overview.png new file mode 100644 index 0000000000..f21b7e966b Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-overview.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-variables.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-variables.png new file mode 100644 index 0000000000..22f0491741 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/gs-thing-variables.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/setup.png b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/setup.png new file mode 100644 index 0000000000..9734ec277e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/assets/setup.png differ diff --git a/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/iot-cloud-getting-started.md b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/iot-cloud-getting-started.md new file mode 100644 index 0000000000..eb3ec8b285 --- /dev/null +++ b/content/arduino-cloud/01.getting-started/01.iot-cloud-getting-started/iot-cloud-getting-started.md @@ -0,0 +1,208 @@ +--- +title: "Getting Started With the Arduino IoT Cloud" +compatible-products: [mkr-1000-wifi, mkr-wifi-1010, nano-33-iot, nano-rp2040-connect] +difficulty: easy +description: 'The Arduino IoT Cloud is a online platform that makes it easy for you to create, deploy and monitor IoT projects.' +tags: + - IoT Cloud +author: 'Karl Söderby' +featuredImage: 'cloud' +--- + +## Introduction + +Connected devices around the world are increasing by billions every year. The [Arduino IoT Cloud](https://create.arduino.cc/iot/things) is a platform that allows **anyone** to create IoT projects, with a user friendly interface, and an all in one solution for **configuration, writing code, uploading** and **visualization.** + +In this article, we will take a look at some different components of the Arduino IoT Cloud, and provide a general overview. + +But if you’re itching to get started and explore the Arduino IoT Cloud yourself, that is also perfectly fine! You can always come back here for more information! + +- Go to Arduino IoT Cloud + +### IoT Cloud Documentation + +The Arduino IoT Cloud has several pages of documentation available. Below you will find a list of some popular pages: + +- To find **all tutorials & articles**, visit the [Arduino IoT Cloud Documentation page](/cloud/iot-cloud). + +- For a **technical overview, list of features,** and **API guide**, visit the [Arduino IoT Cloud Cheat Sheet](/cloud/iot-cloud/tutorials/technical-reference). + +- For **API & SDK Documentation**, visit the developer reference at [Arduino IoT Cloud API](https://www.arduino.cc/reference/en/iot/api/). + +### Features + +Below is a list of Arduino IoT Cloud features. + +- [**Data Monitoring**](/cloud/iot-cloud/tutorials/cloud-environmental-data) - learn how to easily monitor your Arduino's sensor values through a dashboard. +- [**Variable Synchronisation**](https://docs.arduino.cc/cloud/iot-cloud/tutorials/device-to-device) - variable synchronisation allows you to sync variables across devices, enabling communication between devices with minimal coding. +- [**Scheduler**](https://docs.arduino.cc/cloud/iot-cloud/tutorials/cloud-scheduler) - schedule jobs to go on/off for a specific amount of time (seconds, minutes, hours). +- [**Over-The-Air (OTA) Uploads**](/cloud/iot-cloud/tutorials/ota-getting-started) - upload code to devices not connected to your computer. +- [**Webhooks**](https://docs.arduino.cc/cloud/iot-cloud/tutorials/webhooks) - integrate your project with another service, such as IFTTT. +- [**Amazon Alexa Support**](/cloud/iot-cloud/tutorials/alexa-mkr-rgb-shield) - make your project voice controlled with the Amazon Alexa integration. +- [**Dashboard Sharing**](https://docs.arduino.cc/cloud/iot-cloud/tutorials/sharing-dashboards) - share your data with other people around the world. + +## Compatible Hardware + +To use the Arduino IoT Cloud, a **cloud compatible board** is required. You can choose between using an official Arduino board, or a board based on the ESP32 / ESP8266 microcontroller. The Arduino IoT Cloud currently supports connection via Wi-Fi, LoRaWAN® (via The Things Network) and mobile networks. + +***All cloud-compatible Arduino boards come with a hardware secure element (such as the [ECC508](/resources/datasheets/ATECC508A-datasheet.pdf) cryptochip), where you can store your security keys.*** + +### Wi-Fi + +***Official Arduino boards only supports the 2.4GHz frequency band for transmitting data.*** + +The following boards connect to the Arduino IoT Cloud via Wi-Fi. + +- [MKR 1000 WiFi](https://store.arduino.cc/arduino-mkr1000-wifi) +- [MKR WiFi 1010](https://store.arduino.cc/arduino-mkr-wifi-1010) +- [Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect) +- [Nano 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) +- [Portenta H7](https://store.arduino.cc/portenta-h7) +- [Portenta H7 Lite Connected](https://store.arduino.cc/products/portenta-h7-lite-connected) +- [Nicla Vision](https://store.arduino.cc/products/nicla-vision) + + +Connection via Wi-Fi is an easy alternative, and your credentials can safely be entered during the configuration of a project. This type of connection is most suitable for low-range projects, where you connect your board to the cloud via your home/work/school router. + +### LoRaWAN® + +The following boards connect to the Arduino IoT Cloud via [The Things Stack](https://www.thethingsindustries.com/stack/), a LoRaWAN® Network Server connected to thousands of public LoRa® gateways. + +- [MKR WAN 1300](https://store.arduino.cc/arduino-mkr-wan-1300-lora-connectivity-1414) +- [MKR WAN 1310](https://store.arduino.cc/mkr-wan-1310) + +Connection via LoRaWAN® is recommended for low-power projects in both remote and urban areas, where Wi-Fi or other popular connectivity types are not available. The MKR WAN 1300/1310 boards are equipped with a LoRa radio module and has a slot for an antenna. With the right low-power configuration, the board can send data to the cloud for months on a single battery. + +***To learn more about setting up LoRaWAN® devices, visit the [Configuring LoRaWAN® devices in the Arduino Cloud](/cloud/iot-cloud/tutorials/cloud-lora-getting-started) guide.*** + +### GSM / NB-IoT Boards + +The MKR GSM 1400 and MKR NB 1500 require a **SIM card** to connect to the cloud, as they communicate over the mobile networks. + +- [MKR GSM 1400](https://store.arduino.cc/arduino-mkr-gsm-1400) +- [MKR NB 1500](https://store.arduino.cc/arduino-mkr-nb-1500-1413) + +Connection through mobile networks can be considered in remote areas where there's no Wi-Fi, or in mobile projects (such as cargo tracking). + +***For more information, visit the [Arduino SIM page](https://store.arduino.cc/digital/sim).*** + +***Note that a secured connection is a memory intense operation, so there's not a lot of memory for the user application (e.g. around 2.6 kB on the MKR GSM 1400). Using a lot of IoT Cloud variables may cause the sketch to run out of memory on boards which don't offload the SSL stack and make it crash.*** + +### ESP32 / ESP8266 + +The Arduino IoT Cloud supports a wide range of third party boards based on the ESP32 and ESP8266 microcontrollers with support for Wi-Fi. To set them up, simply choose the **third party option** in the device setup. + +![Configuring third party boards.](assets/3rd-party-support.png) + +***To learn more about ESP32/ESP8266 support and how to set it up, visit the [Connecting ESP32 & ESP8266 to Arduino Cloud IoT](/cloud/iot-cloud/tutorials/esp-32-cloud) guide.*** + +## Support + +If you have any problems with the Arduino IoT Cloud, you can browse through common troubleshooting issues and find information on different features in the **Arduino Help Center**. If you don’t find the answer you are looking for, we are always happy to help you with any question regarding our products! + +Go to Arduino Help Center + +## A Walk Through the Configuration + +![Setting up the Arduino IoT Cloud.](assets/setup.png) + +Setting up the Arduino IoT Cloud and accessing the different features available involves a few simple steps. So let’s take a look at how to go from start to finish! + +### 1. Creating an Arduino Account + +To starting using the Arduino IoT cloud, we first need to [log in or sign up to Arduino](https://create.arduino.cc/iot/things). + +#### 2. Go to the Arduino IoT Cloud + +After we have signed up, you can access the Arduino IoT Cloud from any page on [arduino.cc](https://www.arduino.cc/) by clicking on the four dots menu in the top right corner. You can also [go directly to the Arduino IoT Cloud](https://create.arduino.cc/iot/). + +![Navigating to the cloud.](assets/gs-access.png) + +### 3. Creating a Thing + +The journey always begin by creating a new **Thing**. In the Thing overview, we can choose what device to use, what Wi-Fi network we want to connect to, and create variables that we can monitor and control. This is the main configuration space, where all changes we make are automatically generated into a **special sketch file**. + +![The Thing overview.](assets/gs-thing-overview.png) + +### 4. Configuring a Device + +Devices can easily be added and linked to a Thing. The Arduino IoT Cloud requires your computer to have the [Arduino Agent installed](https://create.arduino.cc/getting-started/plugin/welcome). The configuration process is quick and easy, and can be done by clicking on the **“Select device”** button in the Thing overview. Here, we can choose from any board that has been configured, or select the **“Configure new device”** option. + +![Configuring a device.](assets/gs-device-attach.png) + +We can also get a complete overview of our devices by clicking the **“Devices"** tab at the top of the Arduino IoT Cloud interface. Here we can manage and add new devices. + +![The device tab.](assets/gs-device-overview.png) + +### 5. Creating Variables + +The variables we create are automatically generated into a sketch file. There are several data types we can choose from, such as **int, float, boolean, long, char**. There’s also special variables, such as **Temperature, Velocity, Luminance** that can be used. When clicking on the **“Add variable”** button, we can choose name, data type, update setting and interaction mode. + +![Creating variables.](assets/gs-thing-variables.png) + +### 6. Connecting to a Network + +To connect to a Wi-Fi network, simply click the **“Configure”** button in the network section. Enter the credentials and click **“Save”**. This information is also generated into your sketch file! + +![Entering network credentials.](assets/gs-thing-network.png) + +### 7. Editing the Sketch + +Now that we have configured variables, devices and network settings, we can get to programming our devices! + +An automatically generated sketch file can be found in the **“Sketch”** tab. It has the same structure as a typical `.ino` file, but with some additional code to make the connection to your network and to the cloud. + +A sketch that, for example, reads an analog sensor, and use the **cloud variable** to store it. When the sketch has been uploaded, it will work as a regular sketch, but it will also update the cloud variables that we use! + +Additionally, each time we create a variable that has the **Read & Write** permission enabled, a function is also generated, at the bottom of your sketch file. Each time this variable changes, it will execute the code within this function! This means that we can leave most of the code out of the **loop()** and only run code when needed. + +To upload the program to our board, simply click the **"Upload"** button. + +![Editing a sketch in the cloud editor.](assets/gs-thing-editor.png) + +The editor also has a **Serial Monitor Tool**, which can be opened by clicking the magnifying glass in the toolbar. Here you can view information regarding your connection, or commands printed via `Serial.print()`. + +![The Serial Monitor Tool.](assets/gs-serial-monitor.png) + +After we have successfully uploaded the code, we can open the **“Serial Monitor”** tab to view information regarding our connection. If it is successful, it will print **“connected to network_name”** and **“connected to cloud”**. If it fails to connect, it will print the errors here as well. + +***The cloud editor is a mirrored "minimal" version of the Web Editor. Any changes you make will also be reflected in the Web Editor, which is more suitable for developing more advanced sketches.*** + +### 8. Creating a Dashboard + +Now that we have configured the device & network, created variables, completed the sketch and successfully uploaded the code, we can move on to the fun part: **creating dashboards!** + +![Visualize your data.](assets/dashboard1.png) + +Dashboards are visual user interface for interacting with your boards over the cloud, and we can setup many different setups depending on what your IoT project needs. We can access our dashboards by clicking on the **“Dashboards”** tab at the top of the Arduino IoT Cloud interface, where we can create new dashboards, and see a list of dashboards created for other Things. + +![Navigating to dashboards.](assets/gs-dashboards.png) + +If we click on **“Create new dashboard”**, we enter a dashboard editor. Here, we can create something called **widgets**. Widgets are the visual representation of our variables we create, and there are many different to choose from. Below is an example using several types of widgets. + +![The different widgets available.](assets/gs-dashboard-widgets.png) + +When we create widgets, we also need to **link them to our variables**. This is done by clicking on a widget we create, select a Thing, and select a variable that we want to link. Once it is linked, we can either interact with it, for example a button, or we can monitor a value from a sensor. As long as our board is connected to the cloud, the values will update! + +Let's say we have a **temperature widget** that we want to link to the **temperature** variable inside the **Cloud project** thing. + +![Linking a variable to a widget.](assets/gs-dashboard-link.png) + +***Note that not all widgets and variables are compatible. A switch and an integer can for example not be linked, and will not be an option while setting up your dashboard.*** + +We can also have several things running at once, depending on your Arduino IoT Cloud plan, which we can include in the same dashboard. This is a great feature for tracking multiple boards in for example a larger sensor network, where boards can be connected to different networks around the world, but be monitored from the same dashboard. + +## Congratulations + +![What will you build?](assets/endimg.png) + +You are just a few easy steps from deploying your very own IoT project. Having a project connected to the Arduino IoT Cloud opens up many possibilities, such as tracking data in real time, triggering remote devices and building wireless systems. + +What will you create? + +Start your IoT journey + + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/3rd-party-support.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/3rd-party-support.png new file mode 100644 index 0000000000..5bf5639282 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/3rd-party-support.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/add-widget-manually.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/add-widget-manually.png new file mode 100644 index 0000000000..f39293293d Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/add-widget-manually.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-device.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-device.png new file mode 100644 index 0000000000..5dcb413e62 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-device.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-thing.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-thing.png new file mode 100644 index 0000000000..fef8cbb295 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-thing.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-variable.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-variable.png new file mode 100644 index 0000000000..ee3d65e023 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/adding-a-variable.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/choosing-a-device.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/choosing-a-device.png new file mode 100644 index 0000000000..c7a4d5d74e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/choosing-a-device.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/cloud-widgets.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/cloud-widgets.png new file mode 100644 index 0000000000..cd82fed152 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/cloud-widgets.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/configuration-completed.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/configuration-completed.png new file mode 100644 index 0000000000..d5085943b7 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/configuration-completed.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/configuring-network.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/configuring-network.png new file mode 100644 index 0000000000..3d56a5647c Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/configuring-network.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-a-dashboard.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-a-dashboard.png new file mode 100644 index 0000000000..064080c1e9 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-a-dashboard.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-an-account.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-an-account.png new file mode 100644 index 0000000000..99ee5aaa93 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-an-account.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-widget-from-thing.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-widget-from-thing.png new file mode 100644 index 0000000000..905c50abde Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/create-widget-from-thing.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/device_OtA.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/device_OtA.png new file mode 100644 index 0000000000..65e4454656 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/device_OtA.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/download-historical-data.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/download-historical-data.png new file mode 100644 index 0000000000..d2198365e3 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/download-historical-data.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/files-automated-sketch.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/files-automated-sketch.png new file mode 100644 index 0000000000..debbb93815 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/files-automated-sketch.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/iot-cloud-compatible-boards.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/iot-cloud-compatible-boards.png new file mode 100644 index 0000000000..a89b495a3c Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/iot-cloud-compatible-boards.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/navigating-to-devices.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/navigating-to-devices.png new file mode 100644 index 0000000000..199bac606e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/navigating-to-devices.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/open-with-web-editor.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/open-with-web-editor.png new file mode 100644 index 0000000000..1752ada9a8 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/open-with-web-editor.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/ota_compatible_boards.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/ota_compatible_boards.png new file mode 100644 index 0000000000..92e2ef4102 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/ota_compatible_boards.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/sharing-variables.gif b/content/arduino-cloud/01.getting-started/02.technical-reference/images/sharing-variables.gif new file mode 100644 index 0000000000..43ddcc87fd Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/sharing-variables.gif differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/signing-in-to-account.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/signing-in-to-account.png new file mode 100644 index 0000000000..ab0bdfcb00 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/signing-in-to-account.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/sketch-tab.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/sketch-tab.png new file mode 100644 index 0000000000..aa89a5fd31 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/sketch-tab.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-chart.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-chart.png new file mode 100644 index 0000000000..68a3da6a5e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-chart.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-color-light.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-color-light.png new file mode 100644 index 0000000000..38c0d94169 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-color-light.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-color.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-color.png new file mode 100644 index 0000000000..72b98e6201 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-color.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-dimmed-light.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-dimmed-light.png new file mode 100644 index 0000000000..0b5a960d69 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-dimmed-light.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-gauge.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-gauge.png new file mode 100644 index 0000000000..1876fcdefb Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-gauge.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-01.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-01.png new file mode 100644 index 0000000000..70e2e16d2e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-01.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-02.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-02.png new file mode 100644 index 0000000000..0f3ab39963 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-02.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-03.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-03.png new file mode 100644 index 0000000000..9f6c01df8c Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-03.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-04.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-04.png new file mode 100644 index 0000000000..a40f8fceec Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-04.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-05.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-05.png new file mode 100644 index 0000000000..643d4aafb4 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-05.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-06.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-06.png new file mode 100644 index 0000000000..e481a002b9 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-06.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-collected.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-collected.png new file mode 100644 index 0000000000..83ef99e705 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-img-collected.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-led.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-led.png new file mode 100644 index 0000000000..e1a4e0e47e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-led.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-map.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-map.png new file mode 100644 index 0000000000..6f028c681f Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-map.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-messenger.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-messenger.png new file mode 100644 index 0000000000..8d8911e2b2 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-messenger.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-percentage.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-percentage.png new file mode 100644 index 0000000000..06b89ef665 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-percentage.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-pushbutton.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-pushbutton.png new file mode 100644 index 0000000000..ee08f3b153 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-pushbutton.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-slider.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-slider.png new file mode 100644 index 0000000000..acd05b5395 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-slider.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-status.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-status.png new file mode 100644 index 0000000000..782b412b12 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-status.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-stepper.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-stepper.png new file mode 100644 index 0000000000..4fe6d3e347 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-stepper.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-switch.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-switch.png new file mode 100644 index 0000000000..378cc5310f Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-switch.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-value.png b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-value.png new file mode 100644 index 0000000000..de78f0435a Binary files /dev/null and b/content/arduino-cloud/01.getting-started/02.technical-reference/images/widget-value.png differ diff --git a/content/arduino-cloud/01.getting-started/02.technical-reference/iot-cloud-tech-ref.md b/content/arduino-cloud/01.getting-started/02.technical-reference/iot-cloud-tech-ref.md new file mode 100644 index 0000000000..ac54189aed --- /dev/null +++ b/content/arduino-cloud/01.getting-started/02.technical-reference/iot-cloud-tech-ref.md @@ -0,0 +1,992 @@ +--- +date: 'September 24, 2021, at 11:11 AM' +title: 'Arduino Cloud IoT Cheat Sheet' +description: 'Learn how to set up the Arduino Cloud IoT, get a quick overview of the compatible boards, the API, configuration, Things, variables and dashboards.' +author: 'Liam Aljundi' +--- + +[Arduino IoT Cloud](https://create.arduino.cc/iot/) is a service that allows you to configure, program and deploy your Arduino devices. It is an all-in-one solution for IoT development, where you can build visual dashboards to monitor and control your devices, integrate with other services and much more. + +This article summarizes the use of the Arduino Cloud IoT, and includes information regarding requirements, installation, API and general usage of the platform. + +## Compatible Hardware + +To use the Arduino IoT Cloud, a **cloud compatible board** is required. You can choose between using an official Arduino board, or a board based on the ESP32 / ESP8266 microcontroller. The Arduino IoT Cloud currently supports connection via Wi-Fi, LoRaWAN® (via The Things Network) and mobile networks. + +***All cloud-compatible Arduino boards come with a hardware secure element (such as the [ECC508](/resources/datasheets/ATECC508A-datasheet.pdf) cryptochip), where you can store your security keys.*** + +### Wi-Fi + +***Official Arduino boards only supports the 2.4GHz frequency band for transmitting data.*** + +The following boards connect to the Arduino IoT Cloud via Wi-Fi. + +- [MKR 1000 WiFi](https://store.arduino.cc/arduino-mkr1000-wifi) +- [MKR WiFi 1010](https://store.arduino.cc/arduino-mkr-wifi-1010) +- [Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect) +- [Nano 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) +- [Portenta H7](https://store.arduino.cc/portenta-h7) +- [Portenta H7 Lite Connected](https://store.arduino.cc/products/portenta-h7-lite-connected) +- [Nicla Vision](https://store.arduino.cc/products/nicla-vision) + +Connection via Wi-Fi is an easy alternative, and your credentials can safely be entered during the configuration of a project. This type of connection is most suitable for low-range projects, where you connect your board to the cloud via your home/work/school router. + +### LoRaWAN® + +The following boards connect to the Arduino IoT Cloud via [The Things Stack](https://www.thethingsindustries.com/stack/), a LoRaWAN® Network Server connected to thousands of public LoRa® gateways. + +- [MKR WAN 1300](https://store.arduino.cc/arduino-mkr-wan-1300-lora-connectivity-1414) +- [MKR WAN 1310](https://store.arduino.cc/mkr-wan-1310) + +Connection via LoRaWAN® is recommended for low-power projects in both remote and urban areas, where Wi-Fi or other popular connectivity types are not available. The MKR WAN 1300/1310 boards are equipped with a LoRa radio module and has a slot for an antenna. With the right low-power configuration, the board can send data to the cloud for months on a single battery. + +***To learn more about setting up LoRaWAN® devices, visit the [Configuring LoRaWAN® devices in the Arduino Cloud](/cloud/iot-cloud/tutorials/cloud-lora-getting-started) guide.*** + +### GSM / NB-IoT Boards + +The MKR GSM 1400 and MKR NB 1500 require a **SIM card** to connect to the cloud, as they communicate over the mobile networks. + +- [MKR GSM 1400](https://store.arduino.cc/arduino-mkr-gsm-1400) +- [MKR NB 1500](https://store.arduino.cc/arduino-mkr-nb-1500-1413) + +Connection through mobile networks can be considered in remote areas where there's no Wi-Fi, or in mobile projects (such as cargo tracking). + +***For more information, visit the [Arduino SIM page](https://store.arduino.cc/digital/sim).*** + +### ESP32 / ESP8266 + +The Arduino IoT Cloud supports a wide range of third party boards based on the ESP32 and ESP8266 microcontrollers with support for Wi-Fi. To set them up, simply choose the **third party option** in the device setup. + +![Configuring third party boards.](assets/3rd-party-support.png) + +***To learn more about ESP32/ESP8266 support and how to set it up, visit the [Connecting ESP32 & ESP8266 to Arduino Cloud IoT](/cloud/iot-cloud/tutorials/esp-32-cloud) guide.*** + +## Software Requirements + +### Create Agent + +The [Arduino Create Agent](https://github.com/arduino/arduino-create-agent) is a single binary that will appear on the menu bar and work in the background. It allows you to use the Arduino IoT Cloud and the Arduino Web Editor to seamlessly upload code to any board directly from the browser. + +Downloading and installing the Arduino Create Agent plugin can be simply done following [this quick and easy process](https://create.arduino.cc/getting-started/plugin/welcome). + +The full documentation of the [Arduino Create Agent is available here](https://github.com/arduino/arduino-create-agent#readme) for more advanced usage. + +### Arduino Account + +An Arduino account is needed to use all of the Arduino Cloud services including Arduino IoT Cloud and the Arduino Web Editor. [Follow this link to make an account](http://create.arduino.cc/iot). + +***In addition to IoT Cloud, the Arduino account provides access to the Arduino Web Editor which is the full online IDE. Arduino and non-Arduino boards can be programmed using the Arduino Web Editor without the need for installing board drivers or libraries.*** + +## Device configuration + +Configuration of the device to be used with the Arduino IoT Cloud is required **once for every new device**. + +Configuring a new device can be achieved following the steps below: + +1. [Sign in to the Arduino IoT Cloud](https://create.arduino.cc/iot). + +2. [Navigate to "Devices" on the top menu](https://create.arduino.cc/iot/devices). + +3. Connect an Arduino IoT Cloud **compatible device**. + +4. Click on the **"ADD DEVICE"** button. + +5. Select the correct device, either an **Arduino device** or a **third party device**. + +6. Wait until the **configuration is complete**. + +Once a device is successfully configured it appears in the **"Devices"** list and can be used to **create a thing**, or can be **linked to an existing thing**. + +The **Devices** page displays the name, status, and linked Things for each of the configured devices. Clicking on the device allows for **renaming** it, as well as accessing more information about the device such as its **ID number**, **type**, **FQBN**, **serial number**, **NINA firmware** version and the option to update it, **linked Thing**, **status**, latest activity and the date when the device was added. + +The **status** of the device indicates whether it's connected to the Arduino IoT Cloud (**online**), or not successfully connected (**offline**). + +A shortcut to add a device is also provided in **"Things" page** as explained in the next section. + +## Features + +Below you will find a list of features that are available in the Arduino IoT Cloud. + +### Uploading over-the-air (OTA) + +This feature allows for uploading sketches wirelessly to Arduino boards, without the need to connect the board physically. This feature is supported for the following **compatible Arduino boards**: + +![Over The Air compatible boards](./images/ota_compatible_boards.png) + +- [Arduino MKR WiFi 1010](https://store.arduino.cc/arduino-mkr-wifi-1010) +- [Arduino NANO 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) +- [Arduino Nano RP2040 Connect](https://store.arduino.cc/products/arduino-nano-rp2040-connect-with-headers) +- [Portenta H7](https://store.arduino.cc/products/portenta-h7) + +![Connecting the device with the OTA option](./images/device_OtA.png) + +In order to **enable over-the-air uploads**, an initial upload should be done in the traditional way via a cable connection using the IoT Cloud interface. After such initial upload, "Over-the-Air" will appear as an option whenever the board is connected to the cloud via its network connection. For more information about this topic, check out the [tutorial about uploading sketches Over-the-Air (OTA)](https://www.arduino.cc/en/Tutorial/ota-getting-started). + +### Variable Synchronisation + +This feature allows Arduino devices to communicate with each other by sharing variables, without writing a single line of code or spending time with radio modules and network protocols. + +![Sharing Variables](./images/sharing-variables.gif) + +Using this feature you can link variables of the same data type between **two or more cloud-enabled devices**, and Arduino IoT Cloud will automatically ensure any change to their value is propagated among all linked boards. +For example, one button could set three smart bulbs to the same color by just setting a variable on one device and reading it on the others. Or you could turn on a heater when temperature sensors in your room or outside in your weather station drop below a certain level. + +## Things + +In order to use your devices in IoT Cloud, you need to associate a Thing to each of them. A Thing is an abstract concept which holds the configuration of the variables and other settings, as well as the history of the data collected for the variables. + +Devices and things are distinct concepts in IoT Cloud so that you can easily swap the actual hardware without reconfiguring everything from scratch: just detach a thing from a device, and ressign it to another device. + +![Two ways to add a Thing](./images/adding-a-thing.png) + +The **Things page** can be accessed either by clicking on **"CREATE THING"** on the added device in the **"Device" page**, or by navigating to the **"Things"** tab in the top menu, then clicking on the **"CREATE THING"**. The first method links the device to the created Thing **automatically**, while the later method requires a **manual linking** of the device on the Things page. + + +The steps below can be used as guidance when **setting up a Thing**: + +1. **Attach a device** if not already attached. +2. **Add a variable**, or variables by clicking on the **"Add Variable"** button. +3. **Configure the network**, by entering the WiFi's name and password. +4. **Edit the sketch** in the **"Sketch"** tab. + +***You can learn more about Things in the [Getting Started with the Arduino IoT Cloud](https://docs.arduino.cc/cloud/iot-cloud/tutorials/iot-cloud-getting-started) guide.*** + +## Variables + +A thing can have one or more variables. A variable can be used for multiple purposes: + +* collect data over time in the cloud (sensor readings, status changes, log messages etc.) +* show data in real-time in a dashboard using the various available visual widgets +* receive changes originated from a dashboard or other linked devices + +When you configure a variable, Arduino IoT Cloud will handle all the communication and synchronization behind the scenes. Variables can be used directly just like any other variables in an Arduino sketch. + +When adding a variable the following values need to be determined: + +![Options for adding a variable](./images/adding-a-variable.png) + +1. A **Display Name**, which can any string name, preferably something that indicates the function of the variable. It can not include spaces and special characters, and it cannot start with a number. + +2. The **Type of Variable** corresponds to the data type of the variable and must be chosen from the provided list. See below for a full list of the available types. + + **Please note:** when a variable is added, it is automatically declared in the `thingProperties.h` file so you don't need to declare it yourself in the sketch. + +3. A **Declaration Name**, a unique name by which the variable will be called in the sketch. It can not include spaces and special characters, and it cannot start with a number. The display name chosen for the variable may be used here to avoid conflicts. + +4. The **Variable's Permission**, which can be either **Read & Write** or **Read Only**. A **Read & Write** variable can work both as **input and output**, the data can be sent from the device to the cloud and vice versa. A **Read Only** variable can only send data from the device to the cloud. + +5. The **Variable Update Policy**, which may be either **On Change** or **Periodically**. If **On Change** is chosen, the variable will be updated to the cloud whenever the change in value is greater than or equal to the set **threshold**. If **Periodically** is chosen, the variable will be updated to the cloud each time the number of seconds set is elapsed. + +### Basic Types + +| Type | Declaration | +| --------------------- | ---------------------- | +| Boolean | `bool variableName;` | +| Character String | `String variableName;` | +| Floating Point Number | `float variableName;` | +| Integer Number | `int variableName;` | + + +### Specialized Types + +For your convenience, IoT Cloud provides specialized types which are just wrappers around basic types but declare the variable semantics more explicitly. This enables smarter integrations with third-party services (such as Alexa) and better visualization of widgets in dashboards. + +You can use them just like a normal variable of the wrapped type, since they support assignment and comparison operators. + +| Type | Declaration | Wrapped data type | +| -------------------- | ---------------------------------------- | ----------------- | +| Acceleration | `CloudAcceleration variableName;` | `float` | +| Angle | `CloudAngle variableName;` | `float` | +| Area | `CloudArea variableName;` | `float` | +| Capacitance | `CloudCapacitance variableName;` | `float` | +| Color | `CloudColor variableName;` | `float` | +| Contact Sensor | `CloudContactSensor variableName;` | `bool` | +| Counter | `CloudCounter variableName;` | `int` | +| Data Rate | `CloudDataRate variableName;` | `float` | +| Electric Current | `CloudElectricCurrent variableName;` | `float` | +| Electric Potention | `CloudElectricPotention variableName;` | `float` | +| Electric Resistance | `CloudElectricResistance variableName;` | `float` | +| Energy | `CloudEnergy variableName;` | `float` | +| Flow Rate | `CloudFlowRate variableName;` | `float` | +| Force | `CloudForce variableName;` | `float` | +| Frequency | `CloudFrequency variableName;` | `float` | +| Heart Rate | `CloudHeartRate variableName;` | `float` | +| Information Content | `CloudInformationContent variableName;` | `int` | +| Length | `CloudLength variableName;` | `float` | +| Light | `CloudLight variableName;` | `bool` | +| Location | `CloudLocation variableName;` | `float` | +| Logarithmic Quantity | `CloudLogarithmicQuantity variableName;` | `float` | +| Luminance | `CloudLuminance variableName;` | `float` | +| Luminous Flux | `CloudLuminousFlux variableName;` | `float` | +| Luminous Intensity | `CloudLuminousIntensity variableName;` | `float` | +| Mass | `CloudMass variableName;` | `float` | +| Motion Sensor | `CloudMotionSensor variableName;` | `bool` | +| Percentage | `CloudPercentage variableName;` | `float` | +| Power | `CloudPower variableName;` | `float` | +| Pressure | `CloudPressure variableName;` | `float` | +| Relative Humidity | `CloudRelativeHumidity variableName;` | `float` | +| Smart Plug | `CloudSmartPlug variableName;` | `bool` | +| Switch | `CloudSwitch variableName;` | `bool` | +| CloudTemperature | `CloudTemperature variableName;` | `float` | +| Temperature Sensor | `CloudTemperatureSensor variableName;` | `float` | +| Time | `CloudTime variableName;` | `float` | +| Velocity | `CloudVelocity variableName;` | `float` | +| Volume | `CloudVolume variableName;` | `float` | + + +### Complex Types + +The following variable types hold multiple values internally and are used to represent more complex data. In order to access such values, methods are provided. + +#### DimmedLight + +Declared as `CloudDimmedLight x;` + +| Property | Type | Read value | Set value | +| ---------- | --------------- | ------------------- | ------------------- | +| Brightness | `float` (0-100) | `x.getBrightness()` | `x.setBrightness()` | +| Switch | `bool` | `x.getSwitch()` | `x.setSwitch()` | + +#### ColoredLight + +Declared as `CloudColoredLight x;` + +| Property | Type | Read value | Set value | +| ---------- | --------------- | ------------------- | ------------------- | +| Switch | `bool` | `x.getSwitch()` | `x.setSwitch()` | +| Hue | `float` (0-360) | `x.getHue()` | `x.setHue()` | +| Saturation | `float` (0-100) | `x.getSaturation()` | `x.setSaturation()` | +| Brightness | `float` (0-100) | `x.getBrightness()` | `x.setBrightness()` | + +#### CloudColor + +Declared as `CloudColor x;`. + +To read the Color values, we can use the following method `Color colorValues = x.getValue();`. This will assign the hue, saturation, and brightness values to the `colorValues` variable. + +| Property | Type | Read value | Set value | +| ---------- | ------- | ----------------- | -------------------------------------- | +| Hue | `float` | `colorValues.hue` | `x = Color(hue,saturation,brightness)` | +| Saturation | `float` | `colorValues.sat` | `x = Color(hue,saturation,brightness)` | +| Brightness | `float` | `colorValues.bri` | `x = Color(hue,saturation,brightness)` | + +To set the color, we can assign the CloudColor variable directly to float variables `x = {hue,saturation,brightness}`, or using the method ` x = Color(hue,saturation,brightness)`. + +#### CloudLocation + +Declared as `CloudLocation x;`. + +To read the location values, we can use the following method `Location coordinates = x.getValue();`. This will assign the longitude and latitude values to the coordinates variable. If we want too access the values individually we can use `Serial.println(coordinates.lat)` and `Serial.println(coordinates.lon)`. + +| Property | Type | Read value | Set value | +| --------- | ------- | ----------------- | --------------------------- | +| Latitude | `float` | `coordinates.lat` | This variable is ready only | +| Longitude | `float` | `coordinates.lon` | This variable is ready only | + +***The format of the `lat` and `lon` is in Decimal Degrees (DD), for example `41.40338`, `2.17403`.*** + +#### Television + +Declared as `CloudTelevision x;` + +| Property | Type | Read Value | Set value | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ------------------------ | +| Switch | `bool` | `x.getSwitch()` | `x.setSwitch()` | +| Volume | `int`(0-100) | `x.getVolume()` | `x.setVolume()` | +| Mute | `bool` | `x.getMute()` | `x.setMute()` | +| PlaybackCommands | `PlaybackCommands` (FastForward, Next, Pause, Play, Previous, Rewind, StartOver, Stop) | `x.getPlaybackCommand()` | `x.setPlaybackCommand()` | +| Input | `InputValue` ([Up to 60 values](https://github.com/arduino-libraries/ArduinoIoTCloud/blob/master/src/property/types/automation/CloudTelevision.h) such as HDMI1, HDMI2, DVD, GAME...etc.) | `x.getInput()` | `x.setInput()` | +| Channel | `int` | `x.getChannel()` | `x.setChannel()` | + + +### Utilities + +The following utilities are available using any IoT Cloud sketch. + +#### Check Connection Status + +To check connection to the cloud, use: + +```arduino +ArduinoCloud.connected() +``` + +This will return in an `int` format: +- `0` (not connected) +- `1` (connected). + +#### Get Local Time (Unix) + +To check local time, use: + +```arduino +ArduinoCloud.getLocalTime() +``` + +This will return in a `long` format: +- Epoch Unix time stamp. Example: `1652442415`. + +***This utility can be used together with the `CloudTime` variable and the `Time Picker` widget.*** + +### Examples + +Here are some examples of how to use the variables in a sketch: + +#### Colored Light + +ColoredLight is a complex variable declared automatically in the `thingProperties.h` file as `CloudColoredLight variableName;`. The example below shows how the ColoredLight variable (declared with the variableName `cLight`) can be used and modified in the sketch. Note that the `onCLightChange()` function is automatically added and is triggered whenever the value of the Light variable is updated in the Cloud. + +```arduino +#include +#include // Arduino_MKRRGB depends on ArduinoGraphics + +#include "thingProperties.h" + +void setup() { + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial mood without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); + + if (!MATRIX.begin()) { + Serial.println("Failed to initialize MKR RGB shield!"); + while (1); + } + + // set the brightness, supported values are 0 - 255 + MATRIX.brightness(10); +} + +void loop() { + ArduinoCloud.update(); +} + +void onCLightChange() { + uint8_t r, g, b; + cLight.getValue().getRGB(r, g, b); + + MATRIX.beginDraw(); + + if (cLight.getSwitch()) { + Serial.println("R:"+String(r)+" G:"+String(g)+ " B:"+String(b)); + MATRIX.fill(r, g, b); + MATRIX.rect(0, 0, MATRIX.width(), MATRIX.height()); + }else{ + MATRIX.clear(); + } + + MATRIX.endDraw(); +} + +``` + +#### Television + +CloudTelevision is an automation variable declared automatically in the `thingProperties.h` file as `CloudTelevision variableName;`. The example below shows how the CloudTelevision variable (declared with the variableName `tv`) can be used and modified in the sketch. The example simulates a remote controller by using an IR receiver to read the signals sent from the a remote controller and save them in arrays of unsigned integers. An IR transmitter is then used to send IR signals using the Arduino IoT Cloud. To view the full documentation of the project, [you can check this page](https://create.arduino.cc/projecthub/313276/full-control-of-your-tv-using-alexa-and-arduino-iot-cloud-9e7c4d). + +Note that the `onTvChange()` function is automatically added and is triggered whenever the value of the tv variable is updated in the Cloud. + +```arduino +#include "thingProperties.h" +#include + +/******* SAVE DATA FROM IR RECEIVER ********/ +const unsigned int chan[9][67] = {}; +const unsigned int volUp[67] = {}; +const unsigned int chanUp[67] = {}; +const unsigned int onoff[67] = {}; + +IRsend irsend; +const int freq = 38; +bool first; + +int prevChannel; +int prevVolume; +bool prevSwitch; +bool prevMute; + +void setup() { + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); + + first = true; + pinMode(LED_BUILTIN, OUTPUT); +} + +void loop() { + ArduinoCloud.update(); +} + +/******* HANDLING THE IR TRANSMITTER********/ +void sendIR(const unsigned int buf[]) { + digitalWrite(LED_BUILTIN, HIGH); + irsend.sendRaw(buf, 67, freq); + delay(300); + digitalWrite(LED_BUILTIN, LOW); +} + +void onTvChange() { + + Serial.println("=================="); + Serial.println("Switch:"+String(tv.getSwitch())); + Serial.println("Volume:"+String(tv.getVolume())); + Serial.println("Channel:"+String(tv.getChannel())); + Serial.println("Mute:"+String(tv.getMute())); + Serial.println("=================="); + + if (first){ + prevSwitch = tv.getSwitch(); + prevVolume = tv.getVolume(); + prevChannel = tv.getChannel(); + prevMute = tv.getMute(); + first = false; + return; + } + + + // Volume changed + if (tv.getVolume() > prevVolume) { + tv.setMute(false); + prevMute = false; + for (int k = prevVolume + 1 ; k<=tv.getVolume(); k++) { + sendIR(volUp); + Serial.println("Volume requested:"+String(tv.getVolume())+" Set:"+String(k)); + } + prevVolume = tv.getVolume(); + } + else if (tv.getVolume() < prevVolume) { + tv.setMute(false); + prevMute = false; + for (int k = prevVolume - 1; k>=tv.getVolume(); k--) { + sendIR(volDown); + Serial.println("Volume changed:"+String(tv.getVolume())+" Set:"+String(k)); + } + prevVolume = tv.getVolume(); + } + + + // Mute changed + if (tv.getMute() != prevMute && tv.getMute()) { + prevMute = tv.getMute(); + sendIR(mute); + Serial.println("Mute changed:"+String(tv.getMute())); + } + else if (tv.getMute() != prevMute && !tv.getMute()) { + prevMute = tv.getMute(); + sendIR(mute); + Serial.println("Mute changed:"+String(tv.getMute())); + } + + + // Channel changed + if (tv.getChannel() != prevChannel) { + int newChannel = tv.getChannel(); + if (newChannel > 0 && newChannel < 10) { + sendIR(chan[newChannel-1]); + } else if (newChannel > 9) { + if (newChannel > prevChannel) { + for (int ch = prevChannel; ch < newChannel; ch++) { + sendIR(chanUp); + Serial.println("Chan requested:"+String(newChannel)+" Set:"+String(ch)); + } + } else if (newChannel < prevChannel) { + for (int ch = prevChannel; ch > newChannel; ch--) { + sendIR(chanDown); + Serial.println("Chan requested:"+String(newChannel)+" Set:"+String(ch)); + } + } + } + prevChannel = newChannel; + Serial.println("Channel changed:"+String(tv.getChannel())); + } + + + // On/Off changed + if (tv.getSwitch() != prevSwitch) { + prevSwitch = tv.getSwitch(); + if (tv.getSwitch()) { + sendIR(chan[6]); + } else { + sendIR(onoff); + } + Serial.println("Switch changed:"+String(tv.getSwitch())); + } +} + +``` + +## Configuring Network + +Configuring the network allows for connecting an Arduino, or third party devices to a Wi-Fi network. The credentials entered are saved in the **Secret file**, inside the sketch. + +Entering the network details can be done simply by navigating to **"Network"** and clicking on **"Configure"**. A popup screen appears where the **Network's Name** and **Password** can be entered. The network details are saved and only gets uploaded to the device when **the sketch is uploaded**. + +The network details can be modified by clicking the **"Change"** button, correcting the entered credentials, saving the new details, and uploading the sketch again. + +## Editing the sketch + +The **"Sketch"** tab in the **Things** page includes a code editor, which is a lite version of the Arduino Web Editor that enables for editing, formatting, compiling and saving a sketch. An automatically generated code is found in the editor after adding **at least one variable**. + +![Open with Arduino Web Editor](./images/open-with-web-editor.png) + +The sketch may be also displayed and modified in the full **Arduino Web Editor** by clicking the **"Open full editor"** button, which provides more features. + +The sketches generated automatically in IoT Cloud include four files: + +### thingProperties.h + +![Files generated in the automated sketch](./images/files-automated-sketch.png) + +This is a file containing the code generated by the Arduino IoT Cloud that should not be edited. This file includes the [ArduinoIoTCloud](https://github.com/arduino-libraries/ArduinoIoTCloud) and [Arduino_ConnectionHandler](https://github.com/arduino-libraries/Arduino_ConnectionHandler) libraries, the network configuration, initializations of variables and function, and properties of each variable saved in the `initProperties()` function. + +The example below shows a basic code generated in the `thingProperties.h` file as a result of adding two variables. The first variable **"Variable_Name_01"** is an integer variable with a **READ & WRITE** permission, and the second is a **READ ONLY** CloudTemperature variable. + +***Please note: for READ & WRITE variables a callback function (in this case called `onVariableName01Change()`) is automatically generated in sketch. This will allow for writing commands inside the function to trigger actions whenever the value is changed from the cloud.*** + +```arduino +#include ArduinoIoTCloud.h +#include Arduino_ConnectionHandler.h + +const char SSID[] = SECRET_SSID; // Network SSID (name) +const char PASS[] = SECRET_PASS; // Network password (use for WPA, or use as key for WEP) + +void onVariableName01Change(); // declaring a function for the read & write variables + +int Variable_Name_01; // declare a normal integer variable +CloudTemperature Variable_Name_02; // declare a Cloud specific temperature variable + +void initProperties(){ + + ArduinoCloud.addProperty(Variable_Name_01, READWRITE, ON_CHANGE, onVariableName01Change); // linking the read & write variable with its function and updating it on change + ArduinoCloud.addProperty(Variable_Name_02, READ, 10 * SECONDS, NULL); // setting up the read only variable and updating it every 10 seconds + +} + +WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS); // setting up the network name and password chosen in the Network configuration +``` + +***As of 2022/02/09 the `thingProperties.h` no longer contains your Thing ID. If you have created a Thing prior to this date, simply update your Thing and your `thingProperties.h` will automatically be updated. You can see the lines that were removed in the snippet below:*** + +```arduino +const char THING_ID[] = "A-UNIQUE-THING-ID-NUMBER"; + +ArduinoCloud.setThingId(THING_ID); //previously located inside initProperties() +``` + + +### sketch.ino + +This file includes the main Arduino sketch that can be **edited and uploaded to the device**. The sketch includes the `thingProperties.h` file, the `setup()` and `loop()` functions, and an empty function for every **Read & Write** variable. The code below is a basic example of an auto generated code in the sketch file, using the same variables from the previous example displayed in `thingProperties.h` section. + +```arduino +#include "thingProperties.h" + +void setup() { + Serial.begin(9600); // Initialize serial and wait for port to open: + delay(1500); // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + + initProperties(); // Defined in thingProperties.h + + ArduinoCloud.begin(ArduinoIoTPreferredConnection); // Connect to Arduino IoT Cloud + + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); +} + +void loop() { + ArduinoCloud.update(); + // Your code here +} + +void onVariableName01Change() { + // Do something +} + +``` + +The `setup()` function includes an initialization of the **Serial Monitor** and the **properties** using the `Serial.begin(9600);` and `initProperties();` commands. Additionally, the **connection to the Arduino IoT Cloud** is initialized using the `ArduinoCloud.begin(ArduinoIoTPreferredConnection);` command, which uses methods from the [ArduinoIoTCloud](https://github.com/arduino-libraries/ArduinoIoTCloud) and [Arduino_ConnectionHandler](https://github.com/arduino-libraries/Arduino_ConnectionHandler) libraries that are included in the `thingProperties.h` file. Finally, `setDebugMessageLevel(2);` and `ArduinoCloud.printDebugInfo();` are used for **debugging**, it prints information related to the state of **network and IoT Cloud connection and errors**. The higher number the more granular information obtained, the default is 0 (only errors) and the maximum is 4. + +### Secret + + This is a file to save sensitive data such as passwords and API keys that will be protected and hidden from public access. The network configuration details are saved in this file. + +### ReadMe.adoc + + This is a Read Me file as a placeholder for adding a description of the project. + +### Uploading A Sketch + +Uploading a sketch through the Arduino IoT Cloud can be achieved in two ways, either through the code editor in the thing page (**Sketch** tab) or through the full editor (click on "Open full editor" to open it). + +The full editor allows for more control over the code and its libraries and provides access to all files included in the sketch, as well as more editing and sharing options. + +***Please note: the status of the connection to the Network and Arduino IoT Cloud may be checked by opening the Serial Monitor after uploading a sketch. If the `while(!Serial);` loop is included in the `setup()` function, the code would not execute before opening the Serial Monitor.*** + + +## Dashboards + +Dashboards are **visual user interfaces** for interacting with your boards over the cloud, which can be customized with different setups depending on the project's needs. + +One or more **Things** can be added to a **Dashboard**, with all or some of their variables. The dashboards can be accessed by navigating to the **“Dashboards”** page at the top menu of the Arduino IoT Cloud interface, where a list of the **existing Dashboards** and an option to **create a new Dashboard** are available. + +![Create widgets from a Thing](./images/create-widget-from-thing.png) + +### Widgets + +On the Dashboard **widgets can be added individually** and linked to variables, and variables can be assigned to widgets **automatically by adding a Thing**. + +Additionally, the widgets can be **resized and rearranged** on the dashboard using the **"Arrange widgets"** icon. All widgets available are shown in the images below. + +![The Arduino IoT Cloud widgets](./images/cloud-widgets.png) + +Widgets are visual representations of variables. You can for example choose to have a **Gauge Widget** for a variable storing temperature readings, or a **Chart Widget** for monitoring energy consumption. Depending on the variable's permission, the Widget looks different: + +- Read Only cannot be interacted with (e.g. charts) +- Read & Write can be interacted with (e.g. sliders, steppers) + +### Sharing Dashboards + +It is possible to share your live dashboards with external people. To do so, please refer to the guide in the link below: + +- [Sharing Dashboards in the Arduino IoT Cloud](/cloud/iot-cloud/tutorials/sharing-dashboards) + + +### Downloading Historical Data + +You can download the historical data of one or multiple variables. This can be done directly in the dashboard interface, by clicking the information sign at the top right corner, and clicking on download data. + +![Downloading historical data](images/download-historical-data.png) + +Here you can do the following: + +- Search for specific variables +- Select a period of time +- Select one (or all) variables + +Once you have selected the variables you want data from, click on the **"Select Data Source"** button and then on the **"Get Data"** button. An email will be sent to you with a log file. + +### List of Widgets + +Below you will find a list of available widgets, and examples on how they are linked to a variable used in a sketch. + +#### Switch + +![The Switch Widget](./images/widget-switch.png) + +The switch widget is great for simply turning something ON or OFF. + +Can be linked with a **boolean** variable. + +An example of how it is used in a sketch: + +```arduino +if(switchVariable == true){ + digitalWrite(ledPin, HIGH); +} + +else{ + digitalWrite(ledPin, LOW); +} +``` + +#### Push Button + +![Push Button Widget](images/widget-pushbutton.png) + +The push button widget is a virtual version of a push button. While pushed down, something is activated, and when released, it is de-activated. + +Can be linked with a **boolean** variable. + +An example of how it is used in a sketch: + +```arduino +while(pushbuttonVariable == true){ + counter++ + delay(10); +} +``` + +#### Slider + +![Slider Widget](images/widget-slider.png) + +The slider widget can be used to adjust a value range. Great for changing the intensity of light, or the speed of a motor. + +Can be linked with multiple variables, including **integers & floats.** + +An example of how it is used in a sketch: + +```arduino +analogWrite(ledPin, sliderVariable); +``` + +#### Stepper + +![Stepper Widget](images/widget-stepper.png) + +Similar to the slider, the stepper widget increases or decreases a variable by increments of 1. It can be used to switch between different modes. + +Can be linked with multiple variables, including **integers & floats.** + +An example of how it is used in a sketch: + +```arduino +if(stepperVariable == 10){ + activateThisFunction(); +} + +//activate another function +else if(stepperVariable == 11){ + activateAnotherFunction(); +} + +//or simply print out the updated value +Serial.println(stepperVariable); +``` + +#### Messenger + +![Messenger Widget](images/widget-messenger.png) + +The messenger widget can be used to send and receive strings through the messenger window. + +Can be linked with a **String** variable. + +An example of how it is used in a sketch: + +```arduino +stringVariable = "This is a string"; +``` + +#### Color + +![Color Widget](images/widget-color.png) + +The color widget is great for selecting an exact color for an RGB light. + +Can be linked with a **Color** variable. + +An example of how it is used in a sketch: + +```arduino +uint8_t r, g, b; +rgbVariable.getValue().getRGB(r, g, b); +``` + +#### Dimmed Light + +![Dimmed Light Widget](images/widget-dimmed-light.png) + +The dimmed light widget is great for changing the intensity of a light, and to be able to turn it ON and OFF as well. + +Can be linked with a **Dimmed Light** variable. + +An example of how it is used in a sketch: + +```arduino + //retrieve and map brightness value from cloud + uint8_t brightness = map(dimmedVariable.getBrightness(), 0, 100, 0, 255); + + //then check if switch is on/off + if (dimmedVariable.getSwitch()) { + analogWrite(6, brightness); //write brightness value to pin 6 + } + else{ + analogWrite(6, LOW); //turn off lamp completely + } +``` + +#### Colored light + +![Colored Light Widget](images/widget-color-light.png) + +The colored light widget is designed to set the color for a lamp, and can turn it ON and OFF as well. + +Can be linked with a **Colored Light** variable. + +An example of how it is used in a sketch: + +```arduino +uint8_t r, g, b; +rgbVariable.getValue().getRGB(r, g, b); +``` + +#### Value + +![Value Widget](images/widget-value.png) + +The value widget is a simple one. It only reads, or writes values without any additional functionalities. + +Can be linked with many different variables. + +An example of how it is used in a sketch: + +```arduino +valueVariable = analogRead(A0); +``` + +#### Status + +![Status Widget](images/widget-status.png) + +The status widget is great for checking the state of something: green is positive, red is negative! + +Can be linked to a **boolean** variable. + +An example of how it is used in a sketch: + +```arduino +statusVariable = true; +//or +statusVariable = false; +``` + +#### Gauge + +![Gauge Widget](images/widget-gauge.png) + +The gauge widget is the go-to for any measurements that fit in a half circle. A great widget for building organized, professional dashboards. + +Can be linked with multiple variables, including **integers & floats.** + +An example of how it is used in a sketch: + +```arduino +gaugeVariable = analogRead(A0); +``` + +#### Percentage + +![Percentage Widget](images/widget-percentage.png) + +Much like the gauge widget, the percentage widget displays percentage in a more visual way. + +Can be linked with multiple variables, including **integers & floats.** + +An example of how it is used in a sketch: + +```arduino +percentageVariable = analogRead(A0); +``` + +#### LED + +![LED Widget](images/widget-led.png) + +The LED widget is a virtual LED that can signal the status of something. Can either be set to ON or OFF. + +Can be linked with a **boolean** variable. + +An example of how it is used in a sketch: + +```arduino +ledVariable = true; +//or +ledVariable = false; +``` + +#### Map + +![Map Widget](images/widget-map.png) + +The map widget is a tool for keeping track on the location of your projects. This is a great tool for any project involving GPS, or to get an overview of where your Thing, or multiple Things are operating. + +Can be linked with the **Location** variable. + +An example of how it is used in a sketch: + +```arduino +locationVariable = Location(51.5074, 0.1278); +``` + +#### Chart + +![Chart Widget](images/widget-chart.png) + +The chart widget is great for data analytics. It is used to track real time data, as well as tracking historical data. + +Can be linked with multiple variables, including **integers & floats.** + +An example of how it is used in a sketch: + +```arduino +locationChart = analogRead(A0); +``` + +## Recommended Code Practices + +### Avoid blocking commands within the loop() + +The `loop()` function includes the `ArduinoCloud.update();` call, which sends data to the cloud and receives updates. In order to get the best responsiveness in your cloud-connected projects, the `loop()` function should run as fast as possible. This means that no blocking commands should be used inside, and you should prefer a non-blocking programming approach whenever possible. + +A common **blocking pattern** is the use of the `delay()` function which stops the execution of the function for the given time. We strongly advise to **get rid of this function** and achieve the same behavior in a non-blocking way with the `millis()` function as described below. + +Let's see how to blink a LED. The traditional way involves the `delay()` function: + + void loop() { + ArduinoCloud.update(); + + digitalWrite(LED_BUILTIN, HIGH); + delay(1000); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); + } + +This works, but it will cause a delay of at least two seconds between one execution of `ArduinoCloud.update()` and the next one, thus causing bad performance of the cloud communication. + +This can be rewritten in a non-blocking way as follows: + + void loop() { + ArduinoCloud.update(); + + digitalWrite(LED_PIN, (millis() % 2000) < 1000); + } + +How does this work? It gets the current execution time provided by `millis()` and divides it by 2 seconds. If the remainder is smaller than one second it will turn the LED on, and if it's greater it will turn the LED off. + +For a more complex and commented example, you can have a look at the [BlinkWithoutDelay example](https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay). + +### Avoid waiting for Serial Monitor to initialize connection + +`while(!Serial) {}` loops endlessly until the Serial Monitor is opened. This is a useful practice in cases where you want to see all debug output from the start of the sketch execution. However, when building IoT systems using **`while(!Serial){}` can hinder our project from running autonomously**, stopping the board from connecting to the network and IoT Cloud before manually opening the Serial Monitor. Therefore, it is recommended to consider removing the `while(!Serial){}` loop if it's not necessary. + +A common trick is to add a **`delay(1500);` command after `Serial.begin(9600);`**. This will slightly slow down the initialization of your device, but will give you some time to open the serial monitor when you're interested in seeing its output within losing the very first lines. + + +## Arduino IoT Cloud API + +We provide two Arduino Iot Cloud APIs: + +**1.** The first is the **REST API** which allows you to adding and configuring new Arduino IoT Cloud Devices, Things, Properties, as well as reading historical data. An example of this API's use is making custom dashboards in a local server. A full [documentation of the Arduino IoT Cloud REST API](https://www.arduino.cc/reference/en/iot/api/) is available for advanced users. + + The Arduino IoT Cloud REST API can be called just with any **HTTP Client**, or using one of these clients: + - [Javascript NPM package](https://www.npmjs.com/package/@arduino/arduino-iot-client). + - [Python PYPI Package](https://pypi.org/project/arduino-iot-client/). + - [Golang Module](https://github.com/arduino/iot-client-go). + +**2.** The second is the **Data API (MQTT)** which allows you to send/receive Variables' data. An example of this API's use is sending IoT Cloud Variables' updates to the browser. A full [documentation of the Arduino IoT Cloud Data API (MQTT)](https://www.npmjs.com/package/arduino-iot-js) is available for advanced users. + + + + + + + diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_1.png b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_1.png new file mode 100644 index 0000000000..0792aae8f3 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_1.png differ diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_2.png b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_2.png new file mode 100644 index 0000000000..da31d94f97 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_2.png differ diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_3.png b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_3.png new file mode 100644 index 0000000000..836e082ed8 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_3.png differ diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_4.png b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_4.png new file mode 100644 index 0000000000..9b65899360 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_4.png differ diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_5.png b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_5.png new file mode 100644 index 0000000000..ba3fd136db Binary files /dev/null and b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_5.png differ diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_6.png b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_6.png new file mode 100644 index 0000000000..fa97862a3d Binary files /dev/null and b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_6.png differ diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_7.png b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_7.png new file mode 100644 index 0000000000..8aa61c88aa Binary files /dev/null and b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/assets/WebEditorInstall_7.png differ diff --git a/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/getting-started-web-editor.md b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/getting-started-web-editor.md new file mode 100644 index 0000000000..3e2163044f --- /dev/null +++ b/content/arduino-cloud/01.getting-started/03.getting-started-web-editor/getting-started-web-editor.md @@ -0,0 +1,91 @@ +--- +title: 'Getting started with the Web Editor' +description: 'A step-by-step guide to set up your online development environment.' +author: 'Karl Söderby' +--- + +## Getting started with the Web Editor + +The Web Editor is a great choice for working with your Arduino board. It stores all of your sketches online, requires no installation of cores and includes most of the popular libraries. + +Getting started with the Web Editor is quick & easy, and in this tutorial, we will walk you through the necessary steps so you can use it with your Arduino board. + +>**Note:** This tutorial works with **all** official Arduino boards. + +### Goals + +In this tutorial, we will achieve the following: + +- Creating an account (required to use the Web Editor). +- Download and install the [Create Plugin](https://create.arduino.cc/getting-started/plugin/welcome). +- Make sure our board is recognized by the computer. +- Upload a simple blink example. + +### Hardware & software needed + +- [Arduino Web Editor](https://create.arduino.cc/editor) +- [Create Agent](https://create.arduino.cc/getting-started/plugin/welcome) +- Arduino board +- USB cable (different depending on the board you are using). + +### Setting up the Web Editor + +We will now go through the necessary steps to get your Arduino board working with the Web Editor. + +#### Creating an account + +The first step is to create an account. This is done by navigating to login.arduino.cc/login. Here, you can either manually create an account, or login using for example Google. + +![Log in to your Arduino account.](assets/WebEditorInstall_1.png) + +### Installing the plugin + +Once you have created and activated your account, we need to install the **Create Plugin.** This is done by navigating to the [Create Agent Installation page](https://create.arduino.cc/getting-started/plugin/welcome). Here, you simply need to click on **"Start"** to begin the installation. + +![Installing .](assets/WebEditorInstall_2.png) + +Follow the instructions at this page to complete the installation. You will need to download the Create Agent in this process, and install it locally on your machine. + +When we are done, we should see this screen: + +![Agent successfully installed.](assets/WebEditorInstall_3.png) + +Congratulations, you now have the necessary tools to start using the Web Editor. + +> You can find the Arduino Create Agent files by following the path that relates to your operative system: +> +> **Windows:** `C:\Users\{username}\AppData\Roaming\ArduinoCreateAgent` +> +> **MacOS:** `Users/{username}/Applications/ArduinoCreateAgent` +> +> **Linux:** `/home//ArduinoCreateAgent` + +### Uploading a simple example + +Now, let's take a look at how the Web Editor works, by uploading a simple example to the board. First, we need to navigate to the Web Editor, by either [clicking this link](https://create.arduino.cc/editor) or clicking the menu at the top right corner, following the image below: + +![Clicking on the Web Editor button.](assets/WebEditorInstall_4.png) + +Once you are in the Web Editor, you can see any board that you have connected to the computer. In this case, we have a **Arduino MKR WiFi 1010** at port **COM29** connected. Yours may look differently. This means that the board is recognized and the Create Agent is working. + +![Check if connected boards can be found.](assets/WebEditorInstall_5.png) + +Now, let's test it out by uploading the basic **Blink example.** This is done by navigating to **Examples > 01.Basics > Blink**, following the image below. + +![Selecting the blink example.](assets/WebEditorInstall_6.png) + +To upload it, click on the arrow in the top left corner of the editor. Do not disconnect the board during the uploading phase. + +![Upload the sketch to the board.](assets/WebEditorInstall_7.png) + +Once it is uploaded, there should be a message in the bottom of the editor saying: + +``` +Success. Saved on your online Sketchbook and done uploading Blink. +``` + +If we look at the board we uploaded the code to, we should see the onboard LED blink with an interval of 1 second. This means that you have successfully used the Web Editor to upload a code to your board! + +#### More tutorials + +You can find more tutorials in the [Web Editor documentation page](/cloud/web-editor/). diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-gateway-img-01.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-gateway-img-01.png new file mode 100644 index 0000000000..aaa8bcdf18 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-gateway-img-01.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-gateway-img-02.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-gateway-img-02.png new file mode 100644 index 0000000000..fff9d97a26 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-gateway-img-02.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-01.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-01.png new file mode 100644 index 0000000000..c6d6809813 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-01.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-02.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-02.png new file mode 100644 index 0000000000..01654cb375 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-02.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-03.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-03.png new file mode 100644 index 0000000000..d4abf04963 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-03.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-04.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-04.png new file mode 100644 index 0000000000..0a19fc90ca Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-04.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-05.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-05.png new file mode 100644 index 0000000000..2d13bd623a Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-05.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-06.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-06.png new file mode 100644 index 0000000000..e34c27a3dd Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-06.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-07.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-07.png new file mode 100644 index 0000000000..61fcdac03a Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-07.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-08.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-08.png new file mode 100644 index 0000000000..527617c4c2 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-08.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-09.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-09.png new file mode 100644 index 0000000000..3f87ed6882 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-09.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-10.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-10.png new file mode 100644 index 0000000000..707355f441 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-10.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-11.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-11.png new file mode 100644 index 0000000000..78ffb08891 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-11.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-12.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-12.png new file mode 100644 index 0000000000..2ef99e9c7e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-12.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-13.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-13.png new file mode 100644 index 0000000000..33eee05aaf Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-13.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-14.5.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-14.5.png new file mode 100644 index 0000000000..8d277beb4b Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-14.5.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-14.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-14.png new file mode 100644 index 0000000000..8034d30eb2 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-14.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-15.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-15.png new file mode 100644 index 0000000000..5a18e89edb Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-15.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-16.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-16.png new file mode 100644 index 0000000000..cb971a1754 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-16.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-17.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-17.png new file mode 100644 index 0000000000..119372bb78 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-17.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-18.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-18.png new file mode 100644 index 0000000000..c32ad0b897 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-18.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-19.png b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-19.png new file mode 100644 index 0000000000..7c173392c8 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/assets/cloud-lora-img-19.png differ diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/cloud-lora-getting-started.md b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/cloud-lora-getting-started.md new file mode 100644 index 0000000000..5cc2ab88b6 --- /dev/null +++ b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/cloud-lora-getting-started.md @@ -0,0 +1,313 @@ +--- +title: 'Configuring LoRaWAN® devices in the Arduino Cloud' +compatible-products: [mkr-wan-1300, mkr-wan-1310] +difficulty: intermediate +description: 'Connect your LoRaWAN® devices to the Arduino Cloud platform via The Things Network.' +tags: + - LoRa® + - LoRaWAN® + - The Things Industries + - IoT Cloud +author: 'Karl Söderby' +hero_position: 2 +--- + +![Arduino Cloud and The Things Network.](assets/cloud-lora-img-01.png) + +## Introduction + +If you are interested in building cheap, long range & low power devices, you will be excited to hear that Arduino Cloud is interfaced with [The Things Stack](https://www.thethingsindustries.com/stack/) network (TTS). When configuring a LoRaWAN® device (MKR WAN 1300/1310), you will also automatically register your device on the The Things Stack platform. + +So, what does that mean for you? It means that you can connect to any of the **22000+ public gateways** that make up that network. With coverage in most parts of the world, LoRa® technology has become increasingly more popular, as it continues to chirp payloads using the license-free frequency bands! Your end-devices (such as the MKR WAN 1310), can be setup in remote locations (or cities, of course), where there's no Internet connection. These devices can then send data to nearby gateways connected to the TTS service, which in turn forwards the data to the Arduino Cloud. Data can also be sent the other way, from the Arduino Cloud to the end device via TTS. + +In this tutorial we will walk you through the steps needed to successfully provision devices that use the Arduino Cloud & The Things Network, from unboxing your device until viewing data on a dashboard! + +### Terminology Run-Trough + +- **LoRa®** - short for **Lo**ng **Ra**nge, and is a modulation technique used to send and receive data over low-power, wide-area networks (LPWAN). +- **LoRaWAN®** - can be defined as the networking protocol. The architecture of the network consists of different gateways that relay messages from low-power devices over long ranges, to central network servers. +- **MKR WAN 1300/1310** - development boards that has a LoRa® module capable of sending and receiving packets of data. +- **End device/node** - end device/node is a term used for deployed devices such as the MKR WAN 1310, that for example are reading and processing sensor data. +- **The Things Network (TTN)** - a not for profit association, making available the TTS Community Edition as a public LoRaWAN® network service for free. +- **The Things Stack Network (TTS)** - a cloud platform used by TTN and TTI for their LoRaWAN® connectivity networks. +- **The Things Industries (TTI)** - a company that runs and manages The Things Network and offers private LoRaWAN network and support for enterprise customers. +- **The Things Stack console (TTC)** - a service that allows you to register devices and handle incoming or outgoing data. +- **Device EUI** - a code to identify your device. +- **App EUI** - a code to identify your application. +- **App KEY** - a key used for encryption and decryption of a payload. +- **LoRa® gateway** - a network router able to send and receive LoRa RF packets and forward them on Internet. +- **Frequency Band (e.g. 868 MHz, 915 MHz)** - LoRa oxperates only on specific, license-free frequencies which differs from region to region. For example, the band used in Europe is 868 MHz, while North America uses the 915 MHz band. + +### Related Resources + +If you want to learn more about Arduino and LoRa®, you can check out the resources below: + +- [MKR WAN 1300 documentation page.](/hardware/mkr-wan-1300) +- [MKR WAN 1310 documentation page](/hardware/mkr-wan-1310) +- [LPWAN (Low-Power Wide-Area Networks) 101](/learn/wireless/low-power-wide-area-networks-101) + +## Goals + +The goals of this project are: +- Configure a LoRaWAN® device in the Arduino Cloud. +- Register an account on The Things Console. +- Create a simple testing program for the end device. +- View data from the device in the Arduino Cloud. +- Send data to the device from the Arduino Cloud. + + +## Hardware & Software needed + +- [Arduino IoT Cloud](https://create.arduino.cc/iot/) +- [Arduino MKR WAN 1300](https://store.arduino.cc/mkr-wan-1300) or [Arduino MKR WAN 1310](https://store.arduino.cc/mkr-wan-1310) +- [Antenna](https://store.arduino.cc/antenna) + + +## Circuit + +Follow the wiring diagram below to connect the antenna to the MKR WAN 1300/1310 board. + +![Connect the antenna to the MKR WAN 1300/1310 board.](assets/cloud-lora-img-02.png) + + +## Step 1: Configuring Your Device + + +**1.** Navigate to the [Arduino Cloud IoT platform](https://create.arduino.cc/iot/things). + +**2.** Sign in or follow the registration process. + +**3.** Once signed in, navigate to the **"Things"** tab, and click on **"Create New Thing"**. + +![Click on the "Create New Thing" tab.](assets/cloud-lora-img-03.png) + +**4.** Connect your board to your computer via USB. + +**5.** Click on the **"Add Device"** button, and then on the **"Set up an Arduino device."**. If you have not installed the **Create Agent**, download and install it by following the instructions provided in the platform. + +**6.** If your board is connected, and the Create Agent is installed, your board should now appear, and you can click on **"Configure"**, and **"Continue"** in the next window. + +![MKR WAN 1310 board detected.](assets/cloud-lora-img-04.png) + +**7.** Now you will need to select the **frequency band** that you will use. These are available through a dropdown menu, where you will e.g. Europe (868 MHz), America (915 MHz). + +![Select Frequency Band.](assets/cloud-lora-img-05.png) + +***It is very important that you select the right band for your country. Enabling a device to transmit on certain frequencies may have legal consequences. It is your responsibility to select the right frequency. You can find more information in [frequencies by country](https://www.thethingsnetwork.org/docs/lorawan/frequencies-by-country/).*** + +**8.** Now, you will need to give your board a good name, such as **LoRa**ine, **WAN**da or G**LoR**i**a** (feel free to ignore this advice). Click on **"Next"** to start the configuration. + +![Naming your board.](assets/cloud-lora-img-06.png) + +When the configuration is complete, we should see the following window: + +![Successful configuration.](assets/cloud-lora-img-07.png) + +Congratulations! We are now done with the first step of the configuration! + +**Troubleshooting** + +Did something go wrong? + +- Is the Arduino Create Agent downloaded & installed? +- Is your board a MKR WAN 1300/1310? +- Is your board connected to the computer? + +Some things to try: + +- Reset the board (double tap the reset button quickly). +- Try uploading a simple sketch (such as blink) to the board. +- Re-install the Create Agent. + + +## Step 2: Registering The Things Stack Network Account + +In this step, we will complete the registration so we can access the **The Things Console (TTC)**. Here we can see the status of our device, if any data is coming in or out and much more. + +***Note that you will not need to make any changes in The Things Console, but access is useful to check if your board sends and receives data correctly. All information (DevEUI, AppEUI & AppKey) is available through the Arduino Cloud as well. Your TTC app will automatically be created, and the integration to the Arduino Cloud done automatically.*** + +**1.** After your device was successfully configured, an **email was sent to your account's email address**, and an account was automatically created on **The Things Stack Network**. The email sent out includes a link to **creating a password** for that account, which you will need to follow to complete the registration. + +![Email from TTC.](assets/cloud-lora-img-08.png) + +**2.** Follow the link, and create a new password. + +![Creating a password.](assets/cloud-lora-img-09.png) + +**3.** You can now login to the **TTS** platform with your account name and password. + +![Log in to TTS.](assets/cloud-lora-img-10.png) + +***Your account name is listed in the email sent out by The Things Industries (TTI).*** + +**4.** In the next window, click on the **"Go to the Console"** button. + +![Go to the Console.](assets/cloud-lora-img-11.png) + +**5.** In the next window, select your region (Europe, North America, Australia). + +![Choose your region.](assets/cloud-lora-img-12.png) + +**6.** Select **"Go to Applications"**. + +![Go to Applications.](assets/cloud-lora-img-13.png) + +**7.** Click on the `[username]-app` item from the list. + +![Click on the app.](assets/cloud-lora-img-14.png) + +**8.** You are now in the application overview. Here you will find a lot of useful information, such as **DevEUI, AppEUI & AppKey**, and see the live data that is sent to and from your device. You do not need to make any changes here, instead it acts as a great troubleshooting tool to check if your device is working. + +### TTI Email Expiration + +After some time, the automatic email sent out by TTI will expire. If the link is expired and you wish to access the Things Stack Network, you can click on the **"Forgot Password"** link which will restart the activation. + +![Restart the activation.](assets/cloud-lora-img-14.5.png) + +## Step 3: Completing Arduino Cloud Setup + +In this step, we will complete the Arduino Cloud setup that we started earlier by configuring a device. We will create a simple **test variable**, that we will use to send data from the MKR WAN 1300/1310 device. This will just be a counter that updates every 10 seconds, to see if the data can be successfully sent from **end device** to the **Arduino Cloud** via the **The Things Network**. + +***At this point, we will need to make sure that we are in reach of a gateway registered to The Things Network. This might take a few attempts, depending on your device's success of transmitting to a nearby gateway. You can check the coverage of your area through either [TTN Map](https://www.thethingsnetwork.org/map) or the [TTN Mapper](https://ttnmapper.org/)*** + +**1.** After TTS registration is complete, head back to the Arduino Cloud, and to the Thing you created earlier. Here, we will need to click on the **"Add Variable"** button, following the image below: + +![Adding a new variable.](assets/cloud-lora-img-15.png) + +**2.** Let's name the variable `test`, and select `Integer Number` as data type (this will be declared as `int test;`). Tick the **Read Only** option, and click on **"Add Variable**. + +![Create a new variable.](assets/cloud-lora-img-16.png) + +**3.** Let's head to the **Sketch** tab, and add the following code inside the `void loop()`: + +```arduino + test = test + 1; + delay(10000); +``` + +This code will simply increase the `test` variable every 10 seconds, which will sync with the variable we just created. That means that every 10 seconds, there's a change in value, which should also be visible in the Arduino Cloud if the data is sent properly. + +You can take a look at the full code in the snippet below: + +```arduino +#include "thingProperties.h" + +void setup() { + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection, false); + + /* + The following function allows you to obtain more information + related to the state of network and IoT Cloud connection and errors + the higher number the more granular information you’ll get. + The default is 0 (only errors). + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); +} + +void loop() { + ArduinoCloud.update(); + // Your code here + hello = hello + 1; + Serial.println(hello); + delay(10000); + +} +``` + +**4.** Finally, we can upload the sketch to the board. After we have uploaded it, the board will start sending data via The Things Network, to the Arduino Cloud. We can check if we are receiving any data in the **Things overview**, under the **"Last Value / Last Update"** column. + +![Data from the MKR WAN 1300/1310 device.](assets/cloud-lora-img-18.png) + +**5a.** After we have uploaded the sketch to the board, we can head over to the TTS console, then to **Applications > NameOfApp > End Devices**. Here we can see if data is received. Basically, if it is not receiving any data, it means that data is not correctly passing through the gateway and the Internet to TTS. + +**5b.** If **successful**, in the **"live data"** section, the "first sign of life" should be a message that says **"Accept join-request"**. Then under "End Devices" there's a column named **Last Seen**, which should have a **blue circle** and how long since it was last seen, e.g. 5 minutes or 2 hours. + +**5c.** If **unsuccessful**, under "End Devices", you can see a **yellow circle** next to the text **"Unknown"**. This means your board has not been sending any data recently. + +![Successful/unsuccessful attempts.](assets/cloud-lora-img-19.png) + +**Troubleshooting** + +- Check out the [TTN Mapper tool](https://ttnmapper.org/) to see if you are in range of a gateway. Remember that even if you are in range, you may still have issues transmitting data. +- Make sure your device is close to a window and has an antenna attached to it. The better Line of Sight (LoS), the better chance of transmitting data. +- Did you upload the sketch to the board? + +## Arduino PRO Gateway + +If you have an Arduino PRO Gateway, you will need to register it, using the [manager for Linux devices](https://create.arduino.cc/devices/). + +You can visit the [Activate an Arduino Pro Gateway with IoT Cloud](https://support.arduino.cc/hc/en-us/articles/4407770369042-Activate-an-Arduino-Pro-Gateway-with-IoT-Cloud) article for more details. + +### Migrate Existing Gateway + +If you had a gateway setup prior to the [A2A to TTS migration](linktoblogpost.com), you will need to complete the following steps to use the Pro Gateway. + +To perform the Arduino Pro gateway migration: + +**1.** The Gateway **needs** be turned on and connected to Internet. + +**2.** Backup any existing sketch or custom docker images of the Gateway. + +**3.** Delete the device using “Manager for Linux” page. It is very important that the Gateway is **turned on and connected to the Internet.** + +![Click on the "Delete" button.](assets/cloud-lora-gateway-img-01.png) + +**4.** Redo the provisioning procedure. + +**5.** Stop the packet forwarder. + +**6.** Delete the existing packet forwarder in the “Container” page. + +**7.** Deploy the new packet forwarder using the following parameters: + +- Container Name: `pktfwd` (use this exact name). +- Image URL: public.ecr.aws/h8w3x7h8/arduino:latest +- Volume flags:--device /dev/spidev0.0 --device /dev/i2c-1 -v /sys:/sys +- Restart Policy: Always + +![Deploy a new container.](assets/cloud-lora-gateway-img-02.png) + +### Provision New Gateway + +To perform the Arduino Pro gateway provisioning: + +**1.** Claim the GW in the “Manager For Linux” page + +**2.** Stop the packet forwarder + +**3.** Delete the existing packet forwarder in the “Container” page + +**4.** Deploy the new packet forwarder using the following parameters: + +- Container Name: `pktfwd` (use this exact name). +- Image URL: public.ecr.aws/h8w3x7h8/arduino:latest +- Volume flags:--device /dev/spidev0.0 --device /dev/i2c-1 -v /sys:/sys +- Restart Policy: Always + +![Deploy a new container.](assets/cloud-lora-gateway-img-02.png) + +### Register a Gateway on TTS + +As **Arduino Cloud IoT** is now interfacing with the **The Things Stack** network, you can set up your own gateway through their services (this can be done through the same console that is used to check device status). You can visit [The Things Industries](https://www.thethingsindustries.com/stack/) to see what commercial gateways are supported. + +See below links for more resources on adding gateways to the Things Stack network. + +- [Adding Gateways | The Things Industries](https://www.thethingsindustries.com/docs/gateways/adding-gateways/) +- [Recommended Gateways | YouTube](https://www.youtube.com/watch?v=h_6dIte_IxI&ab_channel=TheThingsNetwork) + +## Conclusion + +In this guide we have gone through the steps necessary to connect a MKR WAN 1300/1310 board to the **Arduino Cloud** via **The Things Network**. We have briefly gone through **the console of The Things Stack**, the backend portal that provides information on the status of our devices. + +The integration between the two services is a great milestone for makers or professionals working with LoRaWAN® devices and IoT development. As the Arduino Cloud and The Things Console handle the backend applications, you can focus on creating great projects with minimal effort. You can also monitor and control them through dashboards in the Arduino Cloud. \ No newline at end of file diff --git a/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/hero-banner.svg b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/hero-banner.svg new file mode 100644 index 0000000000..073477b967 --- /dev/null +++ b/content/arduino-cloud/01.getting-started/04.cloud-lora-getting-started/hero-banner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-01.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-01.png new file mode 100644 index 0000000000..8948dd80c2 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-01.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-02.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-02.png new file mode 100644 index 0000000000..774c689b5e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-02.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-03.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-03.png new file mode 100644 index 0000000000..0cfd12bd7e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-03.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-04.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-04.png new file mode 100644 index 0000000000..1eefcc9df9 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-04.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-05.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-05.png new file mode 100644 index 0000000000..102d4457d6 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-05.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-06.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-06.png new file mode 100644 index 0000000000..f8fd811f07 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-06.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-07.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-07.png new file mode 100644 index 0000000000..31ac7ada3e Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-07.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-08.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-08.png new file mode 100644 index 0000000000..89e5a798bb Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-08.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-09.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-09.png new file mode 100644 index 0000000000..65148585f3 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-09.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-10.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-10.png new file mode 100644 index 0000000000..ba08de0e48 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-10.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-11.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-11.png new file mode 100644 index 0000000000..1855e7a8d6 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-11.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-12.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-12.png new file mode 100644 index 0000000000..220096940d Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-12.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-13.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-13.png new file mode 100644 index 0000000000..0ebb6b0541 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-13.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-14.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-14.png new file mode 100644 index 0000000000..6b12a72995 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-14.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-15.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-15.png new file mode 100644 index 0000000000..73b0b9b00f Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-15.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-16.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-16.png new file mode 100644 index 0000000000..c4330ffdd8 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-16.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-17.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-17.png new file mode 100644 index 0000000000..4cfb631e58 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-17.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-18.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-18.png new file mode 100644 index 0000000000..5d819de7bd Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-18.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-19.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-19.png new file mode 100644 index 0000000000..6805405a20 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-19.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-20.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-20.png new file mode 100644 index 0000000000..98ead4333f Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-20.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-21.png b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-21.png new file mode 100644 index 0000000000..d8ccf78088 Binary files /dev/null and b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/assets/cloud-esp32-img-21.png differ diff --git a/content/arduino-cloud/01.getting-started/05.esp-32-cloud/esp-32-cloud.md b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/esp-32-cloud.md new file mode 100644 index 0000000000..65f3757ead --- /dev/null +++ b/content/arduino-cloud/01.getting-started/05.esp-32-cloud/esp-32-cloud.md @@ -0,0 +1,229 @@ +--- +title: 'Connecting ESP32 & ESP8266 to Arduino Cloud IoT' +difficulty: easy +description: 'Learn how to send data between an ESP32 / ESP8266 development board and the Arduino Cloud IoT.' +tags: + - ESP32 + - ESP8266 + - Installation + - Cloud IoT +author: 'Karl Söderby' +hardware: + - _snippets/hardware/led + - _snippets/hardware/jumper-wires + - _snippets/hardware/breadboard +software: + - iot-cloud +--- + +## Introduction + +In this tutorial, we will go through the steps necessary to set up an **ESP32 / ESP8266 development board** with the Arduino Cloud IoT. To test it out, we will send random values from the board to the cloud, and set up a switch that can enable the built-in LED on the board. + +>**Please note:** the support for ESP32 microcontroller is currently in an experimental stage. For reporting issues, please refer to Arduino Forum. + +- [Report Arduino Cloud IoT ESP32 issues on the Forum.](https://forum.arduino.cc/c/software/iot-cloud/152) + +## Goals + +The goals of this project are: + +- Send data to the cloud from the board. +- Turn ON/OFF an LED on the board through the cloud. + +## Hardware & Software needed + +- ESP32 / ESP8266 development board. +- [Arduino Cloud IoT](https://create.arduino.cc/iot/). + +We will also need the following components for the circuit: + +- LED +- 220 ohm resistor +- Breadboard +- Jumper Wires + +## Circuit + +Follow the circuit below to connect the LED to the ESP32 / ESP8266 board. + +>**Note: if you prefer to use your board's built-in LED, you do not need a circuit.** + +![The circuit for this tutorial.](assets/cloud-esp32-img-01.png) + +## Setting up the Arduino Cloud IoT + +To start, we will need to head over to the [Arduino Cloud IoT](https://create.arduino.cc/iot/). This is also accessible through the menu at the top right. + +![Navigate to the cloud.](assets/cloud-esp32-img-02.png) + +### Step 1: Setting up the device + +**1.** Once in the cloud, click on the **"Devices"** tab. Then, click on the **"Add device"** button. + +![Adding a device.](assets/cloud-esp32-img-03.png) + +**2.** Then, click on **"Set up a 3rd party device"**. + +![Setting up a third party device.](assets/cloud-esp32-img-04.png) + +**3.** Now we need to select what board we are using. Select either ESP32 or ESP8266, and then choose the board from the drop-down menu. + +![Select the board.](assets/cloud-esp32-img-05.png) + +**4.** Now the board needs a name. We choose **My_ESP32**, but you can have a lot more imagination than that! + +![Naming the board.](assets/cloud-esp32-img-06.png) + +**5.** You will now receive your **Device ID** and **Secret key**. Please note that the secret key cannot be recovered, so make sure you note it down. You can also download a PDF with the information. + +When you have saved it, tick the box at the bottom, and click on **"Continue"**. + +![Credentials of your board.](assets/cloud-esp32-img-07.png) + +Congratulations! You have now configured your ESP32 board with the Arduino Cloud IoT. Your device will now appear in the list of devices. + +### Step 2: Creating a Thing + +The next step is to create a Thing. This is done by navigating to the **"Things"** tab. + +![Go to the Thing tab.](assets/cloud-esp32-img-09.png) + +Then, we need to create a new Thing, by clicking on the **"Create Thing"** button. We can then rename our Thing something appropriate to what we are doing, in this case we simply chose **ESP32 Project**. + +![Creating a Thing.](assets/cloud-esp32-img-10.png) + +Now, we need to link our device with our Thing. This is done by clicking on the button in the **"Device"** section. This will open a window, where your ESP32 / ESP8266 should be available to select. + +![Select ESP32 / ESP8266 device.](assets/cloud-esp32-img-11.png) + +Once the device is linked, we need to create two variables: `random_value` and `led_switch`. Click on **"Add variable"** button. This will open a window where you need to fill in variable information. Let's create the `random_value` first. The data type is **int**, permission is **read only** and update policy is **on change**. + +Once done, click on the **"Add variable"** button. + +![Adding the random_value variable.](assets/cloud-esp32-img-12.png) + +Now, let's also add the `led_switch` variable. The data type for this variable is **boolean**, the permission is **read & write**, and update policy is **on change**. + +Once done, click on the **"Add variable"** button. + +![Adding the led_switch variable.](assets/cloud-esp32-img-13.png) + +### Step 3: Adding credentials + +Now, we need to enter the credentials for our network, plus the secret key generated during the device configuration. + +First, click on the button in the **"Network Section"**. + +![Open the credentials tab.](assets/cloud-esp32-img-14.png) + +Then, enter the credentials (network name, network password and secret key). Click **"Save"** when finished. + +![Entering the credentials.](assets/cloud-esp32-img-15.png) + +## Programming the board + +The next step is to program the board. To do so, we need to go to the **"Sketch"** tab. + +![Navigate to the sketch tab.](assets/cloud-esp32-img-16.png) + +The code for this tutorial can be found in the snippet below. Upload it to the board by clicking on the **"Upload"** button at the top left corner. + +## Complete sketch + +>**Note:** in this tutorial we are using pin 13 for the LED. You can easily change this to another GPIO, by editing the LED variable. + +```arduino +#include "thingProperties.h" + +int LED = 13; + +void setup() { + pinMode(LED, OUTPUT); + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + /* + The following function allows you to obtain more information + related to the state of network and IoT Cloud connection and errors + the higher number the more granular information you’ll get. + The default is 0 (only errors). + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); +} + +void loop() { + ArduinoCloud.update(); + // Your code here + random_value = random(0, 500); + delay(500); +} + + +void onLedSwitchChange() { + // Do something + if(led_switch){ + digitalWrite(LED, HIGH); + } + else{ + digitalWrite(LED, LOW); + } +} +``` + +If the upload was successful, we should see it printed in the console at the bottom of the editor. + +![Successful upload of sketch.](assets/cloud-esp32-img-17.png) + +## Creating a dashboard + +Now that the sketch is running on the ESP32 / ESP8266 board, we can move on to the final step, which is creating a dashboard. + +First, navigate to the **"Dashboards"** tab. + +![Navigating to the dashboards tab.](assets/cloud-esp32-img-18.png) + +Then, click on the **"Build dashboard"** button. + +![Click on the "Build dashboard" button.](assets/cloud-esp32-img-19.png) + +To edit the dashboard, click on the pencil icon at the top left icon, select **"Things"** and search for your Thing. Select it, and click on **"Add widgets"** as shown in the image below. + +![Adding widgets.](assets/cloud-esp32-img-20.png) + +We should now have two widgets that are linked to your ESP32 / ESP8266 board. + +- `random_value` - whenever the `random_value` updates on the board, it also updates here. +- `led_switch` - when we activate this switch, we turn ON the LED connected to the board (pin 13). + +![Complete dashboard.](assets/cloud-esp32-img-21.png) + + +## Troubleshooting + +If you are having issues completing this tutorial, make sure that the following is correct: + +- We have entered the right **secret key** in the credentials window. +- We have entered the right **network name** and **password** in the credentials window. +- We have selected the right device (if you have multiple devices registered in the cloud, you may have selected the wrong device). + +>**Note:** The Arduino Cloud IoT's support for the ESP32 is in an experimental stage. + + +## Conclusion + +In this tutorial, we went through the basics of setting up an ESP32 / ESP8266 microcontroller to communicate with the Arduino Cloud IoT. We tested this out by sending a **random value** from the board to the cloud, and by creating a switch that **controls an LED** from the cloud. + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). \ No newline at end of file diff --git a/content/arduino-cloud/01.getting-started/getting-started.md b/content/arduino-cloud/01.getting-started/getting-started.md new file mode 100644 index 0000000000..7edab30465 --- /dev/null +++ b/content/arduino-cloud/01.getting-started/getting-started.md @@ -0,0 +1,3 @@ +--- +title: Getting Started +--- \ No newline at end of file diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-01.png b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-01.png new file mode 100644 index 0000000000..c8e8a5d82b Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-01.png differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-02.png b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-02.png new file mode 100644 index 0000000000..83f4dd6d20 Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-02.png differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-03.png b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-03.png new file mode 100644 index 0000000000..becfc6634f Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-03.png differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-04.png b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-04.png new file mode 100644 index 0000000000..463db9e763 Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-04.png differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-05.png b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-05.png new file mode 100644 index 0000000000..552af8779b Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-05.png differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-06.png b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-06.png new file mode 100644 index 0000000000..fb7828a2ea Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-06.png differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-timezone.png b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-timezone.png new file mode 100644 index 0000000000..f3b954f713 Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/cloud-scheduler-img-timezone.png differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/assets/scheduler-action.gif b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/scheduler-action.gif new file mode 100644 index 0000000000..6299f1f626 Binary files /dev/null and b/content/arduino-cloud/02.features/01.cloud-scheduler/assets/scheduler-action.gif differ diff --git a/content/arduino-cloud/02.features/01.cloud-scheduler/cloud-scheduler.md b/content/arduino-cloud/02.features/01.cloud-scheduler/cloud-scheduler.md new file mode 100644 index 0000000000..81f1bbd96b --- /dev/null +++ b/content/arduino-cloud/02.features/01.cloud-scheduler/cloud-scheduler.md @@ -0,0 +1,311 @@ +--- +title: 'Arduino IoT Cloud Scheduler Feature' +description: 'Learn how to use the scheduler feature to trigger repeating jobs during specific times.' +tags: [IoT Cloud, Scheduler, Time] +author: 'Karl Söderby' +software: + - iot-cloud +--- + +It is now possible to schedule jobs with the [Arduino IoT Cloud](https://create.arduino.cc/iot/), using the new `CloudSchedule` variable type. You can pick a start & end date for when the variable should be triggered, and for how long it should be active. This variable can be controlled in real time using a graphical widget that you can place on an IoT Cloud dashboard. + +We can for example have: + +- One trigger scheduled to run every minute for 10 seconds +- One trigger scheduled to run every hour for 10 minutes + +## Goals + +The goals of this project are: + +- Learn how the `CloudSchedule` variable works. +- Learn how to access local time in your sketch. + +Make sure you have a [cloud-compatible board](/cloud/iot-cloud/tutorials/technical-reference#compatible-hardware). + +## How Does it Work? + +A variable of `CloudSchedule` type can be configured to trigger at a specific time, with a specific duration. In the code, you do not need to worry about the logic for this. The configuration of the variable is done in the dashboard, through a widget associated to the variable. + +For example, we can set such variable to be: +- ON for 10 seconds, every minute. +- ON for 8 hours, every day. +- ON for a week, and then finish. + +![Example of a schedule configured to run for 10 seconds every minute.](assets/cloud-scheduler-img-01.png) + +## Application Examples + +There are countless examples where schedulers can be used, but predominantly it can be utilized for timer projects. Below are a few examples that can be used as inspiration. + +***Note that "schedule_variable" used in these examples is the name we give when creating the variable in the Thing settings.*** + +### Basic Example + +To test out functionality of your scheduler job, we can turn on an LED while the job is active. + +```arduino +if (schedule_variable.isActive()) { + // whenever the job is "active", turn on the LED + digitalWrite(LED, HIGH); +} else { + // whenever the job is "not active", turn off the LED + digitalWrite(LED, LOW); +} +``` + +### Multiple Schedulers + +You can set up **multiple scheduler variables.** This way, you can have a different code executing at specific times. In the example below, there are three schedulers, each performing a unique task whenever triggered: + +- Write a high state to a pin. +- Read a sensor. +- Change a string. + +```arduino +// scheduler 1 (write a high state to a pin) +if (schedule_variable_1.isActive()) { + digitalWrite(3, HIGH); +} else { + digitalWrite(3, LOW); +} + +// scheduler 2 (read a sensor) +if(schedule_variable_2.isActive()) { + sensor_variable = analogRead(A1); +} + +// scheduler 3 (change a string) +if (schedule_variable_3.isActive()) { + string_variable = ""; + string_variable = "Update something here!"; +} +``` + + +### Smart Light Automation + +Turning on and off light sources can be a great power saver for the office, home or vacation home. This can be achieved with a few lines of code and a [relay shield](https://store.arduino.cc/products/arduino-mkr-relay-proto-shield). + +```arduino +if (schedule_variable.isActive()) { + // can be configured to be ON between 8am - 5pm + digitalWrite(relay, HIGH); +} else { + //can be set to OFF between 5pm - 8am the next morning + digitalWrite(relay, LOW); +} +``` + + + +### Plant Watering + +For a "smart watering" setup, if you connect a pump through a relay, you can schedule a job to be on for a period of time (pumping water) and then turn off. This could for example occur for a few seconds every day to keep your plants alive. + +```arduino +// configure to be "on" for 10 seconds every day +if (schedule_variable.isActive()) { + digitalWrite(pump, HIGH); +} else { + digitalWrite(pump, LOW); +} +``` + +Or, if you use a driver, such as **L298N**, you can control the pump through: + +```arduino +if (schedule_variable.isActive()) { + analogWrite(pump, 127); // range between 0-255 +} else { + analogWrite(pump, 0); +} +``` + +## Creating a Scheduler (Tutorial) + +In this section you will find a step by step tutorial that will guide you to creating and testing out the **scheduler feature**. + +- Create a Thing. +- Configure an Arduino board. +- Create a basic sketch & upload it to the board. +- Create a dashboard. + +### API + +The two **variables types** introduced in this tutorial are `CloudTime` and `CloudSchedule`. These are used to retrieve local time and to schedule a job respectively. + +The `CloudSchedule` variable is of a **complex type**. It has a **internal boolean state**, which can be checked through the `isActive()` function (returns `true` or `false`). + +```arduino +if(schedule_variable.isActive()) { + //do something +} +``` + +The `CloudTime` variable is an unsigned integer which is used to store current time. We can use the `getLocalTime()` function to retrieve local time. + +```arduino +time_variable = ArduinoCloud.getLocalTime(); +``` + +### Create a Thing + +***If you are new to the Arduino IoT Cloud, you can either visit the [Getting Started with Arduino IoT Cloud](https://docs.arduino.cc/cloud/iot-cloud/tutorials/iot-cloud-getting-started) guide, or any of the tutorials in the [Arduino IoT Cloud documentation](https://docs.arduino.cc/cloud/iot-cloud). There you will find detailed step by step guides.*** + +**1.** Navigate to [Arduino IoT Cloud](https://create.arduino.cc/iot/). You will need to log in with your Arduino account. + +**2.** Create a new Thing by clicking on the "Create Thing" button. You can name it something like "Scheduler Test". + +**3.** Now, we need to attach a device to our Thing, by clicking on **"Select Device"**. If you already have a device configured, you can select it, otherwise, follow the configuration. + +***Note that your board will need to be connected to your computer at this point.*** + +Once your device is configured and attached to your Thing, we can move on to create variables. + +### Create Variables + +For this project, we will need to create the following variables, by clicking on the "Add Variable" button. + +| Variable Name | Variable Type | Permission | +| ------------- | ------------- | ------------ | +| schedule_test | CloudSchedule | Read & Write | +| time_read | CloudTime | Read Only | +| light | bool | Read Only | +| counter | int | Read Only | + +Your Thing overview should now look like the image below: + +![The Thing overview.](assets/cloud-scheduler-img-02.png) + +### Set Time Zone + +In order for our job to go off at the right time, we need to set the **time zone** for our Thing. This is done in our Thing configuration, by selecting your time zone through the drop down menu available at the bottom of the page. + +![Change time zone for a Thing.](assets/cloud-scheduler-img-timezone.png) + +### Network Credentials + +To connect your device to the Arduino IoT Cloud, you need to enter your network credentials in the "network" section. + +***Note that this only applies to Wi-Fi enabled boards.*** + +### Programming the Board + +Now, let's take a look at the sketch used for this tutorial. First, we need to navigate to the **"Sketch Tab"**. + +- This sketch first checks whether the `schedule_test` variable is true, and if it is, increase the `counter` variable and turn on the `light`. +- The `light` variable is used for feedback later on, when we create a dashboard. Whenever `schedule_test` is true, so is `light`. +- The `LED` variable is also attached to pin 6, which is **ON** when the job is active, and **OFF** when the job is inactive. + +### Complete Sketch + +```arduino +#include "thingProperties.h" +#include + +bool toggle; +int LED = 6; + +void setup() { + Serial.begin(9600); + delay(1500); + + initProperties(); + + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); + counter = 0; + light = false; +} + +void loop() { + ArduinoCloud.update(); + // Your code here + if (schedule_test.isActive()) { + light = true; + digitalWrite(LED, HIGH); + + if (toggle) { + counter = ++counter; + toggle = false; + } + } else { + light = false; + digitalWrite(LED, LOW); + toggle = true; + } + if(ArduinoCloud.connected()){ + time_read = ArduinoCloud.getLocalTime(); + } +} + +void onScheduleTestChange() { + +} +``` + +***If you want to see if your board successfully connects to the cloud, open the Serial Monitor right after the upload finishes. If there's any errors, you will see them there.*** + +### Creating a Dashboard + +Finally, let's build a dashboard that will help us interface with our Arduino board. + +**1.** Head over to the **"Dashboards"** section, and click on the **"Build Dashboard"** button. + +**2.** Now we will need to create a set of widgets that we will link to our variables. Follow the table below to create them. + +| Widget | Variable | +| ----------- | ------------- | +| Scheduler | schedule_test | +| Time Picker | time_read | +| Value | value | +| LED | light | + +***When you create a widget, you will need to click on "Link Variable" in the widget settings, and then choose the variable you want to link (see the image below).*** + +![Linking a widget to a variable.](assets/cloud-scheduler-img-04.png) + +When the dashboard is finished, it should look something like the image below, where we have four widgets in total: + +![The final dashboard.](assets/cloud-scheduler-img-05.png) + +We are now finished with the setup, and can move on to testing out the scheduler feature. + +## Scheduling a Job + +To schedule a job, there are several parameters that can be set: + +- **Start & end** date for a "job". For example, **start** on 1st of December at 00:00, **end** at 31st of December at 12.00. +- **Duration** of the job, set in hours, minutes, seconds. If we for example set 1 minute, the `schedule_test` variable will be `true` for 1 minute. +- **Repetition** interval, how often should this job occur: every minute, hour, day, week, month, day or year. + +To create a job, simply click anywhere on the **scheduler widget**, and configure the job after your preferences. + +![Scheduler Widget settings.](assets/cloud-scheduler-img-06.png) + +### Testing the Scheduler + +In this tutorial, we created a job that has the following parameters: + +- **Start:** today. +- **End:** never. +- **Duration:** 10 seconds. +- **Repeat Every:** minute. + +The sketch used for this is configured to switch the `light` variable to true, whenever the `schedule_test` variable is true. While it is true, the **LED widget**, which is linked to the `light` variable, will be on (for 10 seconds). Each time this happens, the `counter` variable will also increase by 1. + +![The scheduler in action.](assets/scheduler-action.gif) + +### Troubleshoot + +If you have any issues with finishing this tutorial, you can check out some common troubleshooting issues: + +- Is your network credentials correct? If you change these, you will need to upload the sketch again for the changes to have effect. +- If you can't link a widget to a variable, you may have selected the wrong variable type. The **scheduler widget** will only work with the **scheduler variable**. +- Does the variables created in your Thing match the variables in your sketch? For example, if your variable is named `Schedule_test`, the code provided in this tutorial will not work since it is **case sensitive**. + +## Conclusion + +The scheduler is yet another amazing Arduino IoT Cloud feature that allows you to control the future. In this tutorial, we used **just one scheduler**, but you might just as easily create 10 schedulers that can perform actions automatically. This makes it an ideal building block for IoT projects. diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-01.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-01.png new file mode 100644 index 0000000000..1a339e1f45 Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-01.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-02-1.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-02-1.png new file mode 100644 index 0000000000..78853aa80a Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-02-1.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-02.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-02.png new file mode 100644 index 0000000000..59b85ae9f6 Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-02.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-03.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-03.png new file mode 100644 index 0000000000..c3d2574a9f Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-03.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-04.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-04.png new file mode 100644 index 0000000000..04577b94b0 Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-04.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-05.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-05.png new file mode 100644 index 0000000000..a016571ab8 Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-05.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-06.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-06.png new file mode 100644 index 0000000000..d0858562fa Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-06.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-07.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-07.png new file mode 100644 index 0000000000..cbec42be84 Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-07.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-08.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-08.png new file mode 100644 index 0000000000..d72bb22b3a Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-08.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-09.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-09.png new file mode 100644 index 0000000000..1b823df8fe Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-09.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-10.png b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-10.png new file mode 100644 index 0000000000..7d338659e2 Binary files /dev/null and b/content/arduino-cloud/02.features/02.device-to-device/assets/device-to-device-img-10.png differ diff --git a/content/arduino-cloud/02.features/02.device-to-device/device-to-device.md b/content/arduino-cloud/02.features/02.device-to-device/device-to-device.md new file mode 100644 index 0000000000..a0ab0bb6de --- /dev/null +++ b/content/arduino-cloud/02.features/02.device-to-device/device-to-device.md @@ -0,0 +1,301 @@ +--- +title: 'Device to device with Arduino IoT Cloud' +compatible-products: [mkr-1000-wifi, mkr-wifi-1010, nano-33-iot, nano-rp2040-connect] +difficulty: intermediate +description: 'Learn how to connect two boards through the Arduino IoT Cloud, by syncing their variables.' +tags: + - Device to device +author: 'Karl Söderby' +--- + +## Introduction + +In this tutorial, we will find out how to send data between two Arduino boards, using the Arduino IoT Cloud. Each board will have **one LED and one button each** that will be used to send data between the boards. + +This will be made possible through something called **syncing variables**, which will be explained further in this tutorial. + +## Goals + +The goals of this project are: + +- Set up the Arduino IoT Cloud. +- Create synchronized variables. +- Control an LED remotely with a push button. + +## Hardware & Software needed + +- [Arduino IoT Cloud](https://create.arduino.cc/iot/). +- 2x [Arduino MKR WiFi 1010](https://store.arduino.cc/mkr-wifi-1010) or, +- 2x [Arduino MKR WiFi 1000](https://store.arduino.cc/arduino-mkr1000-wifi) or, +- 2x [Arduino Nano 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) or, +- 2x [Arduino Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect-with-headers). +- Micro USB cable. + +***Note: It is not required to have two devices of the same type. You can for example use a Nano RP2040 Connect and a MKR WiFi 1010. Any [IoT Cloud enabled Wi-Fi board](/cloud/iot-cloud/tutorials/iot-cloud-getting-started#compatible-hardware) will work with this tutorial.*** + +We will also need the following components for the circuit: + +- 2x generic LEDs. +- 2x pushbuttons. +- 2x 220 ohm resistors. +- Jumper wires. +- Breadboard. + +## Circuit + +Follow the circuit below to connect the buttons and LEDs to your Arduino board. + +***Note that the pinouts are different on a Nano board. The circuit below is for a MKR WiFi 1000/1010 board.*** + +![Two identical circuits with 1x button and 1x LED each.](assets/device-to-device-img-01.png) + +## Setting up the Arduino IoT Cloud + +To start, we will need to head over to the [Arduino IoT Cloud](https://create.arduino.cc/iot/). This is also accessible through the menu at the top right. + +![Navigate to the cloud.](assets/device-to-device-img-02.png) + +### Step 1: Configuring two devices + +In this tutorial, we will need to set up **two devices in the Arduino IoT Cloud**. If you have never used this service before, you can check out [our getting started with the IoT cloud guide](https://www.arduino.cc/en/Tutorial/iot-cloud-getting-started). + +Now that we are working with two devices, it is important to separate them from each other, since they will later be linked to two different Things. In this tutorial, we named the devices: + +- **Device_1** +- **Device_2** + +It is a good idea to place a label on the physical board to remember which one is which as well! + +### Step 2: Creating the first Thing + +Let's start by creating a new Thing, for simplicity, let's name it **Remote Light One**. + +![The Thing overview.](assets/device-to-device-img-02-1.png) + +Now, we will need to add two variables, with the following settings: + +| Variable Name | Data Type | Permission | +| ------------- | --------- | ------------ | +| switch_1 | integer | read & write | +| switch_2 | boolean | read & write | + +We also need to enter our network details, and select our device (which should be **Device_1**). + +The final overview should look something like this: + +![The final view.](assets/device-to-device-img-03.png) + +### Step 3: Program the first Thing + +Now, we also need to complete the sketch for our first Thing. First, let's head over to the **"Sketch"** tab in the Arduino IoT Cloud. + +![Click on the "Sketch" tab to edit the sketch.](assets/device-to-device-img-04.png) + +The code that is needed can be found in the snippet below. Upload the sketch to the first board. + +### Step 4: Complete code for Device_1 + +```arduino +#include "thingProperties.h" + +int buttonPin = 2; +int ledPin = 7; + +void setup() { + // Initialize serial and wait for port to open: + pinMode(buttonPin, INPUT_PULLUP); + pinMode(ledPin, OUTPUT); + + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + /* + The following function allows you to obtain more information + related to the state of network and IoT Cloud connection and errors + the higher number the more granular information you’ll get. + The default is 0 (only errors). + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); +} + +void loop() { + ArduinoCloud.update(); + // Your code here + + int buttonState = digitalRead(buttonPin); + + if(buttonState == LOW) { + switch_1 = !switch_1; + delay(500); + } + +} + +void onSwitch2Change() { + // Do something + +} + +void onSwitch1Change() { + // Do something + if(switch_2) { + digitalWrite(ledPin, HIGH); + } + else{ + digitalWrite(ledPin, LOW); + } +} +``` + +### Step 5: Creating the second Thing + +After we have successfully uploaded the code to our first board, we can go on to create our **second Thing.** + +To create our second Thing, we need to click on the **"Things"** tab, and click on **"Create Thing"**. We can name this one **Remote Light Two**. + +![Creating the second thing.](assets/device-to-device-img-05.png) + +Now, we need to create the variables we want to sync with the other Thing. First, click on the **"Add Variable"** button. We will name this one **switch_1** as well, and then click on the **"Sync with other things"** option. + +![Click on "Sync with other things".](assets/device-to-device-img-06.png) + +We will now see the two variables we created inside **Remote Light One**. Let's select the **switch_1** variable and click on **"Synchronize variables"**. + +![Selecting the variables we want to synchronize.](assets/device-to-device-img-07.png) + +Then, click on the **"Add Variable"** button. + +![Adding the variable.](assets/device-to-device-img-08.png) + +Next, we can repeat the same process for the boolean variable, but instead of selecting the **switch_2** variable to sync with, select the **boolean_sync** variable. Now we should have two variables that are synced with our other Thing. + +Here we will also need to enter our network details, and select our device (which should be **Device_2**). + +### Step 6: Program the second Thing + +Now we will need to edit the sketch for our second Thing. This sketch is almost identical to the previous sketch we made, but the only difference is that we switched places on the **boolean variables**. + +This means that whenever the button is pressed, `switch_2` will change. As it is synced, it will turn ON / OFF the LED on the other board. Similarly, we check if `switch_1` has changed, and turn ON / OFF the LED on this board. + +The code that is needed can be found in the snippet below. Upload the sketch to the board. + +>**Note:** Make sure that you upload this sketch to **Device_2**, as we have already uploaded the first sketch to **Device_1**. + +### Step 7: Complete for Device_2 + +```arduino +#include "thingProperties.h" + +int buttonPin = 2; +int ledPin = 7; + +void setup() { + // Initialize serial and wait for port to open: + pinMode(buttonPin, INPUT_PULLUP); + pinMode(ledPin, OUTPUT); + + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + /* + The following function allows you to obtain more information + related to the state of network and IoT Cloud connection and errors + the higher number the more granular information you’ll get. + The default is 0 (only errors). + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); +} + +void loop() { + ArduinoCloud.update(); + // Your code here + + int buttonState = digitalRead(buttonPin); + + if(buttonState == LOW) { + switch_2 = !switch_2; + delay(500); + } + + +} + +void onSwitch2Change() { + // Do something + +} + +void onSwitch1Change() { + // Do something + if(switch_1) { + digitalWrite(ledPin, HIGH); + } + else{ + digitalWrite(ledPin, LOW); + } +} +``` + +## Testing it out + +After we have successfully uploaded the code to our second Thing, we have completed all the configurations needed for the two boards to communicate. + +Just to re-cap here's what we have done so far: + +- Configured two devices. +- Created two Things. +- Created two variables, `switch_1` and `switch_2`. +- Synced the variables between the Things. +- Uploaded the sketches to **Device_1** and **Device_2**. + +If everything is working properly, and the circuit is wired correctly, we should be able to control both LEDs on each board, by **pressing the button on the opposite board.** + +- The button on **Device_1** will control the LED on **Device_2.** +- The button on **Device_2** will control the LED on **Device_1.** +- The logic is set to turn ON and OFF the LED with the same button. + +![Simple abstraction of how the setup will work.](assets/device-to-device-img-10.png) + +The logic behind it is that one button is each linked to one of the booleans. If for example, `switch_2` is `false`, then the LED in **Remote Light One** will be OFF, and if `switch_1` is set to `true`, the LED in **Remote Light Two** will be off. + +![How the variables synchronize.](assets/device-to-device-img-09.png) + +### Troubleshooting + +- Have you uploaded the sketches correctly? Remember that you need to upload the sketch for **Remote Light One** to **Device_1** and **Remote Light Two** to **Device_2**. +- Have you entered the network details correctly? After you have uploaded the sketch, open the Serial Monitor to see if there is any errors with your connection. +- Have you configured the devices properly? It can sometimes be confusing to which board is which, sometimes it helps to re-configure and re-upload the sketches! + +## Conclusion + +In this tutorial, we created a connection between two Arduino boards, using the Arduino IoT Cloud. We set up two identical circuits, and uploaded two almost identical sketches to the boards. + +The connection between the boards is made through the **syncing of variables**, which allows two Things to communicate with each other. In this case, whenever a boolean is activated on one device, it is also activated on the other device. This **remote ON/OFF switch** is a great building block for creating other cool IoT projects. + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). + + + + \ No newline at end of file diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/dashboard_motion.gif b/content/arduino-cloud/02.features/03.thing-to-thing/assets/dashboard_motion.gif new file mode 100644 index 0000000000..251cb2b04d Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/dashboard_motion.gif differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-circuit.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-circuit.png new file mode 100644 index 0000000000..066ab2d358 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-circuit.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-00.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-00.png new file mode 100644 index 0000000000..59b85ae9f6 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-00.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-01.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-01.png new file mode 100644 index 0000000000..1820106775 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-01.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-02.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-02.png new file mode 100644 index 0000000000..5503a692b0 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-02.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-03.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-03.png new file mode 100644 index 0000000000..ec705adcf3 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-03.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-04.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-04.png new file mode 100644 index 0000000000..bbb8d5a892 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-04.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-05.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-05.png new file mode 100644 index 0000000000..e62542910b Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-05.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-06.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-06.png new file mode 100644 index 0000000000..a21156d028 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-06.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-07.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-07.png new file mode 100644 index 0000000000..7e9fa6c8db Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-07.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-08.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-08.png new file mode 100644 index 0000000000..b4467a69b4 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-08.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-09.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-09.png new file mode 100644 index 0000000000..605a81b822 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-09.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-10.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-10.png new file mode 100644 index 0000000000..74ab10faee Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-10.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-11.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-11.png new file mode 100644 index 0000000000..5b25e807e8 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-11.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-12.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-12.png new file mode 100644 index 0000000000..39b8464bb9 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-12.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-13.png b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-13.png new file mode 100644 index 0000000000..05106fe520 Binary files /dev/null and b/content/arduino-cloud/02.features/03.thing-to-thing/assets/thing-to-thing-img-13.png differ diff --git a/content/arduino-cloud/02.features/03.thing-to-thing/thing-to-thing.md b/content/arduino-cloud/02.features/03.thing-to-thing/thing-to-thing.md new file mode 100644 index 0000000000..26dcc8b024 --- /dev/null +++ b/content/arduino-cloud/02.features/03.thing-to-thing/thing-to-thing.md @@ -0,0 +1,166 @@ +--- +title: 'Thing to Thing communication with Arduino IoT Cloud' +compatible-products: [mkr-1000-wifi, mkr-wifi-1010, nano-33-iot, nano-rp2040-connect] +difficulty: easy +description: 'Learn how two Things can communicate with each other through variable syncing.' +tags: + - Device to device +author: 'Karl Söderby' +--- + +## Introduction + +The Thing to Thing communication is a great feature that allows you to synchronize your Arduino devices. It enables you to pair **variables** of the same data type between things and with the Arduino IoT Cloud, creating a two-way communication between your devices has never been easier. + +## Goals + +The goals of this project are: + +- Learn how to set up the Thing to Thing communication. +- Sync a variable containing a value between two Things. +- Trigger a boolean between two Things. + +## Hardware & Software needed + +- [Arduino IoT Cloud](https://create.arduino.cc/iot/) (with a Maker subscription, read more [here](https://store.arduino.cc/digital/create)). +- 2x [Arduino MKR WiFi 1010](https://store.arduino.cc/mkr-wifi-1010) or, +- 2x [Arduino MKR WiFi 1000](https://store.arduino.cc/arduino-mkr1000-wifi) or, +- 2x [Arduino Nano 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) or, +- 2x [Arduino Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect-with-headers). + + +## Circuit + +In this tutorial, we are using no external circuit. You will only need 2x IoT Cloud compatible devices. You can for example use one Nano 33 IoT and one MKR WiFi 1010. + +![Choosing two IoT boards.](assets/thing-to-thing-circuit.png) + +## Setting up the Things + +To start, we will need to head over to the [Arduino IoT Cloud](https://create.arduino.cc/iot/). This is also accessible through the menu at the top right. + +![Navigate to the cloud.](assets/thing-to-thing-img-00.png) + +### Step 1: Configuring two devices + +To enable Thing to Thing communication, we will first need to configure the two devices. If you have never used the Arduino IoT Cloud before, you can check out [our getting started with the IoT cloud guide](https://www.arduino.cc/en/Tutorial/iot-cloud-getting-started). + +Now that we are working with two devices, it is important to separate them from each other, since they will later be linked to two different Things. In this tutorial, we named the devices: + +- **Device_1** +- **Device_2** + +It is a good idea to place a label on the physical board to remember which one is which as well! + +### Step 2: Creating the first Thing + +Let's start by creating a new Thing, for simplicity, let's name it **Thing Number One**. + +![Creating Thing number one.](assets/thing-to-thing-img-01.png) + +Now, we will need to add two variables, with the following settings: + +| Variable Name | Data Type | Permission | +| ------------- | --------- | ------------ | +| analog_value | integer | read & write | +| boolean_sync | boolean | read & write | + +We also need to enter our network details, and select our device (which should be **Device_1**). + +The final overview should look something like this: + +![Final overview.](assets/thing-to-thing-img-02.png) + +Finally, we need to edit and upload the code to the board. We are only making one addition to the code. Inside `void loop()`, add the following line: + +```arduino +analog_value = analogRead(A1); +``` + +This means we would simply read pin A1, which we have not connected anything to, but will generate random values. You can now upload the code to the board. + +When it is finished uploading, we can move on to the next step. + +### Step 3: Creating the second Thing + +To create our second Thing, we need to click on the **"Things"** tab, and click on **"Create Thing"**. We can name this one **Thing Number Two**. + +![Creating a second Thing.](assets/thing-to-thing-img-03.png) + +Now, we need to create the variables we want to sync with the other Thing. First, click on the **"Add Variable"** button. We will now click on the **"Sync with other things"** option. + +![Click on "Sync with other Things".](assets/thing-to-thing-img-04.png) + +We will now see the two variables we created inside **Thing Number One**. Let's select the **analog_value** variable and click on **"Synchronize variables"**. + +![Selecting variables to synchronize.](assets/thing-to-thing-img-05.png) + +Finally, we need to name it something fitting, such as **analog_value_2**, and click on the **"Add Variable"** button. + +![Adding the variable.](assets/thing-to-thing-img-06.png) + +Next, we can repeat the same process for the boolean variable, but instead of selecting the **analog_value** variable to sync with, select the **boolean_sync** variable. Now we should have two variables that are synced with our other Thing. + +Here we will also need to enter our network details, and select our device (which should be **Device_2**). + +Then we can move on to the sketch. Inside the sketch we actually **don't need to edit anything**. Simply upload the sketch to **Device_2**. + +Once the upload is successful, we can move on to the next step! + +## Creating a dashboard + +With both **Device_1** and **Device_2** up and running, we can go on to **create a dashboard**. Navigate to the **"Dashboards"** tab, and click on the **"Build Dashboard"** button. + +### Step 1: Creating widgets for Thing Number One + +In the new, empty dashboard, click on **"Add"** and select **"Gauge"** from the list. + +![Adding a gauge widget.](assets/thing-to-thing-img-07.png) + +Then, we need to click on the **"Link Variable"** button. + +![Click on](assets/thing-to-thing-img-08.png) + +Now, let's link it to the **analog_value** variable, inside **Thing Number One**. Then click on the **"Link Variable"** button. + +![Linking the variable.](assets/thing-to-thing-img-09.png) + +We need to set the threshold values to **Min: 0** and **Max: 1000**, and click on the **"Done"** button. + +![Setting the thresholds values.](assets/thing-to-thing-img-10.png) + +Our widget will now appear in the dashboard. Next, let's add a **Switch** widget, following the same process to link it to the **boolean_sync** variable inside **Thing Number One**. After adding it, we will have two widgets: a **gauge** and a **switch**. + +![Dashboard with gauge and switch.](assets/thing-to-thing-img-11.png) + +### Step 2: Creating widgets for Thing Number Two + +Now that we have created the widgets and linked them to the variables from **Thing Number One**, we need to do the same for the variables that we sync from **Thing Number Two**. + +The process of creating them is identical to the previous steps, but we need to select the variables inside **Thing Number Two**. When it is finished, the complete dashboard should look like this: + +![The complete dashboard.](assets/thing-to-thing-img-12.png) + +## Testing it out + +Now that everything is set up, let's test it out. First of all, we can verify that the two **gauge widgets** are updating continuously, and that they show the same values (with a short delay). + +This is because they are only recorded by **Device_1**, linked with **Thing Number One**, which has the variable **analog_value**. Since **analog_value** and **analog_value_2** are synced, the values in the widgets are the same! + +![Synced variables.](assets/thing-to-thing-img-13.png) + +Now, that the boolean variables are set up just to test that the communication is working between the two Things. To test it, simply change the state of the switch to **"ON"** by clicking on it. After a short pause we will see the other switch turn to **"ON"** as well. The same thing will happen if we turn one switch to **"OFF"**, then the other should follow shortly after. + +![Two synchronized Things.](assets/dashboard_motion.gif) + +This means that our devices are linked, and whenever we update one of them, the other one follows. And that's how the variable sync works in a nutshell! + +## Conclusion + +The **Thing to Thing Communication** is an amazing feature that is easy to set up and has various benefits. In this tutorial we simply demonstrated the very basics by syncing two variables between two Things, but there is a lot more to explore! + +We hope you enjoyed this tutorial and that it helped you to get started with your next IoT project! + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). \ No newline at end of file diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/OtA_board_selection.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/OtA_board_selection.png new file mode 100644 index 0000000000..309d08f0fd Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/OtA_board_selection.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/adding_variable.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/adding_variable.png new file mode 100644 index 0000000000..863a7a0a60 Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/adding_variable.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/dashboard_widget.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/dashboard_widget.png new file mode 100644 index 0000000000..c3174f8ec8 Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/dashboard_widget.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/device_OtA.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/device_OtA.png new file mode 100644 index 0000000000..3db84ef2b5 Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/device_OtA.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/final_dshboard.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/final_dshboard.png new file mode 100644 index 0000000000..1f4c001ce9 Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/final_dshboard.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/iot_cloud_grid.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/iot_cloud_grid.png new file mode 100644 index 0000000000..f87735b7ec Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/iot_cloud_grid.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/ota-supported-boards.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/ota-supported-boards.png new file mode 100644 index 0000000000..32e662f15a Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/ota-supported-boards.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/other_power_supplier.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/other_power_supplier.png new file mode 100644 index 0000000000..7f5e1571f5 Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/other_power_supplier.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/assets/select_device.png b/content/arduino-cloud/02.features/04.ota-getting-started/assets/select_device.png new file mode 100644 index 0000000000..f7b796cb61 Binary files /dev/null and b/content/arduino-cloud/02.features/04.ota-getting-started/assets/select_device.png differ diff --git a/content/arduino-cloud/02.features/04.ota-getting-started/ota-getting-started.md b/content/arduino-cloud/02.features/04.ota-getting-started/ota-getting-started.md new file mode 100644 index 0000000000..be46ddbafd --- /dev/null +++ b/content/arduino-cloud/02.features/04.ota-getting-started/ota-getting-started.md @@ -0,0 +1,144 @@ +--- +title: "Uploading sketches Over-The-Air (OTA)" +difficulty: easy +description: 'Learn how to utilize Over-The-Air (OTA), a feature that allows you to upload sketches remotely.' +tags: + - OTA + - Wireless upload +author: 'Jose Garcia' +--- + +The new IoT Cloud brings a lot of new things, and one of them is the OTA (over-the-air) feature. This feature allows you to upload programs wirelessly to your Arduino boards. This way, as soon as you have a compatible board connected to a WiFi network and configured to work with OTA, you won’t need to physically connect the board to the computer in order to upload new sketches to it. Instead, everything will work over-the-air. + + +![Over-the-Air uploads.](assets/other_power_supplier.png) + + +Over-the-air update is now available through [Arduino IoT Cloud](https://create.arduino.cc/iot/) and the [Arduino Web Editor](https://create.arduino.cc/editor), which is an always up-to-date online IDE that stores sketches in the Cloud. It also allows you to wirelessly upload sketches from a browser, to any board that is connected to that computer. + +This tutorial will guide you through the necessary steps to configure your board to work with the OTA feature. + +## Compatible Hardware + +![Compatible boards.](assets/ota-supported-boards.png) + +Below is a list of all boards that supports OTA through the Arduino Cloud. + +- [Arduino MKR WiFi 1010](https://store.arduino.cc/mkr-wifi-1010) +- [Arduino Nano 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) +- [Arduino Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect-with-headers) +- [Portenta H7](https://store.arduino.cc/portenta-h7) + + +## How does it work + +In order to configure the feature, we will need to create a project in the IoT Cloud following the next steps. + +**1.** Go to the [IoT Cloud](https://create.arduino.cc/iot/things) by opening the grid menu in any Arduino Site. + +![Navigating to the cloud.](assets/iot_cloud_grid.png) + +> **Note:** You will need to have an Arduino account to be able to use both the Web editor and IoT Cloud features. + + +**2.** Once you are logged in the IoT Cloud, you need to create a new thing and name it “smart_led”. + Inside the thing let’s include a boolean variable called `light`, activate the interaction **Modify from dashboard API** and select the **on change** variable update. Once we have these characteristics set, click on **add variable**. + + +![Adding a variable.](assets/adding_variable.png) + +> **Note:** If you want to know more about how to get started with the Arduino IoT Cloud, visit the [getting started tutorial](https://drive.google.com/file/d/1yW_kH0-O9ehJATrGQUvpuyhWPXLUc_uN/view?usp=sharing). + + +**3.** Once you have added the variable, you’ll need to associate your device (Arduino MKR WiFi 1010 or Arduino Nano 33 IoT) to this new thing and add your network credentials. + +![Selecting a device to associate.](assets/select_device.png) + +***Note: If it is the first time you configure the MKR WiFi 1010 or the Nano 33 IoT board to the IoT Cloud, you will need to have the latest version of the WiFi Nina firmware installed. The configuration process updates it automatically. However, if you get any error during the configuration process, you can manually update the FW version of the Nina module following [these instructions](https://support.arduino.cc/hc/en-us/articles/360018104880).*** + + +**4.** Next step is to create a dashboard with a **Switch** widget, linked to the lights variable that you created before. Once it is set, click on the **use dashboard** button and go to **things > smart_led > Sketch** + +![A switch widget.](assets/dashboard_widget.png) + + +**5.** It is time now to edit the sketch. Let’s create a program that turns ON/OFF the `LED_BUILTIN` embedded on your board. To do so, you will need to add just four lines of code to the auto generated sketch: + 1. Initialise as `false` the boolean variable `led_status` at the beginning of the program. + 2. Set as `OUTPUT` the `LED_BUILTIN` pin of the board in the `setup()` function. + 3. Modify the state of the `LED_BUILTIN` pin with the `led_status` variable in the `loop()` function. To do so, let’s use the `digitalWrite()` statement. + 4. Add the statement `led_status = !led_status` inside the `onLightChange()`auto generated function. + + +Check the highlighted lines in the following code to see what required changes are. + + + + + +**6.** Once the sketch has uploaded to your board, let’s check that everything is working as it should. To do so, go back to the IoT Cloud and once in there, go to the **smart_led** dashboard we created before. Now, when you turn the **light** widget in the dashboard ON or OFF, the LED in your board should also turn ON or OFF. + +![Final dashboard.](assets/final_dshboard.png) + + +Now that we have checked that everything is working as it should, let’s go back to the **Things > smart_led >** **Sketch** tab in the IoT Cloud, and see what has happened there. + +Once in the sketch tab, let’s open the board's drop down menu. There, a new option to connect our board should be available. The name of the board configured for the cloud will appear, followed by the **Over-the-Air** option. + +![List of devices available.](assets/device_OtA.png) + + +If you select this option, you should be able to upload sketches to your board wirelessly. Let’s learn how to do it, by following the next steps. + +**1.** Let’s modify the program in order to blink the LED each second when we click the button ON, and switch it Off when the button OFF is pressed. + To do it, you will need to modify the `loop()` function by adding the highlighted lines shown in the following sketch. + + + +**2.** Power your board from a different power supplier than your computer's USB cable. Powering it through a phone charger's USB should be enough. + +![img](assets/other_power_supplier.png) + +**3.** Once you have powered the board from a power source other than your computer, you should only see the **Over-the-Air** option. Select it, and upload the program to the board. + +![Over-the-Air board connection](assets/OtA_board_selection.png) + +> **Note:** This option will take a bit longer than usual, since the process of compiling and uploading the program to the board over-the-air is a longer process. + +**4.** Now, if you switch the widget on the IoT Cloud dashboard ON and OFF, the LED will either blink every second or go off. + + +## But how does it work, inside? + +An IoT Cloud sketch is generated by the IoT Cloud application, it leverages the Arduino IoT Cloud and [Arduino Connection Handler](https://github.com/arduino-libraries/Arduino_ConnectionHandler) libraries to give your sketch IoT powers. + + +When uploading a sketch over-the-air: + +- The sketch is compiled for the selected board type. +- The compiled file is stored in a [AWS S3](https://aws.amazon.com/s3/) bucket. +- OTA file url location is associated with the target device. +- OTA_REQ flag set to true to instruct the board to start the OTA file download. +- OTA file length/CRC is verified. +- Updated sketch is flashed on the board. + + +## Conclusion + +In order to upload sketches Over-the-Air to your Arduino board you need: + +- An [Arduino NANO 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) or [Arduino MKR WiFi 1010](https://store.arduino.cc/arduino-mkr-wifi-1010) board. +- NINA firmware on the board, updated to version 1.4.1 or later. +- An **IoT Sketch** to be uploaded. + + +### Next steps + +If you want to continue learning about amazing IoT features or projects you can check: + +- [Oplà IoT Kit](https://opla.arduino.cc/) + +--- + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). diff --git a/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img01.png b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img01.png new file mode 100644 index 0000000000..b4602fc9b8 Binary files /dev/null and b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img01.png differ diff --git a/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img02.png b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img02.png new file mode 100644 index 0000000000..3b4f574608 Binary files /dev/null and b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img02.png differ diff --git a/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img03.png b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img03.png new file mode 100644 index 0000000000..55ae71690f Binary files /dev/null and b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img03.png differ diff --git a/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img04.png b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img04.png new file mode 100644 index 0000000000..415e6bf54e Binary files /dev/null and b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img04.png differ diff --git a/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img05.png b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img05.png new file mode 100644 index 0000000000..b7590f74d1 Binary files /dev/null and b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img05.png differ diff --git a/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img06.png b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img06.png new file mode 100644 index 0000000000..209ba98d26 Binary files /dev/null and b/content/arduino-cloud/02.features/05.sharing-dashboards/assets/cloud-sharing-dashboards-img06.png differ diff --git a/content/arduino-cloud/02.features/05.sharing-dashboards/sharing-dashboards.md b/content/arduino-cloud/02.features/05.sharing-dashboards/sharing-dashboards.md new file mode 100644 index 0000000000..d0f34bcb01 --- /dev/null +++ b/content/arduino-cloud/02.features/05.sharing-dashboards/sharing-dashboards.md @@ -0,0 +1,62 @@ +--- +title: 'Sharing dashboards' +difficulty: easy +description: 'Learn how to share your dashboards with other Arduino Cloud users.' +tags: + - Dashboards + - Cloud +author: 'Karl Söderby' +software: + - iot-cloud +--- + +The Arduino Cloud IoT is a great tool for remote control and analytics of your devices. A central component in the cloud system is the **dashboards**, the tool that is used to visualize and interact with you devices. + +In this tutorial, we will show how to share these dashboards with other Arduino IoT Cloud users! + +If you want to get started with the Arduino Cloud IoT, you can check out [getting started with the Arduino Cloud IoT](https://docs.arduino.cc/cloud/iot-cloud/tutorials/iot-cloud-getting-started). + + +## Sharing your dashboards + +>**Note:** Before we start, let's make sure that we have a **Thing** and **Dashboard** already set up. If you haven't got that set up, head over to the [Setting up the Arduino IoT Cloud in detail]() tutorial. + +The Arduino IoT Cloud's dashboard feature is a really good tool for sending, receiving and storing data through the cloud. You can now also share your dashboards with other people, so that they can access your devices as well, without having access to your account! + +The **sharing dashboards** feature is really easy to use, but let's take a look at how it is done! + +**1.** First, let's select a dashboard of your choice. In this case, we will choose the **"Temperature & Humidity"** dashboard. + +![Choose the dashboard you want to share.](assets/cloud-sharing-dashboards-img01.png) + +**2.** In our example, we have a **temperature** and **humidity** widget. Now, if we want to share our dashboard, we can simply click on the share icon at the top right corner, see the image below: + +![Click on the share button.](assets/cloud-sharing-dashboards-img02.png) + +**3.** When we click on the icon, a pop up will appear. Here, we can search for the user that we want to share the dashboard with. We can search by either user name, or email. When have selected someone to invite, we can click on the **"Share"** button. This allow them access to our dashboards, and a link to the dashboard is sent to the users email address. + +![Enter the email/user name and click on share.](assets/cloud-sharing-dashboards-img03.png) + +**4.** When we have sent an invite, they will appear in a list of people who have access. + +![List of people that has access.](assets/cloud-sharing-dashboards-img04.png) + +**5.** In the email sent out, simply click on the **"Open Dashboard"** button, and you will be directed to the dashboard! + +![Receiving the email.](assets/cloud-sharing-dashboards-img05.png) + +And that's how you can share dashboards with your friends, colleagues and family, with just a few clicks! + +## Removing access for people + +If you no longer want people to have access to your dashboards, simply click the cross next to the person's user name. This will remove their access to the dashboard. + +![Removing the access.](assets/cloud-sharing-dashboards-img06.png) + +## Conclusion + +In this tutorial, we have learned how to **share dashboards**, a feature that can be really useful when we want others to access the data from our IoT devices quickly. + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). \ No newline at end of file diff --git a/content/arduino-cloud/02.features/06.webhooks/assets/creating-an-applet.gif b/content/arduino-cloud/02.features/06.webhooks/assets/creating-an-applet.gif new file mode 100644 index 0000000000..3d79c96152 Binary files /dev/null and b/content/arduino-cloud/02.features/06.webhooks/assets/creating-an-applet.gif differ diff --git a/content/arduino-cloud/02.features/06.webhooks/assets/finding-webhook-link.png b/content/arduino-cloud/02.features/06.webhooks/assets/finding-webhook-link.png new file mode 100644 index 0000000000..9722013ceb Binary files /dev/null and b/content/arduino-cloud/02.features/06.webhooks/assets/finding-webhook-link.png differ diff --git a/content/arduino-cloud/02.features/06.webhooks/assets/setting-a-webhook.gif b/content/arduino-cloud/02.features/06.webhooks/assets/setting-a-webhook.gif new file mode 100644 index 0000000000..eca8a8cb74 Binary files /dev/null and b/content/arduino-cloud/02.features/06.webhooks/assets/setting-a-webhook.gif differ diff --git a/content/arduino-cloud/02.features/06.webhooks/assets/webhook-dashboard-sheets.gif b/content/arduino-cloud/02.features/06.webhooks/assets/webhook-dashboard-sheets.gif new file mode 100644 index 0000000000..d555749f89 Binary files /dev/null and b/content/arduino-cloud/02.features/06.webhooks/assets/webhook-dashboard-sheets.gif differ diff --git a/content/arduino-cloud/02.features/06.webhooks/assets/webhook-dashboard.gif b/content/arduino-cloud/02.features/06.webhooks/assets/webhook-dashboard.gif new file mode 100644 index 0000000000..ac1c4cff9e Binary files /dev/null and b/content/arduino-cloud/02.features/06.webhooks/assets/webhook-dashboard.gif differ diff --git a/content/arduino-cloud/02.features/06.webhooks/iot-cloud-webhooks.md b/content/arduino-cloud/02.features/06.webhooks/iot-cloud-webhooks.md new file mode 100644 index 0000000000..16330e44b7 --- /dev/null +++ b/content/arduino-cloud/02.features/06.webhooks/iot-cloud-webhooks.md @@ -0,0 +1,158 @@ +--- +title: 'Webhooks with Arduino IoT Cloud' +compatible-products: [mkr-1000-wifi, mkr-wifi-1010, nano-33-iot, nano-rp2040-connect] +difficulty: advanced +description: 'Learn how to setup webhooks with the Arduino IoT Cloud to work with third party platforms such as IFTTT.' +tags: + - Webhooks + - IoT Cloud + - IFTTT +author: 'Liam Aljundi' +--- + +## Introduction + +Webhooks allow you to send and receive automated messages to and from other services. For example, you can use webhooks to receive a notification when a property of your Thing changes. To do this, there are third party platforms that link the properties from your Arduino Cloud projects to the desired trigger action. + +## Goals + +- Learn how to set up webhooks in the Arduino IoT Cloud. +- Provide an overview of available platforms where webhooks may be used. +- Demonstrate an example that uses a webhook to send data from the Arduino IoT Cloud to Google Sheets, via the IFTTT platform. + +## Hardware & Software Requirements + +- The [Arduino Create Agent](https://github.com/arduino/arduino-create-agent) +- An [Arduino account](http://create.arduino.cc/iot). + +You will also need a cloud compatible board: + +- [MKR 1000 WiFi](https://store.arduino.cc/arduino-mkr1000-wifi) +- [MKR WiFi 1010](https://store.arduino.cc/arduino-mkr-wifi-1010) +- [MKR WAN 1300](https://store.arduino.cc/arduino-mkr-wan-1300-lora-connectivity-1414) +- [MKR WAN 1310](https://store.arduino.cc/mkr-wan-1310) +- [MKR GSM 1400](https://store.arduino.cc/arduino-mkr-gsm-1400)\* +- [MKR NB 1500](https://store.arduino.cc/arduino-mkr-nb-1500-1413)\* +- [Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect) +- [Nano 33 IoT](https://store.arduino.cc/arduino-nano-33-iot) +- [Portenta H7](https://store.arduino.cc/portenta-h7) + +***Please note: The MKR GSM 1400 and MKR NB 1500 require a SIM card to connect to the cloud, as they communicate over mobile networks.*** + +## Webhook Setup + +A webhook can be set for any **Thing** on the Arduino IoT Cloud, allowing us to send data from the Arduino IoT Cloud to various third party platforms. For example, you can use webhooks to receive an email when any of you devices is disconnected, or send and save live sensor values collected from your device in a Google Spreadsheet. + +There are many available platforms that support the use of Webhooks, for this tutorial we will try the **IFTTT** platform. IFTTT allows you to integrate services with your DIY projects. With IFTTT you can create Applets that work with any device or app that can make or receive a web request. + +Let's try it out by creating an Applet that uses a webhook to receive String Values sent via the **Message Widget** on the Arduino IoT Cloud, and save them into a Google Sheets. + +### IFTTT Configuration + +The first step is to create an Applet on the IFTTT platform using the following steps: + +![Creating an Applet](assets/creating-an-applet.gif) + +**1.** Go to [IFTTT website](maker.ifttt.com) and sign in. + +**2.** Click **Create** in the top right, then select **If This**. + +**3.** In the search field, type **"Webhooks"** and select that service. + +**4.** Select Receive a web request. + +**5.** In the Event Name field, type "message", and click the Create trigger button. + +**6.** Now, click on **Then That**, type **"Google Sheets"** and select that service. + +**7.** Choose the **"Add row to spreadsheet"** option. + +**8.** You can keep the default settings, scroll down and click on **"Create action"**. + +Both the trigger and action have now been configured. Click **Continue**. Optionally, change the applet title, and click **Finish** to create the applet. + +The final step is finding the webhook link that you will need to set to your Thing on the Arduino IoT Cloud. You can find the link under **Profile picture in the top right > My Services > Webhooks > Documentation.** + +![Finding the Webhook link](assets/finding-webhook-link.png) + +### Setting a Webhook to a Thing + +Linking a webhook to a Thing is a quite simple process, follow the steps below to set a webhook to your Thing: + +![Setting a webhook](assets/setting-a-webhook.gif) + +**1.** [Sign in to your Arduino account](https://create.arduino.cc/iot), and open the [Arduino IoT Cloud](https://create.arduino.cc/iot). + +**2.** Navigate to [**Things** -> **Create Thing**](https://create.arduino.cc/iot/things). + +**3.** Create your Variables. In our case, we will create a **"message"** Variable and set its type to **"Character String"**. + +**4.** Add your **Device**, and configure your **Network** from the right side menu. + +**5.** Click on "**Set Webhook**", one the bottom left corner. + +**6.** Enter the webhook link provided from the platform you are using. + +**7.** Finally, navigate to the **Sketch** tab, and upload the automatically generated code to your board. + +The Arduino IoT Cloud will share **five sets of values** through the assigned webhook: + +- `"event_id": "EVENT_UUID"` +- `"webhook_id": "WEBHOOK_ID"` +- `"device_id": "DEVICE_UUID"` +- `"thing_id": "THING_UUID"` + +The fifth value contains an array of objects, each representing a Variable in your Thing, as the following: + +- `"values":` + + ```js + [ + { + "id": "VARIABLE_01_ID", + "name": "NAME_OF_VARIABLE_01", + "value": "VARIABLE_01_VALUE", + "persist": true/false, + "updated_at": "DATE", + "created_by": "USERID" + }, + { + "id": "VARIABLE_02_ID", + "name": "NAME_OF_VARIABLE_02", + "value": "VARIABLE_02_VALUE", + "persist": true/false, + "updated_at": "DATE", + "created_by": "USERID" + } + ] + ``` + +### Testing the Webhook + +To test the webhook, we need to create a *Messenger widget*. We can do that by: + +![Setting a webhook](assets/webhook-dashboard.gif) + +**1.** Navigating to [*Dashboards*](https://create.arduino.cc/iot/dashboards) -> *Edit* -> *Add* -> stay on the *Widgets tab* -> select "Messenger". + +**2.** Press on *Link Variable*, select the Thing we created, then the **"message"** Variable. + +In the "messenger widget", we are modifying the value of the "message" Variable. Whenever we send a message, the "message" Variable is updated and using the webhook we set, the updates are sent to the spreadsheet file created by IFTTT. + +To try it out, all you need to do is to navigate to your **Dashboards** on the Arduino IoT Cloud and send messages using the **Messenger Widget**. The messages, along with the exact date and time will be found in the Google Sheets file created by IFTTT, on our Google account. To access this file, you need to navigate to your [Google Sheets](https://docs.google.com/spreadsheets) -> find and open the file names **"IFTTT_Maker_Webhooks_Events"**. + +![Setting a webhook](assets/webhook-dashboard-sheets.gif) + +## Available Platforms + +In addition to IFTTT, here are examples of platforms that you can use webhooks with: + +### Zapier + +[Zapier](https://zapier.com/) works similarly to IFTTT. In addition to connecting your APIs quickly using **Zaps**, you can use Zapier's visual builder, which allows you to build an integration and preview data in real time. + +### Google Services + +- [**Google Cloud APIs**](https://cloud.google.com/apis/docs/overview): with Google APIs you can develop application programming interfaces (APIs) to communicate with Google services such as Search, Gmail, Translate or Google Maps apps or other applications like Arduino IoT Cloud. + +- [**Google Script**](https://developers.google.com/apps-script): allows you to interact with all your Google G-Suite files such as Google Sheets, Docs and more. diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-01.png b/content/arduino-cloud/02.features/07.nodered/assets/nodered-01.png new file mode 100644 index 0000000000..00ed6b5cc7 Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-01.png differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-02.gif b/content/arduino-cloud/02.features/07.nodered/assets/nodered-02.gif new file mode 100644 index 0000000000..07af54c9f3 Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-02.gif differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-03.gif b/content/arduino-cloud/02.features/07.nodered/assets/nodered-03.gif new file mode 100644 index 0000000000..b8aabb128b Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-03.gif differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-04.gif b/content/arduino-cloud/02.features/07.nodered/assets/nodered-04.gif new file mode 100644 index 0000000000..b2923427c0 Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-04.gif differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-05.gif b/content/arduino-cloud/02.features/07.nodered/assets/nodered-05.gif new file mode 100644 index 0000000000..0eeabf8d8f Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-05.gif differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-06.gif b/content/arduino-cloud/02.features/07.nodered/assets/nodered-06.gif new file mode 100644 index 0000000000..126a3c6c51 Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-06.gif differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-07.gif b/content/arduino-cloud/02.features/07.nodered/assets/nodered-07.gif new file mode 100644 index 0000000000..7f337c7e1a Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-07.gif differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/nodered-08.png b/content/arduino-cloud/02.features/07.nodered/assets/nodered-08.png new file mode 100644 index 0000000000..86cc666190 Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/nodered-08.png differ diff --git a/content/arduino-cloud/02.features/07.nodered/assets/rednode-09.png b/content/arduino-cloud/02.features/07.nodered/assets/rednode-09.png new file mode 100644 index 0000000000..3de28d8405 Binary files /dev/null and b/content/arduino-cloud/02.features/07.nodered/assets/rednode-09.png differ diff --git a/content/arduino-cloud/02.features/07.nodered/nodered-intro.md b/content/arduino-cloud/02.features/07.nodered/nodered-intro.md new file mode 100644 index 0000000000..73f1e2e7da --- /dev/null +++ b/content/arduino-cloud/02.features/07.nodered/nodered-intro.md @@ -0,0 +1,256 @@ +--- +title: 'Node-RED with Arduino IoT Cloud' +compatible-products: [mkr-1000-wifi, mkr-wifi-1010, nano-33-iot, nano-rp2040-connect] +difficulty: advanced +description: 'Learn how to use Node-RED together with the Arduino IoT Cloud to create advanced automation systems.' +tags: + - Node-RED + - IoT Cloud + - Automation + - IoT +author: 'Liam Aljundi' +--- + +## Introduction + +Node-RED is a programming tool for connecting hardware devices such as Arduino with other hardware devices, APIs, and online services easily using a web-based flow editor. It allows you to connect those different devices and services by connecting a combination of nodes that create your desired flow. + +In this tutorial, we will look into the applications of using Node-RED together with the Arduino IoT Cloud. The integration of the two platforms allows us to facilitate communications between the Arduino IoT Cloud and home automation devices, send and receive data from online services such as Email and SMS, and write JavaScript code to manipulate the data. + +***Note: this tutorial requires a [subscription to the Arduino IoT Cloud](https://cloud.arduino.cc/plans), all three subscriptions (Entry, Maker & Maker Plus) are valid.*** + +## Goals + +- Set up Node-RED with the Arduino IoT Cloud. +- Use simple Flows with Node-RED. +- Build a Node-RED Flow that pulls data from Arduino IoT Cloud. +- Manipulate data received from the Arduino IoT Cloud using JavaScript code. +- Send email notifications with data from the Arduino IoT Cloud. + +## Hardware & Software Requirements + +- [Arduino Create Agent](https://github.com/arduino/arduino-create-agent) +- [Node.js](https://nodejs.org/en/) and [Node-RED installed]() +- An [Arduino account](http://create.arduino.cc/iot). + +For this tutorial, you will need a cloud compatible board. You will find all compatible boards in the link below: + +- [Arduino IoT Cloud compatible hardware.](/cloud/iot-cloud/tutorials/iot-cloud-getting-started#compatible-hardware) + + +## Node-RED Setup + +Setting up Node-RED is simple, we will run it locally following the steps below: + +**1.** Install [Node.js](https://nodejs.org/en/). To check if Node.js is installed, open a terminal and enter the following command: + +```shell +node --version +``` + +If correctly installed, you will see the version number printed in the terminal. + +**2.** Install Node-RED from the command line using the command `sudo npm install -g --unsafe-perm node-red`, delete `sudo` if you are using a Windows machine. + +**3.** After installation, start it by running the command `node-red` in the terminal, you should see a similar output to this: + +```shell + $ node-red + + Welcome to Node-RED + =================== + + 30 Jun 23:43:39 - [info] Node-RED version: v1.3.5 + 30 Jun 23:43:39 - [info] Node.js version: v14.7.2 + 30 Jun 23:43:39 - [info] Darwin 19.6.0 x64 LE + 30 Jun 23:43:39 - [info] Loading palette nodes + 30 Jun 23:43:44 - [warn] rpi-gpio : Raspberry Pi specific node set inactive + 30 Jun 23:43:44 - [info] Settings file : /Users/nol/.node-red/settings.js + 30 Jun 23:43:44 - [info] HTTP Static : /Users/nol/node-red/web + 30 Jun 23:43:44 - [info] Context store : 'default' [module=localfilesystem] + 30 Jun 23:43:44 - [info] User directory : /Users/nol/.node-red + 30 Jun 23:43:44 - [warn] Projects disabled : set editorTheme.projects.enabled=true to enable + 30 Jun 23:43:44 - [info] Creating new flows file : flows_noltop.json + 30 Jun 23:43:44 - [info] Starting flows + 30 Jun 23:43:44 - [info] Started flows + 30 Jun 23:43:44 - [info] Server now running at http://127.0.0.1:1880/red/ + +``` + +**4.** Open the Node-RED editor by going to your browser and entering `http://localhost:1880`. + +***For more details on installing Node-RED, you can check [their installation page](https://nodered.org/docs/getting-started/local).*** + +## The Node-RED Editor + +The Node-RED editor consists of four main parts: + +- A **header on the top** containing the Deploy button, main menu, and the user menu (only visible if user authentication is enabled). +- The **palette on the left side**, containing the available nodes. +- A **workspace in the middle**, where flows can be created. +- The **sidebar on the right**, containing editing tools such as a node configuration tool and a debugger. + +![The Node-RED editor](assets/nodered-01.png) + +You can run the simple flow shown below using Node-RED's default nodes: + +- drag the **"inject"** node from the palette on the left side into the workspace in the middle +- double-click on the node to edit it +- assign a name and topic to it +- click on the dropdown menu next to *msg.payload* and choose **"string"**, then enter a random message +- click **Done** +- drag the **"debug"** node into the workspace +- connect the two nodes by dragging a wire from the message node to the debug node +- click on the debug menu from the sidebar on the right +- press **Depoly** from the header on the top +- finally, press on the checkbox of the message node + +![Creating a simple flow](assets/nodered-02.gif) + +Your message should be printed to the console on the right side. + +In addition to the default nodes installed in node-RED, you can use the palette manager to install additional nodes that can be useful to creating more advanced flows. Follow the steps below to install the Arduino IoT Cloud nodes using the palette manager: + +**1.** Click on the menu in the header bar in the top right corner. + +**2.** Select **"Manage palette"**. + +**3.** Go to the **"Install"** tab. + +**4.** Search for **"Arduino"**. + +**5.** From the results, install **"@arduino/node-red-contrib-arduino-iot-cloud"**. + +![Installing the Arduino IoT Cloud Palette](assets/nodered-03.gif) + +Now, you should be able to use the Arduino IoT Cloud nodes from the palette on the left side of the editor. There are five IoT Cloud nodes: property in, property out, historic, periodic, and inject. Each of the nodes has a description of its function, which appears when you hover over the node. + +## Setting Up a Thing + +The Thing we will create for this example is quite simple. It is a sketch to read humidity values from a **DHT11 humidity sensor**, any other values can be used alternatively, such as temperature, soil moisture, light etc. Keep in mind that the code and example below are specific to using the DHT11 humidity sensor. + +Follow the steps below to set up the Thing: + +- Go to the Arduino IoT Cloud -> Thing -> Create a Thing +- Add your Device and your Network credentials +- Add an integer Variable, with the name humidity, and set permissions to Read Only +- Go to the **"Sketch"** tab and replace the code with the code below: + +```arduino + + #include "thingProperties.h" + #include + MKRIoTCarrier carrier; + + #include // include this library, named: "dht library" + dht DHT; + #define DHT11_PIN 7 // define DHT pin + + void setup() { + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); + + carrier.begin(); + } + + void loop() { + ArduinoCloud.update(); + + int readValue = DHT.read11(DHT11_PIN); // check the data coming from the DHT pin + humidity = DHT.humidity; // assign the humidity variable to data from sensor + } + + ``` + +### Circuit + +The final step is connecting the **DHT11 humidity sensor** to our Arduino MKR Wi-Fi 1010 board, as shown in the image below. You can also freely use any other [IoT Cloud compatible board](/cloud/iot-cloud/tutorials/iot-cloud-getting-started#compatible-hardware) and a different sensor. + +![Connecting the DHT11 Sensor.](assets/rednode-09.png) + +## Communicating with Node-RED + +Use the steps below to use Node-RED with the Arduino IoT Cloud: + +![Obtaining API Key](assets/nodered-04.gif) + +**1.** Go to the Arduino IoT Cloud -> Integrations -> Create API Key + +**2.** Save the Client ID and Client Secret in a safe document + +**3.** Go to Node-RED web page at [http://localhost:1880](http://localhost:1880) + +**4.** Add the Arduino IoT Cloud "**property out**" node from the palette menu on the left side + +**5.** Double click on the node -> select "Add new Arduino-connection" + +**6.** Click on the pen icon to enter the API Key details -> enter the Client ID and Client Secret saved in the previous steps -> click on the ADD button + +**7.** You should now be able to select any of your Things and properties (Variables). In our case, we select the **Humidity Thing**, and **humidity property** (Variable) to retrieve data values from. + +![Communicating with the Cloud.](assets/nodered-05.gif) + +![Values in console.](assets/nodered-06.gif) + +### Creating a Flow + +Now that you have a node pulling data from the Arduino IoT Cloud, you need to use the *Inject* node in order to manipulate and send the data. All you need to do is dragging the *Inject* node and connect it to the property out node, then double-clicking on the inject node to ensure that the right Thing and property are selected. + +Finally, we will add a debug node from the top of the palette menu, to print the values coming from the Arduino IoT Cloud into the console. You will now be able to see the values from the humidity sensor printed into the Node-RED console. + +The next step is adding a **function node** that processes the data coming from the Arduino IoT Cloud. This node is important when working with a constant flow of data, as it allows you to use JavaScript code to create customized triggers from the received values. After dragging the function node into the editor, double-click on the node and select **"on message"** tab, then insert the code below: + +```js +let data = msg.payload; +let trigger = context.get("status"); + +if(typeof trigger == "undefined") +trigger = false; + +if(data>60 && !trigger){ + trigger = true; + context.set("status",trigger); + return msg; +} + +if(data<60 && trigger){ + trigger = false; + context.set("status",trigger); + return msg; +} +``` + +This code will only send values when they are above 60, or when they change back to below 60. You can connect it to the flow, in between the humidity inject node, and the debug node. Try it out by blowing air on the humidity sensors to increase the values. + +![Filtering values with a function.](./assets/nodered-07.gif) + +### Sending Email Notifications + +Now that you are able to pull and manipulate data from the Arduino IoT Cloud, it's time to use this data. In this example, we will show how to send alarm notifications to your email, using the Arduino IoT Cloud. To achieve this, we need to add an email nodes following the steps below: + +- Click on the menu in the header bar in the top right corner. +- Select **"Manage palette"**. +- Go to the "install" tab. +- Search for "Email". +- From the shown results, install **"node-red-node-email"**. + +Next, drag the email node from the palette menu on the left side into the editor. Double-click on the node, then enter an email to send the data to, as well as your email information to send the data from. + +![Email node](./assets/nodered-08.png) + +Now, all you need to do is replace the debug node with the email node to receive email notifications with the humidity data received from the Arduino IoT Cloud. You can customize the emails using the function node if you wish. + +## Further Applications + +In this tutorial we demonstrated how you can use the [Arduino IoT Cloud](https://create.arduino.cc/iot/) together with [Node-RED](https://nodered.org/) to build a more complex automation applications. The email notification is only one of the many different use cases, other applications can be creating communication between the Arduino IoT Cloud to other home automation devices, sending customized SMS and WhatsApp messages, and many more. diff --git a/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data-dashboard.png b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data-dashboard.png new file mode 100644 index 0000000000..e35a2ba29e Binary files /dev/null and b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data-dashboard.png differ diff --git a/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data-selecting-variable.png b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data-selecting-variable.png new file mode 100644 index 0000000000..d1df1c9181 Binary files /dev/null and b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data-selecting-variable.png differ diff --git a/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data.png b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data.png new file mode 100644 index 0000000000..5b73b98baa Binary files /dev/null and b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/assets/cloud-historical-data.png differ diff --git a/content/arduino-cloud/02.features/08.iot-cloud-historical-data/iot-cloud-historical-data.md b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/iot-cloud-historical-data.md new file mode 100644 index 0000000000..c0d903f233 --- /dev/null +++ b/content/arduino-cloud/02.features/08.iot-cloud-historical-data/iot-cloud-historical-data.md @@ -0,0 +1,64 @@ +--- +title: 'Historical Data on Arduino IoT Cloud' +difficulty: easy +description: 'Learn how to download historical data from the Arduino IoT Cloud' +tags: [IoT Cloud, Historical Data] +author: 'Benjamin Dannegård' +software: + - iot-cloud +--- + +## Introduction + +It is possible to download historical data from your [Arduino IoT Cloud]((https://create.arduino.cc/iot/)) Things and Variables. It is downloaded in `.csv` format, and can be used for data comparison. + +## Goals + +The goals of this tutorial are: + +- Learn about Arduino cloud historical data +- Learn how to use this data + +## Hardware & Software Needed + +You do not need an active board to download the historical data, but for initial data collection, you will need a cloud compatible board. + +To see all compatible boards, check out the link below: + +- [Arduino IoT Cloud compatible boards](/cloud/iot-cloud/tutorials/iot-cloud-getting-started#compatible-hardware). + +### Different Historical Data + +If you are running a home automation to turn the lights on when it's dark, your system is working with (pretty much) real-time data. So 24 hours of sensor information is perfectly adequate. It's not like you'll be turning a lamp on or off based on yesterday's ambient light levels. + +A weather station might work a bit differently though. If you're measuring the temperature or rainfall or daylight hours, you may want to build a comparison to see how the weather is changing. In this case using 15 days of data would be more suitable, allowing you to monitor and record recent changes in your weather station's variables. + +Historical data for an IoT greenhouse, or maybe an aquarium or terrarium, would be much more important. Maybe it's even an industrial project that's monitoring equipment for predictive maintenance needs. In these cases, being able to look back at your variables over previous weeks and months could be essential. + +### Putting Historical Data to Use in Arduino Cloud + +Arduino Cloud is really clever when it comes to the data generated by sensors and used as variables. For example, you can specify how often new data is sent to your Arduino Cloud. Let's say you are monitoring Wi-Fi signal strength at the end of the garden, where a project (weather station for example) is installed. If this is a solar and/or battery powered device, power consumption becomes essential. By changing the data sampling interval from updating a variable on Arduino Cloud every second to updating once a minute, you can extend battery life by a huge amount. The device is only operating a fraction of the time it was before, and the information is just as useful. + +Combined with 15 days or three months of historical data, you can build a detailed picture of Wi-Fi performance that lets you keep everything running perfectly. Or, if you need to find out when and why your signal has been dropping, the story is right there in your Arduino Cloud dashboard historical data. + +## Instructions + +### Downloading Historical Data + +First, to download historical data navigate into one of your dashboards on the [Arduino IoT Cloud](https://create.arduino.cc/iot/dashboards). + +![Arduino cloud dashboard](assets/cloud-historical-data-dashboard.png) + +While in the dashboard press the "i" icon up in the right corner. When this icon is pressed a window will show up that allows you to download historical data. As shown in the image below. + +![Window with historical data inside dashboard](assets/cloud-historical-data.png) + +Clicking “Historical Data” that gives you a list of all variables in use. From here you can select all the ones you want to download by selecting the check boxes. If your dashboard is using multiple Things, you can swap between them from the dropdown at the top. + +![Selecting variables for historical data](assets/cloud-historical-data-selecting-variable.png) + +Simply choose the variables and Things you want to export and click the "Select Data Source" button. You’ll be taken to a new window where you confirm that you want to download the data. You will receive an email shortly after, providing you with a link to download your data as individual CSV files. + +## Conclusion + +In this tutorial you learned what applications historical data could have. And how to extract historical data from your Arduino IoT Cloud dashboard. \ No newline at end of file diff --git a/content/arduino-cloud/02.features/features.md b/content/arduino-cloud/02.features/features.md new file mode 100644 index 0000000000..d68e9a7ade --- /dev/null +++ b/content/arduino-cloud/02.features/features.md @@ -0,0 +1,3 @@ +--- +title: Features +--- \ No newline at end of file diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/alexa-mkr-rgb-shield.md b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/alexa-mkr-rgb-shield.md new file mode 100644 index 0000000000..88bcee0adf --- /dev/null +++ b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/alexa-mkr-rgb-shield.md @@ -0,0 +1,248 @@ +--- +title: 'Arduino IoT Cloud, MKR RGB Shield and Alexa integration' +compatible-products: [mkr-wifi-1010, mkr-rgb-shield] +difficulty: intermediate +description: 'Learn how to build a smart lamp by integrating the Arduino IoT Cloud and Alexa.' +tags: +- Alexa +- Smart lamp +author: 'Karl Söderby' +featuredImage: 'cloud' +--- + +## Introduction + +In this tutorial, we will find out how to create a smart colored light with the help of Arduino IoT Cloud and the Alexa app. We will set it up so that we can control the brightness and color of the pixels onboard the [MKR RGB Shield](https://store.arduino.cc/arduino-mkr-rgb-shield). + +## Goals + +The goals of this project are: + +- Set up the Arduino IoT Cloud. +- Create a program that controls the RGB pixels. +- Install the Arduino Skill on the Alexa app. +- Sync the Arduino IoT Cloud with Alexa. + +## Hardware & Software needed + +- [Arduino IoT Cloud](https://create.arduino.cc/iot/) +- [Amazon Alexa skill](https://www.amazon.com/Arduino-LLC/dp/B07ZT2PK2H) +- [Arduino MKR WiFi 1010](https://store.arduino.cc/mkr-wifi-1010). +- [MKR RGB Shield](https://store.arduino.cc/arduino-mkr-rgb-shield) + +## Circuit + +Simply mount the MKR RGB Shield on top of the MKR WiFi 1010. + +![Mounting the shield.](assets/alexa-mkr-rgb-shield-img-01.png) + +## Step 1: Setting up the Arduino IoT Cloud + +Let's start by navigating to the Arduino IoT Cloud. + +>**Note:** You will need a Arduino account to use the Arduino IoT Cloud. If you do not have one, you will be directed to the account registration. + +### Configure a new device + +Once we are in the Arduino IoT Cloud, we will need to click on the **"Devices"** tab. This will open a new page which will ask you to add a new device. Click on the **"Add device"** button. + +![Adding a new device.](assets/new_device.png) + +You will now have an option of either configuring a new Arduino device, or a third party device. Select the **"Set up an Arduino device** option. + +![Selecting the type of device.](assets/device_setup_1.png) + +At this point, you will need to connect your cloud compatible board to your computer. You will also need to have installed the Arduino Create Agent. If if it is not installed, the set up wizard will ask you to install it. Your device should now show up, and you will need to click on the **"Configure"** +button. + + +![Device found.](assets/device_setup_2.png) + +You will now be asked to name your device. In this case, a name was randomly generated, which is **Phil**. Click on **"Next"** to proceed. + +![Naming the device.](assets/device_setup_3.png) + +After clicking on next, the board will start to configure. This process may take a few minutes. + +![The configuration process.](assets/device_setup_4.png) + +Once it is done, we will be directed to the devices page, where we can see our device. Congratulations, you have just made your first device IoT ready! + +![Configuration complete!](assets/device_overview.png) + +### Creating a Thing and linking your device + +After our device is configured, we can move on to the next step: creating our very first Thing. Click on the **"Things"** tab. You should now see a button that says **"Create thing"**, which we will need to click. + +![Creating a thing.](assets/new_thing.png) + +We will now see an interface with multiple options. This is your Thing configuration overview. Here we can select what network we are connecting to, what device we are using and create variables that we want to sync. + +![Overview of a Thing.](assets/thing_overview.png) + +Let's start by linking our freshly configured device, by clicking on the **"Select Device"** button to the right. This will open up a window, where we can **"Associate"** the board with this Thing. + +![Associating the device.](assets/associate_device.png) + +### Creating the RGB variable + +After our device is configured, we need to create the variable that will store the R, G, B data that will be retrieved from Alexa. Click on the **"Add Variable"** button in the Thing overview. + +![The "Add Variable" button.](assets/alexa-mkr-rgb-shield-img-02.png) + +Name the variable **LoungeArea**, and for variable type, select the **Colored Light**. When done, click on **"Add Variable"**. + +![Adding a variable.](assets/alexa-mkr-rgb-shield-img-03.png) + +### Adding your network details + +Now that we have created a variable, we can configure the **network details**. This is done by clicking on the **"Configure"** button in the **"Network"** section. + +![Entering the network details.](assets/alexa-mkr-rgb-shield-img-04.png) + +>**Note:** You can't enter any network details until you have added a variable. + +### Creating the program + +With all configurations done, we can move onto creating the program. By clicking on the **"Sketch"** tab, we can start editing the code right away. + +![Click on the "Sketch" tab to edit the sketch.](assets/alexa-mkr-rgb-shield-img-05.png) + +First of all, we need to include two libraries called `ArduinoGraphics` and `Arduino_MKRRGB`. These will help us control the MKR RGB Shield. + +We will only be adding a couple of lines inside the `setup()`, and then the functionality of the program will all be stored inside the `onLoungeAreaChange()` function. The `loop()` will remain empty. + +When we later on will be connecting the cloud to Alexa, the data will be received directly from the Alexa app. Whenever the data updates, the `onLoungeAreaChange()` will execute, where it will fetch the data from Alexa (the RGB values) and display them on the RGB matrix. You can find the full code in the snippet below. + +```arduino +#include +#include +#include "thingProperties.h" + +void setup() { + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + MATRIX.begin(); + MATRIX.brightness(10); + + while(!Serial); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + /* + The following function allows you to obtain more information + related to the state of network and IoT Cloud connection and errors + the higher number the more granular information you’ll get. + The default is 0 (only errors). + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); +} + +void loop() { + ArduinoCloud.update(); + // Your code here +} + + +void onLoungeAreaChange() { + uint8_t r, g, b; + loungeArea.getValue().getRGB(r, g, b); + if (loungeArea.getSwitch()) { + Serial.println("R:"+String(r)+" G:"+String(g)+ " B:"+String(b)); //prints the current R, G, B values + MATRIX.beginDraw(); //starts a new "drawing" on the RGB shield's pixels + MATRIX.clear(); //clears the RGB shield's pixels + MATRIX.noStroke(); + MATRIX.fill(r, g, b); //the r, g, b values are fed into the shield's pixels + MATRIX.rect(0, 0, MATRIX.width(), MATRIX.height()); //creates a rectangle (this covers the entire matrix) + MATRIX.endDraw(); // ends the draw, and displays the new "drawing" + + } + else{ + Serial.println("Lamp Off"); + //the following code simply turns everything off + MATRIX.beginDraw(); + MATRIX.clear(); + MATRIX.noStroke(); + MATRIX.fill(0, 0, 0); + MATRIX.rect(0, 0, MATRIX.width(), MATRIX.height()); + MATRIX.endDraw(); + + } +} +``` + +### Uploading the program + +Upload the code in the snippet above to your MKR WiFi 1010 board. When it has successfully uploaded, go to the **"Serial Monitor"** tab to initialize the program. If the connection is successful, we should see the following: + +![Information regarding connection to network & cloud.](assets/alexa-mkr-rgb-shield-img-05.1.png) + +We can now move on to the next step: **setting up Alexa.** + +## Step 2: Setting up Alexa + +We will now need the Amazon Alexa app which can be downloaded from the [Apple App Store](https://apps.apple.com/us/app/amazon-alexa/id944011620) or the [Google Play Store](https://play.google.com/store/apps/details?id=com.amazon.dee.app&hl=en). Once installed, login with your existing account or create a new one. + +### Installing the Arduino Alexa Skill + +Let's go through the steps necessary to install the Arduino Alexa Skill. + +![Installing the Alexa Skill.](assets/alexa_phone_1.png) + +1. Once in the Amazon Alexa app, begin by tapping on "Devices". +2. Tap on the "Enable Smart home skills" button. +3. We will now see a list of featured ones, where we need to search for the right skill. +4. If we search for "Arduino" we will see a skill that has that exact name. + +![Installing the Alexa skill part 2.](assets/alexa_phone_2.png) + +5. Once we have selected it, we'll need to enable it. +6. We now need to sync it with our Arduino Cloud, by logging into it. +7. Our Alexa and Arduino IoT Cloud is now synced! +8. We can now start discovering our devices! + +![Looking for devices.](assets/alexa_phone_3.png) + +### Amazon Alexa devices setup + +After waiting a little bit, we should see a new screen appear, where it says **"1 light found and connected"**. + +Click **"Set Up Device"**. If you like you can also add it to a group (this way you can control and organize your devices more easily), otherwise skip this part. + +![Light found and connected.](assets/alexa-mkr-rgb-shield-img-06.png) + +Congratulations! You should now be able to control the lights through your Alexa app. + +## Step 3: Controlling the lights + +To control the lights on our setup, we will need to head over to the **"Devices"** tab in the Alexa app. Once in the Devices tab, click on the **"Lights"** button. We will now see the available lights. If you have other lights already connected, they will appear here as well. In our case, we only have one, which is **LoungeArea**, which is the same name as the variable we created earlier in the Arduino IoT Cloud. If we click on **LoungeArea** we will access the color / brightness control. + +![Controlling the lights through the Alexa app.](assets/alexa-mkr-rgb-shield-img-07.png) + +Any changes of color / brightness you make will be sent to our MKR WiFi 1010, which will change the pixels on the MKR RGB Shield accordingly. + +### Troubleshooting + +One great way of knowing if data is coming through from the Alexa app is by checking the Serial Monitor. The sketch that we uploaded to the board includes a command that prints out the value of **r, g** and **b** whenever they receive new data. If the board is successfully connecting to the cloud, it is most likely a problem on setting up the Alexa device. + +## Conclusion + +In this tutorial, we went through a few simple steps to integrate a MKR WiFi 1010 + MKR RGB Shield, the Arduino IoT Cloud and the Amazon Alexa app. + +![The Alexa and Arduino IoT Cloud integration.](assets/alexa-mkr-rgb-shield-img-08.png) + +As a result, we now have a smart light that can be controlled directly through the Alexa app, and if you have a physical Alexa device, you can start playing around with different voice commands, such as changing the color and brightness of your lamp! + +## More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). + diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-01.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-01.png new file mode 100644 index 0000000000..51eee6b0d1 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-01.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-02.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-02.png new file mode 100644 index 0000000000..3001f09385 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-02.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-03.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-03.png new file mode 100644 index 0000000000..5707976f2c Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-03.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-04.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-04.png new file mode 100644 index 0000000000..af0bc52f20 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-04.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-05.1.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-05.1.png new file mode 100644 index 0000000000..c70be71cf0 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-05.1.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-05.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-05.png new file mode 100644 index 0000000000..30ed0c6445 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-05.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-06.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-06.png new file mode 100644 index 0000000000..c5fddbe99e Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-06.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-07.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-07.png new file mode 100644 index 0000000000..7020abac27 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-07.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-08.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-08.png new file mode 100644 index 0000000000..f7d582ab99 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa-mkr-rgb-shield-img-08.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_circuit_1.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_circuit_1.png new file mode 100644 index 0000000000..84839468ff Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_circuit_1.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_circuit_2.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_circuit_2.png new file mode 100644 index 0000000000..2be8ba27bf Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_circuit_2.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_1.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_1.png new file mode 100644 index 0000000000..19491139e6 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_1.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_2.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_2.png new file mode 100644 index 0000000000..0365d51f42 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_2.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_3.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_3.png new file mode 100644 index 0000000000..62c08a2fc9 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_3.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_4.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_4.png new file mode 100644 index 0000000000..8beefd9fca Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_4.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_5.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_5.png new file mode 100644 index 0000000000..17be8ca54c Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_phone_5.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_variables.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_variables.png new file mode 100644 index 0000000000..e63e3fbb7a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/alexa_variables.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/associate_device.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/associate_device.png new file mode 100644 index 0000000000..705c592dbc Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/associate_device.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/dashboard_edit_blank.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/dashboard_edit_blank.png new file mode 100644 index 0000000000..15e2954017 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/dashboard_edit_blank.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_overview.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_overview.png new file mode 100644 index 0000000000..4d0a44ed2a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_overview.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_1.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_1.png new file mode 100644 index 0000000000..5c72e0dc44 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_1.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_2.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_2.png new file mode 100644 index 0000000000..dc1d17ba7e Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_2.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_3.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_3.png new file mode 100644 index 0000000000..32775546b9 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_3.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_4.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_4.png new file mode 100644 index 0000000000..afcb09bd1e Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/device_setup_4.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_dashboard.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_dashboard.png new file mode 100644 index 0000000000..be696ec4ee Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_dashboard.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_device.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_device.png new file mode 100644 index 0000000000..96e6c0fb3a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_device.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_thing.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_thing.png new file mode 100644 index 0000000000..dde2c600df Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/new_thing.png differ diff --git a/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/thing_overview.png b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/thing_overview.png new file mode 100644 index 0000000000..8bc9701882 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/alexa-mkr-rgb-shield/assets/thing_overview.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG01.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG01.png new file mode 100644 index 0000000000..12c7b4f23a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG01.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG02.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG02.png new file mode 100644 index 0000000000..507218edc8 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG02.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG03.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG03.png new file mode 100644 index 0000000000..67536121a6 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG03.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG04.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG04.png new file mode 100644 index 0000000000..b4ad10f232 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG04.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG05.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG05.png new file mode 100644 index 0000000000..9117af0c00 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG05.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG06.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG06.png new file mode 100644 index 0000000000..b50412ef0b Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG06.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG07.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG07.png new file mode 100644 index 0000000000..2920b11540 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG07.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG08.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG08.png new file mode 100644 index 0000000000..90e3f98217 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG08.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG09.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG09.png new file mode 100644 index 0000000000..5ff076e163 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG09.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG10.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG10.png new file mode 100644 index 0000000000..c48c71d41a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/IoT_ENV_IMG10.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/MKRENV_T1_IMG01.5.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/MKRENV_T1_IMG01.5.png new file mode 100644 index 0000000000..a58497d701 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/MKRENV_T1_IMG01.5.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/associate_device.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/associate_device.png new file mode 100644 index 0000000000..705c592dbc Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/associate_device.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/dashboard_edit_blank.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/dashboard_edit_blank.png new file mode 100644 index 0000000000..15e2954017 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/dashboard_edit_blank.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_overview.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_overview.png new file mode 100644 index 0000000000..4d0a44ed2a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_overview.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_1.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_1.png new file mode 100644 index 0000000000..5c72e0dc44 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_1.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_2.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_2.png new file mode 100644 index 0000000000..dc1d17ba7e Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_2.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_3.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_3.png new file mode 100644 index 0000000000..32775546b9 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_3.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_4.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_4.png new file mode 100644 index 0000000000..afcb09bd1e Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/device_setup_4.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_dashboard.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_dashboard.png new file mode 100644 index 0000000000..be696ec4ee Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_dashboard.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_device.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_device.png new file mode 100644 index 0000000000..96e6c0fb3a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_device.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_thing.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_thing.png new file mode 100644 index 0000000000..dde2c600df Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/new_thing.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/thing_overview.png b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/thing_overview.png new file mode 100644 index 0000000000..8bc9701882 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-environmental-data/assets/thing_overview.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-environmental-data/cloud-environmental-data.md b/content/arduino-cloud/03.tutorials/cloud-environmental-data/cloud-environmental-data.md new file mode 100644 index 0000000000..cdebc7a060 --- /dev/null +++ b/content/arduino-cloud/03.tutorials/cloud-environmental-data/cloud-environmental-data.md @@ -0,0 +1,219 @@ +--- +title: 'Environmental data in the Arduino IoT Cloud' +compatible-products: [mkr-wifi-1010, mkr-env-shield] +difficulty: easy +description: 'Learn how to collect environmental data from the MKR ENV Shield and display it in the Arduino IoT Cloud.' +tags: + - Environmental data + - Sensors +author: 'Karl Söderby' +featuredImage: 'cloud' +--- + +## Introduction + +In this tutorial, we will combine the functionality of the [MKR WiFi 1010](https://store.arduino.cc/mkr-wifi-1010) and the [MKR ENV Shield](https://store.arduino.cc/arduino-mkr-env-shield). The shield, mounted on top of the board, will record environmental data, such as temperature, humidity, pressure and illuminance. This data will be synced with the [Arduino IoT Cloud](https://create.arduino.cc/iot/), a service that allows us to remotely control and monitor our devices. + +This means that whenever we read data on the board, it will also be visible in the cloud dashboard, where we can create different ways of visualizing the data. + +>**Note:** Newer versions of the MKR ENV Shield does not have the UV sensor component. You can read more about the different versions in [this Arduino Help Center article](https://support.arduino.cc/hc/en-us/articles/360019197540-Different-MKR-ENV-Shield-versions). + +## Goals + +The goals of this project are: + +- Configure the Arduino IoT Cloud. +- Create a program to read the sensors on the MKR ENV shield. +- Read the data live in the Cloud dashboard. + +## Hardware & Software needed + +- [Arduino IoT Cloud](https://create.arduino.cc/iot/). +- [Arduino MKR WiFi 1010](https://store.arduino.cc/mkr-wifi-1010). +- [Arduino MKR ENV Shield](https://store.arduino.cc/arduino-mkr-env-shield). +- [Arduino_MKRENV](https://www.arduino.cc/en/Reference/ArduinoMKRENV) library. + +## Circuit + +![Mount the shield.](assets/IoT_ENV_IMG01.png) + +## Configuring the IoT Cloud + +The first step in this tutorial is to navigate to the [Arduino IoT Cloud](https://create.arduino.cc/iot/). If you are not logged in, or do not have an account, you will be re-directed to the login page. Here you can create a new account or log in to an existing one. + +### Configure a new device + +Once we are in the Arduino IoT Cloud, we will need to click on the **"Devices"** tab. This will open a new page which will ask you to add a new device. Click on the **"Add device"** button. + +![Adding a new device.](assets/new_device.png) + +You will now have an option of either configuring a new Arduino device, or a third party device. Select the **"Set up an Arduino device** option. + +![Selecting the type of device.](assets/device_setup_1.png) + +At this point, you will need to connect your cloud compatible board to your computer. You will also need to have installed the Create plugin. If if it is not installed, the set up wizard will ask you to install it. Your device should now show up, and you will need to click on the **"Configure"** +button. + +![Device found.](assets/device_setup_2.png) + +You will now be asked to name your device. In this case, a name was randomly generated, which is **Phil**. Click on **"Next"** to proceed. + +![Naming the device.](assets/device_setup_3.png) + +After clicking on next, the board will start to configure. This process may take a few minutes. + +![The configuration process.](assets/device_setup_4.png) + +Once it is done, we will be directed to the devices page, where we can see our device. Congratulations, you have just made your first device IoT ready! + +![Configuration complete!](assets/device_overview.png) + +### Creating a Thing and linking your device + +After our device is configured, we can move on to the next step: creating our very first Thing. Click on the **"Things"** tab. You should now see a button that says **"Create thing"**, which we will need to click. + +![Creating a thing.](assets/new_thing.png) + +We will now see an interface with multiple options. This is your Thing configuration overview. Here we can select what network we are connecting to, what device we are using and create variables that we want to sync. + +![Overview of a Thing.](assets/thing_overview.png) + +Let's start by linking our freshly configured device, by clicking on the **"Select Device"** button to the right. This will open up a window, where we can **"Associate"** the board with this Thing. + +![Associating the device.](assets/associate_device.png) + +### Creating variables + +Now, we can continue to create variables for our Thing. These variables will be synced with the cloud, as long as the board is connected to Internet and the cloud. + +To create variables, simply click on the **"Add variable"** button. This will open up a new window. + +![The "Add Variable" button.](assets/MKRENV_T1_IMG01.5.png) + +Here, we will name our variable `temperature` and choose the data type `float`. Click **"Add variable"** at the bottom to add it. + +![Creating a variable.](assets/IoT_ENV_IMG02.png) + +Now, we need to add the rest of the variables in a very similar fashion, but changing the name. The variables that we need to add can be seen in the table below: + +| Name | Data type | +| ----------- | --------- | +| humidity | float | +| illuminance | float | +| pressure | float | +| **uva**\* | float | +| **uvb**\* | float | +| **uvIndex**\* | float | + +>**Note:** the `uva`, `uvb` and `uvIndex` variables will only work with the MKR ENV Shield v1. Newer versions does not have the UV sensor. If you have a newer version, do not add these variables. You can read more about the different versions in the this [Arduino Help Center article](). + +When we have added these, the variable list will look something like this: + +![full list of variables.](assets/IoT_ENV_IMG04.png) + +Now as a final part of the configuration, we just need to add our network details. Click on the button in the **Network** section, and enter your credentials to your Wi-Fi network. + +![Entering the network details.](assets/IoT_ENV_IMG05.png) + +## Creating the program + +Now, the final thing needed is the actual program that will run on the MKR 1010 board. We can edit the program directly in the Arduino IoT Cloud, by clicking on the **"Sketch"** tab. This will open up the built-in editor, where we can write the program directly. + +![The sketch tab.](assets/IoT_ENV_IMG06.png) + +For the program, we will need to include the **Arduino_MKRENV** library, which is used to read all the sensors. Below is the code that will allow us to do so, and you can see that the variables in the code is identical to the ones we just created. + +Copy and paste the code below, and upload the program to the board, by clicking the upload button at the top of the editor. + +>**Note:** Newer versions of the MKR ENV Shield does not have the UV sensor component. You will need to remove the `ENV.readUVA()`, `ENV.readUVB()` and `ENV.readUVIndex()` functions in the program if you have a newer version. + +```arduino +#include "thingProperties.h" +#include + +void setup() { + // Initialize serial and wait for port to open: + Serial.begin(9600); + + while(!Serial); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + /* + The following function allows you to obtain more information + related to the state of network and IoT Cloud connection and errors + the higher number the more granular information you’ll get. + The default is 0 (only errors). + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); + + if (!ENV.begin()) { + Serial.println("Failed to initialize MKR ENV shield!"); + while (1); + } + +} + +void loop() { + ArduinoCloud.update(); + // Your code here + temperature = ENV.readTemperature(); + humidity = ENV.readHumidity(); + pressure = ENV.readPressure(); + illuminance = ENV.readIlluminance(); + uva = ENV.readUVA(); //comment out if using a newer version of the ENV shield + uvb = ENV.readUVB(); //comment out if using a newer version of the ENV shield + uvIndex = ENV.readUVIndex(); //comment out if using a newer version of the ENV shield +} +``` + +Once the code has been uploaded, open the Serial Monitor (tab next to sketch) to initialize the program. If everything went well, it should like the image below: + +![Information regarding connection to network & cloud.](assets/IoT_ENV_IMG07.png) + +The most important thing is that the two following commands are printed: + +``` +Connected to "Network" +Connect to the Arduino IoT Cloud +``` + +## Building a dashboard + +Once we have confirmed that the board is connected to the cloud, the last step is to build the dashboard that we can monitor the environmental data in. Click on the **"Dashboards"** tab, which will take you to the dashboards page. Here, we need to click on the **"Build Dashboard"** button. + +![Building a new dashboard.](assets/new_dashboard.png) + +We will now see an empty dashboard, where we are now going to create something called **widgets**. Widgets are the visual representation of our variables. There's two ways of creating widgets: either we add them one by one, and link them manually, or we can add and link **them all at once**. To save some time, let's do that! + +Simply click on the **"Add"** button, and a dropdown menu will appear. Here we will click on **"Things"**, and select the Thing that appears here. + +![Find and click on your Thing.](assets/IoT_ENV_IMG08.png) + +In this case, we changed the name to **Environmental Data**, but whatever you name your thing will appear here. By clicking on it, it gives you a list of variables with a checkpoint, and we can simply click **"Create widgets"** + +![Generate widgets from the variables in your Thing.](assets/IoT_ENV_IMG09.png) + +All new widgets will now appear here, and when the board is connected to the cload, it will continue to update these values. + +![The complete dashboard.](assets/IoT_ENV_IMG10.png) + +Congratulations! You can now view your real time data directly in the dashboard. + +## Conclusion + +In this tutorial, we demonstrated simply how a MKR WiFi 1010, a MKR ENV Shield and the Arduino IoT Cloud is used to create a simple IoT application. This, without having to connect a single wire, or create a difficult program: the cloud takes care of all of that. + +You can now start thinking about how this application might work in real life. There are a lot of different things you can add to it, such as wind sensors (anemometers), rain sensors, CO2 sensors and much more. With some easy connections, you can build anything you want to, connect it to the cloud and view all the data live from anywhere in the world! + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG04.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG04.png new file mode 100644 index 0000000000..4c724e551f Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG04.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG06.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG06.png new file mode 100644 index 0000000000..2f8c009acf Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG06.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG07.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG07.png new file mode 100644 index 0000000000..4d70371439 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/MKRRELAY_T1_IMG07.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/associate_device.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/associate_device.png new file mode 100644 index 0000000000..705c592dbc Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/associate_device.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-circuit.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-circuit.png new file mode 100644 index 0000000000..488ef224e2 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-circuit.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img01.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img01.png new file mode 100644 index 0000000000..aceb50a5c6 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img01.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img02.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img02.png new file mode 100644 index 0000000000..bd9c7ace91 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img02.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img03.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img03.png new file mode 100644 index 0000000000..4f52703307 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img03.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img04.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img04.png new file mode 100644 index 0000000000..7d47aff9fc Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img04.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img05.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img05.png new file mode 100644 index 0000000000..e49876b9b8 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img05.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img06.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img06.png new file mode 100644 index 0000000000..0a45e78b53 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img06.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img07.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img07.png new file mode 100644 index 0000000000..69a546cebe Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img07.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img08.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img08.png new file mode 100644 index 0000000000..ca6a45eb60 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img08.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img09.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img09.png new file mode 100644 index 0000000000..2cb0f65d7c Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img09.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img10.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img10.png new file mode 100644 index 0000000000..c5f8c710bc Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img10.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img11.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img11.png new file mode 100644 index 0000000000..0f815984c3 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/cloud-relay-control-img11.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/dashboard_edit_blank.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/dashboard_edit_blank.png new file mode 100644 index 0000000000..15e2954017 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/dashboard_edit_blank.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_overview.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_overview.png new file mode 100644 index 0000000000..4d0a44ed2a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_overview.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_1.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_1.png new file mode 100644 index 0000000000..5c72e0dc44 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_1.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_2.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_2.png new file mode 100644 index 0000000000..dc1d17ba7e Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_2.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_3.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_3.png new file mode 100644 index 0000000000..32775546b9 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_3.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_4.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_4.png new file mode 100644 index 0000000000..afcb09bd1e Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/device_setup_4.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_dashboard.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_dashboard.png new file mode 100644 index 0000000000..be696ec4ee Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_dashboard.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_device.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_device.png new file mode 100644 index 0000000000..96e6c0fb3a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_device.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_thing.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_thing.png new file mode 100644 index 0000000000..dde2c600df Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/new_thing.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/thing_overview.png b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/thing_overview.png new file mode 100644 index 0000000000..8bc9701882 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/cloud-relay-control/assets/thing_overview.png differ diff --git a/content/arduino-cloud/03.tutorials/cloud-relay-control/cloud-relay-control.md b/content/arduino-cloud/03.tutorials/cloud-relay-control/cloud-relay-control.md new file mode 100644 index 0000000000..c02861a4a4 --- /dev/null +++ b/content/arduino-cloud/03.tutorials/cloud-relay-control/cloud-relay-control.md @@ -0,0 +1,240 @@ +--- +title: 'Controlling relays from the Arduino IoT Cloud' +compatible-products: [mkr-wifi-1010, mkr-proto-relay-shield] +difficulty: easy +description: 'Learn how to control the relays onboard the MKR Relay Shield through the Arduino IoT Cloud dashboard.' +tags: + - Relays +author: 'Karl Söderby' +--- + +## Introduction + +In this tutorial, we will go through how to control a MKR WiFi 1010 + a MKR Relay shield from the [Arduino IoT Cloud](https://create.arduino.cc/iot/things). We will create a simple configuration that allows us activate each of the relays on the shield through a dashboard in the cloud. + +## Goals + +The goals of this project are: + +- Set up the Arduino IoT Cloud. +- Create a program that controls the relays. +- Create a dashboard to remotely control the relays. +- Use the Arduino IoT Cloud Remote app to control relays. + +## Hardware & Software needed + +- [Arduino IoT Cloud](https://create.arduino.cc/iot/) +- [Arduino MKR WiFi 1010](https://store.arduino.cc/mkr-wifi-1010) +- [Arduino MKR Relay Shield](https://store.arduino.cc/arduino-mkr-relay-proto-shield) +- Arduino IoT Cloud Remote app (optional). + - [Play Store](https://play.google.com/store/apps/details?id=cc.arduino.cloudiot&hl=en&gl=US) + - [Apple Store](https://apps.apple.com/us/app/arduino-iot-cloud-remote/id1514358431) + +## Circuit + +![Mount the board on top of the shield.](assets/cloud-relay-control-circuit.png) + +## Step 1: Setting up the Arduino IoT Cloud + +To do so, we will first need to configure our MKR 1010 device in the Arduino IoT Cloud. Let's start by navigating to the Arduino IoT Cloud. + +>**Note:** You will need a Arduino account to use the Arduino IoT Cloud. If you do not have one, you will be directed to the account registration. + +### Configure a new device + +Once we are in the Arduino IoT Cloud, we will need to click on the **"Devices"** tab. This will open a new page which will ask you to add a new device. Click on the **"Add device"** button. + +![Adding a new device.](assets/new_device.png) + +You will now have an option of either configuring a new Arduino device, or a third party device. Select the **"Set up an Arduino device** option. + +![Selecting the type of device.](assets/device_setup_1.png) + +At this point, you will need to connect your cloud compatible board to your computer. You will also need to have installed the Arduino Create Agent. If if it is not installed, the set up wizard will ask you to install it. Your device should now show up, and you will need to click on the **"Configure"** +button. + +![Device found.](assets/device_setup_2.png) + +You will now be asked to name your device. In this case, a name was randomly generated, which is **Phil**. Click on **"Next"** to proceed. + +![Naming the device.](assets/device_setup_3.png) + +After clicking on next, the board will start to configure. This process may take a few minutes. + +![The configuration process.](assets/device_setup_4.png) + +Once it is done, we will be directed to the devices page, where we can see our device. Congratulations, you have just made your first device IoT ready! + +![Configuration complete!](assets/device_overview.png) + +### Creating a Thing and linking your device + +After our device is configured, we can move on to the next step: creating our very first Thing. Click on the **"Things"** tab. You should now see a button that says **"Create thing"**, which we will need to click. + +![Creating a thing.](assets/new_thing.png) + +We will now see an interface with multiple options. This is your Thing configuration overview. Here we can select what network we are connecting to, what device we are using and create variables that we want to sync. + +![Overview of a Thing.](assets/thing_overview.png) + +Let's start by linking our freshly configured device, by clicking on the **"Select Device"** button to the right. This will open up a window, where we can **"Associate"** the board with this Thing. + +![Associating the device.](assets/associate_device.png) + +### Creating variables + +Now, we can continue to create **variables** for our Thing. These variables will be synced with the cloud, as long as the board is connected to Internet and the cloud. + +For this application, we will create two **boolean** variables: one for each relay on the MKR Relay Shield. + +To create a new variable, click on the **"Add Variable"** button. + +![The "Add Variable" button.](assets/cloud-relay-control-img01.png) + +Let's name it **relay_1**, and select the **boolean** data type. Then click on **"Add Variable"**. + +![Adding the first variable.](assets/cloud-relay-control-img02.png) + +Let's add another variable, but let's name this one **relay_2**, which is also a boolean variable. + +![Adding the second variable.](assets/cloud-relay-control-img03.png) + +Great, now we have two **boolean variables** named **relay_1** and **relay_2**. + +### Adding your network details + +Now that we have created the variables, we can configure the **network details**. This is done by clicking on the **"Configure"** button in the **"Network"** section. + +![Entering network details.](assets/cloud-relay-control-img04.png) + +>**Note:** You can't enter any network details until you have added a variable. + +### Creating the program + +Once we are finished with all the configurations, we can move on to creating the sketch that we are going to upload to our MKR WiFi 1010. To do so, we first need to go to the **"Sketch"** tab. + +![Open the "Sketch" tab to edit the sketch.](assets/cloud-relay-control-img05.png) + +The sketch we are going to create is very simple. As most of the code is already generated through the configurations we made, we only need to make a few additions: configuring the relay pins as output, and creating two conditionals. + +You can find the full sketch below, which we need to upload to our board. + +```arduino +#include "thingProperties.h" + +void setup() { + // Initialize serial and wait for port to open: + Serial.begin(9600); + // This delay gives the chance to wait for a Serial Monitor without blocking if none is found + delay(1500); + + pinMode(1, OUTPUT); + pinMode(2, OUTPUT); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino IoT Cloud + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + /* + The following function allows you to obtain more information + related to the state of network and IoT Cloud connection and errors + the higher number the more granular information you’ll get. + The default is 0 (only errors). + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); +} + +void loop() { + ArduinoCloud.update(); + // Your code here + +} + +void onRelay1Change() { + // Do something + if(relay_1){ + digitalWrite(1, LOW); + } + else{ + digitalWrite(1, HIGH); + } +} + +void onRelay2Change() { + // Do something + if(relay_2){ + digitalWrite(2, LOW); + } + else{ + digitalWrite(2, HIGH); + } +} +``` + +## Step 2: Creating a dashboard + +After our code has been successfully uploaded to our board, we we will need to create a dashboard to control our relays! + +Head over to the **"Dashboards"** tab, and click on **"Build Dashboard"**. + +![Click on "Build a dashboard".](assets/cloud-relay-control-img06.png) + +We can now see an empty dashboard. Let's click on the **"Add"** button, and select a **Switch** widget. + +![Adding a switch widget.](assets/cloud-relay-control-img07.png) + +Now, we need to link it with our **relay_1** variable, inside our Thing. + +![Linking a variable to the widget.](assets/cloud-relay-control-img08.png) + +We also need to rename the widget so we know which one is which. We choose **"RELAY_1"**. + +![Naming the widget.](assets/cloud-relay-control-img09.png) + +Now, repeat the same process, but instead link it to the **relay_2** variable. At the end, we should have two widgets, each linked to a relay. + +![The complete dashboard.](assets/cloud-relay-control-img10.png) + +Now you can simply test it out by turning ON or OFF the switches. You should hear the relays on your **MKR Relay Shield** making clicking noises. That means it is working! + +## Step 3: Connecting a component with higher voltage + +>**Note:** Working with higher voltage components should be done with extreme caution. Do not alter the circuit while it is connected to a higher power source, and do not connect any high voltage components directly to the Arduino. + +Up until now, we have simply activated the relays, but we still haven't connected anything to them. While we are not going to go in-depth on how to connect high power components, we can take a look at how we could connect something that operates on maximum 24V. + +Let's begin with the high power pins on the MKR Relay Shield. There are **six in total** for both relays, where there are three different type of connections: NO, COM and NC. + +![MKR Relay Shield's high power pins.](assets/MKRRELAY_T1_IMG06.png) + +In this scenario, we are going to use the **NC** configuration, which means that writing a **LOW** signal to the relay will connect the NC pin to COM, which provides power to the component connected. The circuit for this could look like this: + +![A circuit involving a 24V component.](assets/cloud-relay-control-img11.png) + +In this circuit, we are using a 24V power supply and a 24V heater. To control them, we need to use the following commands: + +To activate the relays: + +``` +digitalWrite(relay_1, LOW) +``` + +To de-activate the relays: + +``` +digitalWrite(relay_1, HIGH) +``` + +>**Note:** Use extreme caution when creating higher power circuits. Make sure that both the power supply and the component does not exceed 24V. For example, connecting it straight to a wall socket without a power converter would supply 220-240V, which is **10 times as high.** + +## Conclusion + +In this tutorial, we have gone through the necessary steps to connect a MKR WiFi 1010 + a MKR Relay Shield to the Arduino IoT Cloud. The relays can now be used to trigger higher voltage components, such as smaller heaters, fans or light bulbs. + +### More tutorials + +You can find more tutorials in the [Arduino IoT Cloud documentation page](/cloud/iot-cloud/). \ No newline at end of file diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img01.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img01.png new file mode 100644 index 0000000000..3307b564d4 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img01.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img02.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img02.png new file mode 100644 index 0000000000..4db745a95a Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img02.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img03.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img03.png new file mode 100644 index 0000000000..bfe3456c8f Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img03.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img04.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img04.png new file mode 100644 index 0000000000..f946f138c8 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img04.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img05.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img05.png new file mode 100644 index 0000000000..b82e0840a1 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img05.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img06.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img06.png new file mode 100644 index 0000000000..56a9010241 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img06.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img07.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img07.png new file mode 100644 index 0000000000..13c84bd188 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img07.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img08.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img08.png new file mode 100644 index 0000000000..b905f46674 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img08.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img09.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img09.png new file mode 100644 index 0000000000..fc7fb4e3bf Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img09.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img10.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img10.png new file mode 100644 index 0000000000..5d29330991 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img10.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img11.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img11.png new file mode 100644 index 0000000000..8fd912457f Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img11.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img12.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img12.png new file mode 100644 index 0000000000..988d6e98eb Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img12.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img13.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img13.png new file mode 100644 index 0000000000..1c1bd5d5df Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img13.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img14.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img14.png new file mode 100644 index 0000000000..779a9fe0f4 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img14.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img15.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img15.png new file mode 100644 index 0000000000..99d0ed53d2 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img15.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img16.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img16.png new file mode 100644 index 0000000000..41f609f764 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img16.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img17.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img17.png new file mode 100644 index 0000000000..80212cdf28 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img17.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img18.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img18.png new file mode 100644 index 0000000000..8d0e79cabe Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img18.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img19.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img19.png new file mode 100644 index 0000000000..13a55123a7 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img19.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img20.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img20.png new file mode 100644 index 0000000000..3964c8e2ef Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img20.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img21.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img21.png new file mode 100644 index 0000000000..179949ef45 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img21.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img22.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img22.png new file mode 100644 index 0000000000..e130b94c04 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img22.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img23.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img23.png new file mode 100644 index 0000000000..b5ea042a60 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img23.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img24.png b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img24.png new file mode 100644 index 0000000000..0639411a01 Binary files /dev/null and b/content/arduino-cloud/03.tutorials/modbus-energy-meter/assets/modbus-energy-meter_img24.png differ diff --git a/content/arduino-cloud/03.tutorials/modbus-energy-meter/modbus-energy-meter.md b/content/arduino-cloud/03.tutorials/modbus-energy-meter/modbus-energy-meter.md new file mode 100644 index 0000000000..b8c1161db7 --- /dev/null +++ b/content/arduino-cloud/03.tutorials/modbus-energy-meter/modbus-energy-meter.md @@ -0,0 +1,439 @@ +--- +title: 'Monitor Your Energy Bill with Modbus and the Arduino IoT Cloud' +description: 'Connect a Modbus energy meter to an Arduino® MKR WiFi 1010 board and a MKR 485 Shield and monitor the power consumption of your home via an Arduino Cloud IoT dashboard.' +tags: + - Modbus + - RS-485 + - Energy meter + - MKR WiFi 1010 + - Cloud IoT +author: 'Officine Innesto, José Bagur' +--- + +## Introduction + +If you really want to make your home smarter, you'll probably want start from your monthly bills (for example, energy, gas, etc...). As some say: **good for the planet, the wallet and the bottom line**. In this tutorial, we are going to learn how to connect a Modbus energy meter to the Arduino Cloud IoT using an Arduino® MKR WiFi 1010 board and an Arduino® MKR 485 Shield. + +## Goals + +The goals with this tutorial are: + +- Learn how to connect a Modbus energy meter to the [Arduino Cloud IoT](https://create.arduino.cc/iot). +- Learn how to use the [Arduino® MKR 485 Shield](https://store.arduino.cc/arduino-mkr-485-shield) with an [Arduino® MKR WiFi 1010 board](https://store.arduino.cc/arduino-mkr-wifi-1010). + +## Hardware and Software Needed + +The hardware and software used in this tutorial: + +- [Arduino Cloud IoT](https://create.arduino.cc/iot). +- [Arduino Create Agent](https://support.arduino.cc/hc/en-us/articles/360014869820-How-to-install-the-Arduino-Create-Agent). +- [Arduino Modbus library](https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus) +- [Arduino® MKR WiFi 1010](https://store.arduino.cc/arduino-mkr-wifi-1010) board. +- [Arduino® MKR 485 Shield](https://store.arduino.cc/arduino-mkr-485-shield). +- [Finder Type 7E.64 Energy Meter](https://www.findernet.com/en/usa/series/7e-series-energy-meters/type/type-7e64-energy-meter/). +- Twisted single pair shielded cable. +- Micro USB cable. + +## Electric Meters a.k.a Energy Meters + +**Energy consumption awareness** is a key factor to **reduce energy costs and improve energy efficiency**; we can measure energy consuption using **electric meters**, a.k.a **energy meters**. + +![An analog energy meter (source: General Electric)](assets/modbus-energy-meter_img01.png) + +Electric meters, also known as energy meters, are **electronic devices that can measure the amount of energy consumed by an electrically powered equipment** such as a refrigerator or a lamp. Energy meters can be use also to measure the energy consuption of houses and buildings. While different types of energy meters exist, in this tutorial we choose a [Finder Type 7E.64 Energy Meter](https://www.findernet.com/en/usa/series/7e-series-energy-meters/type/type-7e64-energy-meter/). This energy meter is designed for DIN rail use and fits perfectly in the main cabinet of our house. Also, this energy meter has a **RS-485 Modbus interface**, this is an industrial communication protocol that can be decoded in Arduino boards using an [Arduino MKR 485 Shield](https://store.arduino.cc/arduino-mkr-485-shield) and the [Arduino Modbus library](https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus). + +![Finder Type 73.64 Energy Meter (source: Finder)](assets/modbus-energy-meter_img02.png) + +## Setting Up the Finder Type 7E.64 Energy Meter + +First, you must install the energy meter in your electrical cabinet. To ensure you are working in a safe environment, turn off the power from the electrical terminal ahead of your system and double check with a multimeter that there is no voltage between the terminals. + +***Warning! Check your country regulations about dealing with your house electrical system and be extremely careful because it can be deadly! If you don't know how, call an electrician.*** + +Place the energy meter inside your cabinet and connect the live and neutral wires from the main breaker to the input of the meter, remember to use the standard color convention (blue for neutral and brown/black/grey for live in EU. The output has to be connected to the rest of the system. + +![Main voltage connections. Wires above are inputs, wires below are outputs](assets/modbus-energy-meter_img03.png) + +Now it is time make the connection between the energy meter and our MKR WiFi 1010 board! For this, we will use twisted single pair cable with ground. This type of cable is typically used for phone lines, so it can be used to transmit electrical signals over long distances (up to 1.2 km). However, we are going to use a cable long enough to exit the cabinet and place our MKR WiFi 1010 board in an accessible place. + +![Energy meter RS-485 interface connections](assets/modbus-energy-meter_img04.png) + +The RS-485 standard names its terminals **A**, **B** and **COM**. A common de-facto standard is the use of **TX+/RX+ (or D+) as an alternative for B** (high for mark i.e. idle) and **TX-/RX- (or D-) as an alternative for A** (low for mark i.e. idle). As shown in the image above, we connected the **red cable to the D+ terminal**, the **white cable to the D- terminal** and the **brown cable to the COM terminal** of the energy meter. You can read more about the RS-485 standard [here](https://en.wikipedia.org/wiki/RS-485). + +The Finder energy meter supports **half-duplex communication**, this means that **data can move in two directions, but not at the same time**. The MKR 485 Shield supports both half and full-duplex communication (this means data moving in two directions simultaneously), so we need to set up the shield for half-duplex communication. **In the MKR 485 Shield, half-duplex communication uses Y and Z terminals**, **Y terminal is B or D+ and Z terminal y A or D-**, this means that the red cable must be connected to Y terminal and the white cable to Z terminal; the brown cable (COM) must be connected to ISOGND terminal. Also, we need to set the second switch to HALF (2 to OFF) and the third switch to Y-Z (3 to ON): the first switch is not used in half-duplex communication. The third switch is used for setting up the termination, this is a resistor connecting the two data terminals that is used for dampening interferences. The complete shield setup is shown in the image below: + +![MKR 485 Shield setup and connections](assets/modbus-energy-meter_img05.png) + +Now, we can connect the MKR 485 Shield and the MKR WiFi 1010 board: + +![MKR 485 Shield setup and connections](assets/modbus-energy-meter_img06.png) + +Now that we have finished setting up the hardware, it is time to connect our energy meter to the Arduino Cloud IoT + +## Setting Up the Arduino Cloud IoT + +First, we need to register and configure our MKR WiFi 1010 board in the Arduino Cloud IoT. Let's start by navigating to [Arduino Cloud IoT](https://create.arduino.cc/iot). + +***Note: You will need a Arduino account to use the Arduino Cloud IoT. If you do not have one, you will be redirected to the account registration site.*** + +### Configure a New Device in the Arduino Cloud IoT + +Once we are in the Arduino Cloud IoT, we will need to select "**Devices**" tab. This will open a new page which will ask you to add a new device. Click on the "**ADD DEVICE**" button. + +![Adding a new device to our Arduino Clout IoT account](assets/modbus-energy-meter_img07.png) + +In the set up wizard, we will now have an option of either configuring a new Arduino® device, or a third party device. Let's select the "**Set up an Arduino device**" option. + +![Selecting the type of device to set up](assets/modbus-energy-meter_img08.png) + +At this point, we will need to connect our MKR WiFi 1010 board to our computer; we will also need to have installed the **Arduino Create Agent** in our computer. If the Arduino Create Agent is not installed, the set up wizard will ask us to install it. Our device should now show up as shown in the image below. Now its time to configure it, let's select the "**CONFIGURE**" button. + +![MKR WiFi 1010 board found!](assets/modbus-energy-meter_img09.png) + +Now we must name our device. In this case, we named our device as "**EnergyMeter001**"; names can be randomly generated also by the set up wizard. Let's continue by selecting the "**NEXT**" button. + +![Naming our MKR WiFi 1010 board](assets/modbus-energy-meter_img10.png) + +After selecting the "**NEXT**" button, the set up wizard will start to configure our board. This process may take a few minutes. + +![Configuration process of our MKR WiFi 1010 board and the Arduino Cloud IoT](assets/modbus-energy-meter_img11.png) + +Once it is done, select the "**DONE**" button, we will be redirected to the "Devices" page. In this page we are going to be able to see our device. Congratulations! The configuration of our board and the Arduino Cloud IoT is done, now we can create a "Thing" with it. + +![Configuration process of our MKR WiFi 1010 board and the Arduino Cloud IoT](assets/modbus-energy-meter_img12.png) + +### Create a New Thing in the Arduino Cloud IoT + +After our board is configured in the Arduino Cloud IoT, we can move on to the next step: creating a "Thing". Let's select the "**Things**" tab and then select the "**CREATE THING**" button. + +![Creation of a "Thing" in the Arduino Cloud IoT complete](assets/modbus-energy-meter_img13.png) + +We will be redirected to a page with our "Thing" configuration overview. Here we can define our "Thing" name, select to what network we are connecting to, what device we are using with out "Thing" and create variables that we want to to connect from our board to our "Thing" in the Arduino Cloud IoT. + +![Overview of a "Thing" in the Arduino Cloud IoT](assets/modbus-energy-meter_img14.png) + +Let's start by giving a name to our "Thing" and linking our freshly configured device. We named our Thing as "**Energy Thing**", this can be done by clicking in "**Untitled**". To link out freshly configured device, we select the "**Select Device**" button located to the right. This will open up a window where we can associate a previously configured device with our "Thing" by selecting the "**ASSOCIATE**" button. + +![Associating a device to a "Thing" in the Arduino Cloud IoT](assets/modbus-energy-meter_img15.png) + +### Creating Variables for a "Thing" in the Arduino Cloud IoT + +Now, let's create **variables** for the "Energy Thing". The variables we are going to create will be synced, automatically, with the Arduino Cloud IoT as long as the board is connected to Internet and the Arduino Cloud IoT. Let's create create a new variable by selecting the "**Add Variable**" button. + +!["ADD VARIABLE" button in the Arduino Cloud IoT](assets/modbus-energy-meter_img16.png) + +This will open up a window where we can create new variables and define its characteristics. The first variable we are going to create will be named "**voltage**"; this variable will have the following characteristics: + +- **Variable type**: Floating Point Number. +- **Variable permission**: read only. +- **Variable update policy**: on change (threshold do not changes). + +![Adding a variable to the "Energy Thing"](assets/modbus-energy-meter_img17.png) + + Repeat this process for the variables and its characteristics shown in the table below: + +| **Variable** | **Type** | **Permission** | **Update Policy** | +|:---------:|:---------------------:|:----------:|:---------------:| +| voltage | Floating Point Number | Read Only | On change | +| current | Floating Point Number | Read Only | On change | +| power | Floating Point Number | Read Only | On change | +| frequency | Floating Point Number | Read Only | On change | +| energy | Floating Point Number | Read Only | On change | + + +The created variables should appear now in the "Energy Thing" overview. + +![Variables of the "Energy Thing"](assets/modbus-energy-meter_img18.png) + +### Network Credentials for a "Thing" in the Arduino Cloud IoT + +Now that we have created the variables for the "Energy Thing", we can configure the network details. This can be done by selecting the "**Configure**" button in the "Network" section. This will open up a window where we can add the network SSID and its password. + +![Network credentiales of the "Energy Thing"](assets/modbus-energy-meter_img19.png) + +### Creating an Sketch for a "Thing" in the Arduino Cloud IoT + +Once we are finished with all the configurations of the "Energy Thing", we can move on to creating the sketch that we are going to upload to our MKR WiFi 1010 board. To do so, we first need to go to the "**Sketch**" tab. But before, let's talk about **Modbus**. + +![Sketch tab in the Arduino Cloud IoT](assets/modbus-energy-meter_img20.png) + +Modbus is an open source communication protocol designed specifically for industrial sensors and machines. In simple terms, it is a method used for transmitting information over serial lines between electronic devices. Our MKR WiFi 1010 board can talk Modbus using the [Arduino Modbus library](https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus). This library packs all the handlers and makes hooking up any Modbus device to some of the Arduino® boards (like the MKR family boards) really fast and easy. You can read more about Modbus [here](https://en.wikipedia.org/wiki/Modbus). + +***In the datasheet of the energy meter we can find all the Modbus related information we need like its function codes, address of its registers and also their sizes.*** + +Modbus messages follow a simple structure, for example: + +`01 03 04 00 16 00 02 25 C7` + +In this structure: + +- `0x01` is the **device address**. +- `0x03` is the **function code** that tells the Modbus device if we want to read or write data. In this tutorial, we want to **read data from the holding registers of the energy meter**. +- `0x04` for **byte count**, this specifies how may data items are being returned. +- `00 16` is **register address** from the Modbus device we want to read. +- `00 02` is the **size of the register** in words (every word is 2 bytes long). +- `25 C7` is a **CRC code**. This code is generated from a math function over previous bytes, it ensures that the message has been received correctly. + +The Arduino Modbus library handles this structure. For example, for reading the register of the energy meter that holds information about current, we have the following function that uses the `requestFrom()` function of the Arduino Modbus library: + +```arduino +/* +Function readCurrent() +Description: read current value from the Finder energy meter holding registers + +Created by Alberto Perro (Officine Innesto) +Modified by José Bagur +*/ + +float readCurrent() { + float ampere = 0.; + // Send reading request over RS485 + if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) { + // Error handling + Serial.print("- Failed to read the current! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + // Response handler + uint16_t word1 = ModbusRTUClient.read(); // Read word1 from buffer + uint16_t word2 = ModbusRTUClient.read(); // Read word2 from buffer + int32_t milliamp = word1 << 16 | word2; // Join word1 and word2 to retrieve current value in milliampere + ampere = milliamp/1000.0; // Convert current to ampere + } +return ampere; +} +``` + +In the `else` we have the response handler. Since this register is two words long, we have to join them with binary math. We read the words from the buffer and store them in an unsigned 16-bit integer (2 bytes or a word); then we join them in a signed 32-bit integer by bitshifting the first word to the left and apply an OR over the second word. The result is the current measurement in milliampere (in ampere after dividing it by 1000). This process can adapted to everything else we want to read from the energy meter: voltage, power, frequency and energy. + +The complete sketch we are going to upload to out MKR WiFi 1010 board can be found below, notice that the Arduino Cloud IoT generated automatically the code that is dedicated to handling Internet connectivity: + +```arduino +/* ----------------------------------------- + * Finder Energy Meter to Arduino Cloud IoT + * ----------------------------------------- + * This sketch provides a full bridge between the Finder energy meter and the + * Arduino Cloud IoT. This sketch was developed to monitor electricity costs + * and usage in Casa Jasmina. + * + * Created by Alberto Perro (Officine Innesto) + * Modified by José Bagur +*/ + +#include +#include + +#undef ON +#undef OFF + +#include "thingProperties.h" + +unsigned long rate = 60000; // Default refresh rate in ms +unsigned long lastMillis = 0; + +void setup() { + // Initialize serial port at 9600 bauds and wait for it to open + Serial.begin(9600); + delay(1500); + + // Defined in thingProperties.h + initProperties(); + + // Connect to Arduino Cloud IoT + ArduinoCloud.begin(ArduinoIoTPreferredConnection); + + /* + The following function allows you to obtain more information + related to the state of network and Cloud IoT connection and errors + The higher number the more granular information you’ll get + The default value is 0 (only errors) + Maximum is 4 + */ + setDebugMessageLevel(2); + ArduinoCloud.printDebugInfo(); + + // Start Modbus RTU client + if (!ModbusRTUClient.begin(9600)) { + Serial.println("- Failed to start Modbus RTU Client!"); + while (1); + } +} + +void loop() { + // Update "Energy Thing" variables connected to Arduino Cloud IoT + ArduinoCloud.update(); + + // Update energy meter data and show it via the Serial Monitor + if (millis() - lastMillis > rate) { + lastMillis = millis(); + + voltage = readVoltage(); + delay(100); + current = readCurrent(); + delay(100); + power = readPower(); + delay(100); + frequency = readFreq(); + delay(100); + energy = readEnergy(); + + Serial.print("- " + String(voltage, 3) + "V " + String(current, 3) + "A " + String(power, 3) + "W "); + Serial.println(String(frequency, 3) + "Hz " + String(power, 3) + "kWh"); + delay(100); + } +} + +/* Functions to read Finder energy meter holding registers + * For more information: https://gfinder.findernet.com/public/attachments/7E/EN/PRT_Modbus_7E_64_68_78_86EN.pdf + */ + +/* +Function readVoltage() +Description: read voltage value from the Finder energy meter holding registers +*/ +float readVoltage() { + float volt = 0.; + // Send reading request over RS485 + if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x000C, 2)) { + // Error handling + Serial.print("- Failed to read the voltage! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + // Response handler + uint16_t word1 = ModbusRTUClient.read(); // Read word1 from buffer + uint16_t word2 = ModbusRTUClient.read(); // Read word2 from buffer + uint32_t millivolt = word1 << 16 | word2; // Join word1 and word2 to retrieve voltage value in millivolts + volt = millivolt/1000.0; // Convert to volts + } + + return volt; +} + +/* +Function readCurrent() +Description: read current value from the Finder energy meter holding registers +*/ +float readCurrent() { + float ampere = 0.; + // Send reading request over RS485 + if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) { + // Error handling + Serial.print("- Failed to read the current! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + // Response handler + uint16_t word1 = ModbusRTUClient.read(); // Read word1 from buffer + uint16_t word2 = ModbusRTUClient.read(); // Read word2 from buffer + int32_t milliamp = word1 << 16 | word2; // Join word1 and word2 to retrieve current value in milliampere + ampere = milliamp/1000.0; // Convert current to ampere + } + + return ampere; +} + +/* +Function readPower() +Description: read power value from the Finder energy meter holding registers +*/ +double readPower() { + double watt = 0.; + // Send reading request over RS485 + if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0025, 3)) { + // Error handling + Serial.print("- Failed to read power! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + // Response handler + uint16_t word1 = ModbusRTUClient.read(); // Read word1 from buffer + uint16_t word2 = ModbusRTUClient.read(); // Read word2 from buffer + uint16_t word3 = ModbusRTUClient.read(); // Read word3 from buffer + + uint64_t milliwatt; + + // Join word1 and word2 to retrieve power value in milliwatt + if (word1 >> 7 == 0) { + milliwatt = word1 << 32 | word2 << 16 | word3; + } else { + word1 &= 0b01111111; + milliwatt = 0b1 << 48 | word1 << 32 | word2 << 16 | word3; + } + + watt = milliwatt/1000.; // Convert power to watts + } + + return watt; +} + +/* +Function readFreq() +Description: read frequency value from the Finder energy meter holding registers +*/ +float readFreq() { + float freq = 0.; + // Send reading request over RS485 + if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0040, 2)) { + // Error handling + Serial.print("- Failed to read frequency! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + // Response handler + uint16_t word1 = ModbusRTUClient.read(); // Read word1 from buffer + freq = word1/1000.0; // Retrieve frequency value + } + return freq; +} + +/* +Function readEnergy() +Description: read energy value from the Finder energy meter holding registers +*/ +double readEnergy() { + double kwh = 0.; + // Send reading request over RS485 + if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0109, 3)) { + // Error handling + Serial.print("- Failed to read energy! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + // Response handler + uint16_t word1 = ModbusRTUClient.read(); // Read word1 from buffer + uint16_t word2 = ModbusRTUClient.read(); // Read word2 from buffer + uint16_t word3 = ModbusRTUClient.read(); // Read word3 from buffer + uint64_t dwh = word1 << 32 | word2 << 16 | word3; // Join word1 and word2 to retrieve energy value in dwh + kwh = dwh/10000.0; // Convert energy to kwh + } + return kwh; +} +``` + +### Creating a Dashboard in the Arduino Cloud IoT + +After our code has been successfully uploaded to our board, we we will need to create a **dashboard** for **visualizing** the energy meter data. Head over to the "**Dashboards**" tab and click on "Build Dashboard". + +![Dashboards tab in the Arduino Cloud IoT](assets/modbus-energy-meter_img21.png) + +An empty dashboard will be displayed. After changing the new dashboard's name, for example "Energy Meter Dashboard", let's add widgets to it. Let's click on the "**ADD**" button and select a "**Value**" widget. + +![Adding a value widget into a dashboard in the Arduino Cloud IoT](assets/modbus-energy-meter_img22.png) + +Now, we need to **link** the widget we just added to our dashboard to one of the energy meter variables we defined previously in the "Energy Thing" (voltage, current, power, frequency and energy). This can be done by selecting the "**Link Variable**" button and then selecting the variable you want to link with the widget; let's start with the variable **voltage**; remember also to give a name to the widget. + +![Linking a variable to a widget in the Arduino Cloud IoT](assets/modbus-energy-meter_img23.png) + +Follow the steps described above to link the rest of the variables of the "Energy Thing" to value widgets. We should see now all of the energy meter data being displayed on the dashboard, the data shown should update every `60000` ms when our MKR WiFi 1010 board is connected to the Arduino Cloud IoT. + +![Energy meter data shown in the Arduino Cloud IoT](assets/modbus-energy-meter_img24.png) + +That's it! You have now a Modbus energy meter connected to the Arduino Cloud IoT! + +## Troubleshoot + +Sometimes errors occur, if the code is not working or data is not in the to the Arduino Cloud IoT there are some common issues we can troubleshoot: + +- Missing a bracket or a semicolon. +- Accidental interruption of cable connection. +- Wrong network credentials. +- No variable linked to a widget. + +## Conclusion + +In this tutorial, we learned how to connect a Modbus energy meter to the Arduino Cloud IoT using a MKR WiFi 1010 board and a MKR 485 Shield. We also learned how to visualize the energy meter data in a dashboard using widgets. More tutorials? You can find them in the [Arduino Cloud IoT documentation page](/cloud/iot-cloud). \ No newline at end of file diff --git a/content/arduino-cloud/03.tutorials/tutorials.md b/content/arduino-cloud/03.tutorials/tutorials.md new file mode 100644 index 0000000000..ace2c8f7ae --- /dev/null +++ b/content/arduino-cloud/03.tutorials/tutorials.md @@ -0,0 +1,3 @@ +--- +title: Tutorials +--- \ No newline at end of file diff --git a/content/arduino-cloud/software-icon.png b/content/arduino-cloud/software-icon.png new file mode 100644 index 0000000000..e38ffb77c1 Binary files /dev/null and b/content/arduino-cloud/software-icon.png differ diff --git a/content/arduino-cloud/software.md b/content/arduino-cloud/software.md new file mode 100644 index 0000000000..f99d7b1353 --- /dev/null +++ b/content/arduino-cloud/software.md @@ -0,0 +1,5 @@ +--- +title: Cloud IoT Arduino +--- + +Configure, program and connect your devices - all through the Arduino IoT Cloud service. \ No newline at end of file diff --git a/content/arduino-cloud/software.png b/content/arduino-cloud/software.png new file mode 100644 index 0000000000..48e1a9ffc8 Binary files /dev/null and b/content/arduino-cloud/software.png differ diff --git a/package-lock.json b/package-lock.json index 0fad1bc89f..196a5deb5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,25 +5,25 @@ "requires": true, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz", - "integrity": "sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz", + "integrity": "sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==", "requires": { - "@algolia/autocomplete-shared": "1.6.3" + "@algolia/autocomplete-shared": "1.7.1" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.6.3.tgz", - "integrity": "sha512-IJVyknSDZJRheE5sKffRJN7ukJJDAtvuKiHrk0VLZCJHR/o7XQkowu/6axhUIBRZ6Q2JFzV9hzYZ0PbtSJo9gA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz", + "integrity": "sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==", "requires": { - "@algolia/autocomplete-shared": "1.6.3" + "@algolia/autocomplete-shared": "1.7.1" } }, "@algolia/autocomplete-shared": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz", - "integrity": "sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg==" + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz", + "integrity": "sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==" }, "@algolia/cache-browser-local-storage": { "version": "4.13.1", @@ -169,9 +169,9 @@ } }, "@arduino/docs-arduino-cc": { - "version": "1.3.1", - "resolved": "https://npm.pkg.github.com/download/@arduino/docs-arduino-cc/1.3.1/3596e0beec50dbbd57e415e708a69ec30f67595017c968aedeb6068fe4401140", - "integrity": "sha512-5LU7HwlxCMmdmj33yHZHd/AUBpg236kaqKS6kzERv8d6o4yDVNE+3sY9Iuy3/Mc+NXrVjWEfD0tn7nPbeefZpw==", + "version": "1.4.0-b", + "resolved": "https://npm.pkg.github.com/download/@arduino/docs-arduino-cc/1.4.0-b/cabc54002c963ee541348cf9115ea6120a6d529a531c6428633a5a187afee673", + "integrity": "sha512-ivIRiAXTLLamGoD37E8LwWh28e0vA7yExN5Xjx5xaZxmeLone6hNorTV9N0ODLU5xesyf9T12Ugo18552Adwmg==", "requires": { "@algolia/autocomplete-core": "^1.5.3", "@algolia/autocomplete-preset-algolia": "^1.5.3", @@ -2199,26 +2199,26 @@ "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" }, "@internationalized/date": { - "version": "3.0.0-rc.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.0.0-rc.0.tgz", - "integrity": "sha512-R8ui3O2G43fZ/z5cBdJuU6nswKtuVrKloDE6utvqKEeGf6igFoiapcjg7jbQ+WvWIDGtdUytOp2fOq/X4efBdQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.0.0.tgz", + "integrity": "sha512-mvlQCeYNg7JgO+QtIIx1zFJx10CJNVnt8cOjW2pYab1Ap/c7BYybS37Z5oTCdmRZbvnpmWtjhOEH324zlgWHLw==", "requires": { "@babel/runtime": "^7.6.2" } }, "@internationalized/message": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.0.6.tgz", - "integrity": "sha512-ECk3toFy87I2z5zipRNwdbouvRlIyMKb/FzKj1upMaNS52AKhpvrLgo3CY/ZXQKm4CRIbeh6p/F/Ztt+enhIEA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.0.8.tgz", + "integrity": "sha512-5B9zvBgyPZi0ciPgisW835WTuvjVIWFf4IJex1Swb5mDwonbi0lO2teAjBVGV25NTI0OKq1GM9PAWXXUzv6Waw==", "requires": { "@babel/runtime": "^7.6.2", "intl-messageformat": "^9.12.0" } }, "@internationalized/number": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.1.0.tgz", - "integrity": "sha512-CEts+2rIB4QveKeeF6xIHdn8aLVvUt5aiarkpCZgtMyYqfqo/ZBELf2UyhvLPGpRxcF24ClCISMTP9BTVreSAg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.1.1.tgz", + "integrity": "sha512-dBxCQKIxvsZvW2IBt3KsqrCfaw2nV6o6a8xsloJn/hjW0ayeyhKuiiMtTwW3/WGNPP7ZRyDbtuiUEjMwif1ENQ==", "requires": { "@babel/runtime": "^7.6.2" } @@ -2552,19 +2552,19 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "requires": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "dependencies": { "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2578,9 +2578,9 @@ "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", @@ -2597,39 +2597,39 @@ } }, "@lmdb/lmdb-darwin-arm64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.4.0.tgz", - "integrity": "sha512-TqYe2na5LXTq8KhfcKnafDbBH7BgM/EzgqTJNL67v2wUgFJeTrXw6RtBV3uzAfgQcmx1ucvEl7qVDYTA1W6VAw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", + "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", "optional": true }, "@lmdb/lmdb-darwin-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.4.0.tgz", - "integrity": "sha512-mvkiGPKVYzNamO0+I9ayRhbUf5sykj1RcHyg/7/xAusfPYWGn7j01sCExl0prYOSNGDrgGkwKaUCUndbiOWHeA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", + "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", "optional": true }, "@lmdb/lmdb-linux-arm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.4.0.tgz", - "integrity": "sha512-VCpBd9rTkwarIJWJmTumIYeuy6aNhgQiVtnsP8cPH2GJYNqv4Odfo96loB/fDTtHSvMdDHgu6/KjNrBwJ1zTEg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", + "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", "optional": true }, "@lmdb/lmdb-linux-arm64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.4.0.tgz", - "integrity": "sha512-reRkhk9wxzvYuRDHipiKJgMUCPL73x08xQ344IFK+EEZgyNISDYsERijBQ3h8aJGf1Rj9r8eU2oKFHbOTRoAeg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", + "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", "optional": true }, "@lmdb/lmdb-linux-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.4.0.tgz", - "integrity": "sha512-uLDGJefR5tQNn/5mFhAZ8bBHwJE07bC4SG56I34fMtxTFmdgfL0pWEJzxSmOBNhFWaqaT3ZyKqmJFoM290EQBQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", + "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", "optional": true }, "@lmdb/lmdb-win32-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.4.0.tgz", - "integrity": "sha512-fGdifcROMMUvhNZqPRGSwu6c+VwzVvWB8U1VFGkYZVpSkQwmHz87+qvmZXQB7GzEK2WDIdqAfGk4K6gQ1wBWiA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", + "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", "optional": true }, "@mdx-js/mdx": { @@ -3284,949 +3284,1025 @@ "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" }, "@react-aria/breadcrumbs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.1.10.tgz", - "integrity": "sha512-kuUVQYDSrA5799icfuG9oIw/+zSECZ9J1QiABUsiOdM64TYeDeULfGLV2RV376SB44V8bK8maoZtJ7ewU5gcHg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.2.1.tgz", + "integrity": "sha512-HIXEtlXd/YwSqvVpdEDzvlNQam+q24p1YRxM2S6mUbOUgSj38Prm4unp9EWgmvrohkcWnb5VJUtgCz9jQ/6X0w==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/link": "^3.2.5", - "@react-aria/utils": "^3.12.0", - "@react-types/breadcrumbs": "^3.3.0", - "@react-types/shared": "^3.12.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/link": "^3.3.1", + "@react-aria/utils": "^3.13.1", + "@react-types/breadcrumbs": "^3.4.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/button": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.4.4.tgz", - "integrity": "sha512-Z4jh8WLXNk8BJZ28beXTJWFwnhdjyC6ymby7qD/UDckqbm5OqM18EqYbKmJVF3+MRScunZdGg2aw0jkNpzo+3w==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.5.1.tgz", + "integrity": "sha512-M0AaDeJoM4wu2xkv1FvbhuvWB78yF8yNE91KkyEW+TMBiEjSaij61jyov95m08DT2EXSxuXnch3BoP8s3XHj4g==", + "requires": { + "@babel/runtime": "^7.6.2", + "@react-aria/focus": "^3.6.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/toggle": "^3.3.1", + "@react-types/button": "^3.5.1" + } + }, + "@react-aria/calendar": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.0.0.tgz", + "integrity": "sha512-SculGoyjVUCmFMC3E8kjI2JNPMmXFm4mrRxeDEqyLJu8vbM8hCaCx7al2dXbXAqT8Gie+S92hOUQGeMDLeTdyA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", - "@react-stately/toggle": "^3.2.7", - "@react-types/button": "^3.4.5" + "@internationalized/date": "^3.0.0", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/live-announcer": "^3.1.0", + "@react-aria/utils": "^3.13.1", + "@react-stately/calendar": "^3.0.0", + "@react-types/button": "^3.5.1", + "@react-types/calendar": "^3.0.0", + "@react-types/shared": "^3.13.1" } }, "@react-aria/checkbox": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.3.4.tgz", - "integrity": "sha512-5IJff+hzNR0LJgNyNJPgu8ElTN8Df1GDHDySdD7gP2Sv5916x1eTx+hZlYq4FUyTsOlW6QuynQ0jrQUK4xAnRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.4.1.tgz", + "integrity": "sha512-aTGW7Yo8rXC741GB2FPt0LqtjUm8E0KW2OldskcQuBUk2jSc11q7626VFvagk6bxMuoT+0gKAgehz/+yNHmmzA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/label": "^3.2.5", - "@react-aria/toggle": "^3.2.4", - "@react-aria/utils": "^3.12.0", - "@react-stately/checkbox": "^3.0.7", - "@react-stately/toggle": "^3.2.7", - "@react-types/checkbox": "^3.2.7" + "@react-aria/label": "^3.3.1", + "@react-aria/toggle": "^3.3.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/checkbox": "^3.1.1", + "@react-stately/toggle": "^3.3.1", + "@react-types/checkbox": "^3.3.1" } }, "@react-aria/combobox": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.2.6.tgz", - "integrity": "sha512-/I+YmuLWKq7SNP9eYXaOg5mCNsLJcXCTXas3w5ZsPDTPb9rpVes6nmsz+otBYlb5sTxvGS/sD0036vlI+O0cdg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.3.1.tgz", + "integrity": "sha512-CIO4I6naPjUdNcpdnDyqTUw8slZcTjKco8awL5tMYP/dDWcxtKbBi2MkfD5OMebGqtGd3KEJYR6WcGJqFV3GHQ==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/listbox": "^3.4.5", - "@react-aria/live-announcer": "^3.0.6", - "@react-aria/menu": "^3.4.4", - "@react-aria/overlays": "^3.8.2", - "@react-aria/selection": "^3.8.2", - "@react-aria/textfield": "^3.5.5", - "@react-aria/utils": "^3.12.0", - "@react-stately/collections": "^3.3.8", - "@react-stately/combobox": "^3.0.5", - "@react-stately/layout": "^3.4.5", - "@react-types/button": "^3.4.5", - "@react-types/combobox": "^3.4.0", - "@react-types/shared": "^3.12.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/listbox": "^3.5.1", + "@react-aria/live-announcer": "^3.1.0", + "@react-aria/menu": "^3.5.1", + "@react-aria/overlays": "^3.9.1", + "@react-aria/selection": "^3.9.1", + "@react-aria/textfield": "^3.6.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/collections": "^3.4.1", + "@react-stately/combobox": "^3.1.1", + "@react-stately/layout": "^3.5.0", + "@react-types/button": "^3.5.1", + "@react-types/combobox": "^3.5.1", + "@react-types/shared": "^3.13.1" + } + }, + "@react-aria/datepicker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.0.0.tgz", + "integrity": "sha512-MW9bQQDXmnrq3qd2oHYAhsDZntg4iDVzPMu/whnSYnQeW+po6zmSoYQUACmebEg9YmiA5p5GcuqHoa/3ltf1eA==", + "requires": { + "@babel/runtime": "^7.6.2", + "@internationalized/date": "^3.0.0", + "@internationalized/message": "^3.0.8", + "@internationalized/number": "^3.1.1", + "@react-aria/focus": "^3.6.1", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/label": "^3.3.1", + "@react-aria/spinbutton": "^3.1.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/datepicker": "^3.0.0", + "@react-types/button": "^3.5.1", + "@react-types/calendar": "^3.0.0", + "@react-types/datepicker": "^3.0.0", + "@react-types/dialog": "^3.4.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/dialog": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.1.9.tgz", - "integrity": "sha512-S/HE6XxBU9AiL4TGBjmz4CAEXjCD9nwvV5ofBKlbfPzgimmmSJj3SVNtsawKIt3KyP9AEioyJydM/vbGfccJlw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.2.1.tgz", + "integrity": "sha512-q3834JCNXcVSSfiez8R+6OunQzwiaM/sGctklRVBUooo80nJbPhnegumKiYe1Va4Gz7i/aLZwSEeK4AU3GMA9Q==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/utils": "^3.12.0", - "@react-stately/overlays": "^3.2.0", - "@react-types/dialog": "^3.3.5" + "@react-aria/focus": "^3.6.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/overlays": "^3.3.1", + "@react-types/dialog": "^3.4.1" } }, "@react-aria/focus": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.5.5.tgz", - "integrity": "sha512-scv+jhbQ25JCh36gu8a++edvdEFdlRScdQdnkJOB4NbHbYYfY36APtI70hgQHdfq9dDl5fJ9LMsH9hoF7X3gLw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.6.1.tgz", + "integrity": "sha512-4IHAu+826jC3SjWwuaYhCr0qhWg4XwmJIUEhcL1wbw3fq2dsjIBwEJ5HoayhluiVCfjGbcQcJNf1L4Vj3VTp4w==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", - "@react-types/shared": "^3.12.0", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-types/shared": "^3.13.1", "clsx": "^1.1.1" } }, "@react-aria/grid": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.2.6.tgz", - "integrity": "sha512-hNQHJkedMMAj+XmqbFW97Nybe5nEh+mRWB5SD7yuIvBLOFxnWid2BUF6zRA6nkZpfsPPTY1YHefgCGzQTFxbNQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.3.1.tgz", + "integrity": "sha512-GyqjM/p7pHXBXeFmopbeVfGv137Zm9skAg7k7WKIWeWWvn/2BAB9rFRoC9cl1x3zo0Gt/s26Lu3XbEFlB61qUA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/live-announcer": "^3.0.6", - "@react-aria/selection": "^3.8.2", - "@react-aria/utils": "^3.12.0", - "@react-stately/grid": "^3.1.4", - "@react-stately/selection": "^3.9.4", - "@react-stately/virtualizer": "^3.1.9", - "@react-types/checkbox": "^3.2.7", - "@react-types/grid": "^3.0.4", - "@react-types/shared": "^3.12.0" + "@react-aria/focus": "^3.6.1", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/live-announcer": "^3.1.0", + "@react-aria/selection": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/grid": "^3.2.1", + "@react-stately/selection": "^3.10.1", + "@react-stately/virtualizer": "^3.2.1", + "@react-types/checkbox": "^3.3.1", + "@react-types/grid": "^3.1.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/i18n": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.3.9.tgz", - "integrity": "sha512-EOqiOu84NYH/CW0s/tt3yDqDsjHlrHdi5qzrOGpGN/BvxtA/4UkMBdi8TTKXdRk8oHUIdNW1z5mZxzxkLDy1sA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.4.1.tgz", + "integrity": "sha512-/nrMpWOFmbn9R04JfWgGFRJ/oYBZLIydLBuWVw3ugwyKrHhIj/xRFrAMcGKspEZIymIANv9cnoTYhwk8d/DCEg==", "requires": { "@babel/runtime": "^7.6.2", - "@internationalized/date": "3.0.0-rc.0", - "@internationalized/message": "^3.0.6", - "@internationalized/number": "^3.1.0", - "@react-aria/ssr": "^3.1.2", - "@react-aria/utils": "^3.12.0", - "@react-types/shared": "^3.12.0" + "@internationalized/date": "^3.0.0", + "@internationalized/message": "^3.0.8", + "@internationalized/number": "^3.1.1", + "@react-aria/ssr": "^3.2.0", + "@react-aria/utils": "^3.13.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/interactions": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.8.4.tgz", - "integrity": "sha512-6EHFKK8pmjSJSKcBbduijPETKqE669XZ1VaEY8ubr6VnlVhCszvKHoxpU384CkNiDNLJOVkK6HDzPXsn3lxhng==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.9.1.tgz", + "integrity": "sha512-qPTJpUwIiis2OwpVzDd3I8dBjBkelDnvAW+dJkX+8B840JP5a7E1zVoAuR7OOAXqKa95R7miwK+5la1aSeWoDg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/utils": "^3.12.0", - "@react-types/shared": "^3.12.0" + "@react-aria/utils": "^3.13.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/label": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.2.5.tgz", - "integrity": "sha512-MkcPa7Ps/BsWTctH7IgVWtYENwrByfYMPmYdZCgotI0MiI6wK4LWwRaUQmfc7mWwJ7ns2NPyBRwrzJT4+RRbew==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.3.1.tgz", + "integrity": "sha512-Md4AEYBNByD8e6okbM/GR320++N/i4/xZZXdWtDVIfwpMVnLZ0v/ZPEi4DgLTc4Rwhm021s2qpYhZHQYThOd4A==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/utils": "^3.12.0", - "@react-types/label": "^3.5.4", - "@react-types/shared": "^3.12.0" + "@react-aria/utils": "^3.13.1", + "@react-types/label": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/link": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.2.5.tgz", - "integrity": "sha512-2RfQlZUmTzyHdjv1i7H5bxA4C5cTQonvDNFMzR2AycbN+AudAX8NXNOwPJkNxdxApUJX4EiQ84sGI354yEpa/w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.3.1.tgz", + "integrity": "sha512-so77s4IjZo8VGi85v6oDUzsQRoAwQH4LUUUpDLbKxEb5YaiN4/3yCVibeZrWzIzOTCOyLMXPbGwxHOUsl8EhVg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", - "@react-types/link": "^3.2.5", - "@react-types/shared": "^3.12.0" + "@react-aria/focus": "^3.6.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-types/link": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/listbox": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.4.5.tgz", - "integrity": "sha512-D1Y6fr4ZMGho1EO2eq+uhXs98Iqz78EXbcqIcuNEwyLyQ8w87jl5uGR/0Fhy9/t6qjkTlJ5iyFIJu8CNTXuSJA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.5.1.tgz", + "integrity": "sha512-+wZYQs1M+hrLB8UKPV9aOOhyFa0dC/HrG8ET6uE0nVzYZGcfsR1oDyHCDjB74QCYzmmyTqbzcDruRapheAuXXA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/interactions": "^3.8.4", - "@react-aria/label": "^3.2.5", - "@react-aria/selection": "^3.8.2", - "@react-aria/utils": "^3.12.0", - "@react-stately/collections": "^3.3.8", - "@react-stately/list": "^3.4.5", - "@react-types/listbox": "^3.2.5", - "@react-types/shared": "^3.12.0" + "@react-aria/focus": "^3.6.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/label": "^3.3.1", + "@react-aria/selection": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/collections": "^3.4.1", + "@react-stately/list": "^3.5.1", + "@react-types/listbox": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/live-announcer": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.0.6.tgz", - "integrity": "sha512-dXd5knYAFQPNr4ApxGwHXIDBuO50d9koat1ViFI22yS1QJF3y1dcIkBHfiAWIUtGr8AbRbWDZZnHtKrfPl25Zg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.1.0.tgz", + "integrity": "sha512-YEaGJh1ELho3G9zvUZGOsKsSNEqHsm0fb3Ngvj9z0tjZCXa0867h8YWKuiyTA9BG7WhH8eeJq07WN4nDvYU7fg==", "requires": { - "@babel/runtime": "^7.6.2", - "@react-aria/utils": "^3.12.0", - "@react-aria/visually-hidden": "^3.2.8" + "@babel/runtime": "^7.6.2" } }, "@react-aria/menu": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.4.4.tgz", - "integrity": "sha512-PoeadoSKv4mgx+05KLiRfupu30Pku7nzuL3e+3FAaWi5KyX8siiX6ADMZp8ulnYXoQgQ4C7XzulbwiSE1P/nxg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.5.1.tgz", + "integrity": "sha512-6l9m3/zs3EwSQ5B62wYaLGYP0zif6Esyh+rnxvbwlknsqUsTTDYc8Ly25M5PcGK4oeeLjHajPdFq6hMfNNhMgg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/overlays": "^3.8.2", - "@react-aria/selection": "^3.8.2", - "@react-aria/utils": "^3.12.0", - "@react-stately/collections": "^3.3.8", - "@react-stately/menu": "^3.2.7", - "@react-stately/tree": "^3.2.4", - "@react-types/button": "^3.4.5", - "@react-types/menu": "^3.5.3", - "@react-types/shared": "^3.12.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/overlays": "^3.9.1", + "@react-aria/selection": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/collections": "^3.4.1", + "@react-stately/menu": "^3.3.1", + "@react-stately/tree": "^3.3.1", + "@react-types/button": "^3.5.1", + "@react-types/menu": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/meter": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.1.8.tgz", - "integrity": "sha512-eXE4KUjIo9hdnAmaJXYp/15F9/eGSg0pcAIlC2LkwWojlEZeJYLx3L/8L2hAvp9NGznnDzV7JqBTvRD53x17qA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.2.1.tgz", + "integrity": "sha512-gY3CGGkuWEixWUQWMTD7Wi6wvW7TfBBfITlLJvVjsk3wgW7HQJYF8qTmJp0imUCbiD1t43Si6QC1SjSNl41WmA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/progress": "^3.1.8", - "@react-types/meter": "^3.1.6", - "@react-types/shared": "^3.12.0" + "@react-aria/progress": "^3.2.1", + "@react-types/meter": "^3.2.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/numberfield": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.1.6.tgz", - "integrity": "sha512-0CpIpStNyPfyT6m1gzzmCS5k03oKojM6uuofgvBZt9e/LonyPeGFsHQYI/sVp27OcDzK9wfyXqcYNWvxy9d4gA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.2.1.tgz", + "integrity": "sha512-UJLb87INfOPKKFfxHmllPFfjA25rzKj3L51o/miRYPKbVn+qEEy3PT1UhvT6Lf65BHGDtgS86+LevYTYl5BXgA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/live-announcer": "^3.0.6", - "@react-aria/spinbutton": "^3.0.6", - "@react-aria/textfield": "^3.5.5", - "@react-aria/utils": "^3.12.0", - "@react-stately/numberfield": "^3.0.7", - "@react-types/button": "^3.4.5", - "@react-types/numberfield": "^3.2.0", - "@react-types/shared": "^3.12.0", - "@react-types/textfield": "^3.4.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/live-announcer": "^3.1.0", + "@react-aria/spinbutton": "^3.1.1", + "@react-aria/textfield": "^3.6.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/numberfield": "^3.1.1", + "@react-types/button": "^3.5.1", + "@react-types/numberfield": "^3.3.1", + "@react-types/shared": "^3.13.1", + "@react-types/textfield": "^3.5.1" } }, "@react-aria/overlays": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.8.2.tgz", - "integrity": "sha512-HeOkYUILH4CrMVv3HkTrcK1jeZ2NJ7tS39tTciEGZ9JO1d8nUJ5jzDGGiQ587T9YWc1EYxiA+fbnn5Krxyq8IQ==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.9.1.tgz", + "integrity": "sha512-gQlM9MQX+RZiX5kxuyX5C2hv7Wm0k1wM4VBfeBmcPbcOGJz3v//GN002PuSUjSTx6eaTNuQeks7Qx0Wovsnd5A==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", - "@react-aria/visually-hidden": "^3.2.8", - "@react-stately/overlays": "^3.2.0", - "@react-types/button": "^3.4.5", - "@react-types/overlays": "^3.5.5", - "@react-types/shared": "^3.12.0", - "dom-helpers": "^3.3.1" - }, - "dependencies": { - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } - } + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-aria/visually-hidden": "^3.3.1", + "@react-stately/overlays": "^3.3.1", + "@react-types/button": "^3.5.1", + "@react-types/overlays": "^3.6.1", + "@react-types/shared": "^3.13.1", + "dom-helpers": "^5.2.1", + "react-transition-group": "^4.4.2" } }, "@react-aria/progress": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.1.8.tgz", - "integrity": "sha512-jjbr/ZO9+ZcuaGaQV/mpU0FJZ8sEArGdOjloH+bBDDdmRUUeF4Zyrsfc10hJcwk046kj+HLLXEFnUbNs3A7gNw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.2.1.tgz", + "integrity": "sha512-yHmwPl1phxF8R1KZCTNNbY33Lhz5fXQj/uHbh1Pfu5lpWVOdOiGmUDTeQ7G0pkn/eJMboH4/3WLazxrdWLgOqA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/label": "^3.2.5", - "@react-aria/utils": "^3.12.0", - "@react-types/progress": "^3.1.6", - "@react-types/shared": "^3.12.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/label": "^3.3.1", + "@react-aria/utils": "^3.13.1", + "@react-types/progress": "^3.2.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/radio": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.1.11.tgz", - "integrity": "sha512-xT7FgxECPgGHFDCiMu9QZlRJheesjy13N5KwIfCwKt+Tl8ZDacZ8jxswPrDpTfdwdQaA0TCiHWcmfWkAs790Yw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.2.1.tgz", + "integrity": "sha512-kwTfXCQZhdBJogXqxGSlqD8zVTNR4WAB7vnIjwpBx3HZND7fVHZyxjm5MxkqNXBbaVf8DvVWesfefIdfm+n6FA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/label": "^3.2.5", - "@react-aria/utils": "^3.12.0", - "@react-stately/radio": "^3.3.6", - "@react-types/radio": "^3.1.6" + "@react-aria/focus": "^3.6.1", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/label": "^3.3.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/radio": "^3.4.1", + "@react-types/radio": "^3.2.1" } }, "@react-aria/searchfield": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.2.7.tgz", - "integrity": "sha512-H14iiBB7UCsfKP3bZQSrifXPz7NrFj8l3kgp8+TNbzLpJQQNz6yhlDWA2lNLw25Vy/K1s83BBuSV+C2NKKrN8Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.3.1.tgz", + "integrity": "sha512-vIMR5prW0UgHmiCbCcyy5Pvx7tLP+4ZDq34xdGOB0OEOj+qffHdDBOnO+76fx0XC6vw5l+PMiZwFBdNQukz0Qw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/textfield": "^3.5.5", - "@react-aria/utils": "^3.12.0", - "@react-stately/searchfield": "^3.1.7", - "@react-types/button": "^3.4.5", - "@react-types/searchfield": "^3.2.0", - "@react-types/shared": "^3.12.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/textfield": "^3.6.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/searchfield": "^3.2.1", + "@react-types/button": "^3.5.1", + "@react-types/searchfield": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/select": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.6.5.tgz", - "integrity": "sha512-RIIRGN7vNHIx2Nf43V9UKFLtUKwthIog5akCxQfz1ivIwQ3Pgy+4bs1d7KhFPg8aM7G2w1lGQfv4vMgWwWBjmg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.7.1.tgz", + "integrity": "sha512-g/a3LDkkckZgilsU184y2+By4wLCoRtPdMu51KW9/RXIT55Xvlj4Kgf+ARSikbNaKAfAGvZxLkcv80eJizVZMg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/label": "^3.2.5", - "@react-aria/listbox": "^3.4.5", - "@react-aria/menu": "^3.4.4", - "@react-aria/selection": "^3.8.2", - "@react-aria/utils": "^3.12.0", - "@react-aria/visually-hidden": "^3.2.8", - "@react-stately/select": "^3.1.7", - "@react-types/button": "^3.4.5", - "@react-types/select": "^3.5.5", - "@react-types/shared": "^3.12.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/label": "^3.3.1", + "@react-aria/listbox": "^3.5.1", + "@react-aria/menu": "^3.5.1", + "@react-aria/selection": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-aria/visually-hidden": "^3.3.1", + "@react-stately/select": "^3.2.1", + "@react-types/button": "^3.5.1", + "@react-types/select": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/selection": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.8.2.tgz", - "integrity": "sha512-sBkSza8kT06tUKzIX68H2k+svYNCBOwhHmU0gbx164CmitCLk/akDGIds3LeoA9FhFFXw6/5CuLp6SNhmqlLWw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.9.1.tgz", + "integrity": "sha512-xUjhiVu5HLAxun9crpBLjfXfJc75oMgzKoCwRTCZinPvTdLLqYVFy6U/lTmQzkulIHLyUaJ94EE8IsfSUUzfLw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", - "@react-stately/collections": "^3.3.8", - "@react-stately/selection": "^3.9.4", - "@react-types/shared": "^3.12.0" + "@react-aria/focus": "^3.6.1", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/collections": "^3.4.1", + "@react-stately/selection": "^3.10.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/separator": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.1.7.tgz", - "integrity": "sha512-Z/nfR8mIgILTjlYWaL+MOeyR13RdUsO7fr4Swh9/6QxzthKEkzeKnYl/DtQaxzVo8CpxFoIkjbV1aPN1t4cpyA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.2.1.tgz", + "integrity": "sha512-iBAPH0I5jVqYdEhymqCU5yMyjANL0x8uHrfeE4BohMLhB4Spri+9ZBW1r2lRecMZp++SPRr87jirWv+/UUvo2g==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/utils": "^3.12.0", - "@react-types/shared": "^3.12.0" + "@react-aria/utils": "^3.13.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/slider": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.0.8.tgz", - "integrity": "sha512-sQ3E1Cv3xpATCXCzZtEQe5VI/2oj1UBIs3sH7AsOxifdJql7gLhjCjfmsR73wocjiVHYkIHOA7tQrqA61j+t3g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.1.1.tgz", + "integrity": "sha512-SVLtFXWxDvYa6mIWCF+GLHCPRip1E1L16ljksKwi4cYlK+eYrTxjPhmybEREhyH1l/KxbsMkAchkeCcDa2i4WQ==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/label": "^3.2.5", - "@react-aria/utils": "^3.12.0", - "@react-stately/radio": "^3.3.6", - "@react-stately/slider": "^3.0.8", - "@react-types/radio": "^3.1.6", - "@react-types/slider": "^3.0.6" + "@react-aria/focus": "^3.6.1", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/label": "^3.3.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/radio": "^3.4.1", + "@react-stately/slider": "^3.1.1", + "@react-types/radio": "^3.2.1", + "@react-types/slider": "^3.1.1" } }, "@react-aria/spinbutton": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.0.6.tgz", - "integrity": "sha512-POOzMIPgqpyTfqXl7EjuT560da4ULHyXCQ37+zQ1FWDOWDp6plAhhrEACvMZVTWy6btA2KwGt6kjYAsExb7eqw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.1.1.tgz", + "integrity": "sha512-Fsiu8Is2TN3mRojdJ+cvNb/daW550scjV53g+OMyRZnryu0wLWgxFPKlODyAfuMzoTz/+3ULD8+0jQbp51nlDA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/live-announcer": "^3.0.6", - "@react-aria/utils": "^3.12.0", - "@react-types/button": "^3.4.5", - "@react-types/shared": "^3.12.0" + "@react-aria/i18n": "^3.4.1", + "@react-aria/live-announcer": "^3.1.0", + "@react-aria/utils": "^3.13.1", + "@react-types/button": "^3.5.1", + "@react-types/shared": "^3.13.1" } }, "@react-aria/ssr": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.1.2.tgz", - "integrity": "sha512-amXY11ImpokvkTMeKRHjsSsG7v1yzzs6yeqArCyBIk60J3Yhgxwx9Cah+Uu/804ATFwqzN22AXIo7SdtIaMP+g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.2.0.tgz", + "integrity": "sha512-wwJFdkl+Q8NU5yJ4NvdAOqx5LM3QtUVoSjuK7Ey8jZ4WS4bB0EqT3Kr3IInBs257HzZ5nXCiKXKE4NGXXuIRWA==", "requires": { "@babel/runtime": "^7.6.2" } }, "@react-aria/switch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.1.8.tgz", - "integrity": "sha512-bnZZMMIcWoPLPPrI6Pl31h0rdhP7xAcUKtgM47iVpT99wyitcjjRcqJAaKVQsGnfdsIWeR85+a7QnOI3NByjCA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.2.1.tgz", + "integrity": "sha512-+EppXBl2LlkXYMQng9u+xmoOVvF/PCl6GijGtruoWV2QHTwMY0jvuQS+LROWLarTh2+WBAXrHhkFlkvqqU8p/A==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/toggle": "^3.2.4", - "@react-stately/toggle": "^3.2.7", - "@react-types/switch": "^3.1.6" + "@react-aria/toggle": "^3.3.1", + "@react-stately/toggle": "^3.3.1", + "@react-types/switch": "^3.2.1" } }, "@react-aria/table": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.2.4.tgz", - "integrity": "sha512-2t/EGyNAYsU841ZPLYUkwN+tdXztccgllUJ9qL5a0RJm7DYKKFHHsAYWmnV5ONj/tXqNZQfoqJSzsL6wpTXOZw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.3.0.tgz", + "integrity": "sha512-OYKO0qd/oWYhtbStGByyaRxvz3MSFY+8yIhp5ibr/3fBQw6PuCXAUMJGhhHj+boFVx0Qx+LUWtDk0LOPt5aA0w==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.3", - "@react-aria/grid": "^3.2.4", - "@react-aria/i18n": "^3.3.7", - "@react-aria/interactions": "^3.8.2", - "@react-aria/live-announcer": "^3.0.4", - "@react-aria/selection": "^3.8.0", - "@react-aria/utils": "^3.11.3", - "@react-stately/table": "^3.1.3", - "@react-stately/virtualizer": "^3.1.8", - "@react-types/checkbox": "^3.2.6", - "@react-types/grid": "^3.0.3", - "@react-types/shared": "^3.11.2", - "@react-types/table": "^3.1.3" + "@react-aria/focus": "^3.6.0", + "@react-aria/grid": "^3.3.0", + "@react-aria/i18n": "^3.4.0", + "@react-aria/interactions": "^3.9.0", + "@react-aria/live-announcer": "^3.1.0", + "@react-aria/selection": "^3.9.0", + "@react-aria/utils": "^3.13.0", + "@react-stately/table": "^3.2.0", + "@react-stately/virtualizer": "^3.2.0", + "@react-types/checkbox": "^3.3.0", + "@react-types/grid": "^3.1.0", + "@react-types/shared": "^3.13.0", + "@react-types/table": "^3.2.0" } }, "@react-aria/tabs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.1.5.tgz", - "integrity": "sha512-CJ33b1IW3i0ZJaGAExpR3g2ZHAzpiOQpZEm4NpQlgtPFlcvcNCQu15SYu2fPXEyczc1+LA9eOeRbXwwYfUYO3A==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.2.1.tgz", + "integrity": "sha512-uQfc97v+Hfdn7Ub1JkoCnAPrnwlT5kn7f3jSeHO8qyBFDjNpslA3Ij8KECaxcTZtX3Wl3Vkjy+JLnoTI1Qfudw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/selection": "^3.8.2", - "@react-aria/utils": "^3.12.0", - "@react-stately/list": "^3.4.5", - "@react-stately/tabs": "^3.0.5", - "@react-types/shared": "^3.12.0", - "@react-types/tabs": "^3.0.5" + "@react-aria/focus": "^3.6.1", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/selection": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/list": "^3.5.1", + "@react-stately/tabs": "^3.1.1", + "@react-types/shared": "^3.13.1", + "@react-types/tabs": "^3.1.1" } }, "@react-aria/textfield": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.5.5.tgz", - "integrity": "sha512-ZbGbdObR9cXPXfOr5Ius//nO5Y9yZ+pOT8ymTQTb/X8hLZdfpHqDD9SOjxlTt047ByWfIL0cRlOoEh3MHwvNFg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.6.1.tgz", + "integrity": "sha512-MX0xDIin1rZweEVKqEAqLjw7BsNQjjj8FVopNFzRl2tLxf7C+n/cHLdgwf8uVhHOcl9Vcqx/zeKuuZeB//Dvrg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/label": "^3.2.5", - "@react-aria/utils": "^3.12.0", - "@react-types/shared": "^3.12.0", - "@react-types/textfield": "^3.4.0" + "@react-aria/focus": "^3.6.1", + "@react-aria/label": "^3.3.1", + "@react-aria/utils": "^3.13.1", + "@react-types/shared": "^3.13.1", + "@react-types/textfield": "^3.5.1" } }, "@react-aria/toggle": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.2.4.tgz", - "integrity": "sha512-q1NiUKkWt9trgVj/VvKrTpe/tvNcsM9ie5JJVxikF4moPCyIqxRWaDzi2/g/63c1I6LZDMVT4v6V5tk9xgfuiQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.3.1.tgz", + "integrity": "sha512-y9m5K5UbhfR/xqeHM3N0dV9Z5t4j9dpyCq/VNa9XOvL/NquKVnn7rpXEO715wEfUV7nUILsP2idz99bi3vohDA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", - "@react-stately/toggle": "^3.2.7", - "@react-types/checkbox": "^3.2.7", - "@react-types/shared": "^3.12.0", - "@react-types/switch": "^3.1.6" + "@react-aria/focus": "^3.6.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/toggle": "^3.3.1", + "@react-types/checkbox": "^3.3.1", + "@react-types/shared": "^3.13.1", + "@react-types/switch": "^3.2.1" } }, "@react-aria/tooltip": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.1.8.tgz", - "integrity": "sha512-f61VVQU1je0wqQpTrfPl+aXAi54XPpe5lTIsxBY9qovzi0BBCAt3b5KofpudxcAqGQnZssXrRnG1IQbATIuUQQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.2.1.tgz", + "integrity": "sha512-wcX87K1UdoMFVugNlbkevgjbqshmfdr00hb5N8GnRT3KlilWnlmDtxQBOYNao4uMQvkwkc4/xcvvpOpuuB1FoQ==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/focus": "^3.5.5", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", - "@react-stately/tooltip": "^3.0.9", - "@react-types/shared": "^3.12.0", - "@react-types/tooltip": "^3.1.6" + "@react-aria/focus": "^3.6.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/tooltip": "^3.1.1", + "@react-types/shared": "^3.13.1", + "@react-types/tooltip": "^3.2.1" } }, "@react-aria/utils": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.12.0.tgz", - "integrity": "sha512-1TMrE7UpgTgQHgW3z0r6Zo4CTUDwNsZEwzg+mQVub8ZalonhuNs5OrulUn+lRIsGELNktGNkeh/29WsS1Od8eg==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.13.1.tgz", + "integrity": "sha512-usW6RoLKil4ylgDbRcaQ5YblNGv5ZihI4I9NB8pdazhw53cSRyLaygLdmHO33xgpPnAhb6Nb/tv8d5p6cAde+A==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/ssr": "^3.1.2", - "@react-stately/utils": "^3.4.1", - "@react-types/shared": "^3.12.0", + "@react-aria/ssr": "^3.2.0", + "@react-stately/utils": "^3.5.0", + "@react-types/shared": "^3.13.1", "clsx": "^1.1.1" } }, "@react-aria/visually-hidden": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.2.8.tgz", - "integrity": "sha512-SLBID66sUZrCdxaxLhgxypF/UyGuFVFGc+VhqmFi9QacDfAQcoT3DQyXEaKUIDMVtwAtSuWl7BpuooEctKBe6Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.3.1.tgz", + "integrity": "sha512-HDdYIaRq9BFEwQQ2vkySHcHEj+FaJ/S6bJ4nO+CQwxzVMUcfbVXDS4lfGzsQdDLoV5PaKYajryUZQbUAk0Cfng==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/interactions": "^3.8.4", - "@react-aria/utils": "^3.12.0", + "@react-aria/interactions": "^3.9.1", + "@react-aria/utils": "^3.13.1", "clsx": "^1.1.1" } }, + "@react-stately/calendar": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.0.0.tgz", + "integrity": "sha512-hax5/zzN3LcY5fZpTRZTLl696+0xUJ7pLC4g3ZWGA2beLYi75h5l6dc2cAyf1TDz/PEVam8tIrh3FdHlovRsOA==", + "requires": { + "@babel/runtime": "^7.6.2", + "@internationalized/date": "^3.0.0", + "@react-stately/utils": "^3.5.0", + "@react-types/calendar": "^3.0.0", + "@react-types/datepicker": "^3.0.0", + "@react-types/shared": "^3.13.1" + } + }, "@react-stately/checkbox": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.0.7.tgz", - "integrity": "sha512-dBY4x3qWoCO2IFeTVovnq6xkWa9ycqdNNws+gbYt79EwFdKSIfH1iTuFrv9DIwTU2N72quFCC/xQ23+a1/ZqSg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.1.1.tgz", + "integrity": "sha512-IxqZ6NYe3GV4RZ4ZGBJLuDuVg8/jaWj9eT2QW9YauFDzZvlFFP5tt6w+easWg7X2wG17wHo6VKoIxnKmY82K4A==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/toggle": "^3.2.7", - "@react-stately/utils": "^3.4.1", - "@react-types/checkbox": "^3.2.7" + "@react-stately/toggle": "^3.3.1", + "@react-stately/utils": "^3.5.0", + "@react-types/checkbox": "^3.3.1" } }, "@react-stately/collections": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.3.8.tgz", - "integrity": "sha512-R4RXLc0aaCZaCTh3NT/lmpMtVqP3HIdi2d1kyq4/uIC8APUFzEoUMEV+P0k3nQ5v6mO/UCkP3ePdOywnJBm/Gg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.4.1.tgz", + "integrity": "sha512-CAYFGmzuc/u6qqJru57gXt50JqUz9maLvGO2YMl4ZaQ1kV2/slDVlMD30GIiBqbuYHvVUqXXJdekjPvl2dOBeQ==", "requires": { "@babel/runtime": "^7.6.2", - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-stately/combobox": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.0.5.tgz", - "integrity": "sha512-rgHbriWxW7bOiSGJ9TuAhWW94nI/frGqz5Omlfk8V4Uvqw+0HaKIpoqq9m8gq6PPcyqrT7rLY8bgRyMHheuNaA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.1.1.tgz", + "integrity": "sha512-O0f6eNt5jbtLi/RDgO/4qAHShrubxb3vaH281fblwksxP8FTLQdSgkQRm+mxCIq16LFlW3yOgh4nJ3UouJGy1w==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/list": "^3.4.5", - "@react-stately/menu": "^3.2.7", - "@react-stately/select": "^3.1.7", - "@react-stately/utils": "^3.4.1", - "@react-types/combobox": "^3.4.0", - "@react-types/shared": "^3.12.0" + "@react-stately/list": "^3.5.1", + "@react-stately/menu": "^3.3.1", + "@react-stately/select": "^3.2.1", + "@react-stately/utils": "^3.5.0", + "@react-types/combobox": "^3.5.1", + "@react-types/shared": "^3.13.1" } }, "@react-stately/data": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.4.7.tgz", - "integrity": "sha512-ShxXFEjrtktH9e8u/7Z/lifPjE5T11Tgx5+DBKjZ/kpH3xbHZIpd1riaowpLxeCWt2bYwgoQYxmrL6PA5NclIg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.5.1.tgz", + "integrity": "sha512-IfjAHdcnYJ6GyRsr6W7XpJAZeQD9MTwDTuPdmfxtdrX4fbAz0InPN2/ziEmYoF1P7IwZMz8S2qouooBqcGtNxA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" + } + }, + "@react-stately/datepicker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.0.0.tgz", + "integrity": "sha512-fWIm3k2k4LyGn2FtMd808r5AcmELqzNZGVoFWuNw/RxqtI32iW96SENNjRXut7jACvCJi+0lWEjzObzNV602Og==", + "requires": { + "@babel/runtime": "^7.6.2", + "@internationalized/date": "^3.0.0", + "@internationalized/message": "^3.0.8", + "@react-stately/overlays": "^3.3.1", + "@react-stately/utils": "^3.5.0", + "@react-types/datepicker": "^3.0.0", + "@react-types/shared": "^3.13.1" } }, "@react-stately/grid": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.1.4.tgz", - "integrity": "sha512-f0BjDSGcPFHI7x6PmLwfMMhFj1ttKD3QKZgTrSIhmPnZqY/LEk1XFq8RFdnk5bNmt4JwiEDbytS7W4HbSTIe3g==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.2.1.tgz", + "integrity": "sha512-B/i1/uyZhuHChQ40crF0wtnhxIx+N0U8kd7e5MmwKyUWZKZTw+Ldkqe18ult8x1oH9Z2jPcyhPwKzbIU/987Ew==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/selection": "^3.9.4", - "@react-types/grid": "^3.0.4", - "@react-types/shared": "^3.12.0" + "@react-stately/selection": "^3.10.1", + "@react-types/grid": "^3.1.1", + "@react-types/shared": "^3.13.1" } }, "@react-stately/layout": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.4.5.tgz", - "integrity": "sha512-+u7LVvX5bAUYI49oGV5TOvRA4mpEh6PlDIXluO0l3/WAq9EpT7XJYqt5qxIyfSF5O5VSFvcCcV3HMuqmqY/oVA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.5.0.tgz", + "integrity": "sha512-rZ6MAQQJh4f2bfG8+g+2cR9D0Ymum/QKqlUqpkqRfw93D6zoy6ccNiilvbyk9InuugVni36OJjFCnqCQT2eCZg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/virtualizer": "^3.1.8", - "@react-types/grid": "^3.0.3", - "@react-types/shared": "^3.11.2", - "@react-types/table": "^3.1.3" + "@react-stately/virtualizer": "^3.2.0", + "@react-types/grid": "^3.1.0", + "@react-types/shared": "^3.13.0", + "@react-types/table": "^3.2.0" } }, "@react-stately/list": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.4.5.tgz", - "integrity": "sha512-ylUu9xH+cw7KlEM3rByIcTTeVGAKvscGlj0lVqhn48azqhqEPIDDxlIx3fE4yIKHhXBsscvdp0l8eldJGRvMVA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.5.1.tgz", + "integrity": "sha512-FQGw1WMoGjhZTMUfySi4+mNmoHb5sqAzkNSuqVNV/XS+2sHimHIVp3rfBsA45soc16/J+WDqxN1DxiQxqbW4Xw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/collections": "^3.3.8", - "@react-stately/selection": "^3.9.4", - "@react-stately/utils": "^3.4.1", - "@react-types/shared": "^3.12.0" + "@react-stately/collections": "^3.4.1", + "@react-stately/selection": "^3.10.1", + "@react-stately/utils": "^3.5.0", + "@react-types/shared": "^3.13.1" } }, "@react-stately/menu": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.2.7.tgz", - "integrity": "sha512-ybmi//FFoWUnUnHGzdHvAkCoFV6cNf6eAhTldtHMW/P1Qp/99vlxJGhnpekY6oFrqPe68RjKKANASymOnnKEow==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.3.1.tgz", + "integrity": "sha512-/S4vTsLQK0plhVp25/MmTM38A40pG7fx4wEynSf/bQzS4Jiz+SzZzOBhF1ByysAZJvwREMuXuzakUjTSxLYdvA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/overlays": "^3.2.0", - "@react-stately/utils": "^3.4.1", - "@react-types/menu": "^3.5.3", - "@react-types/shared": "^3.12.0" + "@react-stately/overlays": "^3.3.1", + "@react-stately/utils": "^3.5.0", + "@react-types/menu": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-stately/numberfield": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.0.7.tgz", - "integrity": "sha512-5YbIkCMLpz70kjG0fa5Exmd1xu3KASFQCZT9WQ7L4y5aNSeCRS5DLgRAcL61umWTrbNZTQ/0M+Qbyzzl7dwxJg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.1.1.tgz", + "integrity": "sha512-0vCPxzKpkrJcPDDFG3WTstkUFr1jBHjZBtDuyMCyNTKfSvXy2+tl+LqgFTTJZGJwBAu4ezKMFYxjm9i6DygVoA==", "requires": { "@babel/runtime": "^7.6.2", - "@internationalized/number": "^3.1.0", - "@react-stately/utils": "^3.4.1", - "@react-types/numberfield": "^3.2.0", - "@react-types/shared": "^3.12.0" + "@internationalized/number": "^3.1.1", + "@react-stately/utils": "^3.5.0", + "@react-types/numberfield": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-stately/overlays": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.2.0.tgz", - "integrity": "sha512-Ys+dfhFVyRGFRvvE35+Ychvgk868BDry9Td5rfvjVEwx6x8jaNShbonoo8CYYUkkJhaEnRaiJNG+0OGRCpvjTA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.3.1.tgz", + "integrity": "sha512-IRaK8x9OnwP6p9sojs39hF4nXNqRTt1qydbQMTw876SU94kG2pdqk/vHe4qdGVEaHB/mZ/8wRMntitQ0C6XFKA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/utils": "^3.4.1", - "@react-types/overlays": "^3.5.5" + "@react-stately/utils": "^3.5.0", + "@react-types/overlays": "^3.6.1" } }, "@react-stately/radio": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.3.6.tgz", - "integrity": "sha512-G35xuEIk7TkqA3SGGlSVUyrkauf7bNVxq0/ELSM1mhrAuKF6nXkLqK2kI5LtOrngk/ZrsVFtfJYN+H6cBNhu2Q==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.4.1.tgz", + "integrity": "sha512-tWwvdm/GAsuUJkPv6aislPaek/ZV/BkMSeZO4QqdkWhIJeU8vkJHg5RrlWe5l1mhBS58y5iAkDoRb1XR8asZlw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/utils": "^3.4.1", - "@react-types/radio": "^3.1.6" + "@react-stately/utils": "^3.5.0", + "@react-types/radio": "^3.2.1" } }, "@react-stately/searchfield": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.1.7.tgz", - "integrity": "sha512-jxxSx+hA8E9GE0l/Q/lts28fs1BNW9rWiSCNTJ/ADm9dZ1hnw/CDrJ3hLITAiNN9O5G+4eesI4zKttRc/L7znA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.2.1.tgz", + "integrity": "sha512-WuLfS8qksp30l6KlBKTWyewARNMb/IdJyJi5b+gN0s0TyZ+MCVd851K8jp9ZelJCn78pmF1j+S4QeTYYRQBxEA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/utils": "^3.4.1", - "@react-types/searchfield": "^3.2.0", - "@react-types/shared": "^3.12.0" + "@react-stately/utils": "^3.5.0", + "@react-types/searchfield": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-stately/select": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.1.7.tgz", - "integrity": "sha512-J5xKxWF8XsgaaBO1g9PXlm48EKjnMEKPf+5GJqnDerR07XGeaz11qUyxg+B+BEwIQgGVxRiuEXdACBe8jVvgqw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.2.1.tgz", + "integrity": "sha512-kmXiuFDMoonLraOINrBGSB9g1LL9C84nD9IJPacUfaVHDbCMdCMyxVTXKhZ6TMOP0jYIpREBDxOsAWiSlF9YFw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/collections": "^3.3.8", - "@react-stately/list": "^3.4.5", - "@react-stately/menu": "^3.2.7", - "@react-stately/selection": "^3.9.4", - "@react-stately/utils": "^3.4.1", - "@react-types/select": "^3.5.5", - "@react-types/shared": "^3.12.0" + "@react-stately/collections": "^3.4.1", + "@react-stately/list": "^3.5.1", + "@react-stately/menu": "^3.3.1", + "@react-stately/selection": "^3.10.1", + "@react-stately/utils": "^3.5.0", + "@react-types/select": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-stately/selection": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.9.4.tgz", - "integrity": "sha512-hgJ4raHFQMfQ1aQYgL+nRpQgA7GdPDh9esIeB8Ih+yS783cV4vyyqKxuLd2u9W4cilnEkgXjrI5Z21RU86jzEg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.10.1.tgz", + "integrity": "sha512-5b68yo4kD1kxAyFJTsGRfMsVCkRS45EgpFCqpNkJzcNQj8YK2IlrqCkb+fM7J0IblbHeVcM5KHf3zGsZA39kog==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/collections": "^3.3.8", - "@react-stately/utils": "^3.4.1", - "@react-types/shared": "^3.12.0" + "@react-stately/collections": "^3.4.1", + "@react-stately/utils": "^3.5.0", + "@react-types/shared": "^3.13.1" } }, "@react-stately/slider": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.0.8.tgz", - "integrity": "sha512-LuS4eKVuf2+vLBz5nqox7kHiGDtLCdWEm6mKDQ3xXKMhGj61fCXrefO6W+wBrOzBcCPDKQu+eHmOLhHtPG4LTw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.1.1.tgz", + "integrity": "sha512-T6y1yxf8eek6SOfz6uiXBXR9MERDK7QVeIOLGTH+7kqBbFxZSXs97KyU/ZFT+tTP9U245kPT6Ocso8tids6XLA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/i18n": "^3.3.9", - "@react-aria/utils": "^3.12.0", - "@react-stately/utils": "^3.4.1", - "@react-types/slider": "^3.0.6" + "@react-aria/i18n": "^3.4.1", + "@react-aria/utils": "^3.13.1", + "@react-stately/utils": "^3.5.0", + "@react-types/slider": "^3.1.1" } }, "@react-stately/table": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.1.3.tgz", - "integrity": "sha512-HSsamFabtCSHib4A5rxXBtfKPd0InXjXSoaxUNi6RLOyptULMA06q1ShbWDEijTYGQI5Pfevs/5bgLonj0enbg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.2.0.tgz", + "integrity": "sha512-W4MJITIxma6PCpRX1Z9vi6F35mJiwpM+g24yVG7VK6JD9Fbiw2nIPJf5ZYo11EI2PdIJlamv/xYqYtn2kmGlWw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/collections": "^3.3.7", - "@react-stately/grid": "^3.1.3", - "@react-stately/selection": "^3.9.3", - "@react-types/grid": "^3.0.3", - "@react-types/shared": "^3.11.2", - "@react-types/table": "^3.1.3" + "@react-aria/utils": "^3.13.0", + "@react-stately/collections": "^3.4.0", + "@react-stately/grid": "^3.2.0", + "@react-stately/selection": "^3.10.0", + "@react-types/grid": "^3.1.0", + "@react-types/shared": "^3.13.0", + "@react-types/table": "^3.2.0" } }, "@react-stately/tabs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.0.5.tgz", - "integrity": "sha512-fqNHHpTaOWzBua0NkfQWspESWb70QJvwqy8oklAsMkZ51eaHm24JU5TH1A8rO+2cbuN/IaLNguSHg+8aVsOCtw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.1.1.tgz", + "integrity": "sha512-BeoJ9TQ7SIpFp9DRoetJ+2dx5bXXdexyx1TopMArJONCIzGcuGfvjL98rIo7jt4UzeKW/s8HEapOrOuR5lprVg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/list": "^3.4.5", - "@react-stately/utils": "^3.4.1", - "@react-types/tabs": "^3.0.5" + "@react-stately/list": "^3.5.1", + "@react-stately/utils": "^3.5.0", + "@react-types/tabs": "^3.1.1" } }, "@react-stately/toggle": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.2.7.tgz", - "integrity": "sha512-McKc2wIp1z7Dw6EqQgOgjr2QnKR+LWXppZjdx30K4hnCiP6cXZp66DmR2ngekPrtOYDN6Xdqbty/Ez7kiJxmnQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.3.1.tgz", + "integrity": "sha512-JIOPfeZ46vfQqfBygCmyIRL0KJwdHdVQ5PSii5YM0qs/kzaHm3SLGf/iiGjwcRCOsnL50zN9U5YNDtRAEbsncg==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/utils": "^3.4.1", - "@react-types/checkbox": "^3.2.7", - "@react-types/shared": "^3.12.0" + "@react-stately/utils": "^3.5.0", + "@react-types/checkbox": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-stately/tooltip": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.0.9.tgz", - "integrity": "sha512-XPSRGdm4mZl5ZIbNB4II6Mc9HBsmY7kEOZXzaquH8u/OCUwDuicaykfpvBH7/ZcycRS7TgBWybz0xEl9NwW2tQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.1.1.tgz", + "integrity": "sha512-Y+qyIrmnVTLKD+JaePEKx3AZ634+dcJPDLCA4KkmKqVPRIUW3s4N3BE0Jw+uFlBi+xl5tLEdID+bQGd0fl7avA==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/overlays": "^3.2.0", - "@react-stately/utils": "^3.4.1", - "@react-types/tooltip": "^3.1.6" + "@react-stately/overlays": "^3.3.1", + "@react-stately/utils": "^3.5.0", + "@react-types/tooltip": "^3.2.1" } }, "@react-stately/tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.2.4.tgz", - "integrity": "sha512-rGZuU0ynoN8Lv/Hhfh04FNlx+1c0RnM/5DIwwr8s7S0VWPQHMwGQiPkz+MFOk6Cx28sA/9ZXI4RjupjHvzJvKw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.3.1.tgz", + "integrity": "sha512-s/pcafhvUnt2uOIUWRdTpWCBLnGOuG5e9CAzPkwlUCGFXiI7jIJBT8Y4dLP7Iwx6i9U2wZqs22onxH7GHlGgbw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-stately/collections": "^3.3.8", - "@react-stately/selection": "^3.9.4", - "@react-stately/utils": "^3.4.1", - "@react-types/shared": "^3.12.0" + "@react-stately/collections": "^3.4.1", + "@react-stately/selection": "^3.10.1", + "@react-stately/utils": "^3.5.0", + "@react-types/shared": "^3.13.1" } }, "@react-stately/utils": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.4.1.tgz", - "integrity": "sha512-mjFbKklj/W8KRw1CQSpUJxHd7lhUge4i00NwJTwGxbzmiJgsTWlKKS/1rBf48ey9hUBopXT5x5vG/AxQfWTQug==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.5.0.tgz", + "integrity": "sha512-WzzwlQtJrf7egaN+lt02/f/wkFKbcscsbinmXs9pL7QyYm+BCQ9xXj01w0juzt93piZgB/kfIYJqInEdpudh1A==", "requires": { "@babel/runtime": "^7.6.2" } }, "@react-stately/virtualizer": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.1.9.tgz", - "integrity": "sha512-to0CQU4l08ZI/Ar3h/BeDqFTjK0nJUfhdk8mTpP+bV0RGBQnDwqCnrLFdQCc3Xl8fbYWa+Y6pvSUqJ0rq6Bp7Q==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.2.1.tgz", + "integrity": "sha512-jZKegccx1jbmPxPJJI365gYqtrSI3IFoXzOq5wdrOyOJ1J9lUo476MUbkJBNoajkS21y2cM/e7mt9KF8g2sovw==", "requires": { "@babel/runtime": "^7.6.2", - "@react-aria/utils": "^3.12.0", - "@react-types/shared": "^3.12.0" + "@react-aria/utils": "^3.13.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/breadcrumbs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.3.0.tgz", - "integrity": "sha512-pqYtDkbyHwWVq9eB4pwYtd8e5S2PCcdTy263hEwcW4XhDc9bmWR/iWu6/sBUoY3qwpMrWP+mEzdmfBILWhDqpw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.4.1.tgz", + "integrity": "sha512-uf7BVgkXZd4+UEuC0BBs4/0Qse2ymnL0SCNtRaDNaHUdtBguPIfurT0p5ZOCjAQYboAyGPlfwd+Trerlwdzuaw==", "requires": { - "@react-types/link": "^3.2.5", - "@react-types/shared": "^3.12.0" + "@react-types/link": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/button": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.4.5.tgz", - "integrity": "sha512-wqOw3LvqFRJl6lDhije7koTINWBv+LRBKAlGOri2ddw3VDqvm0/zu2ENDIP/XX0FtUzuffoc1U5YgxmBlXd7gQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.5.1.tgz", + "integrity": "sha512-GxTikDKfuztu1r0LWHmqG1AD5yM9F6WFzwAYgLltn8B7RshzpJcYSfpYsh1e64z84YJpEoj+DD8XGGSc0p/rvw==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" + } + }, + "@react-types/calendar": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.0.0.tgz", + "integrity": "sha512-en74nkHJ0wGpetiwMKiKGnCiWshYM03cN0PVNftmHuYUaSZ7VbGU+z/NAMTIE1ukOOBvC7pR6D16gPK+TD2E0A==", + "requires": { + "@internationalized/date": "^3.0.0", + "@react-types/shared": "^3.13.1" } }, "@react-types/checkbox": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.2.7.tgz", - "integrity": "sha512-c/hJwVRr7JoakyU39hUQstCc/0uPPvE+Eie8SspV2u9umSs7dYiUBc7F2wpboWIdNkQUEHG/Uq/Vs6/hk+yrkg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.3.1.tgz", + "integrity": "sha512-6PlyvfqisuObrltmJdBx88t143NaQ/ibkvuDdsEaiMlJbHKU4m0dbxaYNhGNQ0Jm4AK/x9Rig0tbpMeXjBXaDA==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/combobox": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.4.0.tgz", - "integrity": "sha512-02tRXjeRYgT8dS83O16zRWwKVtFA+oL/STQrvcR+EnidfhUxRNGO4tlZngEn2+V2lY+NfLILbikwDTc/diSV+A==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.5.1.tgz", + "integrity": "sha512-UQe59EU6fFj2kXGpss1BByMVFBbFC8MhJWfMqvDR1l+UlhE+lmGPQjASmh2eKQXSmBdbd+NgOL6y8E1HRDeC2A==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" + } + }, + "@react-types/datepicker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.0.0.tgz", + "integrity": "sha512-OBFvTk+mkIyAx6dExsZYF+WGpROzeqVZ/VXH5BhqTS1WQv2lmsCfYUQikSDLcESQ4HOZ1Uq+tirxNWIIct5TnQ==", + "requires": { + "@internationalized/date": "^3.0.0", + "@react-types/overlays": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/dialog": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.3.5.tgz", - "integrity": "sha512-K77big4JVDy6nhIv5V8PbnfHOeTK8JeGBLAEhl1DGCgCnPhq2eJ/R342rSjQobSyyaVUAYu1Z4AW4jjBSM17ug==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.4.1.tgz", + "integrity": "sha512-tB/zDF4sR0l8GhTz0hl6bZGAYyxbF7UtTHRVVPW1XSDgjM7nuZiJrWb300S8KICj4933+ZmB5DCuzCzEKjIV6g==", "requires": { - "@react-types/overlays": "^3.5.5", - "@react-types/shared": "^3.12.0" + "@react-types/overlays": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/grid": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.0.4.tgz", - "integrity": "sha512-Ot6V/2PajcqBq2GH/YrsuiA8EqEmTcuvICfPd5RpjbLDFhhHbxOFsgOrXX2Qr33huu96dAhhEEEvOuVKbLcBdQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.1.1.tgz", + "integrity": "sha512-YyukFuEcrJR+TcsTpGl5a6boBaQ6T+ashhLv/7c1RIWjNtlIZjYV0s+VaQoo2n2UpgIBY3tv4zBH6Tjg6jG5aA==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/label": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.5.4.tgz", - "integrity": "sha512-LuShOdEYokzn58SKUIo7kQdN3CV5Rs+HCxmvix4+Uw6BAYG9/aqqoKKolTA9klbM8rvvEzDqFzNZZHeMTBoN6w==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.6.1.tgz", + "integrity": "sha512-Yjz1qWJ3uAdMYMOKDUiB28Wdc/3kqeuE9BtrLbvqjX/VZcnFgbVEQ6Yy8G9v6pcjEF/EJRl+hcA0deUews/G0w==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/link": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.2.5.tgz", - "integrity": "sha512-i2e7tgncMGd1w5d6zHi5n3ixkOA6jNjkJZM617Qh2UwOsTtcXD7yrQvwHo1KaZQnAzoBNNxtv6+a8bT3oLPdIg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.3.1.tgz", + "integrity": "sha512-+kx61SCpH9QI0GIhdrgnkSOcgCpMhgpX+PmiMw7gDv+PiCP1GhSJxNw7bZB6sXLYM0Ye/L76F3f2MrPIfec2xw==", "requires": { - "@react-aria/interactions": "^3.8.4", - "@react-types/shared": "^3.12.0" + "@react-aria/interactions": "^3.9.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/listbox": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.2.5.tgz", - "integrity": "sha512-FxZAT0HT1+LASzNffc5faVuIrODyQeN738l3WeCGb2xJAdkImKr4hahtcdduXvT30WVwaPpsynKlhpRRaVxjDA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.3.1.tgz", + "integrity": "sha512-V+r0HrdcSSpKxKlGxN0+0xg+NdqnAN4PaZATYNVHdf1lQFfN7Dj0xDyzobvRISHy6bFYn32pepO4/jH/I9g75A==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/menu": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.5.3.tgz", - "integrity": "sha512-Lj8TYgrWelV49ewSf5gV1QQ9/QRt162nO7dmYOyRWWBXkOJ+YlHpuZRF+7TkuBwFK+xsxzVSaG6QRfndecvxmw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.6.1.tgz", + "integrity": "sha512-W8ClaYd0t/he5tjg2l/E4bPqUFov041MYKGuTIOTL9dfMsB4eHeV7zmXKA2Li8DJL+E7CkTuaYqTJcP9pcfTzg==", "requires": { - "@react-types/overlays": "^3.5.5", - "@react-types/shared": "^3.12.0" + "@react-types/overlays": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/meter": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.1.6.tgz", - "integrity": "sha512-xtO1A8M98VP8oz8VMSCGUbiYVujSsCFqnRlsNT9Vn8Tx5KsPlaVwBv9vPdErDs5lJhTgV8/myBo47yqVi7Wm+g==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.2.1.tgz", + "integrity": "sha512-VqJyRckfzRqO5Q4uX/lKecc3t/4XIqEllPeWGwDjpKHt0prfQdONbSdVK+wb+XAmShVYDKqDwOQg8d5aDJYywg==", "requires": { - "@react-types/progress": "^3.1.6", - "@react-types/shared": "^3.12.0" + "@react-types/progress": "^3.2.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/numberfield": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.2.0.tgz", - "integrity": "sha512-pACJPg3wXJ6UpVHr24OfKPEss07Xvjh7zqTz4AllozClWp9gwNgoHd2io7dEurjNWwlC14YuQru2mYLPGS5d3Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.3.1.tgz", + "integrity": "sha512-xeP/oo9QXTAtzJukahGcR2r26AqPSYlshWPw8wHBKLDqFu2PVIMJmiNblhSUyOxTQ8/OfoyCCkerojjh6uZCAw==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/overlays": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.5.5.tgz", - "integrity": "sha512-TEfn+hv3E6iX1gEjJ6+Gl3r0+WCIPPMhPjTidU6AKqhS0phtcITQ8gPovr0PYEP4Ub8QuT0ttZWu0nWZP3IxIg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.6.1.tgz", + "integrity": "sha512-vkVSC7KvRLugfr9HP2dyV4J5wmI5KxfKyAFdT4j3Q+YfSYQwKa7OT+iTeRHDOIR3ubKnxgoIdQpjurBQTjCWwg==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/progress": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.1.6.tgz", - "integrity": "sha512-gfgE9wrPkAd9aCLrMx3kjG/4deUADI2Lb5X3tdkpr0Og9k5WYlBuz/+Z5rLG4qcoFZtRfaMEMoFYstDjHRWxbQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.2.1.tgz", + "integrity": "sha512-ArGTnnjHcszMiy4nQEiB0yewz6JTHE6QBD97V5OADkF84zBd86sCFFjKduH/GTjz/HZSBQRNVZHCM0k+dbg/oA==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/radio": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.1.6.tgz", - "integrity": "sha512-OmsYEdKnBIGIwX66u2dcbETWeWKlu0bKCzRUDQiTAUpBZOON6s2/34AvknzEGhmxj/OlQB916UzpUHH1EaiqdA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.2.1.tgz", + "integrity": "sha512-xuHEHj9rLaZvra7GsEm5Wx9FiKn0IUC02aX+KNot+RCBjfIljlF89g728TnCiF0RxIIsezvbGL9ydtGy0/sJUg==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/searchfield": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.2.0.tgz", - "integrity": "sha512-U1DeeJRf4h5IgGiwt5sJKptSbGJaarzrYy9RiYEO0/OYGRsYXbV3SeBeOak4uU1l8PVi9jDTNcsnOvAoG77+Ww==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.3.1.tgz", + "integrity": "sha512-worM6fY0Qy8eNwcD/YHhcZo8gvL0LPZeMV9RUUHzxvORfy7Si1oKWT1dL4GlkJ5fVZXr6zRn6dUaVNsv5AoAkg==", "requires": { - "@react-types/shared": "^3.12.0", - "@react-types/textfield": "^3.4.0" + "@react-types/shared": "^3.13.1", + "@react-types/textfield": "^3.5.1" } }, "@react-types/select": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.5.5.tgz", - "integrity": "sha512-LqtDqX/Nk/Ah0NlTXUhVdf1Tbbdp8JLHkw41D68LU8/HGJXQwJ8ZqWbb/xg/ef+EMTVm92+EhrbCmqUpCEE6VA==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.6.1.tgz", + "integrity": "sha512-wO9c5NaXPFdPxVrgHv+fZUoR+K2q/q3tjDVx9l3IxjQ/3TGlB1ibwlpYHqlO2MZymC2tvbEgf9p+yE6Ap++XMw==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/shared": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.12.0.tgz", - "integrity": "sha512-faGr9xOjtMlkQPfA1i36iUmWS/hpPPtxIwdAtBi6p7rCejmShMLFZ2YN4DxzbJUCVubF2S1+rMMIKuXG17DkEw==" + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.13.1.tgz", + "integrity": "sha512-EHQqILDJeDvnloy5VV9lnnEjpCMwH1ghptCfa/lz9Ht9nwco3qGCvUABkWyND7yU1Adt3A/1oJxhpRUu3eTlyg==" }, "@react-types/slider": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.0.6.tgz", - "integrity": "sha512-WZMEzRcyicn5a3T+2yoGxYQPHWDLqz5KxHvS5bGkUvXykXnvUvrSG3HSytZbQgFQKlb58iafYU35Ll9wFqWBjA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.1.1.tgz", + "integrity": "sha512-O9d6F2bZS4SQbWlU1z8i927D4rTJLpAr09f2NHwK8l/TOchNOq32GNSHxTjom81jheu2DpuuswIJ60TspgZR6Q==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/switch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.1.6.tgz", - "integrity": "sha512-H9ECjBeEK82tGGiCNx2gQfrx5nJEviICAvUCfemLCS4zdUxs9NUYxIfI12v1Bl5NJ1dD0Cyc0hb4haiB+mX1ig==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.2.1.tgz", + "integrity": "sha512-Vert9rhsoZb9x8weluROR02EoNz21eg/l1djawORUbLxqK/wal0eYrjlA2S+FPlXtgAwdeFe9AVXDdpvYT0oNQ==", "requires": { - "@react-types/checkbox": "^3.2.7", - "@react-types/shared": "^3.12.0" + "@react-types/checkbox": "^3.3.1", + "@react-types/shared": "^3.13.1" } }, "@react-types/table": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.1.3.tgz", - "integrity": "sha512-l5ZmoPEnnMNUOW/mC7x/HDXC0CmHGz5IpWBPbV1aJtQCxRD42yosMaP8pT48EPZjupSeEuUGVFW2sZQlEjHbwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.2.0.tgz", + "integrity": "sha512-YCfUDT8ysNX/nfm6nvc9rhjSUeVDou5L2e+Y52xnzNU9qw05raLbS8Etm6X/Y5sDLD3qgOlUNjUYkm3swGfaHA==", "requires": { - "@react-types/grid": "^3.0.3", - "@react-types/shared": "^3.11.2" + "@react-types/grid": "^3.1.0", + "@react-types/shared": "^3.13.0" } }, "@react-types/tabs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.0.5.tgz", - "integrity": "sha512-ZUIUeOJ7Nv5aoYPv7ThIgnFo4iM/r4i2mSUeOk0frcZRO1maVnD7Xcp/8xuRmT1rn7tzId/hZkXgFjVcUCtgVw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.1.1.tgz", + "integrity": "sha512-uKytPTxt5uvJN/KSwjXcF/TiS71y2td/9O0MKERGyes+O4ceinOFWmvI0KcgEYmNoCO7aXAt8ncaAJIb+xke4w==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/textfield": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.4.0.tgz", - "integrity": "sha512-NL97JvdzsuGDYGx/JlE/yCceUR4IS1dX6CK9PljI0ZTsOOXLGynJ4HCpayBzbelUA617a+qr/v0c1CxY3y1qfg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.5.1.tgz", + "integrity": "sha512-EYsljXfGJJJ6B/Buu6BaBm0Kyrf67so6skBCP3odECKIvmBwTKbikHULpe/Od8DBFIvjd7x2ZEzUlMH2hp+eRQ==", "requires": { - "@react-types/shared": "^3.12.0" + "@react-types/shared": "^3.13.1" } }, "@react-types/tooltip": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.1.6.tgz", - "integrity": "sha512-CxgSGStWBllpexnveHpKrhJRSrdeVJ/bF8dlrlrGaSHbqifCTryjqig1ermcK99Wmj0wHQ4cho2iCnQq5C/j3Q==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.2.1.tgz", + "integrity": "sha512-1YkpJaIvcVevYbQlOvPqPua5fdwAMrRm4BkLtVRbUL0DerCazCrB/osdQINGOU67XmLU1JIv/xTBMK0Say5Jvg==", "requires": { - "@react-types/overlays": "^3.5.5", - "@react-types/shared": "^3.12.0" + "@react-types/overlays": "^3.6.1", + "@react-types/shared": "^3.13.1" } }, "@serjlee/gatsby-plugin-algolia": { @@ -4946,17 +5022,17 @@ } }, "algoliasearch-helper": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz", - "integrity": "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.10.0.tgz", + "integrity": "sha512-4E4od8qWWDMVvQ3jaRX6Oks/k35ywD011wAA4LbYMMjOtaZV6VWaTjRr4iN2bdaXP2o1BP7SLFMBf3wvnHmd8Q==", "requires": { "@algolia/events": "^4.0.1" } }, "animated-scroll-to": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/animated-scroll-to/-/animated-scroll-to-2.2.0.tgz", - "integrity": "sha512-VVhwrii9tMXwP1GlQacLplUrh/0x2IbU/JxTUMBvzam6lJpJ9jMCw8PKHOvqMJ52vYmBDfcf9lNDuSeoWCD/mw==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/animated-scroll-to/-/animated-scroll-to-2.3.0.tgz", + "integrity": "sha512-PT/5MSKCWQaK2kuOl2HT2KJMuJEvUS4/TgMhWy82c2EmF74/CIkvPBPKOvd8nMYP6Higo7xCn49/iSW9BccMoQ==" }, "anser": { "version": "2.1.1", @@ -5026,7 +5102,8 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true }, "arch": { "version": "2.2.0", @@ -5037,6 +5114,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -5045,12 +5123,14 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5064,12 +5144,14 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -6127,7 +6209,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -6140,7 +6222,7 @@ "pascal-case": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", "requires": { "camel-case": "^3.0.0", "upper-case-first": "^1.1.0" @@ -6199,7 +6281,7 @@ "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", "requires": { "boolbase": "~1.0.0", "css-what": "2.1", @@ -6237,7 +6319,7 @@ "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -6335,9 +6417,9 @@ } }, "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" } } }, @@ -6534,9 +6616,9 @@ } }, "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" }, "coa": { "version": "2.0.2", @@ -6551,7 +6633,8 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true }, "collapse-white-space": { "version": "1.0.6", @@ -6667,7 +6750,7 @@ "compose-function": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==", "requires": { "arity-n": "^1.0.4" } @@ -6722,7 +6805,7 @@ "computed-style": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", - "integrity": "sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ=" + "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==" }, "concat-map": { "version": "0.0.1", @@ -6795,12 +6878,13 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true }, "constant-case": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", "requires": { "snake-case": "^2.1.0", "upper-case": "^1.1.1" @@ -7194,7 +7278,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "requires": { "assert-plus": "^1.0.0" } @@ -7369,7 +7453,8 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true }, "depd": { "version": "1.1.2", @@ -7613,7 +7698,7 @@ "dot-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", "requires": { "no-case": "^2.2.0" }, @@ -7621,7 +7706,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -7664,7 +7749,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -8562,7 +8647,7 @@ "exif-parser": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" }, "expand-brackets": { "version": "2.1.4", @@ -8827,7 +8912,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" }, "fast-deep-equal": { "version": "3.1.3", @@ -8922,7 +9007,7 @@ "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" }, "filenamify": { "version": "4.3.0", @@ -9048,7 +9133,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "fork-ts-checker-webpack-plugin": { "version": "4.1.6", @@ -9780,16 +9865,14 @@ } }, "gatsby-plugin-gatsby-cloud": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-gatsby-cloud/-/gatsby-plugin-gatsby-cloud-4.14.0.tgz", - "integrity": "sha512-9xG+9L5I/Dj2PgpXeTdwFu4FhEjbpAHJaQJuxi9Wz2h4O3ix02nkXmvcDrX3JC/peOQ4zFfHh/mTy2jHl2pzow==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-gatsby-cloud/-/gatsby-plugin-gatsby-cloud-4.18.0.tgz", + "integrity": "sha512-c+PAabQCfmq0qUkGJ9Cp0vaB2+7mYiic7nj/Tx0cLqkeJJHrV7rqcUX1A2l4VycWRDFWSA5K1nTvb3uSUINB2g==", "requires": { "@babel/runtime": "^7.15.4", - "date-fns": "^2.28.0", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", - "gatsby-telemetry": "^3.14.0", - "js-cookie": "^3.0.1", + "gatsby-core-utils": "^3.18.0", + "gatsby-telemetry": "^3.18.0", "kebab-hash": "^0.1.2", "lodash": "^4.17.21", "webpack-assets-manifest": "^5.1.0" @@ -9856,9 +9939,9 @@ } }, "gatsby-core-utils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.14.0.tgz", - "integrity": "sha512-JavHwcX5L+ZRoL5FKhYex3JfbwwS0273YTpf8y8SRKsObD8H+bbLOUlbOjASpqy+IU3dW+r76gT1dQdaqeH9Og==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", @@ -9866,9 +9949,9 @@ "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "import-from": "^4.0.0", - "lmdb": "^2.2.6", + "lmdb": "2.5.2", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", @@ -9878,44 +9961,62 @@ } }, "gatsby-telemetry": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.14.0.tgz", - "integrity": "sha512-QnlN3nvb+1gYsY6cIQKAuvkhx9uoOg71yuEYB0EFQdgcnyIbWlBVRHId8wOXoQHwRYFmatvxBmcKlVF8FCs61A==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.18.0.tgz", + "integrity": "sha512-i1JvNqGOyLDPGEn1QN29YGpe2ripg2LZBAOhXmk6lAhRL5fTVo6WkEA2yW7XESnXIOJBFymgVbUlLjXoqeZ5Xg==", "requires": { "@babel/code-frame": "^7.14.0", "@babel/runtime": "^7.15.4", - "@turist/fetch": "^7.1.7", + "@turist/fetch": "^7.2.0", "@turist/time": "^0.0.2", "async-retry-ng": "^2.0.1", "boxen": "^4.2.0", "configstore": "^5.0.1", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", + "gatsby-core-utils": "^3.18.0", "git-up": "^4.0.5", "is-docker": "^2.2.1", "lodash": "^4.17.21", "node-fetch": "^2.6.7" } }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "lmdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.4.2.tgz", - "integrity": "sha512-dgqoGgHl/lzPobumxIsagVy7JXBAdFJv74avJTC733lb6d/RiCrzjm5YOUyCjhKnCNTNlNPGBP6/C1gZelUwlA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.4.0", - "@lmdb/lmdb-darwin-x64": "2.4.0", - "@lmdb/lmdb-linux-arm": "2.4.0", - "@lmdb/lmdb-linux-arm64": "2.4.0", - "@lmdb/lmdb-linux-x64": "2.4.0", - "@lmdb/lmdb-win32-x64": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.2", + "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } @@ -9946,41 +10047,50 @@ } }, "gatsby-plugin-google-tagmanager": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-google-tagmanager/-/gatsby-plugin-google-tagmanager-4.14.0.tgz", - "integrity": "sha512-jsqnFrb/ugFItckuPgvf98TgoYMNEUi9rNcUYLSfQS2Dp9Wo9Ief5akY9oPEAgVmZs8O98k/2hBrUyRPhfs9vw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-google-tagmanager/-/gatsby-plugin-google-tagmanager-4.18.0.tgz", + "integrity": "sha512-NMloO6dtUu0w2rxgMhcocl2CKOB8iyvZIJYXEfjR+vnxQZ4k0AS20EbfBzoQpvAkK5foXDJCvokhMoGCDHwe0g==", "requires": { "@babel/runtime": "^7.15.4", "web-vitals": "^1.1.2" } }, "gatsby-plugin-image": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-image/-/gatsby-plugin-image-2.14.1.tgz", - "integrity": "sha512-9ez7/MqjZLwvFqY37miFO3IAcqF3rkhUMyrwct+JMk2c1AcXgGyG1acgKGkJU6maiQoIqSKtyzjoQD8+o3f0Hg==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-image/-/gatsby-plugin-image-2.18.0.tgz", + "integrity": "sha512-/WvMDUiZvofmxHzHeEPLNL605FU1AK5pLXKKS8aekRigbNbi+Gip2ZROFPJtj4oxyKDmtD+HaVCNf1q8SdhPEg==", "requires": { "@babel/code-frame": "^7.14.0", "@babel/parser": "^7.15.5", "@babel/runtime": "^7.15.4", "@babel/traverse": "^7.15.4", "babel-jsx-utils": "^1.1.0", - "babel-plugin-remove-graphql-queries": "^4.14.0", + "babel-plugin-remove-graphql-queries": "^4.18.0", "camelcase": "^5.3.1", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "common-tags": "^1.8.2", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", + "gatsby-core-utils": "^3.18.0", + "gatsby-plugin-utils": "^3.12.0", "objectFitPolyfill": "^2.3.5", "prop-types": "^15.8.1" }, "dependencies": { + "@types/sharp": { + "version": "0.30.4", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.4.tgz", + "integrity": "sha512-6oJEzKt7wZeS7e+6x9QFEOWGs0T/6of00+0onZGN1zSmcSjcTDZKgIGZ6YWJnHowpaKUCFBPH52mYljWqU32Eg==", + "requires": { + "@types/node": "*" + } + }, "babel-plugin-remove-graphql-queries": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.14.0.tgz", - "integrity": "sha512-rqCih6maArH0nbkndAP9UKKQCUWZy1NBxG+nSOoIZpvLkMqTweAuiTpMDJVHWDk9CycFlLfl09/Ayk/nciVKhA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.18.0.tgz", + "integrity": "sha512-6oOm/cTZdk+7yPh4R4ISLKNur3rK5w2zAUCXTOGKYcRYbvKCS22ODafQBrNcu/UdfpXwSz3XZOG5ru72Z5usUw==", "requires": { "@babel/runtime": "^7.15.4", - "gatsby-core-utils": "^3.14.0" + "gatsby-core-utils": "^3.18.0" } }, "camelcase": { @@ -9988,6 +10098,33 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -9999,9 +10136,9 @@ } }, "gatsby-core-utils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.14.0.tgz", - "integrity": "sha512-JavHwcX5L+ZRoL5FKhYex3JfbwwS0273YTpf8y8SRKsObD8H+bbLOUlbOjASpqy+IU3dW+r76gT1dQdaqeH9Og==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", @@ -10009,9 +10146,9 @@ "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "import-from": "^4.0.0", - "lmdb": "^2.2.6", + "lmdb": "2.5.2", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", @@ -10020,40 +10157,139 @@ "xdg-basedir": "^4.0.0" } }, + "gatsby-plugin-utils": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.12.0.tgz", + "integrity": "sha512-vdz3qwaCOkvgzAxMkZlgpmpWf555jISwek5lyWYhGyJJvXYV8KQ2cZ4CoOfFKAYVeZVSucrHcdWyY3fLLpQvAA==", + "requires": { + "@babel/runtime": "^7.15.4", + "@gatsbyjs/potrace": "^2.2.0", + "fs-extra": "^10.1.0", + "gatsby-core-utils": "^3.18.0", + "gatsby-sharp": "^0.12.0", + "graphql-compose": "^9.0.7", + "import-from": "^4.0.0", + "joi": "^17.4.2", + "mime": "^3.0.0", + "mini-svg-data-uri": "^1.4.4", + "svgo": "^2.8.0" + } + }, + "gatsby-sharp": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.12.0.tgz", + "integrity": "sha512-dZa/AgxmPzD0vvROEZSuT3IdzAFTxnq1FfLTf9n3mywonvsKYc84zj6nf8TEzBrVrBFAaLvZek4NpVAKWGr4/w==", + "requires": { + "@types/sharp": "^0.30.0", + "sharp": "^0.30.3" + } + }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "lmdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.4.2.tgz", - "integrity": "sha512-dgqoGgHl/lzPobumxIsagVy7JXBAdFJv74avJTC733lb6d/RiCrzjm5YOUyCjhKnCNTNlNPGBP6/C1gZelUwlA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.4.0", - "@lmdb/lmdb-darwin-x64": "2.4.0", - "@lmdb/lmdb-linux-arm": "2.4.0", - "@lmdb/lmdb-linux-arm64": "2.4.0", - "@lmdb/lmdb-linux-x64": "2.4.0", - "@lmdb/lmdb-win32-x64": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.2", + "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } }, + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + }, "node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "sharp": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", + "requires": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", + "semver": "^7.3.7", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + } + } } } }, "gatsby-plugin-mdx": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-3.14.0.tgz", - "integrity": "sha512-H3tZTmky67ZS1ZWOOluWoZ2tdgP052rsKvjbEumJBA+v10aqlYWx0S5Q0RcoWKyTTx90h2OHsx4r+LbLvFPW/g==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-3.18.0.tgz", + "integrity": "sha512-30MS5xPjmUyylhcaD10pdp9622Hn40bkFUq5KJDy/cldimgdvKra3IUJq1OVkzXggGeV8M6kkZxIsqWz46DA2g==", "requires": { "@babel/core": "^7.15.5", "@babel/generator": "^7.15.4", @@ -10071,7 +10307,7 @@ "escape-string-regexp": "^1.0.5", "eval": "^0.1.4", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", + "gatsby-core-utils": "^3.18.0", "gray-matter": "^4.0.2", "json5": "^2.1.3", "loader-utils": "^1.4.0", @@ -10095,26 +10331,34 @@ "unist-util-visit": "^1.4.1" }, "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", + "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==" }, "@babel/core": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", - "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", "requires": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.0", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -10123,21 +10367,21 @@ }, "dependencies": { "@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", "requires": { - "@babel/types": "^7.18.0", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } }, "@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, @@ -10149,178 +10393,302 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", + "@babel/compat-data": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" } }, + "@babel/helper-environment-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", + "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "dependencies": { "@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + } } }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, "@babel/helpers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", - "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "dependencies": { "@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } } } }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, "@babel/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", + "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", - "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", + "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.17.12" + "@babel/plugin-transform-parameters": "^7.18.6" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" } } }, "@babel/plugin-transform-parameters": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", - "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", + "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" } } }, - "@babel/traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", - "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", + "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", "requires": { - "@babel/types": "^7.18.0", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } }, "@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } } } }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", + "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001359", + "electron-to-chromium": "^1.4.172", + "node-releases": "^2.0.5", + "update-browserslist-db": "^1.0.4" } }, "caniuse-lite": { - "version": "1.0.30001342", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz", - "integrity": "sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==" + "version": "1.0.30001363", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz", + "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==" }, "core-js": { - "version": "3.22.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.6.tgz", - "integrity": "sha512-2IGcGH00z9I4twgNWU4uGCNEsBFG1s2JudVQrgSCoVhOfwoTwQjxC8aMo9exrpTMOxvobggEpaHnGMmQY4cfBQ==" + "version": "3.23.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.3.tgz", + "integrity": "sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==" }, "dataloader": { "version": "1.4.0", @@ -10328,9 +10696,9 @@ "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" }, "electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" + "version": "1.4.182", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.182.tgz", + "integrity": "sha512-OpEjTADzGoXABjqobGhpy0D2YsTncAax7IkER68ycc4adaq0dqEG9//9aenKPy7BGA90bqQdLac0dPp6uMkcSg==" }, "fs-extra": { "version": "10.1.0", @@ -10343,9 +10711,9 @@ } }, "gatsby-core-utils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.14.0.tgz", - "integrity": "sha512-JavHwcX5L+ZRoL5FKhYex3JfbwwS0273YTpf8y8SRKsObD8H+bbLOUlbOjASpqy+IU3dW+r76gT1dQdaqeH9Og==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", @@ -10353,9 +10721,9 @@ "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "import-from": "^4.0.0", - "lmdb": "^2.2.6", + "lmdb": "2.5.2", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", @@ -10364,20 +10732,38 @@ "xdg-basedir": "^4.0.0" } }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "lmdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.4.2.tgz", - "integrity": "sha512-dgqoGgHl/lzPobumxIsagVy7JXBAdFJv74avJTC733lb6d/RiCrzjm5YOUyCjhKnCNTNlNPGBP6/C1gZelUwlA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.4.0", - "@lmdb/lmdb-darwin-x64": "2.4.0", - "@lmdb/lmdb-linux-arm": "2.4.0", - "@lmdb/lmdb-linux-arm64": "2.4.0", - "@lmdb/lmdb-linux-x64": "2.4.0", - "@lmdb/lmdb-win32-x64": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.2", + "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } @@ -10413,9 +10799,9 @@ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" }, "resolve-from": { "version": "5.0.0", @@ -10489,17 +10875,17 @@ } }, "gatsby-plugin-react-helmet": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-5.14.0.tgz", - "integrity": "sha512-Loy0fUtVDhEuvv1nCpsyyUpAosGRUB3g5GzHvV3oqxcGgrpTgeXTPH64drXuRKcHyJbH1vgUOuPdlIEzXDbQMQ==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-5.18.0.tgz", + "integrity": "sha512-H55KLoKZ/LeWWILYmkbt+L1c6E2ViurN16GyGOOzIg2LGjd7OXu9zy9H9lMKrkNpn/HUXhyUilYHqVeo5fve1A==", "requires": { "@babel/runtime": "^7.15.4" } }, "gatsby-plugin-sass": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-sass/-/gatsby-plugin-sass-5.14.0.tgz", - "integrity": "sha512-gRts8Tfb1AyNey+xPTRVFlc+agLM7DDZlh4V665RsWja9vF/bQlWwvX1DjmHgYkeVobh0dMyd9QV4TyDv9Uurw==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-sass/-/gatsby-plugin-sass-5.18.0.tgz", + "integrity": "sha512-78CKsIbEb91ojD+CnpZDfgAUWltl8B+Y1J0afORqXZsxd0QL0/YhmYZU7NdTD+kCqZXSZ4B2x+YeZWXZtgA/Kg==", "requires": { "@babel/runtime": "^7.15.4", "resolve-url-loader": "^3.1.4", @@ -10507,9 +10893,9 @@ } }, "gatsby-plugin-sharp": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.14.1.tgz", - "integrity": "sha512-izYl9XcnWdAY+rDtZtnKfzZ/djBioGSDg/k84cgLVbTzLB29jgqipw3PkjV7IlvmJmlw2v78YCHO5mk3bfcitg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.18.0.tgz", + "integrity": "sha512-ExGzy8xAwc5+4nDHgGe1k8Id/HZpETPSizLNeJ5We3T4hjshdfgvnuRiAZf2VIY60+VPuVCezYNn4n7gPTShRw==", "requires": { "@babel/runtime": "^7.15.4", "@gatsbyjs/potrace": "^2.2.0", @@ -10518,24 +10904,23 @@ "debug": "^4.3.4", "filenamify": "^4.3.0", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", - "gatsby-plugin-utils": "^3.8.0", - "gatsby-telemetry": "^3.14.0", - "got": "^11.8.3", + "gatsby-core-utils": "^3.18.0", + "gatsby-plugin-utils": "^3.12.0", + "gatsby-telemetry": "^3.18.0", + "got": "^11.8.5", "lodash": "^4.17.21", "mini-svg-data-uri": "^1.4.4", "probe-image-size": "^7.2.3", "progress": "^2.0.3", "semver": "^7.3.7", "sharp": "^0.30.3", - "svgo": "1.3.2", - "uuid": "3.4.0" + "svgo": "1.3.2" }, "dependencies": { "@types/sharp": { - "version": "0.30.2", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.2.tgz", - "integrity": "sha512-uLCBwjDg/BTcQit0dpNGvkIjvH3wsb8zpaJePCjvONBBSfaKHoxXBIuq1MT8DMQEfk2fKYnpC9QExCgFhkGkMQ==", + "version": "0.30.4", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.4.tgz", + "integrity": "sha512-6oJEzKt7wZeS7e+6x9QFEOWGs0T/6of00+0onZGN1zSmcSjcTDZKgIGZ6YWJnHowpaKUCFBPH52mYljWqU32Eg==", "requires": { "@types/node": "*" } @@ -10549,9 +10934,9 @@ } }, "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "boxen": { "version": "4.2.0", @@ -10663,9 +11048,9 @@ } }, "gatsby-core-utils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.14.0.tgz", - "integrity": "sha512-JavHwcX5L+ZRoL5FKhYex3JfbwwS0273YTpf8y8SRKsObD8H+bbLOUlbOjASpqy+IU3dW+r76gT1dQdaqeH9Og==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", @@ -10673,9 +11058,9 @@ "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "import-from": "^4.0.0", - "lmdb": "^2.2.6", + "lmdb": "2.5.2", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", @@ -10685,15 +11070,15 @@ } }, "gatsby-plugin-utils": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.8.0.tgz", - "integrity": "sha512-dLFk+4E2BJrSuPz5/cLUyw4/dDbyMtruLww2XnFk34DVxg16FHIBYcY7p5IbfmDiBmMtlgJFqxBHj1zt8l6syw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.12.0.tgz", + "integrity": "sha512-vdz3qwaCOkvgzAxMkZlgpmpWf555jISwek5lyWYhGyJJvXYV8KQ2cZ4CoOfFKAYVeZVSucrHcdWyY3fLLpQvAA==", "requires": { "@babel/runtime": "^7.15.4", "@gatsbyjs/potrace": "^2.2.0", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", - "gatsby-sharp": "^0.8.0", + "gatsby-core-utils": "^3.18.0", + "gatsby-sharp": "^0.12.0", "graphql-compose": "^9.0.7", "import-from": "^4.0.0", "joi": "^17.4.2", @@ -10719,34 +11104,52 @@ } }, "gatsby-sharp": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.8.0.tgz", - "integrity": "sha512-As590vHGlCiN9iCWneJo/pJYZjkWykjaFvoKAwPcv6Twn3+6l7ExKOBe9v/WmigALU23dI6vWP0JYvXmmvNYBg==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.12.0.tgz", + "integrity": "sha512-dZa/AgxmPzD0vvROEZSuT3IdzAFTxnq1FfLTf9n3mywonvsKYc84zj6nf8TEzBrVrBFAaLvZek4NpVAKWGr4/w==", "requires": { "@types/sharp": "^0.30.0", "sharp": "^0.30.3" } }, "gatsby-telemetry": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.14.0.tgz", - "integrity": "sha512-QnlN3nvb+1gYsY6cIQKAuvkhx9uoOg71yuEYB0EFQdgcnyIbWlBVRHId8wOXoQHwRYFmatvxBmcKlVF8FCs61A==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.18.0.tgz", + "integrity": "sha512-i1JvNqGOyLDPGEn1QN29YGpe2ripg2LZBAOhXmk6lAhRL5fTVo6WkEA2yW7XESnXIOJBFymgVbUlLjXoqeZ5Xg==", "requires": { "@babel/code-frame": "^7.14.0", "@babel/runtime": "^7.15.4", - "@turist/fetch": "^7.1.7", + "@turist/fetch": "^7.2.0", "@turist/time": "^0.0.2", "async-retry-ng": "^2.0.1", "boxen": "^4.2.0", "configstore": "^5.0.1", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", + "gatsby-core-utils": "^3.18.0", "git-up": "^4.0.5", "is-docker": "^2.2.1", "lodash": "^4.17.21", "node-fetch": "^2.6.7" } }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10762,19 +11165,19 @@ } }, "lmdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.4.2.tgz", - "integrity": "sha512-dgqoGgHl/lzPobumxIsagVy7JXBAdFJv74avJTC733lb6d/RiCrzjm5YOUyCjhKnCNTNlNPGBP6/C1gZelUwlA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.4.0", - "@lmdb/lmdb-darwin-x64": "2.4.0", - "@lmdb/lmdb-linux-arm": "2.4.0", - "@lmdb/lmdb-linux-arm64": "2.4.0", - "@lmdb/lmdb-linux-x64": "2.4.0", - "@lmdb/lmdb-win32-x64": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.2", + "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } @@ -10802,6 +11205,25 @@ "boolbase": "~1.0.0" } }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -10816,18 +11238,25 @@ } }, "sharp": { - "version": "0.30.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.4.tgz", - "integrity": "sha512-3Onig53Y6lji4NIZo69s14mERXXY/GV++6CzOYx/Rd8bnTwbhFbL09WZd7Ag/CCnA0WxFID8tkY0QReyfL6v0Q==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", "requires": { "color": "^4.2.3", "detect-libc": "^2.0.1", - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", "semver": "^7.3.7", "simple-get": "^4.0.1", "tar-fs": "^2.1.1", "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + } } }, "source-map": { @@ -10892,7 +11321,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "css-select": { "version": "2.1.0", @@ -10917,7 +11346,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", @@ -10933,11 +11362,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -11003,9 +11427,9 @@ } }, "gatsby-remark-autolink-headers": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-5.14.0.tgz", - "integrity": "sha512-GfsdnH2rCpq78q08eVYaBHEzlcGIiQKp6QZm4eTYrFoyayg1FYm+2y3UNXZ8QuASON5zY0zQeiMi5hx8Wfe3jg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-5.18.0.tgz", + "integrity": "sha512-majir8Za7i9kXQEBGq3PEMTSV4NG2/bD7Nx6go54Wx3SbxRldp4IeLwdtgOntdugwv//Z2h4uun0xF15O43eBA==", "requires": { "@babel/runtime": "^7.15.4", "github-slugger": "^1.3.0", @@ -11022,9 +11446,9 @@ } }, "gatsby-remark-copy-linked-files": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-5.14.0.tgz", - "integrity": "sha512-qZGAaziKtjNVohW3rWtfVZ4H6/6UonTCTM1du5cIL/VGhgnOQBsBoxgSEpD0gC7oH2TvJAFYh6CHixdjFkIkZQ==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-5.18.0.tgz", + "integrity": "sha512-tqnf/iW7F3tWrNN+scuE176js6WK0Vl8NfhXiHxZ7mQKpnnakLgp9b8q1CQro4Hh2HZxDL4SsKk+nuQqsNqCfw==", "requires": { "@babel/runtime": "^7.15.4", "cheerio": "^1.0.0-rc.10", @@ -11037,9 +11461,9 @@ }, "dependencies": { "cheerio": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", - "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "requires": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -11047,8 +11471,7 @@ "domutils": "^3.0.1", "htmlparser2": "^8.0.1", "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "tslib": "^2.4.0" + "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "dom-serializer": { @@ -11085,9 +11508,9 @@ } }, "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" }, "fs-extra": { "version": "10.1.0", @@ -11117,24 +11540,19 @@ "requires": { "entities": "^4.3.0" } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "gatsby-remark-images": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-images/-/gatsby-remark-images-6.14.0.tgz", - "integrity": "sha512-IGNZ8xUVvbThmg4NeRavX+5BDG4DEGus4hKi/GdWYX1kVGn+I3q4H8O7Kpa7NDpruIF+eY2EvbtTmoNpVrk/Ag==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/gatsby-remark-images/-/gatsby-remark-images-6.18.0.tgz", + "integrity": "sha512-xFLFbHerjdhyIl1iCa5IlMecUoz5HYkvN80rSkCDOZPDXz9AvqrWcoG5KIFP1hgiYh1nZC1CSzd9qNr5yGrXsw==", "requires": { "@babel/runtime": "^7.15.4", "@gatsbyjs/potrace": "^2.2.0", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.10", - "gatsby-core-utils": "^3.14.0", + "gatsby-core-utils": "^3.18.0", "is-relative-url": "^3.0.0", "lodash": "^4.17.21", "mdast-util-definitions": "^4.0.0", @@ -11161,9 +11579,9 @@ } }, "cheerio": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", - "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "requires": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -11171,8 +11589,7 @@ "domutils": "^3.0.1", "htmlparser2": "^8.0.1", "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "tslib": "^2.4.0" + "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "color-convert": { @@ -11222,9 +11639,9 @@ } }, "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" }, "fs-extra": { "version": "10.1.0", @@ -11237,9 +11654,9 @@ } }, "gatsby-core-utils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.14.0.tgz", - "integrity": "sha512-JavHwcX5L+ZRoL5FKhYex3JfbwwS0273YTpf8y8SRKsObD8H+bbLOUlbOjASpqy+IU3dW+r76gT1dQdaqeH9Og==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", @@ -11247,9 +11664,9 @@ "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "import-from": "^4.0.0", - "lmdb": "^2.2.6", + "lmdb": "2.5.2", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", @@ -11258,6 +11675,24 @@ "xdg-basedir": "^4.0.0" } }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11275,19 +11710,19 @@ } }, "lmdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.4.2.tgz", - "integrity": "sha512-dgqoGgHl/lzPobumxIsagVy7JXBAdFJv74avJTC733lb6d/RiCrzjm5YOUyCjhKnCNTNlNPGBP6/C1gZelUwlA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.4.0", - "@lmdb/lmdb-darwin-x64": "2.4.0", - "@lmdb/lmdb-linux-arm": "2.4.0", - "@lmdb/lmdb-linux-arm64": "2.4.0", - "@lmdb/lmdb-linux-x64": "2.4.0", - "@lmdb/lmdb-win32-x64": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.2", + "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } @@ -11317,11 +11752,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -11336,15 +11766,15 @@ } }, "gatsby-source-filesystem": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-4.14.0.tgz", - "integrity": "sha512-r6QTNS0Y8DAWN/cHtA3P/cRXE41TAa0QuOeK+6lnoxAbDmgGt2/EvfXy0wIDvKJTYLQQL0WgY5/pxbvsUqTS5g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-4.18.0.tgz", + "integrity": "sha512-45ivbP9Ho6ioCqAJKdz5ejXlKCZ+8UCzQEC8cQbJI+k5CiJMdA09X65GVITUEob0bFRCcv5RQu4fOodrznaIwg==", "requires": { "@babel/runtime": "^7.15.4", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.14.0", + "gatsby-core-utils": "^3.18.0", "got": "^9.6.0", "md5-file": "^5.0.0", "mime": "^2.5.2", @@ -11370,9 +11800,9 @@ } }, "gatsby-core-utils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.14.0.tgz", - "integrity": "sha512-JavHwcX5L+ZRoL5FKhYex3JfbwwS0273YTpf8y8SRKsObD8H+bbLOUlbOjASpqy+IU3dW+r76gT1dQdaqeH9Og==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", @@ -11380,9 +11810,9 @@ "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "import-from": "^4.0.0", - "lmdb": "^2.2.6", + "lmdb": "2.5.2", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", @@ -11392,9 +11822,9 @@ }, "dependencies": { "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "requires": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -11482,7 +11912,7 @@ "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "requires": { "mimic-response": "^1.0.0" } @@ -11500,7 +11930,7 @@ "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "requires": { "lowercase-keys": "^1.0.0" } @@ -11510,7 +11940,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "keyv": { "version": "3.1.0", @@ -11521,19 +11951,19 @@ } }, "lmdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.4.2.tgz", - "integrity": "sha512-dgqoGgHl/lzPobumxIsagVy7JXBAdFJv74avJTC733lb6d/RiCrzjm5YOUyCjhKnCNTNlNPGBP6/C1gZelUwlA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.4.0", - "@lmdb/lmdb-darwin-x64": "2.4.0", - "@lmdb/lmdb-linux-arm": "2.4.0", - "@lmdb/lmdb-linux-arm64": "2.4.0", - "@lmdb/lmdb-linux-x64": "2.4.0", - "@lmdb/lmdb-win32-x64": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.2", + "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } @@ -11655,12 +12085,12 @@ } }, "gatsby-transformer-remark": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-5.14.0.tgz", - "integrity": "sha512-QHGnNRx9M+YMZBiS3dqHCvmSLgpGAXo/WRl8hNtCyO3MfF1oZlbAYkUWtMwNuwIWAtGmf/SifxzzKhiWRgfNjA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-5.18.0.tgz", + "integrity": "sha512-gGA50zv/hYoyatgIofdJVdbqUzE2YUi9MSCdE3dZl/DHi5rfUtC7cX09hqmCD2z9WRWTLQWupfpuZ3sfxJe1Xg==", "requires": { "@babel/runtime": "^7.15.4", - "gatsby-core-utils": "^3.14.0", + "gatsby-core-utils": "^3.18.0", "gray-matter": "^4.0.3", "hast-util-raw": "^6.0.2", "hast-util-to-html": "^7.1.3", @@ -11694,9 +12124,9 @@ } }, "gatsby-core-utils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.14.0.tgz", - "integrity": "sha512-JavHwcX5L+ZRoL5FKhYex3JfbwwS0273YTpf8y8SRKsObD8H+bbLOUlbOjASpqy+IU3dW+r76gT1dQdaqeH9Og==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", @@ -11704,9 +12134,9 @@ "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "import-from": "^4.0.0", - "lmdb": "^2.2.6", + "lmdb": "2.5.2", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", @@ -11715,6 +12145,24 @@ "xdg-basedir": "^4.0.0" } }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "hast-util-raw": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", @@ -11734,19 +12182,19 @@ } }, "lmdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.4.2.tgz", - "integrity": "sha512-dgqoGgHl/lzPobumxIsagVy7JXBAdFJv74avJTC733lb6d/RiCrzjm5YOUyCjhKnCNTNlNPGBP6/C1gZelUwlA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.4.0", - "@lmdb/lmdb-darwin-x64": "2.4.0", - "@lmdb/lmdb-linux-arm": "2.4.0", - "@lmdb/lmdb-linux-arm64": "2.4.0", - "@lmdb/lmdb-linux-x64": "2.4.0", - "@lmdb/lmdb-win32-x64": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.2", + "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } @@ -11873,20 +12321,29 @@ } }, "gatsby-transformer-sharp": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/gatsby-transformer-sharp/-/gatsby-transformer-sharp-4.14.0.tgz", - "integrity": "sha512-V8tpCavnmK05GK7LoSAUyd/KZBoZr2NK4IdyIbBdxOcXBqtsD/yrThOyLP00hEV03myTv/6nzSIBZdEL+AGG5g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/gatsby-transformer-sharp/-/gatsby-transformer-sharp-4.18.0.tgz", + "integrity": "sha512-uOsP5U10pWPdhpKHkPyKWoxCFEGdnreqmSrWrKUsHa0oViCfudbDrM+xWla+QQ0MhHHkqOUjdcfZRG3SwUlPcg==", "requires": { "@babel/runtime": "^7.15.4", "@gatsbyjs/potrace": "^2.2.0", "bluebird": "^3.7.2", "common-tags": "^1.8.2", "fs-extra": "^10.1.0", + "gatsby-plugin-utils": "^3.12.0", "probe-image-size": "^7.2.3", "semver": "^7.3.7", "sharp": "^0.30.3" }, "dependencies": { + "@types/sharp": { + "version": "0.30.4", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.4.tgz", + "integrity": "sha512-6oJEzKt7wZeS7e+6x9QFEOWGs0T/6of00+0onZGN1zSmcSjcTDZKgIGZ6YWJnHowpaKUCFBPH52mYljWqU32Eg==", + "requires": { + "@types/node": "*" + } + }, "color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -11924,11 +12381,125 @@ "universalify": "^2.0.0" } }, + "gatsby-core-utils": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.18.0.tgz", + "integrity": "sha512-mCoNgH4MilosLhEroklgVffwie9lyxgmvNwe/oIyzXr6NcZ2uxSp8G1KrgxdG2srt2hCNlZLlzS25ltLTeHTjA==", + "requires": { + "@babel/runtime": "^7.15.4", + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fastq": "^1.13.0", + "file-type": "^16.5.3", + "fs-extra": "^10.1.0", + "got": "^11.8.5", + "import-from": "^4.0.0", + "lmdb": "2.5.2", + "lock": "^1.1.0", + "node-object-hash": "^2.3.10", + "proper-lockfile": "^4.1.2", + "resolve-from": "^5.0.0", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" + } + }, + "gatsby-plugin-utils": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.12.0.tgz", + "integrity": "sha512-vdz3qwaCOkvgzAxMkZlgpmpWf555jISwek5lyWYhGyJJvXYV8KQ2cZ4CoOfFKAYVeZVSucrHcdWyY3fLLpQvAA==", + "requires": { + "@babel/runtime": "^7.15.4", + "@gatsbyjs/potrace": "^2.2.0", + "fs-extra": "^10.1.0", + "gatsby-core-utils": "^3.18.0", + "gatsby-sharp": "^0.12.0", + "graphql-compose": "^9.0.7", + "import-from": "^4.0.0", + "joi": "^17.4.2", + "mime": "^3.0.0", + "mini-svg-data-uri": "^1.4.4", + "svgo": "^2.8.0" + } + }, + "gatsby-sharp": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.12.0.tgz", + "integrity": "sha512-dZa/AgxmPzD0vvROEZSuT3IdzAFTxnq1FfLTf9n3mywonvsKYc84zj6nf8TEzBrVrBFAaLvZek4NpVAKWGr4/w==", + "requires": { + "@types/sharp": "^0.30.0", + "sharp": "^0.30.3" + } + }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "lmdb": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", + "msgpackr": "^1.5.4", + "node-addon-api": "^4.3.0", + "node-gyp-build-optional-packages": "5.0.3", + "ordered-binary": "^1.2.4", + "weak-lru-cache": "^1.2.2" + } + }, + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + }, "node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -11938,18 +12509,25 @@ } }, "sharp": { - "version": "0.30.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.4.tgz", - "integrity": "sha512-3Onig53Y6lji4NIZo69s14mERXXY/GV++6CzOYx/Rd8bnTwbhFbL09WZd7Ag/CCnA0WxFID8tkY0QReyfL6v0Q==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", "requires": { "color": "^4.2.3", "detect-libc": "^2.0.1", - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", "semver": "^7.3.7", "simple-get": "^4.0.1", "tar-fs": "^2.1.1", "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + } } } } @@ -11996,6 +12574,7 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -12010,12 +12589,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -12024,6 +12605,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -12034,6 +12616,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -12095,7 +12678,7 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "requires": { "assert-plus": "^1.0.0" } @@ -12350,7 +12933,7 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" }, "har-validator": { "version": "5.1.5", @@ -12408,7 +12991,8 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true }, "has-value": { "version": "1.0.0", @@ -12598,7 +13182,7 @@ "header-case": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", "requires": { "no-case": "^2.2.0", "upper-case": "^1.1.3" @@ -12607,7 +13191,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -12643,7 +13227,7 @@ "html-attributes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/html-attributes/-/html-attributes-1.1.0.tgz", - "integrity": "sha1-ggJ6T6x6YHDqbBjMOIauoY1t6gk=" + "integrity": "sha512-reT/KK6Ju+DZqAbAn3sIkpMH+658kEsaEjpNrej2O5XSUsH5SzVHX7NGZk5RiZcVi7l+RsV+5q3C6TqM5vxsVA==" }, "html-entities": { "version": "2.3.2", @@ -12703,7 +13287,7 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -12773,9 +13357,9 @@ "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" }, "immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" }, "import-fresh": { "version": "3.3.0", @@ -12993,7 +13577,7 @@ "is-alphanumeric": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=" + "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==" }, "is-alphanumerical": { "version": "1.0.4", @@ -13195,7 +13779,7 @@ "is-lower-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", "requires": { "lower-case": "^1.1.0" }, @@ -13203,7 +13787,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" } } }, @@ -13473,7 +14057,7 @@ "is-upper-case": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", "requires": { "upper-case": "^1.1.0" } @@ -13559,7 +14143,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "iterall": { "version": "1.3.0", @@ -13621,9 +14205,9 @@ "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==" }, "js-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", - "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" }, "js-tokens": { "version": "4.0.0", @@ -13648,7 +14232,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "jsesc": { "version": "2.5.2", @@ -13698,7 +14282,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { "version": "2.2.0", @@ -13806,7 +14390,7 @@ "line-height": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", - "integrity": "sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk=", + "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", "requires": { "computed-style": "~0.1.3" } @@ -13899,17 +14483,17 @@ "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==" }, "lodash.bind": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==" }, "lodash.chunk": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", - "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=" + "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==" }, "lodash.clonedeep": { "version": "4.5.0", @@ -13929,7 +14513,7 @@ "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "lodash.every": { "version": "4.6.0", @@ -13939,7 +14523,7 @@ "lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==" }, "lodash.flatten": { "version": "4.4.0", @@ -13964,12 +14548,12 @@ "lodash.has": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==" }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==" }, "lodash.map": { "version": "4.6.0", @@ -13994,27 +14578,27 @@ "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" }, "lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==" }, "lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==" }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==" }, "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" }, "lodash.truncate": { "version": "4.4.2", @@ -14062,7 +14646,7 @@ "lower-case-first": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", "requires": { "lower-case": "^1.1.2" }, @@ -14070,7 +14654,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" } } }, @@ -14422,7 +15006,7 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "meant": { "version": "1.0.3", @@ -14622,7 +15206,7 @@ "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "requires": { "dom-walk": "^0.1.0" } @@ -14901,9 +15485,9 @@ "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" }, "node-gyp-build-optional-packages": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.2.tgz", - "integrity": "sha512-PiN4NWmlQPqvbEFcH/omQsswWQbe5Z9YK/zdB23irp5j2XibaA2IrGvpSWmVVG4qMZdmPdwPctSy4a86rOMn6g==" + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", + "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==" }, "node-object-hash": { "version": "2.3.10", @@ -14933,7 +15517,7 @@ "not": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", - "integrity": "sha1-yWkcF0bFXc++VMvYvU/wQbwrUZ0=" + "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" }, "npm-run-path": { "version": "4.0.1", @@ -14954,6 +15538,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -14986,7 +15571,8 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true }, "oauth-sign": { "version": "0.9.0", @@ -15514,7 +16100,7 @@ "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", "requires": { "no-case": "^2.2.0" }, @@ -15522,7 +16108,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -15545,12 +16131,12 @@ "parse-bmfont-ascii": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" }, "parse-bmfont-binary": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" }, "parse-bmfont-xml": { "version": "1.1.4", @@ -15625,7 +16211,7 @@ "parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "parse-url": { "version": "6.0.0", @@ -15666,9 +16252,9 @@ } }, "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" }, "parse5": { "version": "7.0.0", @@ -15728,7 +16314,7 @@ "path-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", "requires": { "no-case": "^2.2.0" }, @@ -15736,7 +16322,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -15761,7 +16347,7 @@ "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "path-key": { "version": "2.0.1", @@ -15791,7 +16377,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "phin": { "version": "2.9.3", @@ -15821,7 +16407,7 @@ "pixelmatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", "requires": { "pngjs": "^3.0.0" } @@ -16213,6 +16799,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz", "integrity": "sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==", + "optional": true, "requires": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -16232,7 +16819,8 @@ "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "optional": true } } }, @@ -16261,9 +16849,9 @@ } }, "prism-react-renderer": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz", - "integrity": "sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==" }, "prismjs": { "version": "1.28.0", @@ -16283,7 +16871,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, "process-nextick-args": { "version": "2.0.1", @@ -16357,9 +16945,9 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "pump": { "version": "3.0.0", @@ -16386,7 +16974,7 @@ "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" }, "qs": { "version": "6.10.3", @@ -16488,39 +17076,41 @@ } }, "react-aria": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.15.0.tgz", - "integrity": "sha512-H9ClpIFwCDBjqEXrSAiS078MYTSTIs3B17ly+v4BO8DL0Zpmji9qaZlVOkEfCrS80bLIFyLX7Jc1Zhc+jaGvDg==", - "requires": { - "@react-aria/breadcrumbs": "^3.1.10", - "@react-aria/button": "^3.4.4", - "@react-aria/checkbox": "^3.3.4", - "@react-aria/combobox": "^3.2.6", - "@react-aria/dialog": "^3.1.9", - "@react-aria/focus": "^3.5.5", - "@react-aria/i18n": "^3.3.9", - "@react-aria/interactions": "^3.8.4", - "@react-aria/label": "^3.2.5", - "@react-aria/link": "^3.2.5", - "@react-aria/listbox": "^3.4.5", - "@react-aria/menu": "^3.4.4", - "@react-aria/meter": "^3.1.8", - "@react-aria/numberfield": "^3.1.6", - "@react-aria/overlays": "^3.8.2", - "@react-aria/progress": "^3.1.8", - "@react-aria/radio": "^3.1.11", - "@react-aria/searchfield": "^3.2.7", - "@react-aria/select": "^3.6.5", - "@react-aria/separator": "^3.1.7", - "@react-aria/slider": "^3.0.8", - "@react-aria/ssr": "^3.1.2", - "@react-aria/switch": "^3.1.8", - "@react-aria/table": "^3.2.4", - "@react-aria/tabs": "^3.1.5", - "@react-aria/textfield": "^3.5.5", - "@react-aria/tooltip": "^3.1.8", - "@react-aria/utils": "^3.12.0", - "@react-aria/visually-hidden": "^3.2.8" + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.17.0.tgz", + "integrity": "sha512-AiCMDBO8riUNQv/ABsJIaNMwAqpt8tPlhi84LRpXhbjTUWb0TYZuVQXQ7OzGp1i/Gj3F1snTJ+kHJAsJPgTz5Q==", + "requires": { + "@react-aria/breadcrumbs": "^3.2.1", + "@react-aria/button": "^3.5.1", + "@react-aria/calendar": "^3.0.0", + "@react-aria/checkbox": "^3.4.1", + "@react-aria/combobox": "^3.3.1", + "@react-aria/datepicker": "^3.0.0", + "@react-aria/dialog": "^3.2.1", + "@react-aria/focus": "^3.6.1", + "@react-aria/i18n": "^3.4.1", + "@react-aria/interactions": "^3.9.1", + "@react-aria/label": "^3.3.1", + "@react-aria/link": "^3.3.1", + "@react-aria/listbox": "^3.5.1", + "@react-aria/menu": "^3.5.1", + "@react-aria/meter": "^3.2.1", + "@react-aria/numberfield": "^3.2.1", + "@react-aria/overlays": "^3.9.1", + "@react-aria/progress": "^3.2.1", + "@react-aria/radio": "^3.2.1", + "@react-aria/searchfield": "^3.3.1", + "@react-aria/select": "^3.7.1", + "@react-aria/separator": "^3.2.1", + "@react-aria/slider": "^3.1.1", + "@react-aria/ssr": "^3.2.0", + "@react-aria/switch": "^3.2.1", + "@react-aria/table": "^3.3.0", + "@react-aria/tabs": "^3.2.1", + "@react-aria/textfield": "^3.6.1", + "@react-aria/tooltip": "^3.2.1", + "@react-aria/utils": "^3.13.1", + "@react-aria/visually-hidden": "^3.3.1" } }, "react-autosize-textarea": { @@ -16714,9 +17304,9 @@ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, "react-google-recaptcha-v3": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/react-google-recaptcha-v3/-/react-google-recaptcha-v3-1.9.7.tgz", - "integrity": "sha512-LgHTuPUE86jGOtmMYMUWEYux8n7M2ZNj5GHct//DlXWZGyLIgFfLbvxA3UlgrG+tSu2pgw2mqXtYdPxaldqhWQ==", + "version": "1.9.8", + "resolved": "https://registry.npmjs.org/react-google-recaptcha-v3/-/react-google-recaptcha-v3-1.9.8.tgz", + "integrity": "sha512-1AuwvNjcGxMQTBMgsu4XI+Tzh/9En8xdVE/OS48l2Z8VsaCtb8eLh2RcMv/bxgt+UbHzPfQ2JynPBxB1+hYkJA==", "requires": { "hoist-non-react-statics": "^3.3.2" } @@ -16748,12 +17338,12 @@ } }, "react-instantsearch-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.26.0.tgz", - "integrity": "sha512-rBfyP05t6SHuBcXiKibzz0jgA8/qLepy4J/RWb9z++GM6wHO/D0Rhs5eFCw9fBJbXKs3iw1FR5BhxuJV1zBhsQ==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.30.0.tgz", + "integrity": "sha512-HodD592g79/nN+9VI9X2s9sLtTFT5Ax5sUJfWWokYhd36qd7IUZF0ZVkFxBLNlS/QnC/lMSI5xJ+8FrDWyS16w==", "requires": { "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.8.0", + "algoliasearch-helper": "^3.10.0", "prop-types": "^15.6.2", "react-fast-compare": "^3.0.0" }, @@ -16766,16 +17356,16 @@ } }, "react-instantsearch-dom": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.26.0.tgz", - "integrity": "sha512-ai3FlvfhZ019OmOG9V4fdIA28Vlw9KuvHEsG9Nl4WkB3Ic4aPxuxaPNxnlT1CXTIVFgegptkVxi6A0iQvaTCcA==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.30.0.tgz", + "integrity": "sha512-nTZTtLWY0cW3IrPBNratdl5Kseh1/9f4xCtTEgD9xdhOepEJ2VNOPElKa+b2kGSwwd8ZbgihrxeYSzsOUVS4cg==", "requires": { "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.8.0", + "algoliasearch-helper": "^3.10.0", "classnames": "^2.2.5", "prop-types": "^15.6.2", "react-fast-compare": "^3.0.0", - "react-instantsearch-core": "6.26.0" + "react-instantsearch-core": "6.30.0" }, "dependencies": { "react-fast-compare": { @@ -16846,33 +17436,35 @@ } }, "react-side-effect": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", - "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==" }, "react-stately": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.13.0.tgz", - "integrity": "sha512-GMNqVC0EAWJcq/mFIsE1vCHVPbpqtpb9DHzI0zROmCBKYHvjO8eVPdxb/6iAD3ZuSkMq29B9uDpcD0PRWzr6CQ==", - "requires": { - "@react-stately/checkbox": "^3.0.7", - "@react-stately/collections": "^3.3.8", - "@react-stately/combobox": "^3.0.5", - "@react-stately/data": "^3.4.7", - "@react-stately/list": "^3.4.5", - "@react-stately/menu": "^3.2.7", - "@react-stately/numberfield": "^3.0.7", - "@react-stately/overlays": "^3.2.0", - "@react-stately/radio": "^3.3.6", - "@react-stately/searchfield": "^3.1.7", - "@react-stately/select": "^3.1.7", - "@react-stately/selection": "^3.9.4", - "@react-stately/slider": "^3.0.8", - "@react-stately/table": "^3.1.3", - "@react-stately/tabs": "^3.0.5", - "@react-stately/toggle": "^3.2.7", - "@react-stately/tooltip": "^3.0.9", - "@react-stately/tree": "^3.2.4" + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.15.0.tgz", + "integrity": "sha512-5EC21Bpe2GzgJz4NYThCGubIu+XkFv9EsWVGJxWtXZ43ZGFVQZ3FCsiQe4CFbhkAvQg+AAbNwzBR2Z/3MuyJRA==", + "requires": { + "@react-stately/calendar": "^3.0.0", + "@react-stately/checkbox": "^3.1.1", + "@react-stately/collections": "^3.4.1", + "@react-stately/combobox": "^3.1.1", + "@react-stately/data": "^3.5.1", + "@react-stately/datepicker": "^3.0.0", + "@react-stately/list": "^3.5.1", + "@react-stately/menu": "^3.3.1", + "@react-stately/numberfield": "^3.1.1", + "@react-stately/overlays": "^3.3.1", + "@react-stately/radio": "^3.4.1", + "@react-stately/searchfield": "^3.2.1", + "@react-stately/select": "^3.2.1", + "@react-stately/selection": "^3.10.1", + "@react-stately/slider": "^3.1.1", + "@react-stately/table": "^3.2.0", + "@react-stately/tabs": "^3.1.1", + "@react-stately/toggle": "^3.3.1", + "@react-stately/tooltip": "^3.1.1", + "@react-stately/tree": "^3.3.1" } }, "react-swipeable": { @@ -16917,11 +17509,6 @@ "tslib": "^2.1.0" }, "dependencies": { - "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -17115,7 +17702,7 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" }, "parse-entities": { "version": "1.2.2", @@ -17383,7 +17970,7 @@ "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==" }, "request": { "version": "2.88.2", @@ -17437,7 +18024,7 @@ "require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" }, "require-main-filename": { "version": "2.0.0", @@ -17532,7 +18119,7 @@ "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==" }, "json5": { "version": "1.0.1", @@ -17626,7 +18213,7 @@ "rework": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "integrity": "sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==", "requires": { "convert-source-map": "^0.3.3", "css": "^2.0.0" @@ -17635,14 +18222,14 @@ "convert-source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==" } } }, "rework-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + "integrity": "sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==" }, "rimraf": { "version": "3.0.2", @@ -17777,9 +18364,9 @@ } }, "sass": { - "version": "1.52.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", - "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", + "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -17787,9 +18374,9 @@ } }, "sass-loader": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.1.tgz", - "integrity": "sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.3.1.tgz", + "integrity": "sha512-y2aBdtYkbqorVavkC3fcJIUDGIegzDWPn3/LAFhsf3G+MzPKTJx37sROf5pXtUeggSVbNbmfj8TgRaSLMelXRA==", "requires": { "klona": "^2.0.4", "loader-utils": "^2.0.0", @@ -17839,7 +18426,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } @@ -17919,7 +18506,7 @@ "sentence-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", "requires": { "no-case": "^2.2.0", "upper-case-first": "^1.1.2" @@ -17928,7 +18515,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -18186,7 +18773,7 @@ "snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", "requires": { "no-case": "^2.2.0" }, @@ -18194,7 +18781,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -18369,7 +18956,7 @@ "sort-media-queries": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/sort-media-queries/-/sort-media-queries-0.2.2.tgz", - "integrity": "sha1-/d/B5w1mJ1kJG2ojd29EiGg9yh4=", + "integrity": "sha512-XwBDwDsHhjcfMPfGakCDWuNBSiTeMmIRNNEb1bYlyzvG81hBRTAQTu40Nm8cyP/a+aFUaDxPqfzncmYKtibi+Q==", "requires": { "xtend": "^4.0.0" } @@ -18490,11 +19077,18 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-generator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", - "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", "requires": { - "stackframe": "^1.1.1" + "stackframe": "^1.3.4" + }, + "dependencies": { + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + } } }, "stack-trace": { @@ -18508,18 +19102,23 @@ "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" }, "stacktrace-gps": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz", - "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", "requires": { "source-map": "0.5.6", - "stackframe": "^1.1.1" + "stackframe": "^1.3.4" }, "dependencies": { "source-map": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==" + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" } } }, @@ -18572,12 +19171,12 @@ "source-list-map": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", - "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=" + "integrity": "sha512-FqR2O+cX+toUD3ULVIgTtiqYIqPnA62ehJD47mf4LG1PZCB+xmIa3gcTEhegGbP22aRPh88dJSdgDIolrvSxBQ==" }, "webpack-sources": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", - "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", + "integrity": "sha512-iqanNZjOHLdPn/R0e/nKVn90dm4IsUMxKam0MZD1btWhFub/Cdo1nWdMio6yEqBc0F8mEieOjc+jfBSXwna94Q==", "requires": { "source-list-map": "^1.1.1", "source-map": "~0.5.3" @@ -18593,7 +19192,7 @@ "stream-parser": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", "requires": { "debug": "2" }, @@ -18609,7 +19208,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -18723,7 +19322,7 @@ "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" }, "strip-eof": { "version": "1.0.0", @@ -18856,7 +19455,7 @@ "swap-case": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", "requires": { "lower-case": "^1.1.1", "upper-case": "^1.1.1" @@ -18865,7 +19464,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" } } }, @@ -19080,7 +19679,7 @@ "title-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", "requires": { "no-case": "^2.2.0", "upper-case": "^1.0.3" @@ -19089,7 +19688,7 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "no-case": { "version": "2.3.2", @@ -19164,7 +19763,7 @@ "toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "toidentifier": { "version": "1.0.1", @@ -19183,7 +19782,7 @@ "toposort": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" }, "tough-cookie": { "version": "2.5.0", @@ -19202,12 +19801,12 @@ "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "requires": { "escape-string-regexp": "^1.0.2" } @@ -19290,7 +19889,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "type": { "version": "1.2.0", @@ -19561,7 +20160,7 @@ "unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" }, "unset-value": { "version": "1.0.0", @@ -19604,6 +20203,15 @@ } } }, + "update-browserslist-db": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", + "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "update-input-width": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/update-input-width/-/update-input-width-1.2.2.tgz", @@ -19678,12 +20286,12 @@ "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, "upper-case-first": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", "requires": { "upper-case": "^1.1.1" } @@ -19704,7 +20312,7 @@ "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -19713,12 +20321,12 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" } } }, @@ -19817,7 +20425,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -20224,6 +20832,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -20311,7 +20920,7 @@ "x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" + "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==" }, "xdg-basedir": { "version": "4.0.0", @@ -20332,7 +20941,7 @@ "xml-parse-from-string": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" }, "xml2js": { "version": "0.4.23", diff --git a/package.json b/package.json index b90b87f0c2..7de74e5ffe 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/arduino/docs-content#readme", "dependencies": { - "@arduino/docs-arduino-cc": "^1.3.1", + "@arduino/docs-arduino-cc": "1.4.0-b", "gatsby": "^4.9.2" }, "volta": {