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

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

Модератор: immortal

fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

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

Сообщение fandaymon » Пн авг 17, 2020 9:21 pm

Alexander Znamensky писал(а):
Пн авг 17, 2020 6:49 pm
СпойлерПоказать
$service:
{"acl":{},"calendarList":{},"calendars":{},"channels":{},"colors":{},"events":{},"freebusy":{},"settings":{},"batchPath":"batch\/calendar\/v3","rootUrl":"https:\/\/www.googleapis.com\/","version":"v3","servicePath":"calendar\/v3\/","availableScopes":null,"resource":null,"serviceName":"calendar"}
$optParams:
{"maxResults":10,"orderBy":"startTime","singleEvents":true,"timeMin":"2020-08-17T23:59:59+03:00","timeMax":"2020-08-18T00:00:01+03:00"}
$results:
{"accessRole":"reader","description":null,"etag":"\"p324a7clon2hem0g\"","kind":"calendar#events","nextPageToken":null,"nextSyncToken":null,"summary":"Main_email_address@gmail.com","timeZone":"Europe\/Moscow","updated":"2020-08-17T14:24:25.285Z","defaultReminders":[],"items":[]}
Диапазон дат выставлен такой, что туда ничего не попадает...
Аватара пользователя
Alexander Znamensky
Сообщения: 160
Зарегистрирован: Ср дек 18, 2019 11:13 am
Откуда: Москва
Благодарил (а): 87 раз
Поблагодарили: 25 раз

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

Сообщение Alexander Znamensky » Пн авг 17, 2020 10:50 pm

fandaymon писал(а):
Пн авг 17, 2020 9:21 pm
Alexander Znamensky писал(а):
Пн авг 17, 2020 6:49 pm
СпойлерПоказать
$service:
{"acl":{},"calendarList":{},"calendars":{},"channels":{},"colors":{},"events":{},"freebusy":{},"settings":{},"batchPath":"batch\/calendar\/v3","rootUrl":"https:\/\/www.googleapis.com\/","version":"v3","servicePath":"calendar\/v3\/","availableScopes":null,"resource":null,"serviceName":"calendar"}
$optParams:
{"maxResults":10,"orderBy":"startTime","singleEvents":true,"timeMin":"2020-08-17T23:59:59+03:00","timeMax":"2020-08-18T00:00:01+03:00"}
$results:
{"accessRole":"reader","description":null,"etag":"\"p324a7clon2hem0g\"","kind":"calendar#events","nextPageToken":null,"nextSyncToken":null,"summary":"Main_email_address@gmail.com","timeZone":"Europe\/Moscow","updated":"2020-08-17T14:24:25.285Z","defaultReminders":[],"items":[]}
Диапазон дат выставлен такой, что туда ничего не попадает...
Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Raspberry Pi4 B+, образ v4_44 -> Alpha, PHP 7.3, Xiaomi Gateway 2, Tuya, Blynk, ESP8266
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

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

Сообщение fandaymon » Пн авг 17, 2020 11:11 pm

Alexander Znamensky писал(а):
Пн авг 17, 2020 10:50 pm

Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Можно попробовать не добавлять сразу в календарь, а вывести сначала на экран, чтобы посмотреть что именно считывается. + обязательно добавить проверку на существование такой записи в календаре. Чтобы не добавлять каждый раз, когда запускается сценарий
Аватара пользователя
Alexander Znamensky
Сообщения: 160
Зарегистрирован: Ср дек 18, 2019 11:13 am
Откуда: Москва
Благодарил (а): 87 раз
Поблагодарили: 25 раз

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

Сообщение Alexander Znamensky » Вт авг 18, 2020 12:05 am

fandaymon писал(а):
Пн авг 17, 2020 11:11 pm
Alexander Znamensky писал(а):
Пн авг 17, 2020 10:50 pm

Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Можно попробовать не добавлять сразу в календарь, а вывести сначала на экран, чтобы посмотреть что именно считывается. + обязательно добавить проверку на существование такой записи в календаре. Чтобы не добавлять каждый раз, когда запускается сценарий
Да. Еще надо не мало сделать. Но главное - синхронизация налажена! Пусть криво пока, без дат и с дублированием )
Спасибо Вам большое!

