[Модуль] Simple Calendar (app_calendar)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

[Модуль] Simple Calendar (app_calendar)

Сообщение sergejey » Ср май 23, 2012 4:49 pm

После обновления из исходников становится доступен модуль Календарь/менеджер задач.

Запустить модуль можно по ссылке http://localhost/popup/app_calendar.html (вместо localhost поставьте ваш хост, если нужно)

Модуль (как и почти всё) в режиме тестирования и будет ещё дорабатываться.

На данный момент присутствуют следующие возможности:

* Добавление событий на определённую дату
* Повторяющиеся события (ежегодные, ежемесячные, еженедельные)
* Добавление задач на определённую дату (либо без даты)
* Повторяющиеся задачи
* Возможность задать скрипт, выполняющийся при отметке задачи как завершённая

Экран списка текущих задач:

Изображение

Редактирование/добавления события или задачи:

Изображение
За это сообщение автора sergejey поблагодарил:
vitosmaxim80sad145 (Ср май 06, 2020 6:05 am)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Календарь/менеджер задач

Сообщение sergejey » Вт июн 05, 2012 9:12 pm

Небольшой скрипт, который по утрам может говорить запланированные на сегодня дела и события, используя данные из вышеописанного модуля.

Итак, делаем сценарий, называем его к примеру sayTodayAgenda

Ставим такой код:

Код: Выделить всё

if (file_exists('./modules/app_calendar/app_calendar.class.php')) {
 include_once('./modules/app_calendar/app_calendar.class.php');
 $calendar=new app_calendar();
 $calendar->usual($out);
 $events=$out['EVENTS_TODAY'];
 $say_phrase='';
 if (is_array($events)) {
  $total=count($events);
  $tasks=array();
  $cals=array();
  for($i=0;$i<$total;$i++) {
   if ($events[$i]['IS_TASK']=='1' && $events[$i]['IS_DONE']!='1') {
    $tasks[]=$events[$i]['TITLE'];
   } elseif ($events[$i]['IS_TASK']!='1') {
    $cals[]=$events[$i]['TITLE'];
   }
  }
  $total_tasks=count($tasks);
  if ($total_tasks) {
    $say_phrase.="У вас на сегодня запланированы задачи. ";
    for($i=0;$i<$total_tasks;$i++) {
     $say_phrase.=($i+1).". ".$tasks[$i].". ";
    }
  } else {
//   say("Никаких дел не запланировано.",1);
  }
  $total_cals=count($cals);  
  if ($total_cals) {
    $say_phrase.=("Сегодняшние события. ");
    for($i=0;$i<$total_cals;$i++) {
     $say_phrase.=$cals[$i].'. ';
    }
  }  
 }
 $events=$out['EVENTS_PAST'];
 if ($events[0]['TITLE']) {
  $say_phrase.=" Так же напоминаю о пропущенных задачах. ";
  $total_tasks=count($events);
  for($i=0;$i<$total_tasks;$i++) {
   $say_phrase.=($i+1).". ".$events[$i]['TITLE'].". ";
  }
 }
}

if ($say_phrase) {
 say($say_phrase,1);
}
теперь если его вызвать с помощью runScript('sayTodayAgenda'); то вы услышите запланированные дела и события из календаря на сегодня. я его поставил как часть сценария утреннего пробуждения, описанного здесь: http://smartliving.ru/Main/ScSecurityWireless

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Иван
Сообщения: 1
Зарегистрирован: Пн июл 29, 2013 7:40 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Календарь/менеджер задач

Сообщение Иван » Ср июл 31, 2013 8:13 pm

Доброго времени суток. Я сам только начинаю изучать php. А никто не пробовал настроить синхрониронизацию с ms outlook, А в идеале с icloud apple? Вот это было б по настоящему удобно. Есть идеи реализации?
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Календарь/менеджер задач

Сообщение dmw » Чт дек 05, 2013 1:04 pm

Заметил что при создании/редктировании в базу не сохраняется параметр "без конкретной даты". Причем именно не сохраняется, т.к. если вручную изменить в таблице "calendar_events" поле "IS_NODATE" с "0" на "1", то при открытии записи календаря для редактирования галка стоит на месте как и положено.
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Календарь/менеджер задач

Сообщение ErmolenkoM » Пт дек 06, 2013 1:34 pm

Клевый скрипт! И никаких селектов! Круто!

Есть идея ;-)
Сделаю напоминалку как у Невела Долгопупса из Гарри Поттера (угу, я фанат этого произведения).
Будет гореть лампочка (хоть управляемый выелючатель, хоть диод от Ардуины) когда есть не выполненные дела на сегодня. Типа видишь что что-то забыл :-)
Такая вот идейка.

