{"id":4467,"date":"2020-08-28T16:56:43","date_gmt":"2020-08-28T15:56:43","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=4467"},"modified":"2020-08-28T16:56:43","modified_gmt":"2020-08-28T15:56:43","slug":"adaptacion-a-iot-de-un-difusor-de-aceites-esenciales-tenswall-con-control-remoto-ir","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=4467","title":{"rendered":"Adaptaci\u00f3n a IoT de un difusor de aceites esenciales TENSWALL con control remoto IR"},"content":{"rendered":"<p>Seguimos con las adaptaciones a IoT. Otra de las que he realizado recientemente es la integraci\u00f3n en mi sistema de dom\u00f3tica basado en Home Assistant de un difusor de aceites esenciales controlado por infrarrojos. A principio de verano le regalamos uno de estos difusores a mis cu\u00f1ados para su casa, pero como tambi\u00e9n nos gust\u00f3 para la nuestra, nos decidimos a comprar uno. Elegimos un modelo en Amazon con iluminaci\u00f3n y control remoto por infrarrojos, un <a href=\"https:\/\/www.amazon.es\/gp\/product\/B0833KCCK8\" target=\"_blank\">Tenswall de 500 ml<\/a>.<\/p>\n<figure id=\"attachment_4468\" aria-describedby=\"caption-attachment-4468\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/08\/61l2xGlQwTL._AC_SL1500_.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/08\/61l2xGlQwTL._AC_SL1500_-400x368.jpg\" alt=\"Difusor de aceites Tenswall de 500 ml y control por infrarrojos\" title=\"Difusor de aceites Tenswall de 500 ml y control por infrarrojos\" width=\"400\" height=\"368\" class=\"size-medium wp-image-4468\" \/><\/a><figcaption id=\"caption-attachment-4468\" class=\"wp-caption-text\">Difusor de aceites Tenswall de 500 ml y control por infrarrojos<\/figcaption><\/figure>\n<p>Por lo que he podido averiguar, es un modelo bastante estandarizado vendido bajo multitud de marcas y fabricantes: se basa en el uso de frecuencias ultras\u00f3nicas para producir una vaporizaci\u00f3n del agua y los aceites esenciales a ella a\u00f1adidos, generando una niebla que esparce las esencias, pero sin calentar el agua colocada en el dep\u00f3sito. Existen otros modelos m\u00e1s avanzados que integran capacidad WiFi y controlable desde una aplicaci\u00f3n en el tel\u00e9fono m\u00f3vil, basado -por lo que recuerdo- en un ESP8266, pero el modelo que nosotros adquirimos tan s\u00f3lo cuenta con capacidad IR. En realidad, una ventaja para lo que estaba buscando. El modelo que nosotros adquirimos tiene las siguientes funciones:<\/p>\n<ul>\n<li>Encendido\/apagado<\/li>\n<li>Funcionamiento en modo intermitente (varios segundos generando niebla, varios segundos sin generarla)<\/li>\n<li>Funcionamiento en modo continuo<\/li>\n<li>Temporizador de funcionamiento a 60, 120 o 180 minutos, o bien en continuo<\/li>\n<li>Funcionamiento con mucha niebla o poca niebla<\/li>\n<li>Encendido de luces led, en modo carrusel, o 16 posiciones posibles<\/li>\n<li>Apagado de las luces led<\/li>\n<\/ul>\n<p>Para realizar la adaptaci\u00f3n a IoT, lo primero fue capturar los c\u00f3digos IR enviados por el mando a distancia. Para ello utilic\u00e9 un receptor IR y una librer\u00eda arduino que ya en su momento emple\u00e9 para leer c\u00f3digos del aire acondicionado. Captur\u00e9 cada uno de los c\u00f3digos asociados a los comportamientos indicados m\u00e1s arriba. Los adjunto por si a alguien m\u00e1s le sirvieran, en formato raw, y su equivalencia en protocolo NEC:<\/p>\n<ul>\n<li>uint16_t rawDataOnOff[67] = {9040, 4466,  600, 532,  604, 530,  596, 538,  598, 536,  598, 534,  602, 532,  594, 538,  596, 536,  598, 1642,  598, 1642,  598, 1644,  598, 1644,  596, 1646,  596, 1644,  594, 1646,  594, 1646,  594, 538,  596, 536,  598, 560,  576, 558,  566, 568,  568, 564,  572, 562,  574, 560,  576, 1640,  602, 1640,  600, 1640,  600, 1640,  600, 1640,  600, 1642,  600, 1640,  600, 1642,  600};  \/\/ NEC FF00FF<\/li>\n<li>uint16_t rawDataIntermittent[67] = {9040, 4462,  592, 540,  594, 540,  596, 536,  598, 534,  602, 532,  592, 542,  594, 538,  598, 536,  600, 1640,  600, 1642,  600, 1642,  600, 1642,  598, 1644,  598, 1644,  596, 1646,  596, 1646,  594, 1646,  594, 540,  596, 538,  598, 536,  600, 534,  602, 532,  594, 540,  596, 538,  598, 536,  600, 1640,  600, 1640,  600, 1642,  600, 1640,  600, 1642,  600, 1640,  600, 1642,  598};  \/\/ NEC FF807F<\/li>\n<li>uint16_t rawDataContinuous[67] = {9032, 4466,  600, 532,  602, 530,  594, 538,  596, 536,  600, 534,  602, 530,  594, 540,  596, 538,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  600, 1642,  598, 534,  600, 1640,  600, 534,  592, 540,  594, 538,  598, 534,  600, 532,  592, 540,  596, 1644,  594, 538,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1644,  598, 1642,  598};  \/\/ NEC FF40BF<\/li>\n<li>uint16_t rawDataTiming[67] = {9032, 4464,  602, 530,  594, 538,  598, 536,  600, 532,  602, 530,  596, 538,  598, 534,  600, 532,  602, 1638,  604, 1636,  594, 1646,  594, 1646,  594, 1644,  598, 1642,  598, 1642,  598, 1642,  598, 534,  600, 532,  604, 530,  596, 1644,  598, 534,  600, 534,  602, 532,  594, 540,  596, 1644,  596, 1642,  598, 1642,  598, 534,  602, 1638,  602, 1638,  602, 1638,  604, 1636,  604};  \/\/ NEC FF10EF<\/li>\n<li>uint16_t rawDataBigSmall[67] = {9034, 4466,  600, 532,  602, 530,  594, 538,  596, 538,  598, 534,  602, 532,  594, 566,  570, 564,  570, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 1642,  598, 536,  600, 532,  602, 1638,  604, 530,  594, 538,  598, 536,  600, 534,  602, 532,  594, 1646,  594, 1646,  594, 540,  596, 1644,  596, 1644,  596, 1644,  598, 1644,  596};  \/\/ NEC FF906F<\/li>\n<li>uint16_t rawDataLight[67] = {9040, 4462,  594, 538,  596, 536,  598, 536,  600, 532,  602, 532,  604, 530,  596, 538,  596, 538,  598, 1644,  596, 1644,  598, 1644,  596, 1644,  596, 1646,  594, 1646,  594, 1648,  602, 1640,  602, 530,  594, 1648,  602, 532,  594, 1646,  594, 540,  596, 538,  598, 536,  600, 534,  600, 1640,  600, 532,  592, 1648,  602, 530,  594, 1648,  592, 1648,  592, 1648,  592, 1650,  602};  \/\/ NEC FF50AF<\/li>\n<li>uint16_t rawDataLightOff[3] = {9042, 2220,  596};  \/\/ NEC (Repeat) FFFFFFFFFFFFFFFF<\/li>\n<\/ul>\n<p>Posteriormente pas\u00e9 a crear un c\u00f3digo arduino que se suscribe a un <em>topic<\/em> MQTT espec\u00edfico con el que se interact\u00faa con el difusor. La idea es crear en Home Assistant un objeto que implemente las funciones del mando a distancia, y mapear los comandos enviados desde Home Assistant a los c\u00f3digos IR anteriores. En Home Assistant, basta con crear un objeto de tipo luz, que implemente las funciones anteriormente descritas:<\/p>\n<p><code><br \/>\nlight:<br \/>\n- platform: mqtt<br \/>\n    schema: json<br \/>\n    name: Oil Diffuser & Light<br \/>\n    state_topic: \"&lt;topic&gt;\"<br \/>\n    command_topic: \"&lt;topic&gt;\/set\"<br \/>\n    brightness: true<br \/>\n    rgb: false<br \/>\n    effect: true<br \/>\n    effect_list: [intermittent,continuous,timing,big\/small,stopLight,lightOff]<br \/>\n<\/code><\/p>\n<p>&#8230;lo que genera una entidad con el siguiente aspecto:<\/p>\n<figure id=\"attachment_4469\" aria-describedby=\"caption-attachment-4469\" style=\"width: 391px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/08\/oildiffuser-ha.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/08\/oildiffuser-ha-391x400.jpg\" alt=\"Entidad generada en Home Assistant\" title=\"Entidad generada en Home Assistant\" width=\"391\" height=\"400\" class=\"size-medium wp-image-4469\" \/><\/a><figcaption id=\"caption-attachment-4469\" class=\"wp-caption-text\">Entidad generada en Home Assistant<\/figcaption><\/figure>\n<p>Posteriormente, es necesario crear en Arduino un c\u00f3digo que sea capaz de suscribirse al topic definido en Home Assistant, y reacciones a la informaci\u00f3n JSON enviada por \u00e9ste. En realidad, todos los casos posibles son bastante sencillos. El caso que m\u00e1s complejidad tiene es el correspondiente a la luz, ya que el mismo bot\u00f3n\/c\u00f3digo sirve para encender la luz LED (que siempre empieza en carrusel de colores) y para rotar entre los 16 colores disponibles. En mi caso opt\u00e9 por mapear el deslizador de brillo definido (sin hacer uso de la paleta crom\u00e1tica) para escoger entre las 16 opciones de iluminaci\u00f3n, m\u00e1s el modo continuo. En mi caso, opt\u00e9 por lo siguiente:<\/p>\n<ul>\n<li>En el caso de recibir \u00ab1\u00bb como valor de brillo (valor m\u00ednimo): Apagar la luz LED<\/li>\n<li>En el caso de recibir \u00ab255\u00bb como valor de brillo (valor m\u00e1ximo): Encender en el primer modo, correspondiente a la rotaci\u00f3n de colores<\/li>\n<li>Para el resto de valores: Calcular en cu\u00e1l de los 16 tramos de luz se encuentra el deslizador (dividiendo el valor por 16), enviar el c\u00f3digo de apagado (que consiste en simular una pulsaci\u00f3n continua del bot\u00f3n de control de la luz durante 2 segundos), enviar el c\u00f3digo de luz para entrar en el modo de rotaci\u00f3n de colores, enviar de nuevo el c\u00f3digo para detener la rotaci\u00f3n de colores, y posteriormente tantas veces el c\u00f3digo de luz como el tramo en el que nos hallemos (ya que este es el funcionamiento del dispositivo).<\/li>\n<\/ul>\n<p>Por \u00faltimo, es necesario cargar el c\u00f3digo en un ESP8266, equipado con un emisor IR. Dado que el difusor de aceites que yo escog\u00ed dispone de abundante espacio, es bastante sencillo colocarlo. En mi caso, el difusor se alimenta con un transformador de 24v en continua, que no se puede utilizar directamente para alimentar al ESP8266. En mi caso, opt\u00e9 por utilizar un <a href=\"https:\/\/www.amazon.es\/gp\/product\/B0796Q462L\" target=\"_blank\">buck converter DC-DC de 24v a 3.3v<\/a>, con lo que queda solventado el problema de la diferencia de voltaje. \u00a1Y listo! Con todo esto es posible controlar un difusor de aceites simple desde la dom\u00f3tica de la casa.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seguimos con las adaptaciones a IoT. Otra de las que<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[530,543,621,798,846,851,894,1134],"series":[],"class_list":["post-4467","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-difusor-de-aceites","tag-domotica","tag-esp8266","tag-home-assistant","tag-infrarrojos","tag-iot","tag-json","tag-mqtt"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4467"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4467\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4467"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=4467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}