Я вот еще подозреваю, что косяки могут быть связаны с тем, что модуль Google Calendar использует старую библиотеку.
Например, при синхронизации контактов, выскакивает ошибка:
Error: Error calling GET https://www.googleapis.com/calendar/v3/ ... ary/events?
pageToken=***-----****: (400) Invalid Value
А праздники и основной календарь - без ошибок.
СпойлерПоказать
Screenshot 2020-08-17 23.00.05.png
Screenshot 2020-08-17 23.00.05.png (442.14 КБ) 3288 просмотров
Raspberry Pi4 B+, образ v4_44 -> Alpha, PHP 7.3, Xiaomi Gateway 2, Tuya, Blynk, ESP8266
Аватара пользователя
Alexander Znamensky
Сообщения: 160
Зарегистрирован: Ср дек 18, 2019 11:13 am
Откуда: Москва
Благодарил (а): 87 раз
Поблагодарили: 25 раз

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

Сообщение Alexander Znamensky » Вс авг 30, 2020 3:36 pm

fandaymon писал(а):
Пн авг 17, 2020 11:11 pm
Alexander Znamensky писал(а):
Пн авг 17, 2020 10:50 pm

Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Можно попробовать не добавлять сразу в календарь, а вывести сначала на экран, чтобы посмотреть что именно считывается. + обязательно добавить проверку на существование такой записи в календаре. Чтобы не добавлять каждый раз, когда запускается сценарий
Добрый день, уважаемый Fandaymon! Спасибо Вам за помощь, советы и разъяснения. Все сделал, настроил, все прекрасно работает!

Для тех, кто, как и я, не очень разбирается в тонкостях php, как и обещал, выкладываю пошаговую инструкцию (все сделано исключительно по рекомендациям Fandaymona - моей заслуги никакой).

1. Делаем сервисный аккаунт. По ссылке https://console.cloud.google.com создаем новый проект - Create project, даем ему имя, создаем Service account, называем его (например, Google synchroinisation), Role – owner, DONE. Видим созданный сервисный e-mail.
СпойлерПоказать
google.png
google.png (414.67 КБ) 3176 просмотров
Service account.png
Service account.png (450.2 КБ) 3196 просмотров
Проваливаемся в сервисный e-mail (его нужно будет тоже скопировать и потом добавить в скрипт), Add key – добавляем ключ JSON. Json (это файл) сохраняем, например, в /home/pi/. Это позволит авторизоваться в Гугле используя файл, вместо временных токенов.
СпойлерПоказать
google2.png
Service e-mail
google2.png (410.65 КБ) 3197 просмотров
СпойлерПоказать
json.png
Json
json.png (125.78 КБ) 3197 просмотров
2. Далее, идем в свой Гугл-календарь https://calendar.google.com/calendar/r?tab=rc – настройка – настройка моих календарей – разрешения на доступ. Даем доступ нашему сервисному аккаунту (в доступе для отдельных пользователей добавляем свой сервисный e-mail, который был скопирован).
СпойлерПоказать
google3.png
Google calendar
google3.png (403.75 КБ) 3197 просмотров
3. Скачиваем новую библиотеку https://github.com/googleapis/google-api-php-client. Распаковываем и копируем, например, в /var/www/html/modules/.

4. Если будете использовать скрипт Fandaymona, исправьте кавычки в строке $client->setApplicationName(‘TestCalendarAPI’); Также имейте ввиду, что модуль Ивана Google Calendar использует старую библиотеку Гугла, поэтому в скрипте делаем обращение к новой библиотеке, не перепутайте, а то будут сыпаться ошибки при выполнении скрипта.

5. Далее, правим скрипт:
- убеждаемся, что путь к нашей новой библиотеке прописан верно: require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php';
- проверяем, что json доступен для пользователя МДМ и находится в /home/pi/;
- указываем ID своего календаря – он совпадает с вашим e-mail $calendarId = 'e-mail@gmail.com';

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

//Источники:
//https://mjdm.ru/forum/viewtopic.php?f=5&t=34&start=290#p96440
//https://github.com/googleapis/google-api-php-client
//https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-php

//Скачиваем и распаковываем папку google-api-php-client с google-api-php-client
//Делаем сервисный аккаунт
//Календарь с задачами расшаривается для этого аккаунта
//Создаём json для авторизации от сервисного аккаунта
//Помещаем json на сервер (например, в /var/www/html/)
//Раз в день (или чаще) считываются задачи из гугл-календаря и записываются в МДМ

//Тут надо поставить правильный путь до файла autoload.php из новой библиотеки:
//include your composer dependencies
require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php'; 

//Здесь полный путь и название json:
//Set the path to these credentials using the GOOGLE_APPLICATION_CREDENTIALS environment variable:
putenv('GOOGLE_APPLICATION_CREDENTIALS=/home/pi/google_calendar.json');

//Tell the Google client to use your service account credentials to authenticate:
$client = new Google_Client();
$client->useApplicationDefaultCredentials();

