package nerdydog.domoHomeProd;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import nerdydog.domoHomeProd.db.ConfDatabase;
import nerdydog.domoHomeProd.db.ToDoDBAdapter;
import nerdydog.domoHomeProd.json.ParseJSON;
import nerdydog.domoHomeProd.object.Action;
import nerdydog.domoHomeProd.object.Actuator;
import nerdydog.domoHomeProd.object.Counter;
import android.app.Service;
import android.content.Intent;
import android.database.sqlite.SQLiteException;
import android.os.AsyncTask;
import android.os.IBinder;
import android.os.Looper;
import android.text.format.Time;
import android.util.Log;
public class DataService extends Service{
private static final String TAG = "DataService";
Timer timer=new Timer();
ToDoDBAdapter toDoDBAdapter;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate(){
}
@Override
public void onDestroy() {
super.onDestroy();
timer.cancel();
}
@Override
public void onStart(Intent intent, int startid) {
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.v(TAG, "tic");
Utility.updateActionTriggered(getApplicationContext());
toDoDBAdapter = new ToDoDBAdapter(getApplicationContext());
try {
toDoDBAdapter.open();
// meters
Log.i(TAG, "meters size "+ConfDatabase.aryActuatorsForMeter.size());
if (ConfDatabase.aryActuatorsForMeter.size() > 0) {
for (int i = 0; i < ConfDatabase.aryActuatorsForMeter.size(); i++) {
try{
Actuator tmpActuator = ConfDatabase.aryActuatorsForMeter.get(i);
Log.i(TAG, tmpActuator.getName());
String url = "http://"+tmpActuator.getIp()+"/?out="
+ tmpActuator.getOut()
+ "&status=1";
String value = ParseJSON.getMeterValueFromArduino(url);
if (value.length() > 0) {
Log.i(TAG, "id " + tmpActuator.getId());
Counter counter = new Counter(-1,
tmpActuator.getId(), value,
new Date());
toDoDBAdapter.insertCounter(counter);
Log.i(TAG, "insert value " + counter.getValue() + " domo_id " + counter.getDomo_id());
// remove old records
toDoDBAdapter.removeOldCounter(1);
}
}catch(Exception e){}
}
} else {
Log.i(TAG, "no meters");
}
} catch (Exception e) {
Log.i(TAG, e.toString());
if (toDoDBAdapter!=null) toDoDBAdapter.close();
}finally{
if (toDoDBAdapter!=null) toDoDBAdapter.close();
}
Log.v(TAG, "toc");
try {
toDoDBAdapter.open();
// trigger
ArrayList<Action> actions = toDoDBAdapter.getAllAction(ConfDatabase.ACTION_ENDTIME + "!=" + ConfDatabase.ACTION_STARTTIME, null, null);
Log.v(TAG, "actions size " + actions.size());
for(int j = 0; j < actions.size(); j++){
Action p_action = actions.get(j);
SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Calendar now = Calendar.getInstance();
now.add(Calendar.MINUTE, -1);
Date dateNow = new Date();
Time timeNow = new Time();
timeNow.set(dateNow.getTime());
Log.i(TAG, "=== START === date now " + dateNow.toLocaleString() + " compare to " + p_action.getStarttime().toLocaleString() + " result " + p_action.getStarttime().after(dateNow) + " scheduled " + p_action.getScheduled());
Log.i(TAG, "=== END === date now " + dateNow.toLocaleString() + " compare to " + p_action.getEndtime().toLocaleString() + " result " + p_action.getEndtime().after(dateNow) + " scheduled " + p_action.getScheduled());
if( p_action.getScheduled().equals(new String("0000000")))
{
Log.i(TAG, "single run");
if(!p_action.getStarttime().after(dateNow) && p_action.getPos() == 0){
// ON ONE TIME
Log.i(TAG, "trigger on " + p_action.getName() + " action id "+ p_action.getId());
ArrayList<Actuator> actuators = toDoDBAdapter.getAllActuators(ConfDatabase.ACTUATOR_ID + "=" + p_action.getDomo_id(), null, null);
if(actuators.size() > 0){
Actuator actuator = actuators.get(0);
String url = "http://" + actuator.getIp() + "/?out=" + actuator.getOut() + "&status=1";
ParseJSON.doRequestToArduino(url);
toDoDBAdapter.updateAction(p_action, ConfDatabase.ACTION_POS, "1");
}
}
if(!p_action.getEndtime().after(dateNow) && p_action.getPos() == 1){
// OFF ONE TIME
Log.i(TAG, "trigger off " + p_action.getName() + " action id "+ p_action.getId());
ArrayList<Actuator> actuators = toDoDBAdapter.getAllActuators(ConfDatabase.ACTUATOR_ID + "=" + p_action.getDomo_id(), null, null);
if(actuators.size() > 0){
Actuator actuator = actuators.get(0);
String url = "http://" + actuator.getIp() + "/?out=" + actuator.getOut() + "&status=0";
ParseJSON.doRequestToArduino(url);
toDoDBAdapter.updateAction(p_action, ConfDatabase.ACTION_POS, "2");
}
}
}else{
Log.i(TAG, "scheduled run");
Time t_start = new Time();
t_start.set(p_action.getStarttime().getTime());
Time t_end = new Time();
t_end.set(p_action.getEndtime().getTime());
Log.i(TAG, " start time " + t_start.toString() + " end time " + timeNow.toString() + " result " + t_start.after(timeNow) + " status " + p_action.getPos() + " s " + p_action.getScheduled() +" is a day " + Utility.is_day_to_trigger(p_action.getScheduled()));
if(!t_start.after(timeNow) && p_action.getPos() == 0 && Utility.is_day_to_trigger(p_action.getScheduled())){
// ON SCHEDULED
Log.i(TAG, "trigger on " + p_action.getName() + " action id "+ p_action.getId());
ArrayList<Actuator> actuators = toDoDBAdapter.getAllActuators(ConfDatabase.ACTUATOR_ID + "=" + p_action.getDomo_id(), null, null);
if(actuators.size() > 0){
Actuator actuator = actuators.get(0);
String url = "http://" + actuator.getIp() + "/?out=" + actuator.getOut() + "&status=1";
ParseJSON.doRequestToArduino(url);
toDoDBAdapter.updateAction(p_action, ConfDatabase.ACTION_POS, "1");
}
}
if(!t_end.after(timeNow) && p_action.getPos() == 1 && Utility.is_day_to_trigger(p_action.getScheduled())){
// OFF SCHEDULED
Log.i(TAG, "trigger off " + p_action.getName() + " action id "+ p_action.getId());
ArrayList<Actuator> actuators = toDoDBAdapter.getAllActuators(ConfDatabase.ACTUATOR_ID + "=" + p_action.getDomo_id(), null, null);
if(actuators.size() > 0){
Actuator actuator = actuators.get(0);
String url = "http://" + actuator.getIp() + "/?out=" + actuator.getOut() + "&status=0";
ParseJSON.doRequestToArduino(url);
toDoDBAdapter.updateAction(p_action, ConfDatabase.ACTION_POS, "2");
}
}
}
}
} catch (SQLiteException e) {
Log.i(TAG, e.toString());
toDoDBAdapter.close();
}finally{
toDoDBAdapter.close();
}
}
},
0,
10000);
}
}