Crear tabla JSON para Timeline de google charts

Posted by Juan Marcano | Posted in *LINUX*, Software | Posted on 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>

Sensor PIR HC-SR501 con raspberry Pi 3

Posted by Juan Marcano | Posted in *LINUX*, Hardware, Software | Posted on 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.

Unboxing Yealink SIP-T20P

Posted by Jose | Posted in *LINUX*, Hardware | Posted on 23-11-2011

5

Se trata de un teléfono IP con soporte para protocolo SIP (rfc3261) fabricado por la empresa China Yealink.La primera impresión es de un teléfono llamativo con un modelo moderno y evidentemente con la imagen muy similar a la linea de teléfonos Cisco. Posee capacidad para dos lineas SIP, y si utilizas solo una tienes la funcionalidad de asignar el botón de la otra linea para múltiples funciones como BLF, desvió de llamadas, transferencia buzón de voz entre otras 15 funciones. Posee soporte nativo para transferencias de llamadas, llamadas en conferencia y buzón de voz.

Yealink T20 POE

Algo muy bueno es que es un teléfono muy intuitivo en su uso, para el usuario final no sera un dolor de cabeza comenzar a usarlo, en mi caso instale 30 teléfonos (con central Asterisk/Xorcom) en un área de oficinas un día sábado y el día lunes al llegar todos a sus puestos no tuve mayor complicación con esas preguntas típicas de «Usuario»

La configuración inicial del teléfono la puedes hacer vía manual por el teclado y pantalla física, pero la interfaz web de administración no tiene comparación en cuanto a rapidez y facilidad. Algo que me ha gustado mucho es que al realizar cambios en la configuración no es necesario reiniciar totalmente el teléfono, (algo que no tienen otras marcas como grandstream) solo le das a aceptar los cambios y a los pocos segundos ya esta el teléfono funcional con los cambios aplicados, a menos que toquemos configuraciones que si requieran un reinicio general del equipo.

yealink_datasheet

La estabilidad es un punto a favor, ya que hasta el momento, a dos meses de la instalación no he tenido ningún caso de teléfonos»guindados» o con problemas de software de algún tipo. El soporte para POE que traen estos equipos es una gran ventaja, si contamos con un switch con dicha capacidad evitamos alimentar cada teléfono individualmente con el adaptador DC. De modo que para instalar nuevas extensiones solo necesitamos llevar nuestro cable UTP al sitio y listo! no hace falta un toma-corriente para alimentación ya que por el mismo cableado viaja la data y la alimentación. Si vamos un poco mas lejos podemos proteger nuestro switche POE con un (UPS/SAI) con suficiente autonomía y todos nuestros teléfonos quedarian encendidos de manera centralizada durante un apagón (algo de mucha importancia en la Venezuela actual, Gracias Corpoelec!)

yealink_cdPara referencia e información, dejo la hoja de datos y manual de Usuario


Hoja Datos,      Manual

Pidgin como cliente de mensajeria universal

Posted by Juan Marcano | Posted in *LINUX*, Internet, Software | Posted on 22-06-2011

0

Pidgin es un cliente de mensajería excelente, si estas dispuesto a a abandonar el MSN messenger de una vez por todas  y dejar de inundar tu pantalla de publicidad con un software de mayor funcionalidad: pidgin es lo que estabas buscando. Pidgin se encuentra disponible para Windows, Linux y Mac.

Pidgin (a diferencia del clásico messenger de microsoft) te permite utilizar a la vez varias cuentas de mensajería instantánea: AIM, Bonjour, Gadu-Gadu, Google Talk, Groupwise, ICQ, IRC, MSN, MXit, MySpaceIM, SILC, SIMPLE, Sametime, XMPP, Yahoo!,Zephy.

Ademas de todas estas cuentas y de los plugins que trae por defecto podemos agregar plugins de terceros que añaden aún mayor funcionalidad al pidgin:

Facebook y Pidgin

Podemos acceder al servicio de mensajería de la populachera red social con el plugin:

Pidgin-facebookchat

Twitter y Pidgin


Con este plugin podemos ver los últimos ¨twetts¨  alimentar nuestro Twitter y dar a conocer al mundo entero nuestras obras y pensamientos mas absurdos en 120 caracteres sin tener que abrir el navegador.