Ну и раз уж заговорили...
Меняющийся потолок обеденного зала я сделал (диодная RGB лента по периметру меняющая цвет по времени)
Часы дома Уизли - показывают не время, а местонахождение членов семьи. Есть в МЖД из коробки.

Ну и порекламиную фанфик по Гарри Поттера: http://hpmor.ru/
aka msh555
Cubian на Cubietruck, Connect
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Календарь/менеджер задач

Сообщение ErmolenkoM » Вт дек 10, 2013 10:05 am

Реализовал я задумку.
Напоминалка.
Одна лампочка и 2 кнопки. Я сделал на NooLite, но можно и на чем-то другом: 1wire, arduino, ...
Итак функционал.
Лампочка горит, если на сегодня есть невыполненные дела.
Кнопка 1 проговаривает по кругу каждую задачу. В конце списка начинает с начала.
Кнопка 2 помечает задачу как выполненную.
Итого: смотрим горит лампочка, тыкаем 1 кнопку, слушаем. При желании помечаем как выполнено тыкая кнопку 2. Тыкаем опять кнопку 1. И так пока не погаснет лампочка или не пойдем делать оставшиеся дела :-).

Лампочка:
Реализовано через состояния системы. Проверка каждую минуту. Если статус 1, лампочка горит, 0 - не горит.
Class: OperationalModes/Объект: TaskExistMode/Method: Все -> -> check
Код:

Код: Выделить всё

if (file_exists('./modules/app_calendar/app_calendar.class.php')) {
 include_once('./modules/app_calendar/app_calendar.class.php');
 $calendar=new app_calendar();
 $calendar->usual($out);
 $events=$out['EVENTS_TODAY'];
 $task_exists=0;
 if (is_array($events)) {
  $total=count($events);
  $tasks=array();
  for($i=0;$i<$total;$i++) {
   if ($events[$i]['IS_TASK']=='1' && $events[$i]['IS_DONE']!='1') {
    $tasks[]=$events[$i]['TITLE'];
   }
  }
  $total_tasks=count($tasks);
  if ($total_tasks) {
    $task_exists=1;
  }
 }
 $events=$out['EVENTS_PAST']; // напоминание о пропущенных задачах
 if ($events[0]['TITLE']) {
   $task_exists=1;
 }
 if ($this->getProperty("active")!=$task_exists){
   $this->setProperty("active",$task_exists);
 }  
}
Кнопка 1
Для хранения свойств lastSelectId, lastSelectTimeStamp и lastSelectTitle используем объект TaskExistMode

Код: Выделить всё

  //Напомним о делах 
if(time()-gg("TaskExistMode.lastSelectTimeStamp")<60){ // защита от простоя больше минуты, начать с начала
 $lastSelectId = gg("TaskExistMode.lastSelectId");
}else{
 $lastSelectId = 0;
}
sg("TaskExistMode.lastSelectTimeStamp",time());
$SQLText = " SELECT e.id as ID, e.title as TITLE, e.notes as NOTES, u.name AS USERNAME";
$SQLText.= " FROM calendar_events e ";
$SQLText.= " LEFT JOIN users u ON e.USER_ID = u.ID ";
$SQLText.= " WHERE IS_TASK =1 ";
$SQLText.= " AND IS_DONE =0 ";
$SQLText.= " AND DUE < NOW( ) ";
$SQLText.= " AND e.ID > ".$lastSelectId." ";
$SQLText.= " ORDER BY e.ID ";
$SQLText.= " LIMIT 1 ";
$SQLResult = SQLSelectOne($SQLText);
if ($SQLResult['ID']){
  $sayText = "";
  if($SQLResult['USERNAME']){
    $sayText .= $SQLResult['USERNAME']." ";
  }
  $sayText .= $SQLResult['TITLE'].". ".$SQLResult['NOTES'];
  sg("TaskExistMode.lastSelectId",$SQLResult['ID']);
  sg("TaskExistMode.lastSelectTitle",$SQLResult['TITLE']);
}else{
  if($lastSelectId){
    $sayText = "Конец списка";
    sg("TaskExistMode.lastSelectId",0);
  }else{
    $sayText = "Дел больше нет";
  } 
}
say($sayText,1);
Кнопка 2
Помечаем последнюю проговоренную задачу как выполненную.

Код: Выделить всё

  //Помечаем последнюю проговоренную задачу как выполненную.
