Mi Raspberry Pi 3

Publicado por Juan Marcano | Categoria: Electrónica, Hardware, Software | Fecha: 05-03-2019

0

Ya hace algún tiempo vengo «cacharreando» mi raspi 3 como hobbie, usándolo como servidor y añadiendo varios sensores, he logrado en 2018 algunos avances desde que encontraba en la caja de mantequilla, se encuentra funcionando bastante estable.

Más imágenes

Caja personalizada

Tiene ahora una nueva caja plástica a la cual he añadido un trípode que permite direccionar la camara. Hasta ahora mi raspi tiene los siguientes sensores:

  • Cámara 5 mp.
  • Sensor de temperatura y humedad dht22.
  • Leds 5 mm: 1 x amarillo (status del programa de detección de movimiento con el sensor PIR),1 x rojo (pensado para indicar fallos, conexión al wi-fi por ejemplo), 1x RGB (uso general).
  • Matriz de led 8×8 basado en MAX7219 para mostrar mensajes varios.
  • 2 x pushbutton: los coloque para iniciar o detener servicios, hacer reboot,shutdown o general realizar cualquier acción que desee programar sin necesidad de acceder desde el teléfono o un computador.
  • Sensor PIR HC-SR501, que detecta movimiento.
  • Cámara 5Mp.
  • Buzzer activo.

AnyDesk y VNC

En lo que respecta a software decidí colocar entorno de escritorio para facilitar mover archivos, programar y otras operaciones además de ser un medio adicional de conexión alternativo al ssh. Puedo acceder al escritorio por dos medios, usando Anydesk y VNC . El vnc resulta ser bueno para conexiones locales pero excesivamente lento para conexiones fuera de ella. 

Open VPN

El ISP del que dispongo en este momento tiene mi ip publica bajo una NAT, lo cierto es que me era imposible acceder por fuera de la red local al raspi. Lo solucione finalmente arrendando un servidor VPS, en el cual tengo algunos servicios de los que hablaré después. Pero entre ello instalé un servidor Open VPN y cliente en el raspi creando una VPN, para acceder desde internet a cualquier puerto del raspi se realiza una redirección desde el servidor VPS hacia el raspi, una gran ventaja del servidor VPS es disponer de una IP fija además de configurar e instalar lo que se nos antoje.

Sensor de temperatura y humedad DHT-22

Modifiqué un programa en C que lee el sensor PIR y lo combiné con el programa del PIR en lo que respecta a la conexión a la base de datos (mysql) y creación del archivo JSON. Por ahora lo se ejecuta con CRON cada 15 minutos. Y genera un gráfico usando google charts:

http://140.82.6.248:81/pi_server/temp_hum_DHT22

Módulo de cámara 5 mp y motion

Finalmente compré la raspi-cámara más económica que encontré, sin embargo me sorprendió la calidad de vídeos y fotografías que brinda.

Instalé el software motion, bastante poderoso que permite realizar capturas en foto y video cuando se detecta movimiento. 

Permite realizar capturas snapshots cada cierto tiempo e incluso genera videos timelapse, es bastante configurable en el archivo motion.conf.

También hace streaming de video por lo que podemos visualizar desde la red local o internet.

https://motion-project.github.io/

Sensor PIR HC-SR501.

Ya había realizado un post acerca del sensor PIR, fué el primer sensor instalado, un programa en C almacena las detecciones en una base de datos (mysql)y se grafican con la ayuda de google charts:http://140.82.6.248:81/pi_server/movement_PIR/ 

Matriz de led 8×8 MAX7219

Relativamente fácil de usar con python y la librería https://pypi.org/project/max7219/ , muy util para mostrar texto en desplazamiento y me sorprendio que es legible si se selecciona adecuadamente la velocidad de desplazamiento y la fuente. También despliega símbolos CP437. La pantalla la he programado en conjunto a los push buttons.

Eso es todo por ahora, estaré mejorando este artículo a medida que agregue nuevas mejoras.

Yealink config file generator tool (MAC oriented)

Publicado por Jose | Categoria: Desarrollo, Software | Fecha: 28-12-2017

0

The last year (2017), I wrote this small web application to ease the process of configure large quantity of Yealink IP phones.

https://yealink.marcano.net.ve




 

