diff --git a/src/main/java/main/Main.java b/src/main/java/main/Main.java index 6b94d1d..99bc8c8 100644 --- a/src/main/java/main/Main.java +++ b/src/main/java/main/Main.java @@ -4,10 +4,15 @@ import device.*; import device.fitbitdata.HeartRate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import support.Musich; import support.database.Database; import support.database.LocalDB; import support.database.RemoteDB; +import java.awt.*; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Calendar; import java.util.HashMap; import java.util.List; @@ -17,6 +22,7 @@ import java.util.regex.Pattern; /** * Created by 20015159 on 28/08/2018. + * Ci si puo' interfacciare con l'assistente tramite Telegram o dal sito di ngrok. */ public class Main { @@ -40,11 +46,29 @@ public class Main { *
  • hueUser
  • *
  • sensorNode
  • *
  • sensorLog
  • - *
  • remoteDb
  • + *
  • remoteDbUser
  • * * @param args */ public static void main(String[] args) { + List urls = Musich.getVideosId("musica rilassante"); + + try { + String url = Musich.SEARCH_URL + urls.get(0); + System.out.println(url); + Process p = Runtime.getRuntime().exec(new String[] {"start chrome", "\"" + url + "\"" }); + + p.wait( 10 * 1000); // 10 sec + + p.destroy(); + + } catch (Exception e) { + e.printStackTrace(); + } + + if(true) + return; + Map arguments = getArgsMap(args); // list of arguments to use in the classes @@ -52,7 +76,7 @@ public class Main { String hueUser = arguments.get("hueUser"); Integer sensorLog = getInt(arguments.get("sensorLog")); Integer sensorNode = getInt(arguments.get("sensorNode")); - String remoteDbUrl = arguments.get("remoteDb"); + String remoteDbUser = arguments.get("remoteDbUser"); try { LOG.info("Connessione alle Philips Hue..."); @@ -74,12 +98,11 @@ public class Main { fitbit = new Fitbit(); LOG.info("Connessione al database..."); - database = remoteDbUrl==null? new LocalDB():new RemoteDB(remoteDbUrl); + database = remoteDbUser==null? new LocalDB():new RemoteDB(remoteDbUser); startInsertData(); startCheckSteps(); startHueControlledByHeartBeat(); - startWarnIfHeartBeatDrops(); } catch (Exception e) { LOG.warn("Non e' stato possibile collegarsi al fitbit"); e.printStackTrace(); @@ -117,6 +140,8 @@ public class Main { lights.increaseBrightness(params.get("intensity").getAsInt()); return null; }); + //TODO aggiungere una azione che faccia in modo di richiedere dei dati in particolare + //TODO aggiungere una azione su DialogFlow che riconosca di impostare una playlist (Rilassante, Antica...) LOG.info("Starting Webhook"); df.startServer(); @@ -209,14 +234,7 @@ public class Main { */ } - // TODO AUTO:{C} Gestione luci a seconda del battito cardiaco private static void startHueControlledByHeartBeat() { - // ad ogni X minuti: - // prendere la media di battiti di quell'ora dal DB - // prendere dal fitbit i valori degli ultimi X minuti - // controllare che non differiscano di un valore Delta - // se differiscono di almeno Delta modificare le luci abbassandole o alzandole secondo le esigenze - // (nel caso modificare anche il colore e renderlo meno intenso o di piu) LOG.info("Starting thread lights for heartbeat"); final int minutes = 30; final int delta = 15; @@ -227,7 +245,7 @@ public class Main { int count=0; double average; - List heartRate = database.getHeartDataOfLast(15); //TODO da discriminare l'ora (mi sa che c'è da mettere mano al db + List heartRate = database.getHeartDataOfLast(15); Calendar now = Calendar.getInstance(); Calendar past = Calendar.getInstance(); now.setTimeInMillis(System.currentTimeMillis()); @@ -241,6 +259,7 @@ public class Main { } average = count!=0? sum/count:0; + //TODO impostare azioni anche di {E} double rateNow = fitbit.getHeartRate(minutes); if ((rateNow-average) >= delta ) lights.decreaseBrightness(); @@ -263,23 +282,14 @@ public class Main { // (secondo me si puo' evitare) } - // TODO AUTO:{E} Se i battiti sono troppo bassi/alti avvisare il tizio - private static void startWarnIfHeartBeatDrops() { - // controllare gli ultimi X minuti del fitbit - // tenersi una lista degli ultimi Y risultati - // controllare l'andamento dei battiti - // se troppo bassi o alti secondo un Delta, allora inviare un messaggio (DialogFlow?) - // (e' possibile integrarlo con la gestione delle luci tramite il battito) - } - /* - TODO AUTOMATIC: {B}, {C}, {D}, {E} + TODO AUTOMATIC: {B}, {D} XXX Gestione DB in modo che si aggiorni ogni ora /B/ Gestione luci in modo che la luminosità sia sempre la stessa - /C/ Gestione luci a seconda del battito cardiaco + XXX Gestione luci a seconda del battito cardiaco /D/ Ad una certa ora guarda i passi e se sono pochi dillo - /E/ Se i battiti sono troppo bassi/alti avvisare il tizio + XXX Se i battiti sono troppo bassi/alti avvisare il tizio TODO USER-INTERACTION {A}, {C} diff --git a/src/main/java/support/Musich.java b/src/main/java/support/Musich.java new file mode 100644 index 0000000..9006877 --- /dev/null +++ b/src/main/java/support/Musich.java @@ -0,0 +1,48 @@ +package support; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Created by 20015159 on 11/09/2018. + */ +public class Musich { + + public static final String SEARCH_URL = "https://www.youtube.com/watch?v="; + + private static final String API_URL = "https://www.googleapis.com/youtube/v3/search?"; + private static final String KEY = "AIzaSyCtCK0EPR3k_hEEyar0PeY5v9E9UyTX4TM"; + + public static List getVideosId(String search) { + final int maxResult = 5; + try { + search = URLEncoder.encode(search, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + Map response = Rest.get(API_URL + + "maxResults=" + maxResult + + "&part=snippet" + + "&type=video" + + "&q=" + search + + "&key=" + KEY); + + List> items = (List>)response.get("items"); + List videosId = new ArrayList<>(maxResult); + + for(Map obj: items) { + Map id = (Map)obj.get("id"); + videosId.add(id.get("videoId")); + } + + return videosId; + } + +} diff --git a/src/main/java/support/database/Database.java b/src/main/java/support/database/Database.java index a16474a..3184c56 100644 --- a/src/main/java/support/database/Database.java +++ b/src/main/java/support/database/Database.java @@ -85,7 +85,7 @@ public interface Database { } }; - return getThreadStartingEach(runnable, "update-hourly-data", 1); + return getThreadStartingEach(runnable, "update-hourly-data", 60); } /** diff --git a/src/main/java/support/database/LocalDB.java b/src/main/java/support/database/LocalDB.java index 522573f..c57c18c 100644 --- a/src/main/java/support/database/LocalDB.java +++ b/src/main/java/support/database/LocalDB.java @@ -54,17 +54,35 @@ public class LocalDB implements Database { @Override public boolean updateHeart(long dateMilliSec, double heartRate) { - return query("INSERT INTO heart (day, rate) VALUES ( ' " + new Timestamp(dateMilliSec) + " ', '" + heartRate + "')"); + Timestamp time = new Timestamp(dateMilliSec); + return query("IF NOT EXISTS (" + + "SELECT * " + + "FROM heart " + + "WHERE day = '" + time + "') " + + "BEGIN INSERT INTO heart (day, rate) VALUES ( ' " + time + " ', '" + heartRate + "') " + + "END;"); } @Override public boolean updateSleep(long dateStartSleep, long duration) { - return query("INSERT INTO sleep (sleep_start, duration) VALUES ( ' " + new Timestamp(dateStartSleep) + " ', '" + duration + "')"); + Timestamp time = new Timestamp(dateStartSleep); + return query("IF NOT EXISTS (" + + "SELECT * " + + "FROM sleep " + + "WHERE sleep_start = '" + time + "') " + + "BEGIN INSERT INTO sleep (sleep_start, duration) VALUES ( ' " + time + " ', '" + duration + "') " + + "END;"); } @Override public boolean updateSteps(long dateMilliSec, long steps) { - return query("INSERT INTO steps (day, steps) VALUES ( ' " + new Timestamp(dateMilliSec) + " ', '" + steps + "')"); + Timestamp time = new Timestamp(dateMilliSec); + return query("IF NOT EXISTS (" + + "SELECT * " + + "FROM steps " + + "WHERE day = '" + time + "') " + + "INSERT INTO steps (day, steps) VALUES ( ' " + time + " ', '" + steps + "') " + + "END;"); } @Override @@ -75,7 +93,7 @@ public class LocalDB implements Database { // calendar.setTimeInMillis(System.currentTimeMillis()); // calendar.add(Calendar.DATE, -dayToSubtract); // long time = calendar.getTimeInMillis(); - long time = System.currentTimeMillis() - (dayToSubtract * 24 * 60 * 1000); // meno 24 giorni per 60 secondi per 100 millisec + long time = System.currentTimeMillis() - (dayToSubtract * 24 * 60 * 1000); // meno 24 ore per 60 secondi per 100 millisec ResultSet result = conn.createStatement().executeQuery("SELECT * FROM heart WHERE day>='" + new Timestamp(time) + "'"); List list = new LinkedList<>(); diff --git a/src/main/java/support/database/RemoteDB.java b/src/main/java/support/database/RemoteDB.java index a89c2f5..78884e4 100644 --- a/src/main/java/support/database/RemoteDB.java +++ b/src/main/java/support/database/RemoteDB.java @@ -7,8 +7,12 @@ import java.util.List; // TODO implement public class RemoteDB implements Database { - public RemoteDB(String url) { + public static final String BASE_URL = "https://localhost:"; //TODO inserire il percorso giusto con la porta + private final String username; + + public RemoteDB(String username) { + this.username = username; } @Override