Solve-It 2013: Nivel 3

En esta ocasión, a manos de cymo tenemos este enunciado:

SolveIt_2013_3.PNG

Son un montón de parejas de números. Al verlo podemos deducir enseguida que son coordenadas … pero de qué?

Podemos hacer un excel para analizar la frecuencia de cada coordenada pero parece que, en general, se repiten bastantes parejas de números; sobre todo el (3,1) y el (5,2).

Es curioso que al principio tenemos una pareja que únicamente se repite 1 vez. (4,11) y al final otra (4,9). Sin embargo, esta información no e muy concluyente…

Vamos con el título, que a menudo da una pista sobre el solve-it… “clickety-click”. Suena a ratón de ordenador, o algo mecánico. Si buscamos en google:

clickety_definition.PNG

“Un rítmico y rápido click-clack, por ejemplo de las maquinas de escribir

Vale, es una pista interesante, las máquinas de escribir sacan ese ruido denominado clickety-clack al escribir. Así que podrían ser coordenadas de las letras que golpean las hojas para escribir… sin embargo … que vaya del 2 al 5 una coordenada y del 1 hasta el 11 la otra no tiene mucho sentido ya que las “patas” que tienen en relieve las letras que escriben no tienen tantas letras en vertical (igual tienen 2 o 3 máximo.

Bueno, pero y el teclado? Aquí la cosa ya cambia puesto que tenemos (sin contar con las teclas de función) 5 filas y hasta 12 o 13 teclas por fila.

Partiendo de que (3,1) sea la ‘A’ ya que se repite muchas veces (la ‘A’ podría ser (5,2) pero descuadraría todo el teclado; con (3,1) la ‘A’ queda “clavada” en una posición idónea para que pueda salir algún mensaje…

Efectivamente si vamos transformando coordenadas en letras del teclado obetenemos:

Hay ocasiones en las que mas vale borrarse como un muerto, desaparecer de repente como tragado por la tierra, deshilarse en el aire como el copo de humo.

Con esto vamos a recurrir a Google a ver qué nos dice…

pascual_duarte.PNG

Encontramos que la frase exacta que hemos sacado de las coordenadas, pertenece a un extracto del libro “La familia de Pascual Duarte” de Camilo Jose Cela).

Ahí tenemos nuestro salto al proóximo nivel…

Solve-It 2013: Nivel 2

Vamos con un solveit facilito según marcan (me insistió en que lo era … y efectivamente, le voy a dar la razon …) y con el que le volví loco haciendole consultas por correo … me odia!! lo se !! xD

Captura.PNG

Vemos aquí a un plantel de políticos y algún que otro no político … Unos personajes para hacer una orla vaya …

Algunos son bastante conocidos, pero muchos otros no (para mi al menos).

Lo básico en una situación de estas es comenzar a buscar quién es cada uno de ellos. y aquí está la lista (en orden de izquierda a derecha en la foto, en la lista de arriba abajo) Utilizamos google imágenes para ello:

JOSE BLANCO LOPEZ
ROLANDO EUGENIO HIDALGO
IÑAKI URDANGARIN LIBAERT
JUAN MARTIN SARON
LLUIS MIQUEL PEREZ SEGURA
GABRIEL MARIA INCLAN
FRANCISCO RODRIGUEZ FERNANDEZ
ANTONIO BARRIENTOS GONZALES

JOSE MANUEL TRABA
XAVIER CASAS

De aquí ya empezamos a hacer combinaciones con las iniciales de los apellidos, letras en comun de los nombres… etc… nada concluyente… (Como podeis ver nos faltaba un personaje, en anteúltimo. El motivo es que no nos apareció por google imágenes… :/)

Empezamos a alargar un poco la “ficha” de cada uno de los personajes con fechas de nacimiento, lugar donde la habían preparado, etc…

OSE BLANCO LOPEZ          Lugo???
ROLANDO EUGENIO HIDALGO        Aguascalientes
IÑAKI URDANGARIN LIBAERT        Palma
JUAN MARTIN SERON          Alhaurín el Grande
LLUIS MIQUEL PEREZ SEGURA        Reus
GABRIEL MARIA INCLAN        Barakaldo???
FRANCISCO RODRIGUEZ FERNANDEZ      Orense
ANTONIO BARRIENTOS GONZALES      Estepona

JOSE MANUEL TRABA          Cee
XAVIER CASAS            Barcelona

Todos habían estado implicados en algún caso de corrupción, con lo que empezamos a mirarlos igualmente… Después de, uno de nosotros, sacar varios de ellos dejamos esta opción al margen porque nos dijo que no veía nada concluyente… MAL!

Seguimos investigando … y he de decir que dando la caca a marcan por correco electrónico para que nos diera alguna pista porque no veíamos NADA!!  xD (ya lo siento marcan … aunque no prometo que no vuelva a pasar :P)

Finalmente y tras muuuchas horas perdidas y ya un poco desesperados, acabamos rellenando por completo toda la información que pudimos recopilar sobre los personajes (incluso llegamos en un punto a pensar que internet ya no contenía la información necesaria para sacar el solve-it….):

2017-05-06 12.39.54.jpg

Pero después de completar esta tabla, con el dato de “Caso Campeon” vimos una cosa …

Captura de pantalla 2017-05-06 a las 12.43.03.png

Vaya… después de ver esto, maldije un par de veces al del grupo que había “revisado” los casos en los que estaban imputados … (pero bueno, a los 5 minutos le perdoné :P)

CANTIMPALOS

Solve-It 2013: Nivel 1

Vamos hoy con uno de los solveit facilitos:

Captura de pantalla 2017-05-01 a las 11.26.18.png

Partiendo de que el enunciado esta escrito al reves y que suele ser una pista, veamos que contiene el video que hay en el enlace:

Captura de pantalla 2017-05-01 a las 11.37.14.png

Bueno, pues visto el titulo como digo, que esta al reves, se trata de idioma árabe casi seguro. Si esperamos a reproducir el video por completo, hacia la mitad dice algo en árabe. Lo pasamos por google translator (con el reconocimiento de voz y nos sale:

2017-05-01 11.41.55.jpg

Bueno, no es exacto a lo que pone en el texto pero oye, la primera (es decir, realmente la última) palabra sí que coincide así que probablemente y visto el resultado podría ser algo como: “clave: salud”

Si probamos “salud” efectivamente parece que sí que hemos acertado…

Solve-It AE01: Nivel 5

Vamos hoy con el Nivel 5 de la AE01 …:

Captura12.PNG

“Un camino de curvas”. Nos dice marcan que es un fichero con unas instrucciones muy largas para llegar al tesoro, veamos qué contiene…

Captura13.PNG

La verdad es que nada más ver las 2 o 3 primeras lineas me vino a la mente algo que vimos en la escuela la primera vez que dimos informática (igual corria el año 1994? a saber… jeje):  el LOGO.

LOGO es un programilla de dibujo en el que una “tortuga” que se llama, que va trazando líneas sobre una superficie obedeciendo instrucciones que se le van dando por teclado en una línea de comando. El que nosotros usamos tenía, si no recuerdo mal, instrucciones del estilo: AVANZA 10, GIRA DERECHA 90, AVANZA 20, etc…

Rebuscando un poco en internet se puede localizar un programita de estos, donde se podría probar en un momento si por ahí van los tiros asi que vamos a ello. Baje MSW Logo:

Captura14.PNG

Tras probar un poco varias opciones para hacer mover a la tortuga dí con las que lo hacían así que, solamente faltaba intercambiar los comandos del fichero de marcan por los de este programilla de LOGO en un editor de texto:

Captura15.PNG

Sustituimos todo y eliminamos lo de “grados.” y “metros.” y metemos todo en un fichero de texto plano con extensión .LGO (la extensión que abre el programilla que he bajado).

Abrimos el fichero generado en el programa y…

Captura10

Sorpresa! Un QR…

Arreglamos la imagen en un par de minutos con cualquier programa de dibujo sencillo para que cualquier lector QR pueda leer bien los cuadrados negros y los blancos:

Captura11.PNG

Y listo! el restultado es:

TurTl354llTh3W4yD0wn

Solve-It AE01: Nivel 2

Captura03.PNG

En este nivel nos tompamos con una ristra de A’s que aparentemente son iguales. Sin embargo Marcan ya nos previene “No todo es lo que parece”.

Ya en el título del solveit vemos algo curioso:

Captura03_5

Qué puede pasar con esas A’s? Vamos a copy-pastearlas en el editor del Writer y vamos a buscar la primera A; en teorñia son todas iguales pero nos encontramos lo siguiente:

Captura04

Viendo esto lo que pasamos a hacer es ir moviendo en la regla del editor hasta ver si sale un dibujo o algo que nos pueda decir algo. Curiosamente al ir haciendolo encontramos con que se llegan a formar “lineas” con las letras sombreadas hasta que:

Captura05

Si nos fijamos un poco vemos que estamos ante exactamente 8 letras de ancho, lo que significa posiblemente binario. Sustituimos cada A por un 1 y las A diferentes por 0’s:

Captura06

Y ahora sencillamente buscando un conversor de binario a ascii por internet, copiamos todo el tocho y nos da como resultado:

Captura07

Ahí aparece nuestra contraseña: Un1c0d3d

 

Solve-It AE01: Nivel 1

Estando un poco con el hype de que se acerca otro nuevo año la Euskal Encounter, hemos retomado un poco el tema de Solve-Its y Hack-Its. Hay que ir practicando para este año de nuevo!! jeje.

Vamos con uno fácil. El Nivel 1 de la Araba Encounter 01, en la que marcan nos pone este enunciado:

Captura01.PNG

Bajo el título ¡ESTAN LOCOS ESTOS ROMANOS! Nos pone una agrupación de 10 grupos de 5 letras.

Sin prestar atención más que a las letras se puede ver casi a simple vista que hay más W que cualquier otra letra. A veces, y si el idioma es medianamente “normal” una letra que se repite mucho puede ser la letra ‘A’.

Pero con la letra ‘A’ únicamente no vamos a hacer nada… Necesitamos más información. Ésta se nos da en el título ROMANOS => Cifrado César muy posiblemente…

Suponiendo que la ‘W’ como hemos dicho según nuestra teoría es la ‘A’ para hacerle un cifrado cesar hay que desplazar 22 posiciones el alfabeto para que la A coincida con la W.

Buscando en la web hay varios codificadores/descodificadores César (incluso se podría hacer a mano, pero estando en la web que lo hace en 1 segundo… pa que?):

Captura02.PNG

Le metemos el codigo, le ponemos el offset (22 ó -4, lo mismo da) y tenemos una frase en Euskera:

GAUR HITZA EMAN BIHAR HAIZEAK ERAMAN PASAHITZA HOTZA DUZU.

La primera parte se trata de un refrán (Hoy das la palabra, mañana el viento se la lleva). Y en la segunda parte está la clave (Pasahitza hotza duzu = La contraseña es frío). Pero frío en Euskera, “HOTZA”

Domotizing XI – DAQ for kWh – Part I (yes, in English)

The blog is read most by people that is not from Spain so … although I don’t like too much the idea of beginning to write in English (because my English is incredibly awesome, you will discover it) … I think it is a ‘must do’ … so how’s your English then?? xD


Last time I wrote about power consumption management system in my house I started manipulating files, arrays of characters, editing configuration files, and so on… and then I decided that I was wasting my time because I was programing a data/files management system without having any data adquiring system or even data!

Well, I have been programming since then a system with which I could store power data from everyday in a little bit organised style.

First of all I made a little modification to the program that gives all the data when capturing current (A) waveform. This program normally gave me all this info:

Captura de pantalla 2016-09-16 a las 17.50.17.png

The thing is that, for adquiring information about the power consumption I don’t need the graph, the number of samples, time, current peak, … Indeed, I only need ‘Potencia’ (power) value.

The modification I made to have only the power value, was to insert input parameters into the C program I had made before:

Captura de pantalla 2016-09-16 a las 17.54.23.png

As you can appreciate in the screen capture I ‘filtered’ the additional information with ‘argc’ input parameter in ‘main’. In addition to that, if the parameter introduced when we make the call to the program is “pg”, I give only power value and also I generate the graphic of current.

I also  made a little help screen so as to remember how to work with this program. We get to this information by typing the parameter ‘?’ on the program call. It returns this:

Captura de pantalla 2016-09-16 a las 18.00.28.png

  • Parameter ‘p’ gives only the actual power value in W.
  • Parameter ‘pg’ gives actual power value in W and generates current graphic.
  • No parameters gives all information and generates current graphic

OK then, this was the first step to start generating power information data files, now I would need to make another program that catches data every X seconds and stores all this information in files.

The initial idea was to create files with the actual day information on its name like this:

  • data_01_01_2016.txt

(The format is in Spanish DD/MM/YYYY). I was tempted to do it in Basque as it is the normal format I use (YYYY/MM/DD) but day-month-year format I think is easier for this context.

So, inside that .txt file the information would be stored in columns:

Captura de pantalla 2016-09-17 a las 11.30.15.png

First column would be time of day and second column is the Wh at that moment. For example, 16.13 with 45.62 Wh means that from 15.13 to 16.13 we have a power consumption of 45.6 W.

This would be OK but I don’t like it too much because my idea was to store this data in a file with the format:

data_DD_MM_YYYY.dat

… and also the information on every specific time of day like this:

data_DD_MM_YYYY_HHMM.dat

Probably your are thinking that storing the data with that filename is not complex, and indeed you’re right, complexity = 0… but, what would happen when you have to access to that specific hour/minute of the day to show the informatio? How could you know if you have to write in ‘HHMM’ 1613, 1713, 2134, …?

So the solution is easy: force MM to be ALWAYS ’00’:

captura-de-pantalla-2016-09-25-a-las-10-47-12

I created this function that generates a string with the specific path and name of the data file. Parameters ‘crear_ruta’ and ‘crear_ruta_hora’ will indicate this function if the returning string has in the name the actua day and also the hour or if it has only the actual day. The comment there ‘Para que se cree el fichero ….’ means: This is to force the data file to has ceros in the minute field in all cases’.

So after all this I have only created a file ‘pathing’.Let’s start with the rest of the program.

I created in the beginning of the program a ‘samples’ (muestra) tag. In my case this is 360, and it is configurable. For example, if you set 3600 this will store data every second, with 360 it will be every 10 seconds, and so on … The next screen capture shows this constant value in the beginning of the program:

captura-de-pantalla-2016-09-25-a-las-11-11-42

(360 samples means 1 sample every 10 seconds in 1 hour; 3600 samples would be 1 sample every second in 1 hour).

Now we go to main program structure.

Captura de pantalla 2016-09-25 a las 10.52.32.png

Here you can see the tags declaration. There are timing variables, buffering strings, double data arrays for storing power reads. Remember that ‘muestra’ means ‘sample’ in Spanish.

captura-de-pantalla-2016-09-25-a-las-10-55-42

We create the file that will contain Wh every hour in the beginning as you see in the previous capture. We open with “a” so as not to overwrite if the file exists and append the information in the end of it.

Captura de pantalla 2016-09-25 a las 10.58.31.png

And finally we start with the main loop.

As you see it is infinite loop that is catching the time data the whole time (first paragraph). Second paragraph named ‘CHEQUEAMOS EL DIA….’ means ‘we check that the actual day has not finished’. With this we detect a flank if the day is increasing so as to increase the path file for the new day.

captura-de-pantalla-2016-09-25-a-las-11-01-50

I got the previous piece of code from the internet as I did not really know how to get the output data of an executable file to come into another program. I thought that it coul be done by ‘./lecturaA p > potencia.dat‘ and then read ‘potencia.dat’ file but I thought there must be another more elegant method … so that is what I found and it works!.

‘lecturaA’ is the executable file I modified in the beginning. With ‘p’ parameter I get only the actual power read.

Captura de pantalla 2016-09-25 a las 11.05.50.png

Finally this bunch of code. Lots of letters, but don’t worry, most of them are comments :P. What I do here (I remind you we are inside the while loop yet) is checking if the counter is equal to the constant defined value ‘samples’ (muestras).

Normally we will be storing power data and timing data so if we pay attention to what is under ‘most-left-else’ we see an ‘IF’ that is checking that we read correctly the power value. If the reading is good it assigns ‘potencia’ (power) value we catched before. If not read a valid number it assigns 44.0 W by defect. (Need to check this last thing as my current sensor does not read less than 44 W :/ On low currents the information is not accurate).

The sprintf stores the time information in the 2D array I created in the beginning and counter (contador) increases by 1.

When ‘contador’ gets to ‘muestras-1’ then we store the information in 2 different files. The first one is the one I created before with the data ‘dat_DD_MM_YYYY.txt’ and what I make is a sum of all power data (360 values) and divide them by ‘muestras’ => this value will be the ‘Wh‘ in the just passed hour. We store this with the hour information with ’00’ in the minute (as told before, I don’t really care about the minute as I could only get troubles with it).

Next I store ALL samples taken (360 in my case) in a file ‘dat_DD_MM_YYYY_HH00.txt’ I create with the function I described before (fc_crear_ruta….). I create, then record all data and then close the file so as to restart the process again.

As you see I set ‘contador’ to 0 and store the actual power read as indeed a power has been read but I have been storing the previous ones but I need to do this for first power data within the next hour.

And YES, the code that is under ‘contador = 0’ should have been written before the ‘sleep’ as it is common for both xDDD. I will make this modification as it is very easy right now, don’t get angry…

Ok, I think I have written too much today … Next time I will talk about plotting all this information and get a monthly report of power consumption.

Philips Hue ¿¿White??

Pueees si… cogí una bombilla de philips hue (que he de decir son excesivamente caras) de las que se denominan ‘white’ porque quería únicamente luz blanca en algunos puntos de la casa.

Elegí este modelo porque como digo quería color blanco con posibilidad de manejar la intensidad desde el bridge de philips (o sea, desde el movil en mi caso). El precio de esta bombilla es de unos 18€ (como digo bastante cara), ¿cara? sí, pero más barata que los 58€ que cuestan las Philips Hue white and color… (que los de philips se han venido un poco arriba con los precios)

Llegué a casa todo ilusionado para probar mi super-bombilla-led-zigbee-manejabledesdelmóvil (la envié y recogí en donde trabajo) y cuando la pongo en la lámpara de casa cual fue mi sopresa que ….

IMG_5350.JPG

(NOTA: La philips white es la amarilla de la imagen superior…)

Me dije: a ver… igual desde la aplicación se puede manejar la tonalidad de blanco, o algo …

.

.

.

Pos no… no se podía…

Ante esta situación sólo había 2 opciones ….

1ª – Devolver la bombilla

2ª – ¿Se podrán cambiar los leds para hacerla blanca?

Joder, estaba claro que la segunda opción es bastante más atractiva … jejejej.

Vale, empecemos por el principio…. ¿De cuántos watios estamos hablando? En el casquillo pone:

‘9.5W 50mA’

Venga va, que seguro que encuentro alguna equivalente… en concreto ¿por qué no coger la que está en la imagen superior? Es el tono de blanco que quiero!.

Abrir la bombilla blanca (que por cierto es de Leroy Merlin) fue bastante sencillo… Girando un poco el casquillo y sujetando la capota (de plástico por cierto) sale bastante fácil. Sin embargo para abrir la bombilla de Philips, éstos se lo han currado un poco más y he de decir que la han pegado con dos coj**** el cuerpo de la bombilla al casquillo de cristal plástico.

Total, que había que tirar de dremel y así quedó el percal …

IMG_5813.JPG

Me acojoné un poco al meterle la dremel a la bombilla de philips porque podía haber algo vital para la bombilla en el interior pero no… el concepto de las bombillas led parece que es el mismo para todos… Consiste en una plaquita de leds sujeta con unos tornillos a una chapita que hay en el interior a modo de refrigerador.

Antes de empezar a romper (más) cosas medí la tensión en los dos cables que salen de ambas bombillas y que van a la placa de leds. La medida inicial no fue nada prometedora:

En contínua la luz de led de leroy merlin daba 100V y sin embargo, la de philips da 30V … :/

Pero bueno, aquí hemos venido a jugar… ya que estamos vamos a probar así que siguiente paso! vamos a poner la placa de led de la de leroy en la philips.

Cómo no, para la bombilla “made in Leroy Merlin” bastó soltar los tornillos que sujetan la plaquita de los led a la estructura de la bombilla y salió bastante fácil. Únicamente tenía un poco de pasta térmica entre la plaquita de leds y la chapa interior.

Una vez cambie la placa de leds paso lo que todos sospechamos: no funciona; de 30V a 100V son demasiados voltios para no tener en cuenta…

Plan B, vamos con otra táctica.

La bombilla de Phlips tenía pegada igualmente la placa de leds a la base, pero, al igual que el casquillo al plástico, estaba pegada con dos coj**** a la chapa. Va pegada con una especie de pegamento gomoso bastante resistente.

 Aunque al final salio!

Captura de pantalla 2016-09-15 a las 19.33.47.png

… con un poco de violencia, pero bueno …

La cosa es que hacía algunos meses había comprado estos leds por internet para hacer pruebas y asi, aunque no los había llegado a usar nunca, tocaba ya:

IMG_5826.JPG

Segun las características, estos leds son de 12V y 10W, y la “bombilla” da hasta 30V y 9.6W …. bueno… watio arriba watio abajo tampoco nos vamos a poner quisquillosos, que somos ingenieros :P.

Por otro lado si pongo 2 en serie son 24V y la bombilla me daba 30V cuando esta a tope… bah! 6 voltios arriba 6 voltios abajo… voy a meterlos en serie y que sea lo que dios quiera… jejeje.

img_5816

Pues aquí esta el resultado final …. creo bastante interesante atar lo que son los leds a la chapa de la bombilla porque me huele que se van a calentar un poco. Para uno de ellos lo he tenido facil porque he aprovechado un agujero donde va un tornillo pero para el otro sin embargo … malamente he podido colocarlo gracias a la placa que asoma por el agujero central:

IMG_5827.JPG

Se me ocurrió pensar que con loctite todo es posible y con un poco de pasta térmica para rematar me habría valido bien para seguir adelante, pero no tengo (no tengo pasta térmica, loctite sí).

Pero no me iba a quedar mirando porque estoy había que ponerlo ya!

Tirando un poco te internet he hecho pasta térmica con pasta de dientes y aceite de girasol (una auténtica guarrada…) y bueno, se quedará así, como se suele decir, temporalmente pa siempre (donde “pa siempre” puede sustituirse perfectamente por “hasta que pete” porque casi seguro que petará … actualizaré esta entrada del blog si es así ;).

Bueno, había que probar, no?

Bueno, no tiene mala pinta … ahora hasta la luz blanca de detras parece amarilla !!!

Vamos a poner la capota de plástico a ver cómo queda:

Bueno, cosas del destino … ahora resulta que la luz que era amarilla hace que parezcan más amarillas las que eran blancas porque ahora SI es BLANCA! jeje

Podemos decir que hemos hecho una Philips Hue White, pero white white !!

La intensidad de blanco se puede manejar de igual forma que antes desde la aplicación o con comandos POST como anteriormente sin problemas:

IMG_5838.JPG

Me hace gracia cómo ha salido en la fotografía la bombilla de philips que he bajado la intensidad (al mínimo, por cierto) … parece que haya hecho una mierda de edición en Photoshop o algo, pero creedme que no: la foto ha salido asi! Será que los leds que le he metido ahora son de altísima calidad? Cuando peten lo sabremos ….

Domotizando X – Riiiiiing – (… done)

Finalmente encontre la solución al problema que tenía. Resulta que escribir desde una terminal el comando que manda un mensaje por telegram hacía que si se hacían muchas llamadas seguidas, el cliente petase.

Intente arreglarlo con threads y el resultado “mejoro” algo pero habia que poner unos delays bastante elegantes.

El comando “screen” de linux me solucionó la papeleta.

La verdad es que he hecho bastante en el tema de domótica de casa desde que puse el último post pero bueno, me centraré un poco en el tema del timbre, ya habrá tiempo para entrar en otros temas 😉

La cosa es que quería mantener el cliente de telegram ejecutando constantemente en la raspberry. Yo no tengo pantalla así que siempre accedo por SSH con lo que para ejecutar el cliente de telegram…. tenia que hacerlo via SSH.

El problema de conectarse por ssh a un dispositivo es que en el momento que te desconectes cierra todo lo que tuvieras en ejecución…. stenyak me recomendó utilizar “screen” para solucionar ese problema.

Así pues, después de investigar cómo funcionaba, conseguí entenderlo 😛 (soy un poco lentito pa estas cosas si…) y ejecutando con screen el cliente….

Captura de pantalla 2016-08-26 a las 16.57.58.png

Captura de pantalla 2016-08-26 a las 16.56.47.png

se queda en segundo plano y yo puedo cerrar la terminal… una maravilla.

Vale, pero ¿y que? ahora como se puede hacer para usar *ese* cliente que tengo en segundo plano? pues esta todo pensado!! A screen se le puede pasar cadenas de texto para que las ejecute sencillamente haciendo:

Captura_de_pantalla_2016-08-26_a_las_17_01_15.png

Si se escribe desde la terminal directamente sólo hay que tener en cuenta lo que va entre “”. Yo tengo ‘system’ porque estoy ejecutandolo en un programa en C.

Y qué es lo guapo de esto?

Pues que se pueden hacer mil llamadas seguidas (es decir, escribir tantos comandos seguidos como ese) y NO PETA el cliente de telegram 😉 Una maravilla.

Domotizando X – Riiiiing – (Parte 2: Soft)

Pues vamos con la segunda parte de la instalación del timbre-telegram…

Hablemos un poco del tema programación.

Como ya dije en la anterior entrada, parecía que no iba a entrañar mucho problema toda la parte de programación ya que básicamente me hice a la idea de que tendría que ser un proceso que estuviera esperando un flanco (ya sea negativo o positivo) en la entrada GPIO 17 de la raspberry.

raspberry-pi-15.jpg

Arriba vemos el conexionado que hice de la raspberry corregido, ya que al principio como dije, conecté el cable verde a 3.3V y el gris a a GPIO17 (igual debería haberlo metido en el apartado de hard, pero bueno, supongo que hasta hoy no me apetecía hacer el dibujo en el paint…).

Por cierto, el módulo de relés que aparece en la foto no es el módulo RF que uso para el timbre pero bueno, los relés sí son prácticamente idénticos.

Dicho esto entremos por fin en materia:

Captura de pantalla 2016-08-08 a las 17.21.01.png

Como ya comenté, partí de un programa ejemplo que encontré por internet en el que hacía uso de entradas/salidas GPIO de la raspberry programadas en C. La URL a dicha página creo que la puse, la repito:

https://learn.sparkfun.com/tutorials/raspberry-gpio/c-wiringpi-example

Para instalar las librerías y demás solamente hay que seguir el tutorial que viene en la página, bastante sencillo, simple y cómodo.

Después de esas declaraciones y cabeceras de la captura anterior viene el bucle en cuestión:

Captura de pantalla 2016-08-08 a las 17.23.47.png

Antes de entrar en el bucle (no lo he puesto) vemos que hay un memoria_old = digitalRead(butPin). Esto es para inicializar el valor de “memoria_old” para hacer un flanco después de que se detecte el primero y no con el valor basura que nos viene de la declaración de memoria_old.

Como dije, al final opté por utilizar hilos (threads) para este propósito porque me estaba dando problemas el cliente de telegram en consola de comandos. Este cliente como dije en la primera parte, no está muy fino y si le maltratas un poco te hace alguna perrería que otra.

Para instalarlo basta acudir al repositorio GitHub que puse en el post de la parte I y seguir las instrucciones. No me voy a meter ahi porque es un coñazo y no viene a cuento. Sólo diré que me tardó LA VIDA en compilar en la raspberry…

Volviendo al tema. En un principio, cuando no hice con hilos, el programa se quedaba trabado en el while en la llamada a la función de ‘telegram-cli’ (porque antes esta llamada no estaba en un hilo, sino en el propio while) que es la función que manda el mensaje como tal al móvil. Se ejecutaba una vez el envío del mensaje, y como hacía muchos envíos seguidos (deduje que sería por eso…) se quedaba ‘pillao’ en algun envío y no volvía a mandar más mensajes.

Se me ocurrió, para solucionar esto, que ‘tal vez’ si hacía la llamada en uno hilo, hacer que si tras un timeout no respondía (es decir, si tras x segundos, el hilo no terminaba su ejecución) yo lo mataría desde el proceso principal.

Para hacer todo esto que he explicado definimos la variable global: “hilo_running”

if (memoria_old != digitalRead(butPin) && hilo_running == 0){
...
}

Si detectamos flanco (primer != del if) y ademas, el hilo que envía los mensajes a telegram NO está funcionando, entonces procedemos con la ejecución del tinglado.

Esto es así, porque si no compruebo que el hilo está ejecutándose y hago una segunda llamada a otro hilo el cliente de telegram se queda tonto y me  puede dejar hilos por ahí danzando en memoria…

Si se cumple que no hay ningun hilo anterior ejecutando procedo con la creación de un hilo:

err = pthread_create(&hiloEscribirMensajes, NULL, &escribirMensajes, NULL);
if (err == 0){
    hilo_running = 1;
    contador = 1;
}
memoria_old = digitalRead(butPin);

Compruebo que el hilo se ha creado bien (error == 0) y si es así, pongo hilo_running a TRUE (1) y contador lo igualo a 1 para algo que vamos a ver en un momento.

Además de eso hago que memoria_old sea igual al valor actual de la entrada digital para detectar un posible nuevo flanco positivo/negativo.

Luego entraremos en detalle en el hilo, de momento seguimos en el proceso principal (main):

if (memoria_old != digitalRead(butPin) && hilo_running == 1){
    memoria_old = digitalRead(butPin);
}

Esto lo pongo aquí para por si está ejecutandose el hilo que envía los mensajes y se pulsa de nuevo al timbre (detecta otro flanco) para dejar memoria_old con el mismo valor y que no vengan problemas de que, al acabar la ejecución del hilo, justo la entrada digital este en la posicion invertida a como estaba cuando se llamó al primer hilo, lo que provocaría que se ejecutase otro hilo de seguido. Con esto, esa situación se previene.

if (contador != 0){
    contador++;
    if (hilo_running == 0)
       contador = 0;
}

Si contador es diferente de 0 significará que habremos iniciado un “temporizador” ya que ha habido una ejecución de un hilo. Si resulta que de repente el hilo ya no está running… no me interesará hacer un timeout del hilo ya que sabremos con certeza que no hay ninguno corriendo (ya sea porque ha terminado de ejecutarse o porque le hayamos matado desde el main), así que pondremos de nuevo contador a su estado inicial: 0.

if (contador > 25){
    if (hilo_running == 1){
       err = pthread_cancel(hiloEscribirMensajes);
       if (err == 0){
           hilo_running = 0;
       }else{
           printf("**** ERROR EN LA CANCELACION DEL THREAD!\n");
       }
    }
    contador = 0;
}

delay(1000);

Aqui es donde hacemos el timeout del hilo, por si tarda mucho en acabar de ejecutarse.

Como hay un delay(1000) en cada iteracion del bucle infinito 25 serán más o menos 25 segundos de margen de tiempo para que se termine de ejecutar el hilo (es ajustable y posiblemente baje este valor ya que está a modo de prueba).

Lo que hacemos es que si el contador es mayor que 25 (segundos) y el hilo estaba en ejecución, matamos al hilo (pthread_cancel) y si sucede algún error lo imprimimos por pantalla a modo debug.

Además de eso, reseteamos el contador a 0.

Vamos con el programa que ejecuta el hilo:

void *escribirMensajes(void *arg)
{
        system("telegram-cli -W -e \"msg ****** TIMBREE!\"");
        delay(2500);
        system("telegram-cli -W -e \"msg ****** TIMBREE!\"");
        delay(2500);
        system("telegram-cli -W -e \"msg ****** TIMBREEEE!!\"");
        delay(3500);
        system("telegram-cli -W -e \"msg ****** TIMBREEEE!!\"");
        delay(8000);

        printf("SALIENDO DEL THREAD DE LOS MENSAJESSS\n");
        hilo_running = 0;

        return NULL;
}

No creo que tenga mayor complejidad este hilo, si acaso por la cadena que se le pasa a system (que básicamente ejecuta una instrucción de bash.

telegram-cli -W -e "msg ****** TIMBREE!"

Como tal, la instrucción en bash que manda un mensaje al contacto ****** es esta de aquí arriba (en la parte de programación tiene las ” escapadas con ‘\’ para que las escriba en la terminal bien).

Y aquí es donde radica el mayor problema del programa y que realmente NO he solucionado aun… Por eso tiene delays por en medio. Es debido a que hacer muchas llamadas al cliente de telegram, hace que se bloqueen algunas y se quedan perdidas por ahí en memoria, ejecutandose en segundo plano …

Si logro encontrar la solución a este problema ya lo actualizaré por aquí. Pero de momento tiene que ir así… con esos delays…

El tema del hilo soluciona ‘un poco’ la papeleta porque al menos, no se bloquea la ejecución de llamadas al cliente de telegram… Se me ocurrió lo de incluir hilos porque asumí (mal) que al matar al hilo, mataría también las ejecuciones de system() que tiene dentro, pero esto parece que no es asi …

Así pues, podríamos decir que está aun madurando el programa aún… y que está algo verde igual pero bueno, de momento funciona y es más que suficiente… Supongo que podré ajustar más los tiempos hasta encontrar el punto óptimo en el que no se bloquee el cliente.

Veremos a ver si actualizo este post con mejoras para el sistema del timbre….