if(time()-gg("TaskExistMode.lastSelectTimeStamp")<60){
  include_once('./modules/app_calendar/app_calendar.class.php');
  $calendar=new app_calendar();
  $calendar->task_done(gg("TaskExistMode.lastSelectId"));
  say("Задача ".gg("TaskExistMode.lastSelectTitle")." выполнена.",1);
}
callMethod("TaskExistMode.check"); 
За это сообщение автора ErmolenkoM поблагодарили (всего 3):
mirsum (Чт янв 29, 2015 5:56 pm) • shemnik69 (Пт янв 30, 2015 12:10 pm) • vitosmaxim80sad145 (Ср май 06, 2020 6:05 am)
Рейтинг: 3.49%
aka msh555
Cubian на Cubietruck, Connect
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Календарь/менеджер задач

Сообщение Ivan » Вс май 04, 2014 10:25 am

Сделайте пожалуйста просмотр всех событий для редактирования, а также категорий
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
LocalBrownie
Сообщения: 66
Зарегистрирован: Пт июл 11, 2014 11:08 am
Благодарил (а): 16 раз
Поблагодарили: 9 раз

Re: Календарь/менеджер задач

Сообщение LocalBrownie » Пн авг 18, 2014 11:09 am

Подскажите пожалуйста, как можно (если это можно) добавлять события/задачи в календарь из скрипта?
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Календарь/менеджер задач

Сообщение sergejey » Пн авг 25, 2014 12:54 pm

LocalBrownie писал(а):Подскажите пожалуйста, как можно (если это можно) добавлять события/задачи в календарь из скрипта?
Новая задача:

Код: Выделить всё

$rec=array();
$rec['TITLE']="Название"
$rec['NOTES']="Заметки к задаче"
$rec['DUE']=date('Y-m-d'); // срок выполнения
$rec['IS_TASK']=1;
$rec['ADDED']=date('Y-m-d H:i:s');
$rec['ID']=SQLInsert('calendar_events', $rec); 
Новое событие:

Код: Выделить всё

$rec=array();
$rec['TITLE']="Название"
$rec['NOTES']="Заметки к событию"
$rec['DUE']=date('Y-m-d'); // дата события
$rec['IS_REPEATING']=1; // повторяющееся событие
$rec['REPEAT_TYPE']=1; // повторять ежегодно (1), ежемесячно (2), еженедельно (3)
$rec['IS_TASK']=0;
$rec['ADDED']=date('Y-m-d H:i:s');
$rec['ID']=SQLInsert('calendar_events', $rec); 
За это сообщение автора sergejey поблагодарили (всего 8):
dmw (Пн авг 25, 2014 1:34 pm) • Dark_Veter (Пн авг 25, 2014 8:06 pm) • LocalBrownie (Вт авг 26, 2014 5:27 pm) • ErmolenkoM (Пт окт 17, 2014 12:16 pm) • shemnik69 (Пт янв 30, 2015 12:11 pm) • C_3AXAPOB (Пт окт 07, 2016 12:23 am) • London (Вт дек 03, 2019 4:04 pm) • IrisKo (Сб фев 08, 2020 12:38 am)
Рейтинг: 9.3%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
LocalBrownie
Сообщения: 66
Зарегистрирован: Пт июл 11, 2014 11:08 am
Благодарил (а): 16 раз
Поблагодарили: 9 раз

Re: Календарь/менеджер задач

Сообщение LocalBrownie » Пт дек 26, 2014 12:25 pm

Я вот заметил недавно, что назначить выполнение скрипта можно не только на задачу, а и на событие. При этом настройки сохраняются даже после перезагрузки мажордома. Понятно, что скрипт не выполняется, потому как событие - это не задача и "выполнить событие" трудно. Но имя скрипта как-бы есть, так что можно превратить небольшой баг в интересную фичу.
Есть ли возможность вручную запустить скрипт, привязанный к событию, допустим при проговаривании в sayTodayAgenda?

Идея такая - есть праздники с выходными, которые чётко привязаны к дате - например НГ, Рождество, 8-марта и т.д. Понятно, что попадают они чаще всего на будние дни.
Т.е. будний становится выходным, но алисе про это как-бы не известно, и она честно, дабы не обидеть хозяев утром 1-го января, в четверг, начнёт будить всех в 7 утра и выгонять на работу.
С чем моё тело будет явно не согласно! ;)
А вот если-б на 31-е, ну или на 1-е (в зависимости от реализации) прописать событие "Новый год!" и пнуть небольшой скриптец на пару строчек, например:

sg('ThisComputer.Holiday', 1);
sg('ThisComputer.HolidayText', "Новый Год");

То уже отталкиваясь от этих переменных можно спокойно заставить систему правильно среагировать на "случайный выходной", и обойтись без человеческих и "технических" жертв! :)
Ответить