Empezar con la Domótica II

Definición

La primera pregunta que debemos respondernos es ¿Qué es la Domótica?

Segun la escueta definición de la RAE:

Conjunto de sistemas que automatizan las diferentes instalaciones de una vivienda.

A esta definición que es correcta en parte le falta una puntualización muy importante: la información y la monitorización, por lo que yo la definiría así:

Conjunto de sistemas que informan, monitorizan y automatizan las diferentes instalaciones de una vivienda.

Desgranando la definición

Informan

Diferentes tipos de sensores se encargan de recoger toda la información que nos es de interés sobre nuestra vivienda para almacenarla para su posterior uso.

Los sensores más habituales son: luminosidad, presencia, inundación, temperatura, gas, humo,…

Al al mismo tiempo, la información instantánea de estos sensores pueden lanzar determinadas acciones sobre la instalación. Por ejemplo: si el detector de humo alcanza un valor determinado de presencia de humo en una instancia puede iniciar el sonido de una alarma y el envío de un mensaje al cliente.

Monitorizan

La información procedente de estos sensores que es almacenada constantemente puede analizarse de manera que nos ayude a entender cómo funciona nuestra vivienda y como un cambio en un sistema provoca una reacción en otra.

Por ejemplo, abrir una ventana porque es necesario ventilar según nuestro sensor de contaminación provoca un cambio de temperatura que activará ciertos sistemas de climatización que tienen una repercusión directa en el consumo de electricidad.

Esta es una de las partes de la Domótica menos explotada y que sin embargo es la más importante porque si se presentan los datos de la forma adecuada los usuarios podemos entender mejor cómo funcionan nuestras casas y actuar de manera más eficiente dejando de lado falsas creencias.

Automatizan

Es la parte más evidente, la Domótica nos permite automatizar cosas, pero esto no tiene nada que ver con encender luces con el móvil. Tiene que ver con que se enciendan ellas solas cuando tú las encenderías para que no tengas que hacerlo, suena a ciencia ficción, lo sé. Pero si no conseguimos esto no estamos haciendo nada.

Repercusiones

Al invertir en una instalación Domótica ya sea completa o parcial se inicia un proceso que acabara provocando varias cosas: conocerás mejor el funcionamiento de tu casa, mejoraras la seguridad de la misma, optimizaras el uso de la energía y ahorrarás esfuerzo dejando que determinadas cosas ocurran por sí solas.

¿Qué es HomeKit?

Desde hace un par de años varias marcas estaban preparando sus propios sistemas domóticos, cada uno de ellos con su propio protocolo y su propia App. Si tenias dos enchufes de distintas marcas tenias que manejarlos con apps distintas.

Ante este panorama Apple desarrollo HomeKit, un sistema de unificación que permite que todos los dispositivos sean usados con cualquier App que use HomeKit independientemente del fabricante y además que Siri pueda interactuar con todos los dispositivos.

Dispositivos que son compatibles y que pueden adquirirse en España a día de hoy: Philips Hue, Elgato Eve, Netatmo,…

Alternativas

Hay otras iniciativas para conseguir esta integración: Samsung Smarthing y Amazon Echo son los más importantes. Aunque poco os puedo contar de estos porque uso iPhone y mi plataforma es HomeKit.

Ademas, Amazon es muy dura cuando apuesta por algo y lo mantiene mucho tiempo, pero Samsung es muy dada a no poner toda la carne en el asador y dejar tirado al personal si no es rentable para ellos. Así que, si no cambia nada, HomeKit tiene muchas papeletas para ser apuesta ganadora.

Por otro gro lado los dispositivos compatibles con HomeKit suelen ser compatibles con otros sistemas android así que no hay mucho problema si cambiáis de plataforma en el futuro.

Empezar con la Domótica

¿Quién no ha oído hablar de Domótica a día de hoy? Lo normal es pensar que es algo que tiene buena pinta porque puedes automatizar luces, enchufes, … Pero que es algo de casas nuevas o de gente con mucho dinero.