Before… my co-workers unpack and connect every phone, wait many seconds for booting and later configure manually network parameters, after of wait a second reboot other person should enter in each phone (web interface), and configure the rest of parameters, a really SLOW procedure and too many chances of making mistakes, and if you have 100 or more desktop phones waiting for installation.. the time of configuration extends considerably.

Yealink phones have multiples automatic ways to configure, personally select the way of MAC oriented config file. This is a unique file for every phone that contain ALL the parameters and configuration (network parameters, sip accounts, button mappings, timezone, etc).

If you have all the configuration files for your phones.. you can save a huge amount of time placing all this files in a http server and configure your DHCP server with option 66, this option say to every phone that take a DHCP address where to find your own configuration file. Every phone search this location for a file with your unique mac adress name (example 4a27d0fbb9b2.cfg) copy this file and later reboot automatically, later the phone is ready and configured with all the parameters and custom config provided.

The process of collecting data is very simple. In a CSV file put data in the following order:

MAC address, extension, Fixed IP address

Collecting MAC address of every phone can be done quickly reading directly to CSV file with a cheap usb barcode scanner and original box

 

Later upload this file to web application and fill the rest fields

VLAN field and Phone administration password field are optionals, its depends of architecture of network and client needs.

later of pressing GENERATE button, showing a screen with details of process with every file generated, and link for download a .zip file containing all the files. 

 

The tool is designed for work with fixed IP address for every phone, time zone is set to -5, and other custom parameters, but with the source code you can modify files to satisfy your requirements. a folder named models contain the files for every model and can be edited for adjust your requirements and config needed 

GitHub repository:




https://github.com/joseh55/yealink_genconf

Trabajar y vivir en Bogotá Colombia

Publicado por Jose | Categoria: Colombia | Fecha: 26-06-2017

0

Estas pensando Colombia como alternativa para vivir.. trabajar o escapar a la crisis Venezolana??? acá te dejo una serie de consejos basados en mi experiencia personal y pueden ser de ayuda.

Si vienes acá con un capital en efectivo, trata de ahorrar en lo posible, a pasar que hay variedad de alimentos y productos, y vienes con una moneda devaluada es critico (o incluso si vienes con DOLARES) ya que el cambio es bastante fuerte y Bogotá es una ciudad MUY cara. Solo en transportes puedes gastar altas sumas si te movilizas constantemente.

Vivienda: puedes acceder a una habitación ya que es lo mas accesible y económico y el costo depende y varia MUCHO dependiendo de la zona en la cual decidas vivir. Una habitación en Bogota puede oscilar desde los 150.000 pesos (COP) y 700.000 pesos (COP) o incluso mas, en mi caso durante los primeros meses opte por una habitación amoblada (cama, closet, escritorio, wifi) derecho a baño y cocina compartida por 350.000 pesos en una zona central de bogota donde hay muchas residencias estudiantiles por estar cerca a la Universidad Nacional.

Documentos: Es un tema primordial, si vienes como extranjero con pasaporte solo puedes estar tres meses en territorio Colombiano, Si te excedes ese periodo de tiempo seras multado cuando decidas salir de Colombia con una suma proporcional a los días que extendiste tu estadía. Muchos toman la decisión de venir a Colombia solo con pasaporte y extenderse, personalmente no lo recomiendo ya que al no tener una situación LEGAL  al pasar los tres meses de estadía, conseguir un trabajo estable con beneficios de ley se hace imposible lo que afecta directamente en el dinero que puedan pagarte, es decir si consigues algún empleo te pagaran lo que ellos quieran, generalmente con turnos de domingo a domingo.

VISA: esta  la opción de visa de trabajo, la cual te otorgan previo estudio con toda la documentación requerida. Generalmente cuando ya tienes un empleo seguro y necesitas la visa para  regularizar tu estadía en el País. Requiere un estudio (PAGO) aprox 52 Dolares (USD) y luego de ser aprobada debes cancelar 250 Dolares (USD) adicionales. 

Puedes descargar los requisitos de la VISA TP4 de trabajo en el siguiente enlace:

En el tema de búsqueda de empleo, puedes utilizar las paginas de búsqueda de empleo como computrabajo, indeed, etc. en las cuales preparas tu hoja de vida, la subes al sitio y comienzas a rezar para que te llamen. Una opción es que si ya tienes una profesión u oficio con experiencia, puedes buscar empresas mediante Internet y contactar directamente con ellos para enviarles tu hoja de vida.

Condiciones laborales:

Suponemos que ya! conseguiste empleo y tienes documentación, debes estar atento ante las condiciones y derechos que tienes como trabajador.

Luego de firmar un contrato, generalmente el primer contrato es otorgado por tres meses (periodo de prueba) la empresa te afilia a:

una EPS (Entidad Promotora de Salud), a donde te diriges cuando necesitas atención medica, consultas etc.

ARL (Administradora de riesgos laborales)

Fondo de Pensiones. (Dinero que se te descuenta mensualmente para pensión).

COMPRAS: En relación a comida productos para el día a día hay mucha variedad, generalmente algunas plazas de mercado tienen precios mas económicos que grandes cadenas en centros comerciales o cadenas de tiendas tipo tiendas D1 o justo y bueno hacen que al menos te ahorres para el pasaje ida y vuelta.

SERVICIOS: Si vas a vivir en un sitio donde pagaras servicios, ten en cuenta:

Servicios de TV e internet son los mas costosos (desde 60.000 pesos aprox)

Con relación al agua y energía, ten en cuenta que debes ahorrar mucho… no estas en Venezuela donde mantenías la luz encendida toda la coche sin problemas o el WC con una fuga eterna de agua. Acá al ser los servicios públicos tan costosos hacen que vivas pendiente si apagaste o no la luz.

Esta es la primera parte de este articulo y lo ire extendiendo poco a poco…

Si tienes alguna duda o consulta deja tu comentario !

 

 

 

 

 

Crear tabla JSON para Timeline de google charts

Publicado por Juan Marcano | Categoria: *LINUX*, Software | Fecha: 29-04-2017

0

En la página de google charts se explica claramente e formato que debe tener la tabla de datos JSON en el caso de un PieChart, en el ejemplo el fragmento getData.php no hace más que leer la data de un archivo de texto con el formato requerido, en una aplicación real debemos generar este formato JSON dinámicamente en PHP ya que necesitamos que la data del chart que empleamos varíe, ya sea en funcion de las actualizaciones de la base de datos o de las consultas a esta. Es decir,necesitamos escribir código PHP que en funcion de nuestras necesidades genere la tabla JSON que a fin de cuentas no es más que texto con cierto formato.

Para el caso particular del timeline del artículo sobre el raspberry pi 3 y el sensor PIR la base de datos original cuenta con 3 columnas básicas, no indicaré como crear las columnas, es harina de otro costal, en el caso del ejemplo cada columna cumple la siguiente función:

  1. Un columna ID: No es más que un número de referencia. En este caso tomé el ID como llave primaria.
  2. Una columna indica la Fecha de iniciodel evento de detección del sensor. El formato del dato es DATETIME (hora y fecha combinados).
  3. Una tercera columna indica fecha de finalización del evento de detección con el mismo formato DATETIME.

No entraré en detalles sobre el código del raspi y como escribe en la base de datos, tal vez para otro post, . Lo cierto es que con esta tabla de la base de datos se procederá a graficar usando google charts y para ello necesitamos el JSON.

Veamos la tabla (desde MySQL workbench):

Tabla de la base de datos (sensor pir)

Luego hacemos un QUERY super especial a la tabla llamada PIR que dice así:

SELECT Id, Fecha, Fecha_2, timediff(Fecha_2,Fecha) AS calculated 
FROM pir WHERE Fecha_2 IS NOT NULL and(Fecha > DATE_SUB(now(),INTERVAL 30 DAY))
ORDER BY Id DESC

Traduciendo al estilo open english:

Seleciona las columnas: Id,Fecha(inicio del evento), la Fecha_2(fin del evento) y la columna nueva timediff calculada de la tabla PIR donde la fecha_2 es no nula y la en un intervalo de los últimos 30 días, ordenado la tabla por los ID en forma descendente.

Ok, revisemos con mayor cuidado:

La parte:

SELECT Id, Fecha, Fecha_2, timediff(Fecha_2,Fecha)

Lo que hace esta consulta es arrojar una tabla con las columnas: Id, Fecha (inicio del evento) y Fecha_2 (fin del evento), lo util aquí es que crearemos con las herramientas de MySQL una cuarta columna con la función timediff(Fecha_2,Fecha), y que nos regresa la diferencia de tiempo entre los eventos, así podemos conocer cuanto tiempo dura el evento. Realmente esta columna adicional no se emplea para construir la tabla JSON así que es opcional y meramente informativa.

