{"id":522,"date":"2024-10-17T18:22:36","date_gmt":"2024-10-17T17:22:36","guid":{"rendered":"https:\/\/ecothings.webs.upv.es\/?page_id=522"},"modified":"2024-10-17T18:25:04","modified_gmt":"2024-10-17T17:25:04","slug":"app-inventor","status":"publish","type":"page","link":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/","title":{"rendered":"App Inventor"},"content":{"rendered":"\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-323323d98d515ed57898c6e08a5e5722\">1. Description<\/p>\n\n\n\n<p>This document describes the use of an App Inventor 2 (AI2) extension to be able to communicate via Classic Bluetooth an App developed with AI2 with any device. Associated with this extension, an Arduino code is included to be able to encode and decode the Bluetooth telegrams (see Protocol section).<\/p>\n\n\n\n<p>The extension includes AI2 components to access different types of generic electronics such as digital, analog, and PWM inputs and outputs, but also for fairly common Arduino devices such as the sound buzzer, temperature and humidity sensors, infrared, etc\u2026 each These devices have an AI2 component with specific functionalities.<\/p>\n\n\n\n<p>In addition, there are also components for access to variables, not necessarily associated with a certain type of electronics, on which we can share information between the App and the device. These variables can be of the type boolean (bool), integer (int), decimal (float) and text strings (String).<\/p>\n\n\n\n<p>The extension was first developed by Leopoldo Armesto for Rob\u00f3tica F\u00e1cil, source code of the original extension can be found at [1], while the source code of the new extension has been integrated within Facilino OTA repository [2]. During the development of EcoThings project we have updated and improved this extension. For obvious reasons, we have kept the namespaces of Java classes as they were, I.e.: using Rob\u00f3tica F\u00e1cil names.<\/p>\n\n\n\n<p class=\"has-black-color has-text-color has-link-color has-medium-font-size wp-elements-fb4782041defa29bffb01747b1ce17f1\"><strong>a. <a>Download<\/a><\/strong><\/p>\n\n\n\n<p>The latest version of the Bluetooth extension can be downloaded from:<\/p>\n\n\n\n<p><a href=\"https:\/\/facilino.webs.upv.es\/ai2\/es.roboticafacil.facilino.runtime.bluetooth.aix\">https:\/\/facilino.webs.upv.es\/ai2\/es.roboticafacil.facilino.runtime.bluetooth.aix<\/a><\/p>\n\n\n\n<p>While the latest version of the Web extension can be downloaded from:<\/p>\n\n\n\n<p><a href=\"https:\/\/facilino.webs.upv.es\/ai2\/es.roboticafacil.facilino.runtime.web.aix\">https:\/\/facilino.webs.upv.es\/ai2\/es.roboticafacil.facilino.runtime.web.aix<\/a><\/p>\n\n\n\n<p class=\"has-black-color has-text-color has-link-color has-medium-font-size wp-elements-407cb6028f49559240a45c7f020c15ad\"><strong>b. <a>Importing Extensions in AI2<\/a><\/strong><\/p>\n\n\n\n<p>Once downloaded, you can import the extension to your project from the designer view:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"294\" height=\"116\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/1-3.jpg\" alt=\"\" class=\"wp-image-523\"\/><\/figure>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-3eb0a7bc015947bdc66743cc9ac4007a\">2. <a>Bluetooth Extension<\/a><\/p>\n\n\n\n<p class=\"has-black-color has-text-color has-link-color has-medium-font-size wp-elements-397ad5a6d8af9815bc8c9d19230e30f6\"><strong>a. <a>AI2 Project<\/a><\/strong><\/p>\n\n\n\n<p>This AI2 project is used as a complete demonstration of the capabilities of using AI2 to remotely read values from a Multisensor shield using an ESP32 and also to set values for actuators such as a servo, or LEDs.<\/p>\n\n\n\n<p>The project can be downloaded from:<\/p>\n\n\n\n<p><a href=\"https:\/\/facilino.webs.upv.es\/ai2\/FacilinoBluetooth_demo.aia\">https:\/\/facilino.webs.upv.es\/ai2\/FacilinoBluetooth_demo.aia<\/a><\/p>\n\n\n\n<p>The project has the following visible components:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Name<\/td><td>Component Type<\/td><td>Description<\/td><\/tr><tr><td>DeviceMAC<\/td><td>Label<\/td><td>To show the MAC of the device once connected.<\/td><\/tr><tr><td>Connect<\/td><td>ListPicker<\/td><td>To select the device to connect to.<\/td><\/tr><tr><td>Disconnect<\/td><td>Button<\/td><td>To disconnect from a device.<\/td><\/tr><tr><td>BlueLed<\/td><td>Switch<\/td><td>To set the blue LED state.<\/td><\/tr><tr><td>LblServoAngle<\/td><td>Label<\/td><td>To show the numerical value of the angle sent to the servo.<\/td><\/tr><tr><td>ServoSlider<\/td><td>Slider<\/td><td>To set the angle of the servo.<\/td><\/tr><tr><td>ReadSwitch<\/td><td>Switch<\/td><td>To enable\/disable readings of sensors.<\/td><\/tr><tr><td>ImgButD2<\/td><td>Image<\/td><td>An image to show the state of button D2 (ON\/OFF).<\/td><\/tr><tr><td>ImgButD3<\/td><td>Image<\/td><td>An image to show the state of button D3 (ON\/OFF).<\/td><\/tr><tr><td>LblPot<\/td><td>Label<\/td><td>To show the numerical value of the potentiometer.<\/td><\/tr><tr><td>PotSlider<\/td><td>Slider<\/td><td>To show the value of the potentiometer on a slider (thumb is not enabled)<\/td><\/tr><tr><td>LblTemp<\/td><td>Label<\/td><td>To show the numerical value of the temperature sensor.<\/td><\/tr><tr><td>TempWarning<\/td><td>Image<\/td><td>To show temperature warnings (too hot or too cold based on the threshold values).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>In addition to this, the project has the following non-visible components:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Name<\/td><td>Component Type<\/td><td>Description<\/td><\/tr><tr><td>Clock1<\/td><td>Clock<\/td><td>Used to send read requests for sensors (buttons and potentiometer) periodically.<\/td><\/tr><tr><td>ClockTemperature<\/td><td>Button<\/td><td>Used to send read requests for temperature sensor DHT11 (it has a different sampling period and thus, we use a separate clock).<\/td><\/tr><tr><td>FacilinoBluetoothClient1<\/td><td>FacilinoBluetoothClient<\/td><td>The Bluetooth client in charge of send and receiving all requests.<\/td><\/tr><tr><td>D13LED<\/td><td>DigitalWriteBluetooth<\/td><td>Bluetooth component to control the blue LED connected to D13 (GPIO18).<\/td><\/tr><tr><td>D12LED<\/td><td>DigitalWriteBluetooth<\/td><td>Bluetooth component to control the red LED connected to D12 (GPIO19).<\/td><\/tr><tr><td>D2Bt<\/td><td>DigitalReadBluetooth<\/td><td>Bluetooth component to read button state connected to D2 (GPIO26).<\/td><\/tr><tr><td>D3Bt<\/td><td>DigitalReadBluetooth<\/td><td>Bluetooth component to read button state connected to D3 (GPIO 25).<\/td><\/tr><tr><td>A0Pot<\/td><td>AnalogReadBluetooth<\/td><td>Bluetooth component to read a potentiometer connected to A0 (GPIO2).<\/td><\/tr><tr><td>Servo<\/td><td>ServoBluetooth<\/td><td>Bluetooth component to control a servo connected to D8 (GPIO12).<\/td><\/tr><tr><td>Temperature<\/td><td>TemperatureBluetooth<\/td><td>Bluetooth component to read temperature and humidity for a DHT11 sensor connected to D4 (GPI17)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"986\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/2-3-1024x986.jpg\" alt=\"\" class=\"wp-image-526\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/2-3-1024x986.jpg 1024w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/2-3-300x289.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/2-3-768x740.jpg 768w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/2-3.jpg 1333w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The code to stablish the Bluetooth connection is as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/3-5-1024x499.jpg\" alt=\"\" class=\"wp-image-527\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/3-5-1024x499.jpg 1024w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/3-5-300x146.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/3-5-768x374.jpg 768w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/3-5.jpg 1395w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>To set values for actuators (LEDs and servo), we can use this code:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"723\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/4-3.jpg\" alt=\"\" class=\"wp-image-528\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/4-3.jpg 919w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/4-3-300x236.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/4-3-768x604.jpg 768w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><\/figure>\n\n\n\n<p>While in order to read from sensors, we can use this code:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"772\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/5-4-1024x772.jpg\" alt=\"\" class=\"wp-image-530\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/5-4-1024x772.jpg 1024w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/5-4-300x226.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/5-4-768x579.jpg 768w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/5-4-1536x1159.jpg 1536w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/5-4.jpg 1710w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-black-color has-text-color has-link-color has-medium-font-size wp-elements-a1a92b62db6788ded1f5fa335c0b9385\"><strong>b. <a>Facilino code<\/a><\/strong><\/p>\n\n\n\n<p>The Facilino code needed to be able to process all requests is as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"959\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/6-3-1024x959.jpg\" alt=\"\" class=\"wp-image-531\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/6-3-1024x959.jpg 1024w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/6-3-300x281.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/6-3-768x719.jpg 768w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/6-3.jpg 1112w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>As it can be seen, digital read and write requests as well as analog read requests are being handled by the Bluetooth Receive telegram instruction which means that all this can of request do not require any extra block instructions. In order to control a servo, we need first to attach the servo, by using the servo attach instruction, we are indicating to Facilino that we will use this servo. Similarly, by performing a first temperature read with DTH11 sensor, we are indicating to Facilino that this sensor will be used and where is connected to. Thus, Facilino uses that information to decode a Servo telegram to set the angle to the corresponding servo pin and also to decode a Temperature telegram to read from the corresponding DHT11 sensor.<\/p>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-d0c437a91aa2d628c8b9c2a2077b7986\">3. <a>Web Extension<\/a><\/p>\n\n\n\n<p class=\"has-black-color has-text-color has-link-color has-medium-font-size wp-elements-397ad5a6d8af9815bc8c9d19230e30f6\"><strong>a. <a>AI2 Project<\/a><\/strong><\/p>\n\n\n\n<p>This demo uses the web extension and has basically the same visible components are the Bluetooth demo, but the connection-related components, in which we have to indicate the IP of the device to send data.<\/p>\n\n\n\n<p>The project can be download from:<\/p>\n\n\n\n<p><a href=\"https:\/\/facilino.webs.upv.es\/ai2\/FacilinoWeb_demo.aia\">https:\/\/facilino.webs.upv.es\/ai2\/FacilinoWeb_demo.aia<\/a><\/p>\n\n\n\n<p>Thus, the following visible components are the main ones:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Name<\/td><td>Component Type<\/td><td>Description<\/td><\/tr><tr><td>IP<\/td><td>TextBox<\/td><td>User must introduce the device IP (i.e.: format as 192.168.1.100)<\/td><\/tr><tr><td>Update<\/td><td>Button<\/td><td>To update device IP<\/td><\/tr><tr><td>BlueLed<\/td><td>Switch<\/td><td>To set the blue LED state.<\/td><\/tr><tr><td>LblServoAngle<\/td><td>Label<\/td><td>To show the numerical value of the angle sent to the servo.<\/td><\/tr><tr><td>ServoSlider<\/td><td>Slider<\/td><td>To set the angle of the servo.<\/td><\/tr><tr><td>ReadSwitch<\/td><td>Switch<\/td><td>To enable\/disable readings of sensors.<\/td><\/tr><tr><td>ImgButD2<\/td><td>Image<\/td><td>An image to show the state of button D2 (ON\/OFF).<\/td><\/tr><tr><td>ImgButD3<\/td><td>Image<\/td><td>An image to show the state of button D3 (ON\/OFF).<\/td><\/tr><tr><td>LblPot<\/td><td>Label<\/td><td>To show the numerical value of the potentiometer.<\/td><\/tr><tr><td>PotSlider<\/td><td>Slider<\/td><td>To show the value of the potentiometer on a slider (thumb is not enabled)<\/td><\/tr><tr><td>LblTemp<\/td><td>Label<\/td><td>To show the numerical value of the temperature sensor.<\/td><\/tr><tr><td>TempWarning<\/td><td>Image<\/td><td>To show temperature warnings (too hot or too cold based on the threshold values).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>In addition to this, the project has the following non-visible components:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Name<\/td><td>Component Type<\/td><td>Description<\/td><\/tr><tr><td>Clock1<\/td><td>Clock<\/td><td>Used to send read requests for sensors (buttons and potentiometer) periodically.<\/td><\/tr><tr><td>ClockTemperature<\/td><td>Button<\/td><td>Used to send read requests for temperature sensor DHT11 (it has a different sampling period and thus, we use a separate clock).<\/td><\/tr><tr><td>FacilinoWeb<strong>1<\/strong><\/td><td>FacilinoWeb<\/td><td>The web component in charge of send and receiving all requests (HTTP API).<\/td><\/tr><tr><td>D13LED<\/td><td>DigitalWriteWeb<\/td><td>Web component to control the blue LED connected to D13 (GPIO18).<\/td><\/tr><tr><td>D12LED<\/td><td>DigitalWriteWeb<\/td><td>Web component to control the red LED connected to D12 (GPIO19).<\/td><\/tr><tr><td>D2Bt<\/td><td>DigitalReadWeb<\/td><td>Web component to read button state connected to D2 (GPIO26).<\/td><\/tr><tr><td>D3Bt<\/td><td>DigitalReadWeb<\/td><td>Web component to read button state connected to D3 (GPIO 25).<\/td><\/tr><tr><td>A0Pot<\/td><td>AnalogReadWeb<\/td><td>Web component to read a potentiometer connected to A0 (GPIO2).<\/td><\/tr><tr><td>Servo<\/td><td>ServoWeb<\/td><td>Web component to control a servo connected to D8 (GPIO12).<\/td><\/tr><tr><td>Temperature<\/td><td>TemperatureWeb<\/td><td>Web component to read temperature and humidity for a DHT11 sensor connected to D4 (GPI17)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1021\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/7-3-1024x1021.jpg\" alt=\"\" class=\"wp-image-532\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/7-3-1024x1021.jpg 1024w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/7-3-300x300.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/7-3-150x150.jpg 150w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/7-3-768x766.jpg 768w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/7-3.jpg 1211w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The code to update device IP is simply (the web component includes a property named \u2018Host\u2019 that can be set at design phase, but also in run-time):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"342\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/8-3.jpg\" alt=\"\" class=\"wp-image-533\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/8-3.jpg 800w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/8-3-300x128.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/8-3-768x328.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>To set values for the actuators, we can use the following code:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"818\" height=\"714\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/9-3.jpg\" alt=\"\" class=\"wp-image-534\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/9-3.jpg 818w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/9-3-300x262.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/9-3-768x670.jpg 768w\" sizes=\"auto, (max-width: 818px) 100vw, 818px\" \/><\/figure>\n\n\n\n<p>To read from sensors, we can use the following code:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"730\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/10-3-1024x730.jpg\" alt=\"\" class=\"wp-image-535\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/10-3-1024x730.jpg 1024w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/10-3-300x214.jpg 300w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/10-3-768x548.jpg 768w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/10-3-1536x1096.jpg 1536w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/10-3.jpg 1765w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>As it can be seen, the code is almost identical in both cases, because of the aspect of the blocks, but the do implement a different feature depending on whether we are using the Bluetooth extension or the web extension.<\/p>\n\n\n\n<p class=\"has-black-color has-text-color has-link-color has-medium-font-size wp-elements-a1a92b62db6788ded1f5fa335c0b9385\"><strong>b. <a>Facilino code<\/a><\/strong><\/p>\n\n\n\n<p>The Facilino code to deal with HTTP REST request is as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"813\" height=\"885\" src=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/11-3.jpg\" alt=\"\" class=\"wp-image-536\" srcset=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/11-3.jpg 813w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/11-3-276x300.jpg 276w, https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/11-3-768x836.jpg 768w\" sizes=\"auto, (max-width: 813px) 100vw, 813px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><a><strong>References<\/strong><\/a><strong><\/strong><\/h1>\n\n\n\n<p><strong>[1] <\/strong><a href=\"https:\/\/github.com\/roboticafacil\/facilino_ai2\">https:\/\/github.com\/roboticafacil\/facilino_ai2<\/a><strong><\/strong><\/p>\n\n\n\n<p><strong>[2] <\/strong><a href=\"https:\/\/github.com\/roboticafacil\/facilino_ota\">https:\/\/github.com\/roboticafacil\/facilino_ota<\/a> <strong><\/strong><\/p>\n\n\n\n<div data-wp-interactive=\"core\/file\" class=\"wp-block-file\"><object data-wp-bind--hidden=\"!state.hasPdfPreview\" hidden class=\"wp-block-file__embed\" data=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App-Inventor.pdf\" type=\"application\/pdf\" style=\"width:100%;height:600px\" aria-label=\"Embed of App Inventor.\"><\/object><a id=\"wp-block-file--media-d01fafb4-1013-42a3-9052-af4a79b1b220\" href=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App-Inventor.pdf\">App Inventor<\/a><a href=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App-Inventor.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-d01fafb4-1013-42a3-9052-af4a79b1b220\">Download<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>1. Description This document describes the use of an App Inventor 2 (AI2) extension to be able to communicate via Classic Bluetooth an App developed &hellip; <\/p>\n","protected":false},"author":1,"featured_media":537,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-522","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>App Inventor - Ecothings<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"App Inventor - Ecothings\" \/>\n<meta property=\"og:description\" content=\"1. Description This document describes the use of an App Inventor 2 (AI2) extension to be able to communicate via Classic Bluetooth an App developed &hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/\" \/>\n<meta property=\"og:site_name\" content=\"Ecothings\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-17T17:25:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App_inventor.png\" \/>\n\t<meta property=\"og:image:width\" content=\"325\" \/>\n\t<meta property=\"og:image:height\" content=\"325\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/\",\"url\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/\",\"name\":\"App Inventor - Ecothings\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/App_inventor.png\",\"datePublished\":\"2024-10-17T17:22:36+00:00\",\"dateModified\":\"2024-10-17T17:25:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/App_inventor.png\",\"contentUrl\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/App_inventor.png\",\"width\":325,\"height\":325},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/index.php\\\/app-inventor\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"App Inventor\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/#website\",\"url\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/\",\"name\":\"Ecothings\",\"description\":\"Erasmus+ KA220-SCH project focused on domotics\",\"publisher\":{\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/#organization\",\"name\":\"Ecothings\",\"url\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/cropped-site-icon.png\",\"contentUrl\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/cropped-site-icon.png\",\"width\":512,\"height\":512,\"caption\":\"Ecothings\"},\"image\":{\"@id\":\"https:\\\/\\\/ecothings.webs.upv.es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"App Inventor - Ecothings","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/","og_locale":"en_GB","og_type":"article","og_title":"App Inventor - Ecothings","og_description":"1. Description This document describes the use of an App Inventor 2 (AI2) extension to be able to communicate via Classic Bluetooth an App developed &hellip;","og_url":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/","og_site_name":"Ecothings","article_modified_time":"2024-10-17T17:25:04+00:00","og_image":[{"width":325,"height":325,"url":"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App_inventor.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/","url":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/","name":"App Inventor - Ecothings","isPartOf":{"@id":"https:\/\/ecothings.webs.upv.es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/#primaryimage"},"image":{"@id":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/#primaryimage"},"thumbnailUrl":"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App_inventor.png","datePublished":"2024-10-17T17:22:36+00:00","dateModified":"2024-10-17T17:25:04+00:00","breadcrumb":{"@id":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/#primaryimage","url":"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App_inventor.png","contentUrl":"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2024\/10\/App_inventor.png","width":325,"height":325},{"@type":"BreadcrumbList","@id":"https:\/\/ecothings.webs.upv.es\/index.php\/app-inventor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ecothings.webs.upv.es\/"},{"@type":"ListItem","position":2,"name":"App Inventor"}]},{"@type":"WebSite","@id":"https:\/\/ecothings.webs.upv.es\/#website","url":"https:\/\/ecothings.webs.upv.es\/","name":"Ecothings","description":"Erasmus+ KA220-SCH project focused on domotics","publisher":{"@id":"https:\/\/ecothings.webs.upv.es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ecothings.webs.upv.es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/ecothings.webs.upv.es\/#organization","name":"Ecothings","url":"https:\/\/ecothings.webs.upv.es\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/ecothings.webs.upv.es\/#\/schema\/logo\/image\/","url":"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2022\/07\/cropped-site-icon.png","contentUrl":"https:\/\/ecothings.webs.upv.es\/wp-content\/uploads\/2022\/07\/cropped-site-icon.png","width":512,"height":512,"caption":"Ecothings"},"image":{"@id":"https:\/\/ecothings.webs.upv.es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/pages\/522","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/comments?post=522"}],"version-history":[{"count":3,"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/pages\/522\/revisions"}],"predecessor-version":[{"id":541,"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/pages\/522\/revisions\/541"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/media\/537"}],"wp:attachment":[{"href":"https:\/\/ecothings.webs.upv.es\/index.php\/wp-json\/wp\/v2\/media?parent=522"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}