Os voy a ir contando como lo he ido haciendo yo para ir introduciéndome en el mundo de la Domótica a bajo costo pero con un funcionamiento impecable.

Para seguir mi guía necesitarás lo siguiente:
– Un iPhone, porque todo está basado en la plataforma HomeKit de Apple.
– (opcional) Un AppleTV, que hará de enlace entre la casa e Internet. Es necesario si queremos poder controlar el sistema desde el exterior: comprobar si nos hemos dejado algo encendido, encender algo antes de llegar o apagar todo si nos vamos de casa. Por supuesto el nuevo Apple TV es genial para muchas cosas más: ver pelis, series, vídeo consola…
– Nuestro primer accesorio domótico: un enchufe que podemos programar, encender/apagar a distancia y que además nos permite conocer el consumo instantáneo e histórico de lo que haya enchufado, muy útil para estufas y otros aparatos que pueden hacer que se nos vaya de las manos la factura de la luz.

Yo lo tengo desde octubre de 2015 y no tengo ninguna queja. Podéis comprarlo haciendo clic en el siguiente enlace:

http://www.amazon.es/dp/B016IOFQPA/?tag=rafarq-21

En el próximo artículo os explico cómo configurar la casa, así os doy tiempo para ir comprando el enchufe como mínimo.

Mis mejores compras

De vez en cuando os pondré unos cuantos enlaces con lo que considero que son mis mejores compras, como no, de tecnología.

Hoy os traigo tres productos:

Una bateria externa para el iPhone que se carga con el cable lightning del iPhone, por lo que no tienes que llevar mas cables encima. Además tiene para casi cuatro cargas enteras:

Y mi querido NAS. Este es el mejor regalo que me han hecho. El verano pasado me lo compró mi mujer por mi cumpleaños. Es el NAS mas barato que hay pero en funcionalidad esta a la altura de los mas caros.

Le tengo puesto un disco duro de 3TB y el se encarga de hacer descargas de torrents, además de que tiene una app tipo dropbox con la que tener tu nube gratis sin limite de almacenamiento ni cuotas mensuales.

Este enlace es para un disco de 3TB especial para NAS, por poco mas de 200€ podéis tener un NAS y un disco de 3TB para crearos fácilmente vuestra propia nube. Además no hay que saber nada de informática, os va guiando en la configuración.

Espero que os haya gustado la selección.

[GC] Seleccionar todos los elementos que dependen de un nodo

Esta semana me he encontrado con un problema común que voy a simplificar para explicarlo aquí de manera más sencilla. Suponemos que tenemos una línea sobre la que queremos poner puntos, esos puntos serán el centro de una serie de círculos. Algo así:

circ1

Este es el código correspondiente para generar el círculo:

node User.Objects.circle01 Bentley.GC.Features.Circle
{
    Technique                 = 'ByCenterRadius';
    CenterPoint               = {point02, point03, point04, point05};
    Radius                    = 3;
    Support                   = baseCS.XYPlane;
    GraphLocation             = <auto> {1080.0, 40.0};
}

El problema es que si los puntos los dibujamos manualmente luego debemos seleccionarlos uno a uno para hacer los círculos de manera replicable. Esto esta bien cuando hay pocos puntos, o cuando se saben cuantos se van a hacer desde el principio.

Si quiero añadir más puntos ahora debería añadirlos manualmente, y luego editar la lista anterior para que el nodo círculo lo tenga en cuenta. De nuevo, esto está bien si tengo que agregar pocos puntos.

Hay otra manera más “inteligente” y rápida de hacerlo: Seleccionar los puntos cuya dependencia cuelga de la línea o lo que es lo mismo seleccionar los sucesores de la recta.

Seleccionar los sucesores de una recta

Esto se hace accediendo a la propiedad ‘GetSuccessors’ que tienen todos los nodos de la siguiente manera:

line01.GetSuccessors(false)

El resultado será este:

{circle01, point05, point04, point03, point02}