//Set the scopes required for the API you are going to call
$client->setApplicationName('TestCalendarAPI');
$client->setScopes('https://www.googleapis.com/auth/calendar');
$service = new Google_Service_Calendar($client);

// Берём 20 задач за сегодня 
$calendarId = 'e-mail@gmail.com'; // id основного календаря совпадает с е-мейлом

$optParams = array(
  'maxResults' => 20,
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('Y-m-d',strtotime('today')) .'T00:00:00+03:00',
  'timeMax' => date('Y-m-d',strtotime('+1 day')) .'T00:00:00+03:00',
);
//удаляем записи из базы
$dateMin = date('Y-m-d',strtotime('today'));
$dateMax = date('Y-m-d',strtotime('+1 day'));
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMin."' AND CALENDAR_CATEGORY_ID=20"); 
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMax."' AND CALENDAR_CATEGORY_ID=20"); 

$results = $service->events->listEvents($calendarId, $optParams);

if (count($results->getItems()) > 0) 
	{
	foreach ($results->getItems() as $event) 
    	{
		$rec=array();
		$rec['TITLE']=$event->getSummary();
		// Notes
		$notes = $event->getDescription();
		if ($notes){
		$rec['NOTES'] = $event->getDescription();
		}
		// DUE
		$due = $event->getStart();
		if ($due) {
			if ($due['dateTime']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['dateTime'] ));
			} else if ($due['date']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid start date :".print_r($due, true);
			}
		}			  			  
    	// DONE_WHEN
		$done_when = $event->getEnd();
		if ($done_when) {
			if ($done_when['dateTime']){
			$rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['dateTime'] ));
			} else if ($done_when['date']){
		    $rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid end date :".print_r($done_when, true);
			}
		}    
		$rec['CALENDAR_CATEGORY_ID']=20;
		$rec['IS_TASK']=0; //1-Задача, 0-Событие
		// ADDED
		$added = $event->getCreated();
		if ($added) {				
		$rec['ADDED'] = date('Y-m-d H:i:s', strtotime( $added ));
		}
		$rec['ID']=SQLInsert('calendar_events', $rec); 
//    	echo json_encode($rec).'<br/>\n';
    	}
	}

include_once('./modules/app_calendar/app_calendar.class.php');
$calendar = new app_calendar();
$calendar->calendar_getholidays();
Все, наслаждаемся обновлением календаря (я сделал под себя: 20 задач в день, синхронизация событий на предстоящий день в 00-00 часов). Естественно, можно все исправить под себя.

Еще лайф-хак – у меня рабочая почта из outlook синхронизируется с Гугл-календарем используя приложение для Винды gSyncit.
Таким образом получаем утром напоминание из МДМ о всех делах на сегодня (и личные и рабочие).

Говорим спасибо Ивану и Fandaymonу.

Всем удачи!
СпойлерПоказать
script.php.rar
(1.78 КБ) 125 скачиваний
За это сообщение автора Alexander Znamensky поблагодарил:
grifindorec (Ср сен 29, 2021 11:45 am)
Рейтинг: 1.16%
Raspberry Pi4 B+, образ v4_44 -> Alpha, PHP 7.3, Xiaomi Gateway 2, Tuya, Blynk, ESP8266
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

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

Сообщение xor » Сб сен 05, 2020 7:48 pm

А только у меня праздники в подписи в календаре дважды своё название показывают?
2020-09-05_19-42-48.png
2020-09-05_19-42-48.png (100.29 КБ) 3123 просмотра
поправил 115 строку в calendar_full.inc.php

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

                 $calendar_day='<div class="calendar_hd' . $today_class . '" data-toggle="tooltip" title="' . $ev_tips .'">';
не знаю, правильно или нет, но задвоения ушли
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

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

Сообщение xor » Чт сен 10, 2020 1:59 pm

