{"id":4853,"date":"2021-07-25T10:12:16","date_gmt":"2021-07-25T09:12:16","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=4853"},"modified":"2021-07-25T10:12:16","modified_gmt":"2021-07-25T09:12:16","slug":"codificacion-y-envio-de-imagenes-por-mqtt-y-uso-de-las-mismas-en-whatsapp","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=4853","title":{"rendered":"Codificaci\u00f3n y env\u00edo de im\u00e1genes por MQTT, y uso de las mismas en HomeAssistant"},"content":{"rendered":"<p>En fechas recientes he realizado un aprovechamiento interesante de las capacidades de comunicaci\u00f3n que proporciona el servidor MQTT que tengo instalado para diversos temas: el env\u00edo de im\u00e1genes a trav\u00e9s del mismo. en principio no es algo para lo que est\u00e9 pensado un servidor MQTT, que act\u00faa como servidor de mensajer\u00eda, mediante la suscripci\u00f3n a una serie de <em>topics<\/em>, mediante los cuales clientes del servidor MQTT pueden intercambiar informaci\u00f3n en formato texto. Pero como al fin y al cabo, las im\u00e1genes no dejan de transmitirse como informaci\u00f3n codificada, es posible ponerse algo <em>creativo<\/em> para conseguir su procesamiento correcto.<\/p>\n<p>En mi escenario, se trataba de compartir informaci\u00f3n proveniente de una webcam, para integrarla en mi sistema de dom\u00f3tica. En otras circunstancias, consumir\u00eda la informaci\u00f3n directamente de la webcam, pero el servidor de dom\u00f3tica y la webcam se encuentran en ubicaciones geogr\u00e1ficas distintas, y la red de la webcam se encuentra tras un CG-NAT, por lo que no es posible establecer una publicaci\u00f3n directa de puertos. Existe la posibilidad de establecer una VPN, pero esta opci\u00f3n me parec\u00eda bastante m\u00e1s interesante. La webcam se trata de una <a href=\"https:\/\/bitacora.eniac2000.com\/?p=4787\" title=\"Una webcam con Arduino: el ESP32-Cam\" target=\"_blank\">ESP32-CAM<\/a>, con capacidad para publicar im\u00e1genes tanto en formato <em>streaming<\/em> como im\u00e1genes individuales, y acceder a ellas a trav\u00e9s de una URL concreta. Mi idea era aprovechar la capacidad de Python de convertir im\u00e1genes a arrays de bytes, y volcar la informaci\u00f3n a un topic MQTT espec\u00edfico, para su posterior consumo. Consumo que en una primera instancia ser\u00eda una publicaci\u00f3n directa en Home Assistant, pero que posteriormente se vio complementado con una idea adicional interesante.<\/p>\n<figure id=\"attachment_4854\" aria-describedby=\"caption-attachment-4854\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2021\/07\/mqtt-image.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2021\/07\/mqtt-image-400x180.png\" alt=\"Esquema general del env\u00edo de im\u00e1genes por MQTT\" title=\"Esquema general del env\u00edo de im\u00e1genes por MQTT\" width=\"400\" height=\"180\" class=\"size-medium wp-image-4854\" \/><\/a><figcaption id=\"caption-attachment-4854\" class=\"wp-caption-text\">Esquema general del env\u00edo de im\u00e1genes por MQTT<\/figcaption><\/figure>\n<p><strong>Codificaci\u00f3n y env\u00edo de la imagen por MQTT<\/strong><\/p>\n<p>La primera parte de este proyecto consiste en el volcado de la informaci\u00f3n de la imagen en un <em>topic<\/em> MQTT. En mi caso, aprovechando que dispongo de un servidor Orange Pi Zero instalada en Forcarey para controlar diversos dispositivos Zigbee, cre\u00e9 un peque\u00f1o script en Python que toma una captura de imagen de la ESP32-CAM, la vuelca en un fichero temporal, y posteriormente la codifica como un bytearray, para enviarla a un topic MQTT concreto. El c\u00f3digo ser\u00eda el siguiente:<\/p>\n<blockquote><p>mport paho.mqtt.publish as publish<br \/>\nfrom PIL import Image<br \/>\nimport requests<br \/>\nfrom io import BytesIO<\/p>\n<p>MQTT_SERVER = \u00abxxx.xxx.xxx.xxx\u00bb  #Write Server IP Address, or your server FQDN<br \/>\nMQTT_PATH = \u00abpath\u00bb #Write your MQTT topic path<\/p>\n<p>response = requests.get(\u00abhttp:\/\/xxx.xxx.xxx.xxx\/capture\u00bb) #Write your ESP32-CAM IP address<br \/>\nf=open(\u00ab\/tmp\/image_test.jpg\u00bb,\u00bbwb\u00bb)<br \/>\nf.write(response.content)<br \/>\nf.close<\/p>\n<p>f=open(\u00ab\/tmp\/image_test.jpg\u00bb, \u00abrb\u00bb)<br \/>\nfileContent = f.read()<br \/>\nbyteArr = bytearray(fileContent)<br \/>\npublish.single(MQTT_PATH, byteArr, hostname=MQTT_SERVER)<br \/>\nf.close<\/p><\/blockquote>\n<p>Bastante sencillo. Para no andarme loco con servicios en linux, me limito a invocarlo desde \/etc\/crontab una vez cada 5 minutos, aunque se puede programar la frecuencia que se desee.<\/p>\n<p><strong>Captura y publicaci\u00f3n en Home Assistant<\/strong><\/p>\n<p>Una vez tenemos nuestra imagen siendo volcada en el <em>topic<\/em> MQTT correspondiente, se trata de explotarla de manera adecuada. Y en este caso, Home Assistant nos lo pone bastante sencillo, ya que existe una integraci\u00f3n de tipo c\u00e1mara MQTT directamente incorporada a Home Assistant. Su uso es tan sencillo como indicar el topic del que tendremos que recoger la imagen:<\/p>\n<blockquote><p>\ncamera:<br \/>\n  &#8211; platform: mqtt<br \/>\n    name: MQTT Cam<br \/>\n    topic: MQTT_TOPIC_PATH<\/p><\/blockquote>\n<p>El resultado es el que sigue:<\/p>\n<figure id=\"attachment_4855\" aria-describedby=\"caption-attachment-4855\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2021\/07\/camara-forcarey.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2021\/07\/camara-forcarey-400x334.png\" alt=\"Captura de c\u00e1mara MQTT en Home Assistant\" title=\"Captura de c\u00e1mara MQTT en Home Assistant\" width=\"400\" height=\"334\" class=\"size-medium wp-image-4855\" \/><\/a><figcaption id=\"caption-attachment-4855\" class=\"wp-caption-text\">Captura de c\u00e1mara MQTT en Home Assistant<\/figcaption><\/figure>\n<p>En mi caso, una topa del recibidor del piso de Forcarey.<\/p>\n<p><strong>Otros usos: sistema de alarma mediante correo electr\u00f3nico con Node-Red<\/strong><\/p>\n<p>Pero estando ya este sistema montado, y merced a algunos detectores de apertura de puertas y ventanas Zigbee que ya ten\u00eda previamente instalados, es posible dar una vuelta de tuerca, y hacer algo m\u00e1s interesante: un sistema que detecte aperturas no deseadas de la puerta de la entrada, que tome varias im\u00e1genes, y las env\u00ede por correo electr\u00f3nico a un buz\u00f3n previamente definido. El proceso es el siguiente: tengo instalado en la puerta un sensor de apertura Zigbee. La informaci\u00f3n de este sensor es procesada por un servidor Zigbee2MQTT, que vuelca en un <em>topic<\/em> MQTT la informaci\u00f3n de cu\u00e1ndo se activa este sensor. Este topic es procesado mediante una automatizaci\u00f3n en Home Assistant que, cuando se encuentra activada, env\u00eda una se\u00f1al de alarma mediante un segundo <em>topic<\/em> MQTT. A su vez, tengo un script en Python en la Orange Pi Zero de Forcarey que se encuentra suscrito a este <em>topic<\/em>, y que cuando detecta una activaci\u00f3n del mismo, toma tres im\u00e1genes a intervalos regulares, y las env\u00eda codificadas como bytearray por un tercer <em>topic<\/em> MQTT. Y por \u00faltimo, tengo creado en Node-Red un flujo que est\u00e1 suscrito a este \u00faltimo <em>topic<\/em>, descodifica las im\u00e1genes, y las env\u00eda a una cuenta de correo como un adjunto.<\/p>\n<figure id=\"attachment_4856\" aria-describedby=\"caption-attachment-4856\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2021\/07\/node-red-alarm-mail.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2021\/07\/node-red-alarm-mail-400x72.png\" alt=\"Flujo de Node Red de env\u00edo de correo\" title=\"Flujo de Node Red de env\u00edo de correo\" width=\"400\" height=\"72\" class=\"size-medium wp-image-4856\" \/><\/a><figcaption id=\"caption-attachment-4856\" class=\"wp-caption-text\">Flujo de Node Red de env\u00edo de correo<\/figcaption><\/figure>\n<p>Admito que tiene que haber maneras m\u00e1s sencillas de hacerlo, pero esta resulta bastante instructiva. <img src=\"https:\/\/bitacora.eniac2000.com\/wp-includes\/images\/smilies\/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En fechas recientes he realizado un aprovechamiento interesante de las<\/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":[620,798,1134,1177,1209,1361,1817,1818],"series":[],"class_list":["post-4853","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-esp32-cam","tag-home-assistant","tag-mqtt","tag-node-red","tag-orange-pi-zero","tag-python","tag-zigbee","tag-zigbee2mqtt"],"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\/4853","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=4853"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4853\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4853"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=4853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}