El problema es que el círculo que estamos creando es también un sucesor de nuestra línea, por lo que debemos deshacernos de el y sacarlo de la lista para que el nodo círculo pueda funcionar, ya que busca puntos sobre los que hacer las circunferencias. La funcion ‘RemoveAt’ que es la que usaremos para borrar el elemento de la lista necesita saber el índice del elemento que queremos quitar, por tanto usaremos la funcion ‘IndexOf’.

Por pasos, con la funcion ‘indexOf’ obtenemos el índice del círculo en la lista:

IndexOf(lista, elemento)
IndexOf(line01.GetSuccessors(false),circle01)

En este caso el índice que arroja es ‘0’.

Ahora usamos la funcion ‘RemoveAt’ para eliminar el elemento de la lista, para que sea dinámico, en lugar de usar el 0, se usará la funcion ‘IndexOf’ completa:

RemoveAt(lista, índice)
RemoveAt(line01.GetSuccessors(false),IndexOf(line01.GetSuccessors(false),circle01))

El resultado es, por tanto:

{point05, point04, point03, point02}

El nodo quedará definido por:

node User.Objects.circle01 Bentley.GC.Features.Circle
{
    Technique                 = 'ByCenterRadius';
    CenterPoint               = RemoveAt(line01.GetSuccessors(false),IndexOf(line01.GetSuccessors(false),circle01));
    Radius                    = 3;
    Support                   = baseCS.XYPlane;
    GraphLocation             = <auto> {1080.0, 40.0};
}

Descargar el ejemplo en GCT

La portada del PFG

Esta es la imagen de fondo de la portada de mi proyecto fin de grado:
Model

Variables

  • altura: altura del modelo en el eje Y.
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm
  • giro: giro de los cuadrados
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm
  • apertura: tamaño de los cuadrados
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm

Y esta es la animación de cómo se mueven los cuadrados cambiando los parámetros que dejé libres:

Desarrollo del modelo generativo

En primer lugar se hace una matriz de puntos de 20×10 puntos a partir de una serie de puntos en diagonal al que se le aplica una replicación.

transaction modelChange 'Add point01'
{
    node User.Objects.point01 Bentley.GC.Features.Point
    {
        Technique                 = 'ByCartesianCoordinates';
        CoordinateSystem          = baseCS;
        XTranslation              = Series(0,80,4);
        YTranslation              = Series(0,40,4);
        ZTranslation              = 0;
        Origin                    = null;
        Replication               = ReplicationOption.AllCombinations;
        GraphLocation             = <auto> {300.0, 40.0};
    }
}

A partir de esta matriz de puntos se crea un conjunto de polígonos que usa los puntos como vértices.

transaction modelChange 'Add polygon01'
{
    node User.Objects.polygon01 Bentley.GC.Features.Polygon
    {
        Technique                 = 'ByPointGrid';
        Points                    = point01;
        Fill                      = false;
        SkipAlternates            = false;
        FacetOption               = FacetOption.Quads;
        PlaneIndex                = 1;
        TextStyle                 = null;
        UClosed                   = false;
        VClosed                   = false;
        GraphLocation             = <auto> {560.0, 40.0};
    }
}

Se calcula el centroide de cada polígono y usandolo como comienzo se traza una línea en la dirección del eje Z cuya longitud depende de la distancia a otro punto que se usará como atractor que se llama “point02”, es la línea “line01”.

transaction modelChange 'Add point02'
{
    node User.Objects.point02 Bentley.GC.Features.Point
    {
        Technique                 = 'CentroidOfSet';
        SetToFindCentroidFrom     = polygon01.Vertices;
        GraphLocation             = <auto> {820.0, 40.0};
    }
}

transaction modelChange 'Add point03'
{
    node User.Objects.point03 Bentley.GC.Features.Point
    {
        Technique                 = 'ByCartesianCoordinates';
        CoordinateSystem          = baseCS;
        XTranslation              = <free> 12.0569421656741;
        YTranslation              = <free> 16.1699104640786;
        ZTranslation              = <free> -9.03728241466236;
        Origin                    = null;
        GraphLocation             = <auto> {820.0, 180.59};
    }
}

