{"id":9042,"date":"2018-09-10T06:13:00","date_gmt":"2018-09-10T06:13:00","guid":{"rendered":"http:\/\/domosistemas.com\/?p=9042"},"modified":"2018-09-10T06:13:00","modified_gmt":"2018-09-10T06:13:00","slug":"como-crear-desde-cero-un-multisensor-de-viento-lluvia-y-luminosidad-para-eedomus-parte-iii","status":"publish","type":"post","link":"https:\/\/domosistemas.com\/?p=9042","title":{"rendered":"C\u00f3mo crear desde cero un multisensor de viento, lluvia y luminosidad para eedomus (Parte III)"},"content":{"rendered":"<p>Tercera y \u00faltima entrega de nuestro tutorial paso a paso sobre c\u00f3mo\u00a0construir desde cero un <strong>multisensor de viento, lluvia y luminosidad<\/strong>\u00a0preparado para el controlador dom\u00f3tico eedomus.<\/p>\n<p>En <a href=\"http:\/\/www.domoticadomestica.com\/crear-desde-cero-sensor-viento-lluvia-luminosidad-eedomus\/\" target=\"_blank\" rel=\"noopener\">la primera parte del tutorial<\/a> hablamos de los elementos necesarios para la construcci\u00f3n del sensor, y en <a href=\"http:\/\/www.domoticadomestica.com\/como-crear-desde-cero-un-multisensor-de-viento-lluvia-y-luminosidad-para-eedomus-parte-ii\/\" target=\"_blank\" rel=\"noopener\">la segunda parte<\/a>\u00a0del\u00a0funcionamiento del anem\u00f3metro y la conexi\u00f3n de los distintos sensores a la Raspberry Pi. Por consiguiente, <strong>ha llegado el momento de hablar de programaci\u00f3n<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-14163 size-full\" title=\"Python\" src=\"http:\/\/www.domoticadomestica.com\/wp-content\/uploads\/2018\/09\/Python.jpg\" alt=\"Python\" width=\"800\" height=\"239\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3>Programaci\u00f3n<\/h3>\n<p>En esta \u00faltima secci\u00f3n vamos a describir los programas que hemos escrito para tomar lecturas b\u00e1sicas de los tres sensores, procesarlas y enviar los resultados a perif\u00e9ricos virtuales del controlador eedomus, para que \u00e9ste, mediante su estructura de reglas, permita tomar las acciones oportunas.<\/p>\n<p>Estos programas en Python son tres y pod\u00e9is <a href=\"http:\/\/www.domoticadomestica.com\/foro\/index.php?topic=3363.0\" target=\"_blank\" rel=\"noopener\">descargarlos en este enlace<\/a>.<\/p>\n<p>Cabe destacar que con estos programas <strong>tenemos absoluto control sobre la frecuencia<\/strong> con la que queremos que la Raspberry Pi informe a eedomus. Los programas que he escrito son muy b\u00e1sicos en este sentido, pero pueden modificarse a voluntad del usuario seg\u00fan sus necesidades.<\/p>\n<p>Supondr\u00e9 que ya ten\u00e9is instalado en vuestra Raspberry Pi el sistema operativo Raspbian y hecha la configuraci\u00f3n b\u00e1sica de red (WiFi), <strong>de modo que se pueda entrar de forma remota (ssh)<\/strong>. Pod\u00e9is encontrar ayuda para todas estas actuaciones a partir de <a href=\"https:\/\/www.raspberrypi.org\/documentation\/\" target=\"_blank\" rel=\"noopener\">este enlace<\/a>.<\/p>\n<p>Siempre conviene tener actualizado el software. Ejecutaremos sucesivamente:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ sudo apt-get update\t\t\npi@rpimeteo:~ $ sudo apt-get upgrade<\/pre>\n<p>Tenemos tambi\u00e9n que activar el uso del bus I\u00b2C:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ sudo raspi-config<\/pre>\n<p>y en el men\u00fa que se nos presenta seleccionar \u201c5 Interfacing Options\u201d. Dentro de esta opci\u00f3n elegiremos \u201cP5 I2C\u201c, y a continuaci\u00f3n elegiremos \u201cS\u00ed\u201d.<\/p>\n<p>Necesitaremos tambi\u00e9n que est\u00e9n instalados algunos paquetes, aunque es muy posible que la mayor\u00eda ya lo est\u00e9n. Lanzaremos el comando siguiente:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ sudo apt-get install python3 python3-requests \t\n&gt; python3-gpiozero python3-rpi.gpio python3-smbus<\/pre>\n<p>Confirmaremos la selecci\u00f3n y tras una breve espera tendremos instaladas las herramientas y las librer\u00edas que necesitaremos para trabajar con el lenguaje Python.<\/p>\n<p>Antes de cargar, configurar y ejecutar los programas, <strong>vamos a preparar tres perif\u00e9ricos en eedomus<\/strong>. Entramos en Configuraci\u00f3n, y pulsamos sucesivamente A\u00f1adir o eliminar un perif\u00e9rico, A\u00f1adir otro tipo de perif\u00e9rico, Estado y Crear. En el formulario de creaci\u00f3n del perif\u00e9rico rellenamos los campos siguientes:<\/p>\n<p><strong>Perif\u00e9rico para reflejar la velocidad del viento:<\/strong><br \/>\n&#8211;\u00a0\u00a0Nombre: toldos.viento<br \/>\n&#8211;\u00a0\u00a0Uso: Otro indicador (sensor)<br \/>\n&#8211;\u00a0\u00a0Tipo de datos: Decimal<br \/>\n&#8211;\u00a0\u00a0Unidad: km\/h<\/p>\n<p><strong>Perif\u00e9rico para reflejar la luminosidad:<\/strong><br \/>\n&#8211;\u00a0\u00a0Nombre: toldos.luminosidad<br \/>\n&#8211;\u00a0\u00a0Uso: Otro indicador (sensor)<br \/>\n&#8211;\u00a0\u00a0Tipo de datos: Decimal<br \/>\n&#8211;\u00a0\u00a0Unidad: lux<\/p>\n<p><strong>Perif\u00e9rico para reflejar la lluvia:<\/strong><br \/>\n&#8211;\u00a0\u00a0Nombre: toldos.lluvia<br \/>\n&#8211;\u00a0\u00a0Uso: Otro indicador (sensor)<br \/>\n&#8211;\u00a0\u00a0Tipo de datos: Lista de valores<\/p>\n<p>En este perif\u00e9rico, entraremos en la pesta\u00f1a Valores y crearemos dos valores:<br \/>\n&#8211;\u00a0\u00a0Descripci\u00f3n: No ha llovido, valor bruto: 0.<br \/>\n&#8211;\u00a0\u00a0Descripci\u00f3n: Ha llovido, valor bruto: 100.<\/p>\n<p>En cada uno de estos tres perif\u00e9ricos, despu\u00e9s de cumplimentar estos valores y antes de pulsar el bot\u00f3n<br \/>\nGuardar, desplegaremos la secci\u00f3n Par\u00e1metros experto para anotar el c\u00f3digo API del perif\u00e9rico, ya que lo necesitaremos incluir en los programas. Opcionalmente, los podemos asignar a una \u201chabitaci\u00f3n\u201d de<br \/>\needomus. Las figuras siguientes ilustran el proceso para el perif\u00e9rico toldos.lluvia:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-14165 size-full\" title=\"eedomus - Creaci\u00f3n de los valores del perif\u00e9rico\" src=\"http:\/\/www.domoticadomestica.com\/wp-content\/uploads\/2018\/09\/eedomus-Creaci\u00f3n-de-los-valores-del-perif\u00e9rico-1.jpg\" alt=\"eedomus - Creaci\u00f3n de los valores del perif\u00e9rico\" width=\"800\" height=\"359\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-14167 size-full\" title=\"eedomus - Configuraci\u00f3n del perif\u00e9rico\" src=\"http:\/\/www.domoticadomestica.com\/wp-content\/uploads\/2018\/09\/eedomus-Configuraci\u00f3n-del-perif\u00e9rico-1.jpg\" alt=\"eedomus - Configuraci\u00f3n del perif\u00e9rico\" width=\"800\" height=\"840\" \/><\/p>\n<p><strong>Estos tres perif\u00e9ricos act\u00faan como sensores<\/strong>, aunque no se comportan como los sensores virtuales est\u00e1ndar de eedomus ya que <strong>no hacen llamadas URL<\/strong> cada cierto tiempo para obtener el valor: es la Raspberry Pi la que se encargar\u00e1 directamente de poner los valores cada vez que se considere en el programa.<\/p>\n<p>Los programas tienen incluidos bastantes comentarios que ayudan a comprender su funcionamiento detallado para aquellos que tengan unas nociones m\u00ednimas de programaci\u00f3n. Aun as\u00ed, mencionar\u00e9 aqu\u00ed las l\u00edneas principales que los estructuran.<\/p>\n<p>El programa para la gesti\u00f3n del anem\u00f3metro (windsensor.py)\u00a0<strong>consta de un bucle infinito<\/strong>, que no termina nunca, en el que simplemente inicia un contador de pulsos a 0, espera un tiempo programado (por defecto diez segundos), tras el cual mira el valor del contador y a partir de \u00e9l calcula la velocidad del viento (con la f\u00f3rmula indicada anteriormente), que env\u00eda inmediatamente a eedomus.<\/p>\n<p>Adem\u00e1s, <strong>hace algunas funciones administrativas<\/strong>, para dejar rastro en un \u201clog\u201d de lo que va haciendo. Os podr\u00edais preguntar c\u00f3mo se incrementa el contador de pulsos, ya que con lo dicho parece que nunca ser\u00eda distinto de cero. Pues bien, antes de iniciarse el bucle, el programa prepara, con la librer\u00eda GPIO, el sistema de entrada\/salida de la Raspberry Pi, de modo que cada vez que en el pin CHANNEL, en el que tenemos conectado el anem\u00f3metro, se produzca una transici\u00f3n de <strong>1<\/strong> a <strong>0<\/strong> (lo que ocurre en cada pulso, dos veces cada vuelta de las cazoletas) se produzca una interrupci\u00f3n en el programa principal (que estar\u00e1 esperando a que pase el tiempo programado de diez segundos) y llame a la funci\u00f3n pulse_detect, que incrementa el contador en uno.<\/p>\n<p>El programa para la gesti\u00f3n del sensor de lluvia (rainsensor.py) tambi\u00e9n consta de un bucle infinito. En \u00e9l, tras esperar un tiempo predeterminado (1 segundo) lee el valor del pin en el que est\u00e1 conectado el anem\u00f3metro, y cuenta las veces en que se detecta lluvia. Tras un n\u00famero predeterminado de lecturas (10), el programa indica lluvia si en la mayor\u00eda de ellas la ha detectado. Esto es as\u00ed <strong>para poder configurar la sensibilidad del sensor<\/strong> y evitar que informe lluvia cuando, por ejemplo, solamente ha ca\u00eddo una gota. Todo esto puede cambiarse con facilidad por los criterios que cada cual considere mejores. El programa, al igual que el anterior, tambi\u00e9n realiza las funciones administrativas ya mencionadas.<\/p>\n<p>El programa para la gesti\u00f3n del sensor de luminosidad (lightsensor.py) tambi\u00e9n consta de un bucle infinito. En \u00e9l, en cada iteraci\u00f3n, tras la espera de un cierto tiempo (10 segundos en este caso), se realiza la lectura de los dos sensores de luz que tiene el chip <strong>TSL2561<\/strong> accediendo al bus I\u00b2C mediante las funciones proporcionadas por la librer\u00eda smbfs de Python. Los dos sensores, como ya hemos mencionado, proporcionan un valor que es le\u00eddo en dos bloques de 8 bits y convertido al valor de 16 bits. Tras ello, el programa convierte los valores de ambas lecturas en un \u00fanico valor de luminosidad mediante un algoritmo proporcionado en las especificaciones del chip. Esta lectura se repite un n\u00famero predefinido de veces (18) y se env\u00eda a eedomus el promedio de los 18 valores calculados (por tanto, cada 3 minutos).<\/p>\n<p>Una vez configurados los sensores virtuales en eedomus, <strong>instalaremos los tres programas lightsensor.py, windsensor.py y rainsensor.py<\/strong>, en el directorio bin de la cuenta pi: \/home\/pi\/bin, (o en otro cualquiera, aunque utilizar\u00e9 \u00e9ste en lo sucesivo). Utilizando el editor de texto que m\u00e1s nos guste (editor, vi, emacs, ed, etc.), abriremos cada uno de los programas y editaremos las l\u00edneas siguientes de modo que reflejen los valores reales de nuestro controlador eedomus:<\/p>\n<p>API_USER\u00a0\u00a0\u00a0 \u00a0= &#8216;APIUserEedomus&#8217;<br \/>\nAPI_SECRET\u00a0 \u00a0= &#8216;APISecretEedomus&#8217;<br \/>\nPERIPH_ID\u00a0\u00a0 \u00a0= 1001003<br \/>\nEEDOMUS _URL = &#8216;http:\/\/192.168.1.69\/api\/set&#8217;<\/p>\n<p>Como valor de API_USERy API_SECRET sustituiremos los valores ficticios proporcionados por los correspondientes para autenticaci\u00f3n en nuestro eedomus (dentro de las comillas simples, que hay que conservar). Si no sabes c\u00f3mo obtener estas credenciales, puedes consultar <a href=\"http:\/\/www.domoticadomestica.com\/nociones-basicas-sobre-la-api-eedomus\/\" target=\"_blank\" rel=\"noopener\">este art\u00edculo<\/a>, en el que est\u00e1 muy bien explicada la <strong>API de eedomus<\/strong> . En la cadena EEDOMUS_URL tienes que sustituir la direcci\u00f3n IP 192.168.1.69 por la real de tu eedomus. Si el tuyo no est\u00e1 configurado con una direcci\u00f3n IP fija, es el momento de hacerlo con <a href=\"http:\/\/www.domoticadomestica.com\/como-establecer-una-ip-fija-en-eedomus\/\" target=\"_blank\" rel=\"noopener\">este tutorial<\/a>.<\/p>\n<p>Finalmente, en PERIPH_ID tienes que sustituir el c\u00f3digo que est\u00e1 por el que has anotado al crear el perif\u00e9rico correspondiente al programa que est\u00e9s editando:<br \/>\n&#8211;\u00a0\u00a0En lightsensor.py el c\u00f3digo API correspondiente al sensor toldos.luminosidad.<br \/>\n&#8211;\u00a0\u00a0En windsensor.py el c\u00f3digo API correspondiente al sensor toldos.viento.<br \/>\n&#8211;\u00a0\u00a0En rainsensor.py el c\u00f3digo API correspondiente al sensor toldos.lluvia.<\/p>\n<p>Estos cambios son los mismos para los tres programas.<\/p>\n<p>Una vez instalados y configurados, basta ejecutar los tres para que comiencen a funcionar y a actualizar los sensores instalados en eedomus con la frecuencia que traen por defecto (3 minutos el sensor de luminosidad, y 10 segundos los de viento y de lluvia). Para que los programas se inicien autom\u00e1ticamente al iniciarse la Raspberry Pi, y para que si, por el motivo que sea, fallan y dejan de correr (cosa que hacen, por ejemplo, si se cae la red WiFi), se reinicien autom\u00e1ticamente, <strong>vamos a indicar c\u00f3mo se configuran tres servicios de systemd<\/strong> en el sistema operativo Raspbian:<\/p>\n<p>&#8211; En el directorio \/lib\/systemd\/system creamos tres ficheros, con los siguientes nombres y contenidos:<br \/>\n-&gt; Fichero\/lib\/systemd\/system\/rainsensor.service<\/p>\n<pre class=\"crayon-plain-tag\">[Unit]\n Description=RPI rain sensor service\n After=multi-user.target\n\n[Service]\t\t\t\t\t\t\t\t\t\t\n Type=idle\n ExecStart=\/usr\/bin\/python \/home\/pi\/bin\/rainsensor.py\n Restart=always\n\n[Install]\n WantedBy=multi-user.target<\/pre>\n<p>-&gt; Fichero \/lib\/systemd\/system\/windsensor.service<\/p>\n<pre class=\"crayon-plain-tag\">[Unit]\n Description=RPI wind sensor service\n After=multi-user.target\n\n[Service]\n Type=idle\n ExecStart=\/usr\/bin\/python \/home\/pi\/bin\/windsensor.py\n Restart=always\n\n[Install]\n WantedBy=multi-user.target<\/pre>\n<p>-&gt; Fichero \/lib\/systemd\/system\/lightsensor.service<\/p>\n<pre class=\"crayon-plain-tag\">[Unit]\n Description=RPI light sensor service\n After=multi-user.target\n\n[Service]\n Type=idle\n ExecStart=\/usr\/bin\/python \/home\/pi\/bin\/lightsensor.py\n Restart=always\n\n[Install]\n WantedBy=multi-user.target<\/pre>\n<p>&#8211;\u00a0\u00a0Nos aseguramos de que esos ficheros tienen los permisos adecuados:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ sudo chown root:root \/lib\/system\/system\/lightsensor.service\t\npi@rpimeteo:~ $ sudo chmod 644 \/lib\/system\/system\/lightsensor.service\t\t\npi@rpimeteo:~ $ sudo chown root:root \/lib\/system\/system\/rainsensor.service\t\npi@rpimeteo:~ $ sudo chmod 644 \/lib\/system\/system\/rainsensor.service\t\t\npi@rpimeteo:~ $ sudo chown root:root \/lib\/system\/system\/windsensor.service\t\npi@rpimeteo:~ $ sudo chmod 644 \/lib\/system\/system\/windsensor.service<\/pre>\n<p>&#8211;\u00a0\u00a0Despu\u00e9s informamos al proceso de estos cambios y preparamos los servicios para su inicio autom\u00e1tico al arrancar la Raspberry Pi:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ sudo systemctl daemon-reload\t\t\t\t\npi@rpimeteo:~ $ sudo systemctl enable lightsensor.service\t\t\npi@rpimeteo:~ $ sudo systemctl enable windsensor.service\t\npi@rpimeteo:~ $ sudo systemctl enable rainsensor.service<\/pre>\n<p>&#8211;\u00a0\u00a0Finalmente, iniciamos los servicios manualmente si no queremos reiniciar en este momento:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ sudo systemctl start lightsensor.service\t\npi@rpimeteo:~ $ sudo systemctl start windsensor.service\t\npi@rpimeteo:~ $ sudo systemctl start rainsensor.service<\/pre>\n<p>&#8211;\u00a0\u00a0Podemos comprobar que los programas est\u00e1n en ejecuci\u00f3n con el comando ps:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ ps -ef | grep python<\/pre>\n<p>y obtendremos una salida como \u00e9sta, que indica la ejecuci\u00f3n de los tres programas y datos de los procesos asociados:<\/p>\n<pre class=\"crayon-plain-tag\">root 2003 1  0 17:34 ? 00:00:15 \/usr\/bin\/python \/home\/pi\/bin\/windsensor.py\nroot 2015 1  0 17:34 ? 00:00:15 \/usr\/bin\/python \/home\/pi\/bin\/rainsensor.py\nroot 2113 1  0 17:39 ? 00:00:03 \/usr\/bin\/python \/home\/pi\/bin\/lightsensor.py<\/pre>\n<p>&#8211;\u00a0\u00a0Tambi\u00e9n podemos acceder al log de cada programa con el comando journalctl con las opciones adecuadas:<\/p>\n<pre class=\"crayon-plain-tag\">pi@rpimeteo:~ $ journalctl -efu windsensor.service<\/pre>\n<p>y obtendremos algo similar (aunque mucho m\u00e1s largo con el tiempo de ejecuci\u00f3n) a:<\/p>\n<pre class=\"crayon-plain-tag\">ago 11 17:34:36 rpimeteo systemd[1]: Started RPI wind sensor service.\t\nago 11 17:34:49 rpimeteo python[2003]: Sat Aug 11 17:34:49 2018: windspeed=1.2\nago 11 17:34:59 rpimeteo python[2003]: Sat Aug 11 17:34:59 2018: windspeed=0.0<\/pre>\n<p>Ya hemos acabado. Ahora s\u00f3lo os queda crear en eedomus las\u00a0reglas que necesit\u00e9is para controlar vuestros toldos.<\/p>\n<p>El post <a rel=\"nofollow\" href=\"http:\/\/www.domoticadomestica.com\/como-crear-desde-cero-un-multisensor-de-viento-lluvia-y-luminosidad-para-eedomus-parte-iii\/\">C\u00f3mo crear desde cero un multisensor de viento, lluvia y luminosidad para eedomus (Parte III)<\/a> aparece primero en <a rel=\"nofollow\" href=\"http:\/\/www.domoticadomestica.com\">Dom\u00f3tica Dom\u00e9stica<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tercera y \u00faltima entrega de nuestro tutorial paso a paso sobre c\u00f3mo\u00a0construir desde cero un multisensor de viento, lluvia y luminosidad\u00a0preparado para el controlador dom\u00f3tico eedomus. En la primera parte del tutorial hablamos de los elementos necesarios para la construcci\u00f3n del sensor, y en la segunda parte\u00a0del\u00a0funcionamiento del anem\u00f3metro y la conexi\u00f3n de los distintos &hellip; <a href=\"https:\/\/domosistemas.com\/?p=9042\" class=\"more-link\">Sigue leyendo <span class=\"screen-reader-text\">C\u00f3mo crear desde cero un multisensor de viento, lluvia y luminosidad para eedomus (Parte III)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9042","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/domosistemas.com\/index.php?rest_route=\/wp\/v2\/posts\/9042","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/domosistemas.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/domosistemas.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/domosistemas.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/domosistemas.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9042"}],"version-history":[{"count":0,"href":"https:\/\/domosistemas.com\/index.php?rest_route=\/wp\/v2\/posts\/9042\/revisions"}],"wp:attachment":[{"href":"https:\/\/domosistemas.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/domosistemas.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/domosistemas.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}