риторический вопрос:
вот модуль календарь - зачем на отдельной таблице делали? супер бы сделать на классе и объектах - задачи и события - можно крон прикрутить готовый(или свой цикл сгородить) для запуска хоть повторов, хоть одноразовых напоминалок. плюс - не только по дате, но и по времени. Просто шедулер с функцией заодно и календаря. так естественно в существующую модель ложится.
((
понятно, что так исторически сложилось, но от этого модуля хочется большего. те же закаты/рассветы, запуск скриптов по расписанию...
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

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

Сообщение fandaymon » Чт сен 10, 2020 2:18 pm

xor писал(а):
Чт сен 10, 2020 1:59 pm
риторический вопрос:
вот модуль календарь - зачем на отдельной таблице делали? супер бы сделать на классе и объектах - задачи и события - можно крон прикрутить готовый(или свой цикл сгородить) для запуска хоть повторов, хоть одноразовых напоминалок. плюс - не только по дате, но и по времени. Просто шедулер с функцией заодно и календаря. так естественно в существующую модель ложится.
((
понятно, что так исторически сложилось, но от этого модуля хочется большего. те же закаты/рассветы, запуск скриптов по расписанию...
Ммм... Чем наличие таблиц может помешать сделать всё выше перечисленное?
Отдельные таблицы гораздо удобнее и быстрее работают. Добавить задачу значит записать одну запись в 1 таблицу. А не 1 запись в таблицу объектов, 10 записей в таблицу свойств и 10 записей в таблицу текущих значений свойств
Наличие отдельной таблицы никак не отменяет того факта, что календарь и так сделан на классе и объектах....
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

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

Сообщение xor » Чт сен 10, 2020 4:27 pm

fandaymon писал(а):
Чт сен 10, 2020 2:18 pm
xor писал(а):
Чт сен 10, 2020 1:59 pm
риторический вопрос:
вот модуль календарь - зачем на отдельной таблице делали? супер бы сделать на классе и объектах - задачи и события - можно крон прикрутить готовый(или свой цикл сгородить) для запуска хоть повторов, хоть одноразовых напоминалок. плюс - не только по дате, но и по времени. Просто шедулер с функцией заодно и календаря. так естественно в существующую модель ложится.
((
понятно, что так исторически сложилось, но от этого модуля хочется большего. те же закаты/рассветы, запуск скриптов по расписанию...
Ммм... Чем наличие таблиц может помешать сделать всё выше перечисленное?
Отдельные таблицы гораздо удобнее и быстрее работают. Добавить задачу значит записать одну запись в 1 таблицу. А не 1 запись в таблицу объектов, 10 записей в таблицу свойств и 10 записей в таблицу текущих значений свойств
Наличие отдельной таблицы никак не отменяет того факта, что календарь и так сделан на классе и объектах....
отдельный инструмент(модуль календарь) при наличии универсального (мдм) должен предоставлять кучу фич, которые он делает лучше/быстрее/удобнее универсального. сейчас это не особо заметно(
жисть щас такая, что работа с интервалом в сутки уже не интересна. имхо, разумеется

пс. от умного дома я ожидаю не просто -
сегодня встретить бабушку в аэропорту
а чего-то типа -
Сегодня встретить бабушку в аэропорту в 17:30. по данным ... рейс опаздывает на 20 минут, с учётом дорожной обстановки выезжать лучше тогда-то. следующая запланированная задача - кино в 18:30 - под угрозой срыва. удалить, перенести?

не, я понимаю - модуль называется симпл, но возможность-то есть?(
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

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

Сообщение fandaymon » Чт сен 10, 2020 4:59 pm

xor писал(а):
Чт сен 10, 2020 4:27 pm
fandaymon писал(а):
Чт сен 10, 2020 2:18 pm
xor писал(а):
Чт сен 10, 2020 1:59 pm
риторический вопрос:
вот модуль календарь - зачем на отдельной таблице делали? супер бы сделать на классе и объектах - задачи и события - можно крон прикрутить готовый(или свой цикл сгородить) для запуска хоть повторов, хоть одноразовых напоминалок. плюс - не только по дате, но и по времени. Просто шедулер с функцией заодно и календаря. так естественно в существующую модель ложится.
((
понятно, что так исторически сложилось, но от этого модуля хочется большего. те же закаты/рассветы, запуск скриптов по расписанию...
Ммм... Чем наличие таблиц может помешать сделать всё выше перечисленное?
Отдельные таблицы гораздо удобнее и быстрее работают. Добавить задачу значит записать одну запись в 1 таблицу. А не 1 запись в таблицу объектов, 10 записей в таблицу свойств и 10 записей в таблицу текущих значений свойств
Наличие отдельной таблицы никак не отменяет того факта, что календарь и так сделан на классе и объектах....
отдельный инструмент(модуль календарь) при наличии универсального (мдм) должен предоставлять кучу фич, которые он делает лучше/быстрее/удобнее универсального. сейчас это не особо заметно(
жисть щас такая, что работа с интервалом в сутки уже не интересна. имхо, разумеется
Он и предоставляет - календарь. В самом МДМ календаря нет. Т.е. хранение праздников, ДР, именин и т.д., формирование на их основе собственно календаря и ежедневной сводки
Не очень понимаю о чём спор. Вам хочется каких-то фич, которых нет в simple calendar? Пишите, обсудим. Сергей вроде бы этим модулем сейчас не занимается, но могу попробовать я что-то реализовать в рамках своих не очень больших знаний php...
Ответить