Microblog-purple

Google apps y Pidgin

Puedes agregar por defecto cuentas de google talk en pidgin. Si tienes tu propio dominio con google-apps puedes usar google talk siguiendo las siguientes instrucciones.

Google apps-> google talk



Pruebas en Asterisk

Posted by Jose | Posted in *LINUX*, Hardware, Software | Posted on 08-12-2010

1

Ya hace un tiempo había realizado las pruebas preliminares  haciendo la instalación base de la centralita Asterisk con teléfonos por software y herramientas básicas. En esta oportunidad decidí ir un poco mas lejos y realizar pruebas orientadas a los requerimientos que podemos encontrar en una instalación real.

Grandstrean BT201Adquirí un hardphone Grandstream modelo  BT201 el cual resulto bastante bueno. Tiene funcionalidad básica, cuenta con buena calidad de audio y sencillamente hace su trabajo. Hasta el momento no he tenido problemas con el, cero cuelgues, errores etc. La interfaz de configuración se realiza vía web de manera sencilla


Panel trasero

Cuenta con un indicador que nos alerta de la existencia de un mensaje de voz en nuestra cuenta ip (si se encuentra habilitado en el servidor), capacidad incorporada de hacer llamadas en conferencia (no hace falta habilitar una extensión para ello en la central), altavoz, registro de llamadas salientes y entrantes entre otras capacidades.

Asterisk X101 ClonePara continuar con las pruebas le agregué a la máquina que instalé como central, una tarjeta CLON de X101P la cual consiste de un módem con chip ambient MD3200, el cual cuenta con el hardware necesario para funcionar como tarjeta FXO en asterisk. La instalación la realicé descargando y compilando el paquete DAHDI de digium con el modulo wcfxo y hasta ahora me ha resultado bastante bien con el funcionamiento,  pese que en muchos sitios de internet comentan que este tipo de tarjetas son buenas para experimentar, pero para instalaciones en producción no son recomendables. Para una prueba práctica conecté mi extensión de oficina a esta tarjeta y configuré el dialplan de manera que al detectar una llamada entrante la enviara a la extensión sip asignada al hardphone , así cada vez que alguien marca mi extensión analoga convencional repica mi teléfono IP. También realicé los cambios necesarios para poder hacer llamadas saliendo por el puerto FXO.

Algo interesante también fue el hecho de unir dos centrales como amigas, de tal manera que se realizara la conexión por el protocolo SIP  o IAX2 entre extensiones de las 2 centrales Asterisk. Esto es muy práctico ya que con solo marcar una extensión ya podemos conversar con usuarios de la otra central ubicados en otra ciudad o país, implicando un gran ahorro. Esto es muy útil en ambientes de empresas que cuentas con muchas sucursales

Asterisk PBX Friends

A manera de prueba contraté un servicio de telefonía IP externo y lo añadí como troncal SIP a una de las centrales de prueba, de esta manera puedo llamar a números de cualquier parte del mundo desde cualquier extension de la central Asterisk.


libro asterisk gratisUna excelente guía es el libro llamado «Asterisk, the future of telephony» el cual es gratuito y lo podemos descargar completo directamente de la página de la editorial en formato PDF.


AQUÍ

Cualquier duda o pregunta, Comenta!…

jose@marcano.net.ve

PThe Future of Telephony

Tips de seguridad en GNU/Linux

Posted by Jose | Posted in *LINUX*, Software | Posted on 20-10-2010

0

A muchos de nosotros nos anima la idea de tener una maquina en casa que funcione como servidor en casa, acceder a nuestros archivos desde cualquier lugar  o desde el trabajo es algo que con frecuencia buscamos,  en fin es muy útil y  a la vez divertido hacerlo lograrlo nosotros mismos

En GNU/Linux esto no tiene mucha complicación y hay mucha documentación en Internet la cual indica como hacerlo pero esto tiene otros aspectos que debemos tomar en cuenta:

Cada vez que abrimos puertos en nuestro router, o hacemos nat de nuestra red local para acceder a ciertos servicios estamos fabricando «puertas» para dar acceso desde afuera a nuestro computador, las cuales las dejamos ahí para cuando NOSOTROS queramos entrar mediante un usuario y una contraseña, esto no implica que alguna otra persona no intente vulnerar esa «puerta» para entrar y hacer quien sabe que en nuestro equipo.