transaction modelChange 'Add altura'
{
    node User.Objects.altura Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 25;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {1080.0, 40.0};
    }
}

transaction modelChange 'Add line01'
{
    node User.Objects.line01 Bentley.GC.Features.Line
    {
        Technique                 = 'ByStartPointDirectionLength';
        StartPoint                = point02;
        Direction                 = baseCS.ZDirection;
        Length                    = Distance(point02,point03)/4-altura;
        GraphLocation             = <auto> {1080.0, 40.0};
    }
}

En cada centroide se coloca, además, un sistema de coordenadas que toma como base el sistema de coordenadas principal y le aplica un giro definido con la fórmula:

transaction modelChange 'Add coordinateSystem01, giro'
{
    node User.Objects.giro Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 27.0;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {1340.0, 40.0};
    }
    node User.Objects.coordinateSystem01 Bentley.GC.Features.CoordinateSystem
    {
        Technique                 = 'ByOriginRotationAboutCoordinateSystem';
        Origin                    = point02;
        CoordinateSystem          = baseCS;
        RotationAngle             = line01.Length*giro;
        Axis                      = AxisOption.Z;
        GuideRadius               = 1.0;
        GraphLocation             = <auto> {1600.0, 40.0};
    }
}


line01.Length*giro

Por lo que el giro dependerá, además de la variable giro, de la longitud de la línea 01.

Se trazan cuatro puntos a partir del centroide basados en el sistema de coordenadas girado que formarán los vértices de un nuevo polígono. La distancia entre estos puntos está determinada por la variable apertura que divide a la longitud de la línea 01:

line01.Length/apertura

node User.Objects.point04 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.XDirection;
        DistanceFromOrigin        = line01.Length/apertura;
        GraphLocation             = <auto> {1860.0, 40.0};
    }
    node User.Objects.apertura Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 5;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {2120.0, 40.0};
    }
    node User.Objects.point05 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.YDirection;
        DistanceFromOrigin        = line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
    node User.Objects.point06 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.XDirection;
        DistanceFromOrigin        = -line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
    node User.Objects.point07 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.YDirection;
        DistanceFromOrigin        = -line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
}

transaction modelChange 'Add polygon02'
{
    node User.Objects.polygon02 Bentley.GC.Features.Polygon
    {
        Technique                 = 'ByVertices';
        VertexPoints              = { point06, point07,point04, point05};
        Fill                      = false;
        ForcePlanar               = false;
        PlaneIndex                = 1;
        TextStyle                 = null;
        Key                       = "";
        GraphLocation             = <auto> {2640.0, 40.0};
    }
}

Mi primer repositorio en github

Aunque es un proyecto sencillo, resuelve para mi un problema que tenia en casa: Saber cual es la ip externa de mi conexión y sobre todo, si esta cambia, recibir una notificación con la nueva IP.

Para ello hago uso de la raspberry Pi que tengo en casa con un sencillo script que podéis encontrar en https://github.com/rafarq/pushIP

Os dejo la explicación completa del script que he escrito para GitHUB.

pushIP

Get a push notification via PushOver when your computer changes its public IP.

1. Why?

Because I have a Raspbery Pi in my home where I have some tools. I want them to be accesible from the internet. I can’t use ddns, so, I want to be notified when it changes in my phone.

2. What do you need?

  • An account on PushOver.net
  • A linux/mac computer
  • An android/iOS device with pushover App.

3. How to make it work

Put all the files on your home directory, in my case it was /home/pi/. This is going to be yours if you use a raspberry pi like me.

Make the script executable and the file currentIP.txtaccesible with the command:

chmod 777 currentIP.txt script.sh

3.1 Edit the script

First of all you have to edit the script file in te repository to match your personal data:

3.1.1 Paths

You have to give the script the path to the currentIP.txt file on lines #14 and #35 Note that the user that runs the script must give write access to the file.

