{"id":4337,"date":"2020-01-25T15:54:17","date_gmt":"2020-01-25T14:54:17","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=4337"},"modified":"2020-01-25T15:54:17","modified_gmt":"2020-01-25T14:54:17","slug":"integracion-de-una-estacion-meteorologica-domestica-en-el-sistema-de-domotica","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=4337","title":{"rendered":"Integraci\u00f3n de una estaci\u00f3n meteorol\u00f3gica dom\u00e9stica en el sistema de dom\u00f3tica"},"content":{"rendered":"<p>Estas Navidades me han regalado una estaci\u00f3n meteorol\u00f3gica casera, de las que tienen capacidad para mostrar temperatura y humedad tanto en interior como en exterior, esto \u00faltimo mediante un m\u00f3dulo externo que se deja a la intemperie, y que transmite la informaci\u00f3n a la estaci\u00f3n mediante se\u00f1al de radio a 433 MHz. Aparte de por el regalo en s\u00ed, este tipo de estaciones me ven\u00eda interesando desde hace bastante tiempo por el hecho de enviar la informaci\u00f3n utilizando la banda antes mencionada, de la que dispongo unos cuantos receptores. As\u00ed que en cuanto abr\u00ed el regalo supe que iba a invertir algo de tiempo en intentar integrar el sensor externo en mi sistema de dom\u00f3tica.<\/p>\n<figure id=\"attachment_4338\" aria-describedby=\"caption-attachment-4338\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200121_135421187.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200121_135421187-400x300.jpg\" alt=\"Mi nueva estaci\u00f3n meteorol\u00f3gica\" title=\"Mi nueva estaci\u00f3n meteorol\u00f3gica\" width=\"400\" height=\"300\" class=\"size-medium wp-image-4338\" \/><\/a><figcaption id=\"caption-attachment-4338\" class=\"wp-caption-text\">Mi nueva estaci\u00f3n meteorol\u00f3gica<\/figcaption><\/figure>\n<p>Tras investigar un poco sobre este tipo de estaciones, encontr\u00e9 que la mayor\u00eda de ellas hacen uso de protocolos de comunicaci\u00f3n bien definidos y relativamente estandarizados, lo que hace que sea razonablemente sencillo encontrar informaci\u00f3n sobre las mismas, e incluso implementaciones de dichos protocolos para entornos linux o arduino. Dicho lo cual, empec\u00e9 a hacer algunas pruebas de implementaci\u00f3n de un sistema que permitiera recibir la informaci\u00f3n del emisor externo. Las primeras pruebas las hice con un receptor basado en arduino y un m\u00f3dulo 433 MHz, m\u00e1s la <a href=\"https:\/\/github.com\/sui77\/rc-switch\" target=\"_blank\">librer\u00eda rc-switch<\/a> que tan buenos resultados me hab\u00eda dado en el pasado. No fue este el caso, ya que al intentar capturar paquetes enviados por la estaci\u00f3n el programa de captura de paquetes basados en esta librer\u00eda produc\u00eda un error de desbordamiento, siendo incapaz de recibir correctamente el datagrama. Hice algunas pruebas en bruto con otras librer\u00edas, entre las que se inclu\u00edan algunas dise\u00f1adas espec\u00edficamente para alguno de los protocolos de env\u00edo antes mencionados, con resultados igualmente infructuosos.<\/p>\n<figure id=\"attachment_4339\" aria-describedby=\"caption-attachment-4339\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200123_175939576.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200123_175939576-400x300.jpg\" alt=\"NodeMCU con receptor a 433 MHz y m\u00f3dulo externo de la estaci\u00f3n\" title=\"NodeMCU con receptor a 433 MHz y m\u00f3dulo externo de la estaci\u00f3n\" width=\"400\" height=\"300\" class=\"size-medium wp-image-4339\" \/><\/a><figcaption id=\"caption-attachment-4339\" class=\"wp-caption-text\">NodeMCU con receptor a 433 MHz y m\u00f3dulo externo de la estaci\u00f3n<\/figcaption><\/figure>\n<p>Ante ello, no me qued\u00f3 m\u00e1s remedio que cambiar el enfoque. Tocaba acometer el problema desde una perspectiva m\u00e1s basica. As\u00ed que me toc\u00f3 desempolvar un receptor <a href=\"https:\/\/www.rtl-sdr.com\/about-rtl-sdr\/\" target=\"_blank\">RTL SDR<\/a> que compr\u00e9 hace alg\u00fan tiempo para un proyecto similar, e intentar hacer una captura del datagrama a nivel de onda enviada, e intentar decodificar la misma (tirando para ello de programas como <a href=\"http:\/\/gqrx.dk\/\" target=\"_blank\">Gqrx<\/a>, audacity, y algo de tiempo. Sin embargo, tuve algo de suerte, y tras seguir investigando un poco m\u00e1s, encontr\u00e9 una referencia a un proyecto, <a href=\"https:\/\/github.com\/merbanan\/rtl_433\" target=\"_blank\">rtl_433<\/a>, que se dedica a decodificar el tr\u00e1fico de dispositivos que env\u00edan informaci\u00f3n en esta banda.<\/p>\n<figure id=\"attachment_4342\" aria-describedby=\"caption-attachment-4342\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/rtl_433_screenshot.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/rtl_433_screenshot-400x263.png\" alt=\"Captura de pantalla de rtl_433 capturando tr\u00e1fico\" title=\"Captura de pantalla de rtl_433 capturando tr\u00e1fico\" width=\"400\" height=\"263\" class=\"size-medium wp-image-4342\" \/><\/a><figcaption id=\"caption-attachment-4342\" class=\"wp-caption-text\">Captura de pantalla de rtl_433 capturando tr\u00e1fico<\/figcaption><\/figure>\n<p>Tras una instalaci\u00f3n sencilla en mi equipo con Debian (apt install rtl_433), y tras conectar el receptor RTL SDR al mismo, tuve la suerte de que el programa tuviera perfectamente identificado el tipo de protocolo que mi estaci\u00f3n estaba utilizando, en concreto el protocolo \u00abKedsum Temperature &#038; Humidity Sensor, Pearl NC-7415\u00bb. Trasteando un poco con el programa, pude tener algo m\u00e1s de informaci\u00f3n sobre este protocolo, a saber:<\/p>\n<blockquote><p>Frame structure:<br \/>\n    Byte:      0        1        2        3        4<br \/>\n    Nibble:    1   2    3   4    5   6    7   8    9   10<br \/>\n    Type:   00 IIIIIIII BBCC++++ ttttTTTT hhhhHHHH FFFFXXXX<br \/>\n&#8211; I: unique id. changes on powercycle<br \/>\n&#8211; B: Battery state 10 = Ok, 01 = weak, 00 = bad<br \/>\n&#8211; C: channel, 00 = ch1, 10=ch3<br \/>\n&#8211; + low temp nibble<br \/>\n&#8211; t: med temp nibble<br \/>\n&#8211; T: high temp nibble<br \/>\n&#8211; h: humidity low nibble<br \/>\n&#8211; H: humidity high nibble<br \/>\n&#8211; F: flags<br \/>\n&#8211; X: CRC-4 poly 0x3 init 0x0 xor last 4 bits<\/p>\n<p>_Modulation     = OOK_PULSE_PPM,<br \/>\n-Short_width    = 2000,<br \/>\n-Long_width     = 4000,<br \/>\n-Gap_limit      = 4400,<br \/>\n-Reset_limit    = 9400,\n<\/p><\/blockquote>\n<p>Bien, ya ten\u00eda identificado claramente el protocolo, y aqu\u00ed puede verse una captura de la se\u00f1al recibida:<\/p>\n<blockquote><p>root@asustinker:\/etc\/systemd\/system# \/usr\/local\/bin\/rtl_433 -R 57<br \/>\nrtl_433 version 19.08-147-g639ab8a branch master at 202001210044 inputs file rtl_tcp RTL-SDR<br \/>\nUse -h for usage help and see https:\/\/triq.org\/ for documentation.<\/p>\n<p>        Consider using \u00ab-M newmodel\u00bb to transition to new model keys. This will become the default someday.<br \/>\n        A table of changes and discussion is at https:\/\/github.com\/merbanan\/rtl_433\/pull\/986.<\/p>\n<p>Registered 1 out of 145 device decoding protocols [ 57 ]<br \/>\nFound Rafael Micro R820T tuner<br \/>\nExact sample rate is: 250000.000414 Hz<br \/>\n[R82XX] PLL not locked!<br \/>\nSample rate set to 250000 S\/s.<br \/>\nTuner gain set to Auto.<br \/>\nTuned to 433.920MHz.<br \/>\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _<br \/>\ntime      : 2020-01-25 15:24:00<br \/>\nmodel     : Kedsum Temperature &#038; Humidity Sensor   ID        : 226<br \/>\nChannel   : 1            Battery   : OK            Flags2    : 129           Temperature: 60.20 F      Humidity  : 78 %          Integrity : CRC<br \/>\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n<\/p><\/blockquote>\n<p>Bien, esto me planteaba dos problemas: el primero es que la informaci\u00f3n recibida de temperatura estaba expresada en grados Fahrenheit, por lo que necesitaba hacer una conversi\u00f3n a Celsius. Y por otro lado, el poder transmitir esta informaci\u00f3n a mi plataforma de dom\u00f3tica, preferentemente a trav\u00e9s de MQTT. Este segundo problema qued\u00f3 solucionado mediante la capacidad del programa rtl_433 de encapsular la informaci\u00f3n en un JSON, que puede ser retransmitido posteriormente. En mi caso, lo hice mediante un servicio linux que lanza el programa rtl_433 con las opciones adecuadas (formato JSON, protocolo 57 -Kedsum-, e incrustando la hora UTC), que mediante un <em>pipe<\/em> es procesado por el cliente MQTT mosquitto y enviado a mi servidor MQTT, a un <em>topic<\/em> espec\u00edfico:<\/p>\n<blockquote><p>\u00ab\/usr\/local\/bin\/rtl_433 -R 57 -F json -M utc | \/usr\/bin\/mosquitto_pub -l -h servidor_mqtt -t topic\u00bb<\/p><\/blockquote>\n<p>&#8230;donde posteriormente es procesado gracias a Node Red, en el que se hace la conversi\u00f3n a Celsius, se obtiene tambi\u00e9n la sensaci\u00f3n t\u00e9rmica, y se inyecta la informaci\u00f3n resultante en formato JSON en un topic espec\u00edfico:<\/p>\n<blockquote><p>var data=JSON.parse(msg.payload);<br \/>\n\/\/Datagram example: {\u00abtime\u00bb : \u00ab2020-01-22 19:27:58\u00bb, \u00abmodel\u00bb : \u00abKedsum Temperature &#038; Humidity Sensor\u00bb, \u00abid\u00bb : 226, \u00abchannel\u00bb : 1, \u00abbattery\u00bb : \u00abWEAK\u00bb, \u00abflags\u00bb : 66, \u00abtemperature_F\u00bb : 54.600, \u00abhumidity\u00bb : 79, \u00abmic\u00bb : \u00abCRC\u00bb}<br \/>\ntemp_value=((data.temperature_F-32)*5\/9).toFixed(2);<br \/>\nhumidity=data.humidity;<\/p>\n<p>HI = 0.5*(data.temperature_F + 61.0 + ((data.temperature_F-68.0)*1.2) + (humidity*0.094))<br \/>\nHIc = (((HI)-32)*5\/9).toFixed(2);  \/\/  converting to Celsius<\/p>\n<p>var thing = {<br \/>\n    temp: temp_value,<br \/>\n    humidity: humidity,<br \/>\n    heatindex: HIc<br \/>\n};<br \/>\nmsg.payload=thing;<\/p>\n<p>return msg;\n<\/p><\/blockquote>\n<p>&#8230;y el resultado de todo esto fue un&#8230; \u00a1exito! Pas\u00e9 a conectar el receptor RTL SDR a mi Asus Tinker Board donde tengo implementado el sistema de dom\u00f3tica, con excelentes resultados. El sistema, emplazado en la segunda planta de casa, es capaz de recibir las se\u00f1ales del receptor externo emplazado en el patio.<\/p>\n<figure id=\"attachment_4343\" aria-describedby=\"caption-attachment-4343\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200125_145346307.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200125_145346307-300x400.jpg\" alt=\"Asus Tinker Board con receptor RTL SDR\" title=\"Asus Tinker Board con receptor RTL SDR\" width=\"300\" height=\"400\" class=\"size-medium wp-image-4343\" \/><\/a><figcaption id=\"caption-attachment-4343\" class=\"wp-caption-text\">Asus Tinker Board con receptor RTL SDR<\/figcaption><\/figure>\n<p>Por otro lado, quedaba la integraci\u00f3n en el sistema de dom\u00f3tica Home Assistant. En este caso, se trataba de alto tan simple como crear los nuevos sensores en base a la suscripci\u00f3n al topic MQTT de salida definido en el flujo Node Red. El resultado, como no pod\u00eda ser menos, fue perfecto:<\/p>\n<figure id=\"attachment_4345\" aria-describedby=\"caption-attachment-4345\" style=\"width: 166px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/weather-station-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/weather-station-2.png\" alt=\"Informaci\u00f3n mostrada en Home Assistant de la estaci\u00f3n meteorol\u00f3gica\" title=\"Informaci\u00f3n mostrada en Home Assistant de la estaci\u00f3n meteorol\u00f3gica\" width=\"166\" height=\"104\" class=\"size-full wp-image-4345\" \/><\/a><figcaption id=\"caption-attachment-4345\" class=\"wp-caption-text\">Informaci\u00f3n mostrada en Home Assistant de la estaci\u00f3n meteorol\u00f3gica<\/figcaption><\/figure>\n<figure id=\"attachment_4344\" aria-describedby=\"caption-attachment-4344\" style=\"width: 365px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/weather-station-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/weather-station-1.png\" alt=\"Gr\u00e1fica de la informaci\u00f3n hist\u00f3rica recibida\" title=\"Gr\u00e1fica de la informaci\u00f3n hist\u00f3rica recibida\" width=\"365\" height=\"332\" class=\"size-full wp-image-4344\" \/><\/a><figcaption id=\"caption-attachment-4344\" class=\"wp-caption-text\">Gr\u00e1fica de la informaci\u00f3n hist\u00f3rica recibida<\/figcaption><\/figure>\n<p>Este art\u00edculo podr\u00eda haber quedado aqu\u00ed, pero no me encontraba completamente satisfecho con el resultado, ya que me daba la impresi\u00f3n de que utilizar el receptor RTL SDR solo para este prop\u00f3sito era matar moscas a ca\u00f1onazos. Mi idea originaria era usar un ESP8266 junto con un m\u00f3dulo RF de 433 Mhz para recibir estas se\u00f1ales, y decodificarlas en el mismo, para inyectar la informaci\u00f3n directamente en el servidor MQTT, y no tener que dar tantos saltos (RTL SDR -> JSON -> MQTT -> Node Red -> MQTT). No tuve \u00e9xito en encontrar una codificaci\u00f3n del protocolo bajo el nombre de Kedsum, pero s\u00ed la tuve con Pearl NC-7415. Encontr\u00e9 un hilo en un foro de Arduino en alem\u00e1n, que hablaba precisamente de ello: <a href=\"https:\/\/forum.arduino.cc\/index.php?topic=425908.0\" target=\"_blank\">Dekodieren Temperatursensor von PEARL NC7427(NC7415) 433MHz<\/a>. Gracias, Google Translate. <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<p>En este hilo pude encontrar alguien que hab\u00eda decodificado exitosamente el protocolo, y que compart\u00eda el c\u00f3digo. Lo descargu\u00e9 y lo prob\u00e9 y&#8230; \u00a1funcionaba perfectamente! Solo tuve que hacer una modificaci\u00f3n menor para realizar la conversi\u00f3n de Fahrenheit a Celsius, calcular la sensaci\u00f3n t\u00e9rmica, e inyectarlo en el <em>topic<\/em> MQTT (el original no hac\u00eda nada de esto, se limitaba a mostrar la informaci\u00f3n por pantalla). Y de nuevo, \u00e9xito:<\/p>\n<figure id=\"attachment_4341\" aria-describedby=\"caption-attachment-4341\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200123_175930516.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/01\/IMG_20200123_175930516-400x300.jpg\" alt=\"Informaci\u00f3n recibida en ESP8266 y RF, enviada a servidor MQTT\" title=\"Informaci\u00f3n recibida en ESP8266 y RF, enviada a servidor MQTT\" width=\"400\" height=\"300\" class=\"size-medium wp-image-4341\" \/><\/a><figcaption id=\"caption-attachment-4341\" class=\"wp-caption-text\">Informaci\u00f3n recibida en ESP8266 y RF, enviada a servidor MQTT<\/figcaption><\/figure>\n<p>Sin embargo, esta v\u00eda tiene un problema: el receptor apenas es capaz de recibir la se\u00f1al cuando se encuentra a unas pocas decenas de cent\u00edmetros del emisor externo. As\u00ed que en la pr\u00e1ctica ahora mismo es inusable. He probado con varios formatos de antena acoplados al m\u00f3dulo (173mm de largo, en hilo recto, en espiral&#8230;) con resultados bastante pobres. Tengo encargada en aliexpress una antena espec\u00edfica, pero a\u00fan tardar\u00e1 algunas semanas en llegar. Espero poder reportar mejoras una vez la reciba. \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Estas Navidades me han regalado una estaci\u00f3n meteorol\u00f3gica casera, de<\/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":[31,133,160,169,517,621,748,798,904,1134,1177,1179,1451,1452],"series":[],"class_list":["post-4337","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-433-mhz","tag-arduino","tag-asus-tinker-board","tag-audacity","tag-debian","tag-esp8266","tag-gqrx","tag-home-assistant","tag-kedsum","tag-mqtt","tag-node-red","tag-nodemcu","tag-rtl-sdr","tag-rtl_433"],"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\/4337","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=4337"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4337\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4337"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=4337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}