Domótica OpenSource = OpenDomo

Desde hace unos meses estamos trabajando en un proyecto totalmente OpenSource cuyo objetivo es el de proporcionar una solución libre de domótica. Desde aquí os quiero animar a que lo probéis y, si tenéis algo de tiempo, colaborar en lo que sea. El sistema se basa en una distro completamente hecha desde 0 la cuál está pensada para correr en sistemas muy pequeños. El software está escrito en C y shell script. Si queréis más información podéis visitar la página del proyecto: www.opendomo.org y en Google Code: http://code.google.com/p/opendomo

Os paso la introducción del proyecto para que os hagáis una idea:

El proyecto OpenDomo se inició en 2006 con el objetivo de crear un sistema de control domótico libre que cubriese las necesidades de un hogar del futuro. Actualmente el proyecto OpenDomo se encuentra todavía en una fase inicial de desarrollo, aunque sus funcionalidades y su estabilidad aumentan cada día.



¿Qué es OpenDomo?

OpenDomo es un sistema de control domótico y seguridad pensado para ofrecer una alternativa libre al hogar del futuro. La licencia bajo la que se está desarrollando el proyecto es la Licencia Pública General (GPL.) . Ésta, garantiza la libertad en el uso del software, uno de los principales valores de la sociedad tecnológica actual. En términos generales, esto implica que OpenDomo puede ser usado, copiado, modificado y distribuido libremente.



Objetivos del proyecto

OpenDomo surge ante la necesidad de disponer de un software avanzado de domótica, que permita un control total del hogar, integrando hardware de fabricantes diferentes. Por lo que el objetivo principal consiste en disponer de un sistema que permita manipular desde un punto central cualquier elemento susceptible de ser controlado electrónicamente. Por ejemplo, todo tipo de sensores, el sistema de alarma, el circuito cerrado de TV, el sistema multimedia (audio, vídeo, TV, ...), las luces, las persianas, el horno, etc.

Una de las formas más extendidas de aplicar la domótica consiste en el uso de hardware especializado. Algunos fabricantes han desarrollado hardware que usa protocolos propios y cerrados, lo que impide la ampliación o mejora de estos productos por terceras partes. Otros, han desarrollado hardware que usa protocolos abiertos ampliamente usados, como KNX/EIB o X10, pero muy limitados.

OpenDomo intenta salir del esquema basado en hardware y protocolos desfasados que no permiten cumplir con las necesidades del hogar actual. De esta manera, se implementa una red domótica basada en TCP/IP y en hardware estándard. TCP/IP es un conjunto de protocolos de amplio uso que forman Internet y que permiten el uso de todo tipo de tecnologías de actualidad, como streaming de audio/video, telefonía IP, compartición de archivos o televisión p2p, etc.
Posted on 2:04 a. m. by skarvin and filed under , | 2 Comments »

MySql :: Tips de Optimización

Hola,

Estas son unas recomendaciones básicas para mejorar el rendimiento de MySQL y que se hacen vitales cuando tratamos con grandes cantidades de información:

1) Evitar utilizar el tipo de dato BIGINT y utilizar en su lugar INT. Para conocer el tipo de dato recomendado por MySql podemos utilizar la siguiente consulta:

SELECT id_comercio FROM bbdd.comercios PROCEDURE ANALYSE()\G

La cual nos devuelve el tipo de dato óptimo en el campo "Optimal_fieldtype".

2) Es importante evitar que los tipos de dato numéricos se traten como "Strings" en las sentencias.
Por ejemplo:

- Incorrecto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido='10';

- Correcto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido = 10;

- Incorrecto: INSERT INTO tabla_x VALUES ('94','1','99');

- Correcto: INSERT INTO tabla_x VALUES (94, 1, 99);

Puede parecer bastante insignificante pero cuando hablamos de millares de consultas o más, estamos obligando al servidor MySql a hacer un CAST de String a Entero por consulta lo cual, nos lo podemos ahorrar.

3) NO crear índices si el valor que vamos a guardar tiene menos de 20 posibles variantes.
Ejemplos:

- NO crear índices en campos del tipo 0/1 o boleanos.
- NO crear índices en campos cuyo calor sea un rango de números del 1 al 10.

4) Es muy aconsejable utilizar la sentencia EXPLAIN en todas las consultas para saber si estamos utilizando correctamente los índices o en caso contrario, el servidor está haciendo un "table scan". Es importante saber que aunque especifiquemos índices en la cláusula WHERE, MySql no tiene por qué utilizarlos si no lo ve conveniente.

5) No utilizar funciones de tipo NOW o CURDATE ya que las consultas que las utilizan NO las guardan en CACHE.

6) Si se realizan cargas de datos en tablas, es mejor utilizar Inserts múltiples: INSERT INTO bbdd.tabla (campo1,campo2) VALUES (1,2),(3,2),(3,6).

Ejemplo en PHP:

...
$sQuery = "SELECT campo1, campo2 FROM tabla";
$iIdQuery = mysql_query($sQuery, $iIdConn);

foreach(mysql_fetch_row($iIdQuery) as $aValue)
{
$aValues[] = "(".$aValue['campo1'].",".$aValue['campo2'].")";
}
$sQueryInsert = "INSERT INTO tabla2 (campo1, campo2) VALUES ". implode(",",$aValues);

mysql_query($sQueryInsert,$iIdConn);
...

Espero que os sean de utilidad. En cuanto recopile otra lista volveré a postearlos.
Posted on 12:58 a. m. by skarvin and filed under , , | 0 Comments »

Python :: Subir Ficheros a FTP

Hola,

Después de tantos meses, publico un pequeño script que me es muy útil: Sube automáticamente los ficheros modificados al FTP que le especifiquéis. Que conste que soy un novato en Python! Ahí va:

--------------------------------------------------------
#!/usr/bin/env python
# coding: iso-8859-15

import os
import sys
import ftplib

# Configuración

project_path = "/path/to/project"
ftp_project_path = "/public_html"
ftpsite = "ftp.site.com"
ftpusr = "ftpuser"
ftppass = "ftppassword"
mnmin = 120
file_types = "[php|htm|html|js]"

# Funciones

def upload(conn, fname):
global ftp_project_path, project_path, path_len

dir_len = len(fname)
file2stor = fname[path_len:]
(dir, tail) = os.path.split(file2stor)
dir2stor = ftp_project_path+dir
command = "STOR " + tail

conn.cwd(dir2stor)
print "Almacenando en: "+dir2stor

fd = open(fname, 'rb')
temp = fd.read(2048)
fd.seek(0, 0)
if temp.find('\0') != -1:
conn.storbinary(command, fd)
else:
conn.storlines(command, fd)
fd.close()

def connect(site,usr,pwd):
conn = ftplib.FTP(site)
conn.login(user=usr, passwd=pwd)
return conn

# Inicio del script

conn = connect(ftpsite,ftpusr,ftppass)
path_len = len(project_path)

for file in os.popen("/usr/bin/find "+project_path+" -type f -regex '.*."+file_types+"' -mmin -"+str(mnmin)).readlines():
file = file.strip()
print "Subiendo online el fichero ["+file+"]"
upload(conn,file)

--------------------------------------------------------

Espero que os sea útil. Básicamente sube al directorio del FTP que le especifiquéis los ficheros modificados con la extensión file_types en las últimas 2 horas.

A10!

PD: Tener en cuenta que python utiliza la identación para englobar las funciones, bucles, condicionales, etc... y que el blogger este se come las tabulaciones!
Posted on 12:15 a. m. by skarvin and filed under , , , , | 1 Comments »