AS calculated FROM pir WHERE Fecha_2 IS NOT NULL

Nos indica que la nueva tabla no incluirá filas donde la Fecha_2 sea no nula ya que bajo ciertas circunstancias, durante el apagado o encendido repentino del raspberry PI puede darse esta situación y Google charts no será capaz de realizar la gráfica si el dato es nulo, por ello se ignoran estas filas que contengan eventos incompletos.

and(Fecha > DATE_SUB(now(),INTERVAL 30 DAY))ORDER BY Id DESC

Los eventos de la nueva tabla serán de los últimos 30 días y las filas se ordenaran por el ID en forma descendente. Ello es conveniente ya que no interesa ver en el timeline de google charts los eventos más recientes primeros (no los más antiguos).

Luego de esta super consulta resulta:

Tabla resultante del QUERY

Y bueno llegó la hora de la verdad, he aquí como crear la tabla JSON para el timeline, adelanto que el resultado se puede ver aquí.

El archivo que llamamos get_json.php dice así:

<?php
	
require_once("mysqlli_connect.php"); // se llama al script "mysqlli_connect.php" 
//que realiza la conexión mediante mysqli connect, 
//en este caso el Query o consulta se encuentra allí.
include 'mysqlli_connect.php';
$table = array();
$table['cols'] = array(
        array('id' => 'Role', 'type' => 'string'),
        array('id' => 'Name', 'type' => 'string'),
        array('id' => 'Start', 'type' => 'date'),
        array('id' => 'End', 'type' => 'date'));

$rows = array();
while($r = mysqli_fetch_assoc($query)) {
	
preg_match('/(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})/', $r['Fecha'], $match);
    
    $year = (int) $match[1];
    $month = (int) $match[2]-1;//convert to zero-index to match javascript's dates
    $day = (int) $match[3];
    $hours = (int) $match[4];
    $minutes = (int) $match[5];
    $seconds = (int) $match[6];
	
preg_match('/(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})/', $r['Fecha_2'], $match);

    $year_2 = (int) $match[1];
    $month_2 = (int) $match[2]-1;//convert to zero-index to match javascript's dates
    $day_2 = (int) $match[3];
    $hours_2 = (int) $match[4];
    $minutes_2 = (int) $match[5];
    $seconds_2 = (int) $match[6];
		
    $temp = array();
	$temp[] = array('v' => date('m/d/Y',strtotime($r['Fecha'])));
	$temp[] = array('v' => 'Detección # '.$r['Id'].'');
	$temp[] = array('v' => "Date(0,0,0,$hours,$minutes,$seconds)"); 

// Se ignora la fecha 
//dia/mes/ano y se rellena con ceros ya que cada dia se colocara como una nueva fila.
	
        if($hours>$hours_2){$hours_2=24;$minutes_2=00;} 

// evita que el Timeline chart genere un error
// cuando se pasa de las 12:XX a las 00:XX a media noche, 
//ya que la hora de "Start" debe ser menor que la de "End" para el timeline.
	
        $temp[] = array('v' => "Date(0,0,0,$hours_2,$minutes_2,$seconds_2)");
        $rows[] = array('c' => $temp);	
}
$table['rows'] = $rows;

$jsonTable = json_encode($table);

header('Content-type: application/json');

echo $jsonTable;
?>

el archivo mySQLi es solo otra sección de código que realiza la conexión a la base de datos, así. Recordemos que utiliza MySQLli (extensión del PHP para conectarse a bases de datos MySQL). Existen cantidad de ejemplos en la red. Recordemos que este se ejecuta ANTES que el segmento de código anterior.

<?php
$db_host = 'localhost'; // Nombre del host, como la base 
de datos está en el mismo raspberry ponemos localhost
$db_user = 'root'; // el nombre del usuario
$db_pass = 'PASSWORD'; // Password
$db_name = 'NOMBRE_DE_LA_BASE_DE_DATOS'; // Database Name

$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (!$conn) {
	die ('Failed to connect to MySQL: ' . mysqli_connect_error());	
}
$sql = 'SELECT Id, Fecha, Fecha_2, timediff(Fecha_2,Fecha) AS 
calculated FROM pir WHERE Fecha_2 IS NOT NULL 
and(Fecha > DATE_SUB(now(),INTERVAL 30 DAY))ORDER BY Id DESC';
$query = mysqli_query($conn, $sql);

