[Настройка] Умные шаблоны поведения

Описание настройки чего либо

Модераторы: immortal, newz20

Ответить
T-REX-XP
Сообщения: 174
Зарегистрирован: Вт июн 16, 2015 10:54 pm
Благодарил (а): 16 раз
Поблагодарили: 32 раза

[Настройка] Умные шаблоны поведения

Сообщение T-REX-XP » Чт май 12, 2016 10:56 am

Представляю вашему вниманию свои наработки по усовершенствованию/расширению функционала «Шаблоны поведения»
WARNING: Я, не претендую на звание эксперта в PHP, или Majordomo, примеры моего кода могут содержать/содержат ошибки, и я с радостью приму ваши конструктивные замечания. А также все это может быть давно уже решено, а я просто изобретаю очередной велосипед)))
Суть: вместо создания статических шаблонов поведения, сделать универсальные, которые будут работать для почти любого пользователя.
Пример статических шаблонов:
• Какая температура в кухне
• Какая влажность в зале
• Какая температура в спальне
• Какая влажность в спальне
В обычном случае, нужно писать почти один и тот же скрипт для каждого шаблона.
Умный шаблон
Логика работы такого шаблона может быть следующей:
Изображение
Пример реализации умного шаблона:
Запрос пользователя:
Какая температура в кухне
Логика работы скрипта:
1. Получить именительный падеж/основную форму слова отвечающего за расположение/комнату “кухне”
2. Проверить есть ли такое расположение у нас в системе
3. Если есть такое расположение, запросить данные об устройствах с таким расположением.
4. Если есть устройства с таким расположением, то получить среднее значение температуры для этой комнаты если устройств несколько.
5. Ответить пользователю полученный результат.
Профит: Единожды написанный код, работает для любой из ваших комнат. С минимальным дополнением, получаем такой же скрипт для влажности))
П.С. Автор предполагает, что умные шаблоны подходят не только для описанных вариантов. Любой из форумчан, может предложить свой шаблон, и таким образом поучаствовать в развитие проекта.
Скрипт для шаблона:Показать

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

// подключаем модуль phpmorphy, у меня он находиться в папке с модулем SSDPFinder
require ("modules/SSDPFinder/phpmorphy/src/common.php");
// задаем настройки для использования модуля
$opts = array(
// storage type, follow types supported
// PHPMORPHY_STORAGE_FILE - use file operations(fread, fseek) for dictionary access, this is very slow...
// PHPMORPHY_STORAGE_SHM - load dictionary in shared memory(using shmop php extension), this is preferred mode
// PHPMORPHY_STORAGE_MEM - load dict to memory each time when phpMorphy intialized, this useful when shmop ext. not activated. Speed same as for PHPMORPHY_STORAGE_SHM type
'storage' => PHPMORPHY_STORAGE_FILE,
// Enable prediction by suffix
'predict_by_suffix' => true,
// Enable prediction by prefix
'predict_by_db' => true,
// TODO: comment this
'graminfo_as_text' => true,
);

// Path to directory where dictionaries located
$dir = str_replace("patterns", "", dirname(__FILE__)) . '/SSDPFinder/phpmorphy/dicts/utf-8';
$lang = 'ru_RU';
// Создаем экземпляр phpMorphy
try{
$morphy = new phpMorphy($dir, $lang, $opts);
}
catch(phpMorphy_Exception $e){
die('Error occured while creating phpMorphy instance: ' . PHP_EOL . $e);
}
// получаем слово из шаблона означающее комнату/расположение
$Word = mb_strtoupper($matches[1], 'UTF-8');
// используя phpmorphy, получаем основную форму слова
$base = $morphy->getBaseForm($Word); // возвращает массив значений
// если массив базовых форм не пустой, берем из него первое значение
if (isset($base)) 
$location = $base[0];
if ($location != ''){
// получаем id этого расположения
$loc_id = SQLSelectOne("SELECT id FROM locations WHERE upper( title ) LIKE '" . $location . "'");
// получаем список устройств с таким расположением
if (is_array($loc_id))
// $devices= SQLSelect("SELECT id FROM objects WHERE class_id in (36,10) AND LOCATION_ID =".$loc_id['id']);
$devices = SQLSelect("SELECT id,class_id FROM objects WHERE LOCATION_ID =" . $loc_id['id']);
if (isset($devices) && count($devices) > 0){
say("Найдено " . count($devices) . " устройств в " . $matches[1]);
$cls_ids = array();
foreach($devices as $value){
array_push($cls_ids, $value['class_id']);
}
$properties = SQLSelect("SELECT id FROM properties WHERE class_id in (" . implode(",", $cls_ids) . ") AND upper(title) LIKE 'dhtt%' OR upper(title) LIKE 'ds%' OR upper(title) LIKE 'bmpt'");
$props_id = array();
foreach($properties as $value1){
array_push($props_id, $value1['id']);
}

$values = SQLSelect("SELECT AVG(value) as Val FROM pvalues WHERE property_id in (" . implode(",", $props_id) . ")");
say("Среднее значение температуры: " . $values[0]['Val']);
}
  else{
     say("В комнате " . $location . " у вас нет датчиков температуры((");
}
}
  else{
say("У Вас нет комнаты " . $location . "");
}
 
TODO:
[*] - вынести phpmorpher в отдельный модуль
[*] - вынести Умные шаблоны в отдельный модуль

Основано на: http://phpmorphy.sourceforge.net/dokuwiki/
Вложения
1.png
screen1
1.png (6.75 КБ) 5747 просмотров
За это сообщение автора T-REX-XP поблагодарили (всего 4):
m-malva (Чт май 12, 2016 11:30 am) • Amarok (Чт май 12, 2016 7:52 pm) • BloodLover (Вт дек 13, 2016 1:09 pm) • piton_78 (Вс янв 28, 2018 11:03 am)
Рейтинг: 4.65%
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Модуль - Умные шаблоны поведения

Сообщение sergejey » Чт май 12, 2016 11:33 am

очень интересная технология с морфологией, изучу намедни и, возможно, внедрю каким-то образом в ядро системы шаблонов
За это сообщение автора sergejey поблагодарили (всего 3):
piton_78 (Вс янв 28, 2018 11:03 am) • nicolaeF (Чт янв 16, 2020 1:15 am) • u885 (Ср авг 12, 2020 7:58 pm)
Рейтинг: 3.49%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ответить