¿Cual es la idea?

Dejar las menores puertas posibles de entrada a nuestro sistema y lograr que sean lo mas seguras que podamos, para esto me permito dar ciertos consejos que hasta la hora me han funcionado muy bien.

Una practica muy frecuente en usuarios y administradores de sistemas Linux es instalar un servicio de servidor ssh, esto nos da una muy buena opción para el control remoto vía consola y con la posibilidad de acceder a nuestros archivos de manera gráfica, todo esto a través de un canal cifrado y seguro. Esto no significa que no debamos tomar ciertas precauciones con este servicio el cual es uno de los mas utilizados, pero no esta de mas tomar las siguientes precauciones:

SOBRE TODO, utilizar un nombre de usuario y una contraseña segura, nada de 1234 ni abc. Combina letras en mayúscula, minúsculas y números si es posible

  • Especificar que usuarios podrán hacer «login»  por ssh, esto se modifica en el archivo /etc/ssh/sshd_config con la linea:                                                                      AllowUsers «tu-usuario»
  • No permitir que root tenga permiso de hacer login por este medio, esto lo hacemos con la siguiente linea:                                                                                                                            PermitRootLogin no

Por que esto no es buena practica?  Si alguien se llegara a apoderar de nuestros datos de conexión y entra al sistema no tendrá permisos de hacer grandes cambios mas que los de un usuario regular, no podra realizar cambios en archivos de configuración etc. Pero en cambio si  nosotros realmente necesitamos hacer tareas administrativas propias de root por ssh es mejor agregar nuestro usuario regular al archivo /etc/sudoers y así, mediante el comando «sudo» lograr escalar privilegios mediante una contraseña predefinida y nuestro usuario tendrá los permisos necesarios. Otra practica recomendada es cambiar el puerto de escucha del servidor ssh (22) por otro puerto distinto.

En este momento seguramente alguno pensara… que paranoico estoy, pero es realmente importante.. Fíjense en este registro (a la derecha) de intentos fallidos que encontré en un servidor. Hay muchísimos intentos de login fraudulentos intentando entrar como «root» y con varios usuarios distintos, los cuales ninguno existe, solo están utilizando un «robot»   el cual intenta entrar con parámetros predefinidos con una lista de usuarios comunes y contraseñas clasicas en muchas ip al rededor del mundo en el puerto 22

Observen que en un día puede haber miles de intentos de acceso a nuestro equipo por esta vía, para esto podemos complementar  la seguridad instalando la herramienta fail2ban la cual examina los logs continuamente y al detectar cierto numero de intentos fallidos bloquea la ip de origen por un tiempo determinado. El sistema que poseía  este log no tenia instalada esta herramienta, por esa razón se aprecia gran cantidad de intentos desde mismas ip. cabe destacar que las ip que aparecen son reales y de donde han provenido dichos intentos de login

Otras buenas practicas:

  • Tener un Cortafuegos con las reglas básicas para dejar los servicios básicos de nuestro sistema inaccesibles desde fuera.

Por ejemplo bloqueo de puertos 631  (Puerto de escucha de CUPS  – Servidor de impresión en Gnu/Linux) y 515 ( Cola de impresión)

  • Si utilizamos SAMBA, es conveniente denegar el acceso desde la interfaz conectada hacia afuera de nuestra red bloqueando el puerto 139 (netbios) y 445 y cualquier otro servicio el cual instalemos en la maquina, por ejemplo herramientas de administración y control via web, etc
  • La instalación de servidores FTP es inseguro, ya que la contraseña y la data viajan en texto plano por la red y cualquiera con las herramientas adecuadas puede indagar los paquetes que transmitimos o recibimos, e incluso descubrir el usuario y la contraseña de acceso y una muy buena opción es nuevamente ssh, y si queremos acceder desde un equipo con win podemos utilizar winscp con  el cual hacemos transferencias de archivos vía gráfica igualmente que un cliente ftp comun.

Hay mucha mas datos e información la cual ire  escribiendo en otros artículos con temas relacionados, cualquier duda o pregunta comenta!