if (!$query) 
{
	die ('SQL Error: ' . mysqli_error($conn));
}

?>

Nótese que allí se encuentra el QUERY del que hablamos al inicio del artículo, la sección del query podría colocarse en otro archivo y modificarse  dinamicamente , ya esto lo haremos en otra ocasión. 

A continuación la página index o la página que llamaremos para realizar el gráfico (el inicio de todo y que llama a los segmentos de código anteriores, es igual al que sale en la página de google, solo que las secciones que hacen referencia al piechart, ha sido susituidas por Timeline. En el caso de nuestro server se llama main_5.php

<html>
  <head>
    <!--Load the AJAX API-->
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
    
    // Load the Visualization API and the piechart package.
    google.charts.load('current', {'packages':['timeline']});
      
    // Set a callback to run when the Google Visualization API is loaded.
    google.charts.setOnLoadCallback(drawChart);
	
	var options = {
      timeline: { singleColor: '#4d4dff' },
    };
      
    function drawChart() {
      var jsonData = $.ajax({
          url: "get_json.php",
          dataType: "json",
          async: false
          }).responseText;
          
      // Create our data table out of JSON data loaded from server.
      var data = new google.visualization.DataTable(jsonData);

      // Instantiate and draw our chart, passing in some options.
      var chart = new google.visualization.Timeline(document.getElementById('chart_div'));
      chart.draw(data,options);
    }

    </script>
  </head>

  <body>
    <!--Div that will hold the pie chart-->
    <div id="chart_div" style="height: 600px;"></div>
  </body>
</html>

Guía de lubricación SHELL

Publicado por Juan Marcano | Categoria: Uncategorized | Fecha: 23-04-2017

0

Una guía de inducción rápida y concisa que proporciona información sobre usos y terminología asociados a los lubricantes, se divide en 5 partes:

 

Sensor PIR HC-SR501 con raspberry Pi 3

Publicado por Juan Marcano | Categoria: *LINUX*, Hardware, Software | Fecha: 17-04-2017

0

Fotos de mi raspi 3 bajo en calorías, el case es un envase de margarina que tiene las dimensiones ideales y aporta un diseño innovador y estilizado (la verdad es que es saqué el envase de la basura). 

El raspi corre Raspbian con servidor web Apache, MySQL para registrar datos.

  • Por ahora cuenta solo cuenta con un con sensor PIR HC-SR501 para detectar movimiento.
  • Un buzzer (lamentablemente me trajeron uno de tipo activo).
  • Un sensor (super económico y popular, aunque no muy preciso) DHT-11 que aún no uso.

 

El buzzer indica la hora del día, cuando son las 5 de la tarde suena 5 veces y así sucesivamente, el binario se escribió en C++ (escribí una pequeña clase) y se ejecuta cada hora con la ayuda de CRON. Facilito.

Luego para entretenerme con el PIR decidí hacer algo distinto, todo el mundo hace una gráfico XY con el sensor de humedad/temperatura, decidí usar un timeline de google charts para visualizar los eventos de detección del sensor, este tiene un alcance de 3 a 7 metros según la hoja de datos. 

Programado en C/C++ utilizando la librería WiringPi para detectar los flancos de subida y bajada en una de las entradas del raspberry (mediante interrupciones), dicha entrada está conectada a un sensor PIR HC-SR501, mediante la librería cpp-conector se notifica a la base de datos (MySQL) instalada en el raspberry, finalmente para visualizar cómodamente los registros desde una página web se instaló el servidor web de toda la vida (si..  apache), en el caso de la página web se realiza conexión a la base de datos (PHP) y se exporta la data (JSON) según el formato requerido por google charts, se utilizó un chart «Timeline» ideal para representar periodos de tiempo, en este caso cada evento comienza con una detección del sensor y finaliza cuando el sensor no ha registrado movimiento durante unos 2 minutos aprox.

En resumen: las zonas azules del gráfico en la página web indican cuando hay alguna persona en la habitación donde se encuentra el raspberry (o al menos se detecta que la persona se mueve ya que sensor solo detecta movimiento). Se indica claramente la fecha y hora de la detección.

El gráfico con las ultimas detecciones (ultimos 10 dias) se aprecia en el siguiente enlace.

http://140.82.6.248:81/pi_server/movement_PIR/

Esta es una captura, Hacer click en la imagen vincular ir al raspi-server.