Musich
- fixed database - added music class
This commit is contained in:
@@ -4,10 +4,15 @@ import device.*;
|
|||||||
import device.fitbitdata.HeartRate;
|
import device.fitbitdata.HeartRate;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import support.Musich;
|
||||||
import support.database.Database;
|
import support.database.Database;
|
||||||
import support.database.LocalDB;
|
import support.database.LocalDB;
|
||||||
import support.database.RemoteDB;
|
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.Calendar;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -17,6 +22,7 @@ import java.util.regex.Pattern;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by 20015159 on 28/08/2018.
|
* Created by 20015159 on 28/08/2018.
|
||||||
|
* Ci si puo' interfacciare con l'assistente tramite Telegram o dal sito di ngrok.
|
||||||
*/
|
*/
|
||||||
public class Main {
|
public class Main {
|
||||||
|
|
||||||
@@ -40,11 +46,29 @@ public class Main {
|
|||||||
* <li>hueUser</li>
|
* <li>hueUser</li>
|
||||||
* <li>sensorNode</li>
|
* <li>sensorNode</li>
|
||||||
* <li>sensorLog</li>
|
* <li>sensorLog</li>
|
||||||
* <li>remoteDb</li>
|
* <li>remoteDbUser</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
* @param args
|
* @param args
|
||||||
*/
|
*/
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
List<String> 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<String, String> arguments = getArgsMap(args);
|
Map<String, String> arguments = getArgsMap(args);
|
||||||
|
|
||||||
// list of arguments to use in the classes
|
// list of arguments to use in the classes
|
||||||
@@ -52,7 +76,7 @@ public class Main {
|
|||||||
String hueUser = arguments.get("hueUser");
|
String hueUser = arguments.get("hueUser");
|
||||||
Integer sensorLog = getInt(arguments.get("sensorLog"));
|
Integer sensorLog = getInt(arguments.get("sensorLog"));
|
||||||
Integer sensorNode = getInt(arguments.get("sensorNode"));
|
Integer sensorNode = getInt(arguments.get("sensorNode"));
|
||||||
String remoteDbUrl = arguments.get("remoteDb");
|
String remoteDbUser = arguments.get("remoteDbUser");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
LOG.info("Connessione alle Philips Hue...");
|
LOG.info("Connessione alle Philips Hue...");
|
||||||
@@ -74,12 +98,11 @@ public class Main {
|
|||||||
fitbit = new Fitbit();
|
fitbit = new Fitbit();
|
||||||
|
|
||||||
LOG.info("Connessione al database...");
|
LOG.info("Connessione al database...");
|
||||||
database = remoteDbUrl==null? new LocalDB():new RemoteDB(remoteDbUrl);
|
database = remoteDbUser==null? new LocalDB():new RemoteDB(remoteDbUser);
|
||||||
|
|
||||||
startInsertData();
|
startInsertData();
|
||||||
startCheckSteps();
|
startCheckSteps();
|
||||||
startHueControlledByHeartBeat();
|
startHueControlledByHeartBeat();
|
||||||
startWarnIfHeartBeatDrops();
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOG.warn("Non e' stato possibile collegarsi al fitbit");
|
LOG.warn("Non e' stato possibile collegarsi al fitbit");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -117,6 +140,8 @@ public class Main {
|
|||||||
lights.increaseBrightness(params.get("intensity").getAsInt());
|
lights.increaseBrightness(params.get("intensity").getAsInt());
|
||||||
return null;
|
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");
|
LOG.info("Starting Webhook");
|
||||||
df.startServer();
|
df.startServer();
|
||||||
@@ -209,14 +234,7 @@ public class Main {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO AUTO:{C} Gestione luci a seconda del battito cardiaco
|
|
||||||
private static void startHueControlledByHeartBeat() {
|
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");
|
LOG.info("Starting thread lights for heartbeat");
|
||||||
final int minutes = 30;
|
final int minutes = 30;
|
||||||
final int delta = 15;
|
final int delta = 15;
|
||||||
@@ -227,7 +245,7 @@ public class Main {
|
|||||||
int count=0;
|
int count=0;
|
||||||
double average;
|
double average;
|
||||||
|
|
||||||
List<HeartRate> heartRate = database.getHeartDataOfLast(15); //TODO da discriminare l'ora (mi sa che c'è da mettere mano al db
|
List<HeartRate> heartRate = database.getHeartDataOfLast(15);
|
||||||
Calendar now = Calendar.getInstance();
|
Calendar now = Calendar.getInstance();
|
||||||
Calendar past = Calendar.getInstance();
|
Calendar past = Calendar.getInstance();
|
||||||
now.setTimeInMillis(System.currentTimeMillis());
|
now.setTimeInMillis(System.currentTimeMillis());
|
||||||
@@ -241,6 +259,7 @@ public class Main {
|
|||||||
}
|
}
|
||||||
average = count!=0? sum/count:0;
|
average = count!=0? sum/count:0;
|
||||||
|
|
||||||
|
//TODO impostare azioni anche di {E}
|
||||||
double rateNow = fitbit.getHeartRate(minutes);
|
double rateNow = fitbit.getHeartRate(minutes);
|
||||||
if ((rateNow-average) >= delta )
|
if ((rateNow-average) >= delta )
|
||||||
lights.decreaseBrightness();
|
lights.decreaseBrightness();
|
||||||
@@ -263,23 +282,14 @@ public class Main {
|
|||||||
// (secondo me si puo' evitare)
|
// (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
|
XXX Gestione DB in modo che si aggiorni ogni ora
|
||||||
/B/ Gestione luci in modo che la luminosità sia sempre la stessa
|
/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
|
/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}
|
TODO USER-INTERACTION {A}, {C}
|
||||||
|
|
||||||
|
|||||||
48
src/main/java/support/Musich.java
Normal file
48
src/main/java/support/Musich.java
Normal file
@@ -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<String> getVideosId(String search) {
|
||||||
|
final int maxResult = 5;
|
||||||
|
try {
|
||||||
|
search = URLEncoder.encode(search, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, ?> response = Rest.get(API_URL +
|
||||||
|
"maxResults=" + maxResult +
|
||||||
|
"&part=snippet" +
|
||||||
|
"&type=video" +
|
||||||
|
"&q=" + search +
|
||||||
|
"&key=" + KEY);
|
||||||
|
|
||||||
|
List<Map<String, ?>> items = (List<Map<String, ?>>)response.get("items");
|
||||||
|
List<String> videosId = new ArrayList<>(maxResult);
|
||||||
|
|
||||||
|
for(Map<String, ?> obj: items) {
|
||||||
|
Map<String, String> id = (Map<String, String>)obj.get("id");
|
||||||
|
videosId.add(id.get("videoId"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return videosId;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -85,7 +85,7 @@ public interface Database {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return getThreadStartingEach(runnable, "update-hourly-data", 1);
|
return getThreadStartingEach(runnable, "update-hourly-data", 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -54,17 +54,35 @@ public class LocalDB implements Database {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean updateHeart(long dateMilliSec, double heartRate) {
|
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
|
@Override
|
||||||
public boolean updateSleep(long dateStartSleep, long duration) {
|
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
|
@Override
|
||||||
public boolean updateSteps(long dateMilliSec, long steps) {
|
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
|
@Override
|
||||||
@@ -75,7 +93,7 @@ public class LocalDB implements Database {
|
|||||||
// calendar.setTimeInMillis(System.currentTimeMillis());
|
// calendar.setTimeInMillis(System.currentTimeMillis());
|
||||||
// calendar.add(Calendar.DATE, -dayToSubtract);
|
// calendar.add(Calendar.DATE, -dayToSubtract);
|
||||||
// long time = calendar.getTimeInMillis();
|
// 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) + "'");
|
ResultSet result = conn.createStatement().executeQuery("SELECT * FROM heart WHERE day>='" + new Timestamp(time) + "'");
|
||||||
List<HeartRate> list = new LinkedList<>();
|
List<HeartRate> list = new LinkedList<>();
|
||||||
|
|||||||
@@ -7,8 +7,12 @@ import java.util.List;
|
|||||||
// TODO implement
|
// TODO implement
|
||||||
public class RemoteDB implements Database {
|
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
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user