PoC led web with Vaadin 8

Breves inicios

Esta es una versión vieja que programe en el 2016 inspirado en un post de security by default (post que sin el no estuviera aquí se los puedo jurar)

Donde crean un huerto domótico para el monitoreo de tomates, pimientos con gráficas en tiempo real, y la Ayuda de Javier Salcedo (que detesta que lo etiqueten) que me ayudo a entender el patrón observer/observable (bueno no soy muy astuto tampoco) para notificar a todas las UI ligadas a la session junto con websockets aka push.

Luego de un tiempo le di una mejora la UI con responsive web design , aquí el circuito cambio un poco, dado que use un triac bt136 mas un octoacloplador moc3021

ArduinoVersionResponsive

Algo importante a decir es que lo anterior tiene una limitación y es la siguiente: que el arduino debe estar conectado a la pc por usb si o si, cosa que se resuelve por medio de una shield con conexión a wifi (conexión inalambrica), o un ESP8266, el igualmente el codigo entre el arduino y vaadin cambiaría usando solicitudes http aka HTTPrequest, a un servidor asíncrono.

  • NRF24L01 + PA

714fPzclFJL. SL1200
  • ESP8266

esp8266

Yo habia pensado en la NRF24L01 + PA de verdad que le veo mucha mas ventaja con respecto al Esp8266 ESP-01S y es porque se le puede colocar una antena externa, en la imagen se ve una omnidireccional de 5 dbi pareciera, pero no se especifica, e igual es lo de menos, al ponerle una antena direccional grillada de 25dbi mmm, algo me dice que si se notaria diferencia XD, seria así como esta? XD, mi vieja configuración que tenia en la madre Venezuela, aunque con lo que se ahora la NRF24L01 se usa para otros motivos, junto a otra igual, programada receiver-transeiver

Antena grillada de 24dbi direccional

antenaTechoPradera

Son mas o menos a si en la vida real, bastante pequeñas ambas

WhatsApp%2BImage%2B2019 06 08%2Bat%2B17.41.08
WhatsApp%2BImage%2B2019 06 08%2Bat%2B17.41.07

Tocara esperar una semana mas quizás hasta que llegue el resto. XD una triste cara de drama

risaCaries

Continuara…​

Volviendo aquí, el día 6/15/2019 un día común y corriente, típico.

IMG 20190615 122144

nada mal no? son algo largas, bien, quitamos el atmega328p con cuidado mejor, una pinza antiestatica.

quitarAmega328p

Este es el pinout que estoy usando

arduino esp01 esp8266 esquema

Una imagen de como tengo la conexión final

conexionCompletaArduinoMOdulo

Configuraremos ahora, la velocidad a 9600 baudios, por defecto viene a 115200, nos conectamos a esa velocidad, con NL/CR(nueva linea, y retorno de carro), solo le quitaremos la tensión de 3v, para introducir un comando, se ve la salida de la consola algunos caracteres raros.

Introducimos este comando para dejarlo permanente.

AT+UART_DEF=9600,8,1,0,0
configurandoBautRatea9600

Con este comando vemos la version

AT+GMR
AT%252BGMR

Tecleamos AT+CWMODE? para ver en que modo estamos lo mas seguro el dos. Con este comando lo configuramos como modo estación y ap.

AT+CWMODE=3

Vamos a escanear redes disponibles

AT+CWLAP
redesDisponibles

Nos conectamos con

AT+CWJAP="Choristar_5F52","AquiNoEntraNiElDiablo"

Al conectar debería de salir en la consola del IDE…​

WIFI CONNECTED
WIFI GOT IP

OK

Configuramos para aceptar multiples conexiones con

AT+CIPMUX=1

Creamos un servidor por el puerto 8080

AT+CIPSERVER=1,8080

Ahora introducimos ~ipconfig/ifconfig~ para obtener la dirección ip del modulo

spiderMente

No me digan que se creyeron semejante cyberChorrada ? en realidad es:.

AT+CIFSR
direccionIpModulo

Con este código java podemos hacer un HttpRequest con post, usando open jdk-11, esta es la dirección ip

Probando HttpClient nativa de la jdk-11

private static final String IP_ESP8266 = "http://192.168.1.45:8080/";

public void hacerPostESP8266() {
    final String pin = JOptionPane.showInputDialog(null,"Introduce On o off");
        if(nonNull(pin)) {
            try {
                final HttpResponse<String> req = HttpClient.newBuilder()
                           .build()
                           .send(HttpRequest (1)
                                    .newBuilder(URI.create(IP_ESP8266 + pin.replaceAll("[\\,\\s+\\.0-9]+","")))
                                    .header("Content-Type", "text/plain; charset=UTF-8")
                                    .POST(HttpRequest.BodyPublishers.ofString(""))
                                    .build(), HttpResponse.BodyHandlers.ofString());
                    LOGGER.info("Estatus code: " + req.statusCode());
                } catch (IOException e) {
                    LOGGER.severe(e.toString());
                } catch (InterruptedException e) {
                    LOGGER.severe(e.toString());
                }
        } else {
                JOptionPane.showMessageDialog(null,"Valor invalido");
        }
}
1 Este método es síncrono, pero como es una operación tan rápida pues no importaria mucho, existe el async.

Por lo que veo el modulo a veces cuelga sin ninguna razón por lo tanto cuando eso pase, tocara setear los comando AT para servidor multiconexión, y activar la ip con puerto así, es bull shit pero es lo que hay mientras.

AT+CIPMUX=1

AT+CIPSERVER=1,8080

Tocara mejorar esto, porque el modulo ESP8266 se puede flashear con un firmware para programarlo con el IDE de arduino gracias a un ruso Ivan Grokhotkov que encendió la chispa, aquí está el repo ESP8266 repo

Update

Otra manera de ejecutar una request

Este ejemplo es con project reactor, podria dar una manera de como hacer una request asíncrona y de paso usando jbang igualemente con la HttpClient nativa.

  • Se tiene 2 Url para obtener la ip publica, seria lo mismo pero cambiandola a local y modificando un poco para hacer POST,

  • Entonces si una url falla por alguna razón, ejecutamos un fallback


En el siguiente enlace, flashee mi ESP8266