Страница 2 из 4

Re: Примеры синтаксиса кода

Добавлено: Чт июн 14, 2018 4:14 pm
kbh72
AlexL писал(а):
Чт июн 14, 2018 6:08 am
PAV писал(а):
Пт июн 27, 2014 12:28 pm
Договорились кидать на форум, а в вики я ссылку даю.
http://smartliving.ru/Main/Library
Перенаправление какое то включить бы. Половина ссылок на форуме не работает. :cry:
И правда. Может где то в шапке закрепить.

Re: Примеры синтаксиса кода

Добавлено: Ср авг 22, 2018 11:35 am
ZyaK
Здравствуйте, подскажите пожалуйста для особо одаренных, как на ПХП получить свойства объекта?
есть у меня котёл твердотопливный, который по MQTT шлёт несколько параметров
хочу создать сценарий чтоб алиса рассказывала мне эти параметры, но не понимаю как получить свойства и чтоб она их произнесла :cry:
ткните пожалуйста носом :)

Re: Примеры синтаксиса кода

Добавлено: Ср авг 22, 2018 11:49 am
skysilver
ZyaK писал(а):
Ср авг 22, 2018 11:35 am
ткните пожалуйста носом :)
https://kb.smartliving.ru/vstroennie-v- ... o-funkcii/

Re: Примеры синтаксиса кода

Добавлено: Ср авг 22, 2018 12:39 pm
ZyaK
получилось как то так, свойства берет по условиям отрабатывает, а как сделать, чтоб говорила по человечи, а то говорит " температура воды тридцати двух градусов, температура масла тридцати одного градуса"
пробовал Say("Включён твердотопливный котел, температура воды " .gg .$Water_actual." градуса", 2);
говорить начинает правильно, но "ГЫ ГЫ" тоже говорит :D

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

$obj=getObject($Котел);
$Status=getGlobal('Котел.Status');
if($Status == 1)
{
 $Water_actual=getGlobal('Котел.Water_actual');
 $Oil_actual=getGlobal('Котел.Oil_actual');
 $Pressure=getGlobal('Котел.Pressure');
 Say("Включён твердотопливный котел, температура воды " .$Water_actual." градуса, температура масла " .$Oil_actual. " градуса, давление в рессивере " .$Pressure. " атмосферы" ,  2 );
 
}
else
{
 Say("Твердотопливный котёл выключен",2); 
}

Re: Примеры синтаксиса кода

Добавлено: Ср авг 22, 2018 1:48 pm
Logrus

Re: Примеры синтаксиса кода

Добавлено: Чт авг 23, 2018 6:42 am
ZyaK
Пробую вот так, вроде более менее, воду говорит нормально тридцать градусов, а на масле говорит тридцати градусов
ну или тридцать один градус, температура масла тридцати одного градуса
:D :D :D

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

function myMorph($string, $ch1, $ch2, $ch3)
   {
      $ff=Array('0','1','2','3','4','5','6','7','8','9');
      if(substr($string,-2, 1)==1 AND strlen($string)>1) $ry=array("0 $ch3","1 $ch3","2 $ch3","3 $ch3" ,"4 $ch3","5 $ch3","6 $ch3","7 $ch3","8 $ch3","9 $ch3");
      else $ry=array("0 $ch3","1 $ch1","2 $ch2","3 $ch2","4 $ch2","5 $ch3","6 $ch3","7 $ch3","8 $ch3","9 $ch3");
      $string1=substr($string,0,-1).str_replace($ff, $ry, substr($string,-1,1));

      return $string1;
}
Say("температура ". "воды ".  myMorph($Water_actual, "градус", "градуса", "градусов"). ", температура ". "масла ". myMorph($Oil_actual, "градус", "градуса", "градусов"),2);


Re: Примеры синтаксиса кода

Добавлено: Пт авг 24, 2018 9:02 pm
Logrus
тридцати градусов
а на входе в текст ту спич 30 градусов
это проблема речевого движка, и где как по разному с решением, можно и до придумать

Re: Примеры синтаксиса кода

Добавлено: Вс авг 26, 2018 12:13 am
xor
вариант морфа покороче

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

/**
 * Склоняем словоформу
 * @ author runcore
 * morph(1000,'градус','градуса','градусов');
 */
function morph($n, $f1, $f2, $f5) {
	$n = abs(intval($n)) % 100;
	if ($n>10 && $n<20) return $f5;
	$n = $n % 10;
	if ($n>1 && $n<5) return $f2;
	if ($n==1) return $f1;
	return $f5;
}

Re: Примеры синтаксиса кода

Добавлено: Вс авг 26, 2018 12:54 am
fandaymon
Самое смешное, что давно уже есть встроенная функция для склонения чисел - GetNumberWord().

GetNumberWord($x,array('день','дня','дней'))
GetNumberWord($x,array('градус','градуса','градусов'))

Re: Примеры синтаксиса кода

Добавлено: Вс авг 26, 2018 12:57 am
xor
ZyaK писал(а):
Чт авг 23, 2018 6:42 am
Пробую вот так, вроде более менее, воду говорит нормально тридцать градусов, а на масле говорит тридцати градусов
ну или тридцать один градус, температура масла тридцати одного градуса
:D :D :D
Обманем движок
Вот функция, переделанная из перевода суммы в рублях в строку (использует morph) -- для целых

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

/**
 * Возвращает текст числа с параметром
 * @uses morph(...)
 * $sex - 0 male 1 female
 * use mynum2str(30,'градус','градуса','градусов',0)
 */
function mynum2str($num,$f1, $f2, $f5,$sex) {
	$nul='ноль';
	$ten=array(
		array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
		array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
	);
	$a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
	$tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
	$hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
	$unit=array( // Units
		array('' ,'' ,'',$sex),
		array($f1,$f2,$f5,$sex),
		array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
		array('миллион' ,'миллиона','миллионов' ,0),
		array('миллиард','милиарда','миллиардов',0),
	);
	////////////////////////////////
	if($num<0){ 
          $minus='минус ';
        }else{
          $minus = '';
        }
        $num = abs($num); 
        ////////////////////////////////
	list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
	$out = array();
	if (intval($rub)>0) {
		foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
			if (!intval($v)) continue;
			$uk = sizeof($unit)-$uk-1; // unit key
			$gender = $unit[$uk][3];
			list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
			// mega-logic
			$out[] = $hundred[$i1]; # 1xx-9xx
			if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
			else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
			// units without rub & kop
			if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
		} //foreach
	}
	else $out[] = $nul;
	$out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
	//$out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
	return $minus.trim(preg_replace('/ {2,}/', ' ', join(' ',$out))); ///////////////////////////////
}
mynum2str(23,'градус','градуса','градусов',0) -> строка двадцать три градуса
////////////////////
обновил для работы с отрицательными числами