3.1.2 PushOver

Make an account on pushOver and create a new application to hold all the push notifications. You have to write in the script these:

  • token: line #31. Write here the app token
  • user: line #32.

Customize the message that you will reicive with the notification on line #33 changing the string la nueva IP esfor your text.

--form-string "message=la nueva IP es $IP" \

Now if you fire it with sh script.shit will send you the current IP but we want this to be done by itself when we are not at home so we are going to use crontab.

4. Automating the script

To make your linux box to check IP changes you can use crontab. crontab -e

You get the file where you cron jobs are listed. Add a new line at the end of the file like this: */30 * * * * sh /home/pi/script.sh

It will run the script.shat hour:30 minutes and at o’clock hours: 12:00-12:30-13:00-13:30—–and so on.

If the IP changes you will reicive the notification with the new IP, if not it will wait for another 30 minutes.

If you want to know more about crontab to setup another configuration, please refer to:

5. Me

I’m @rafarq on twitter. I would appreciate to know about you If you find this script useful for you.

Proyecto fin de grado. Introducción.

Model

Esta semana he defendido, por fin, mi proyecto fin de grado de Ingeniería de edificación en la ETSIE de Granada. El título del proyecto es: El diseño paramétrico aplicado a las soluciones y detalles constructivos.

Los que me conocéis podéis imaginaros lo que he disfrutado con este proyecto.

En estos momentos las herramientas mas importantes del mercado son las siguientes:

  • Bentley Systems Incorporated:
    • Plataforma: Microstation
    • Programa: GenerativeComponentsTM
    • Scripting: C#
  • Robert McNeel and Associates:
    • Plataforma: Rhinoceros 3D
    • Programa: GrassHopper
    • Scripting: RhinoScript, Python
  • Autodesk:
    • Plataforma: Revit, Vasari
    • Programa: Dynamo
    • Scripting: Python
  • Gehry Technologies:
    • Plataforma: Digital Project (CATIA)
    • Programa: Digital Project
    • Scripting: Visual Basic for Applications (VBA)

Mi trayectoria profesional me ha llevado a conocer profundamente el manejo de GC (GenerativeComponents™), y aunque últimamente me atrae mucho Dynamo, para este trabajo me decidí a usar GC por su potencia y versatilidad.

El objetivo de mi proyecto ha sido demostrar que el diseño paramétrico puede usarse para desarrollar detalles constructivos que sean fácilmente adaptables y que lleven programada la normativa que le es de aplicación para que todas las soluciones sean válidas.

En este caso, mi tutor, el prof. Ildefonso Naverrete y yo, decidimos que el detalle más significativo era el encuentro de un forjado, viga y pilar.

Pilar_forjado2014925-terminado reducido

 

Para abordar este detalle se dividió en componentes para ir reutilizando el código y optimizar el tiempo usado para el desarrollo del modelo.

Presentacion PFG.010

El componente mínimo del dibujo es la barra corrugada que se usó para crear los componentes de la viga/zuncho, el mallazo y la vigueta. Estos cuatro componentes junto con la bovedilla se unieron para formar el detalle constructivo final.

Las variables que se dejaron abiertas en el detalle para que fuera sencillo adaptarlo a las situaciones concretas de cada proyecto son las siguientes:

Presentacion PFG.008En futuras entradas os explicaré desde cómo hice la portada usando GC, pasando por los componentes y el detalle final parándome a explicar los retos más importantes que hubo que superar para llegar al modelo final.

Espigón en Port Saplaya (Valencia)

Anoche di por terminado mi nuevo dibujo. Se trata de un espigón que hay en Valencia, en una zona a la que llaman Port Saplaya.

La técnica es plumilla, aunque lo he hecho en mi iPad usando la aplicación Autodesk Sketchbook Pro y un lápiz para iPad de los económicos, y por supuesto con muchísima paciencia para ir trazando línea a línea.

Espero que os guste. Hacía mucho que me apetecía volver a dibujar y este es el primer resultado.