Простые устройства / Simple Devices

Новые релизы, обновления и т.п.

Модератор: immortal

Аватара пользователя
SmoKE_xDDD
Сообщения: 816
Зарегистрирован: Ср апр 17, 2019 5:00 pm
Откуда: Нижний Новгород
Благодарил (а): 110 раз
Поблагодарили: 898 раз

Re: Простые устройства / Simple Devices

Сообщение SmoKE_xDDD » Сб фев 13, 2021 11:13 am

Как сделать таймеры для своих устройств?
Недавно в модуле произошли изменения и теперь таймеры работают на стороне клиента, а не на стороне сервера, а следовательно не нагружают систему лишними запросами.
Безымянный.png
Безымянный.png (6.9 КБ) 5789 просмотров
Теперь вы сами можете добавить к любому своему устройству нужный таймер и настроить его вид - делается это в шаблонах класса нужного типа устройств, на скрине например это сделано для устройства типа реле.

Итак открываем шаблон класса и в него код, если вы хотите видеть секунды, минуты, часы и их анимацию:
КодПоказать

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

<script>
function setInsertData_%.object_id%() {
	if(window.intervalUpdateDate_%.object_id%) {
		window.clearInterval(intervalUpdateDate_%.object_id%);
	}
	
	var currentTime = parseInt(new Date().getTime()/1000);
	var sID = '%.object_id%';
	var sDATA = '%.updated%';
	var diff = currentTime-sDATA;

	if(diff <= -21) {
		beautyText = '<#LANG_DEVICES_PASSED_INCORRECT_TIME#>';
		$('.updatedText-JS-' + sID).text(beautyText);
	} else if(diff >= -20 && diff <= 10) {
		//Только что
		beautyText = '<#LANG_DEVICES_PASSED_NOW#>';
		$('.updatedText-JS-' + sID).text(beautyText);
		
		window.intervalUpdateDate_%.object_id% = setInterval(function() {
			setInsertData_%.object_id%();
		}, 1000);
	} else if(diff > 10 && diff <= 600) {
		beautyText = secondsToHms(diff, '', '<#LANG_DEVICES_PASSED_NEW_MINUTES_AGO#>', '<#LANG_DEVICES_PASSED_NEW_SECONDS_AGO#>') + ' <#LANG_DEVICES_PASSED_AGO#>';
		$('.updatedText-JS-' + sID).text(beautyText);
		
		window.intervalUpdateDate_%.object_id% = setInterval(function() {
			var currentTime = parseInt(new Date().getTime()/1000);
			var diff = currentTime-sDATA;

			beautyText = secondsToHms(diff, '', '<#LANG_DEVICES_PASSED_NEW_MINUTES_AGO#>', '<#LANG_DEVICES_PASSED_NEW_SECONDS_AGO#>') + ' <#LANG_DEVICES_PASSED_AGO#>';
			$('.updatedText-JS-' + sID).text(beautyText);
			
			setInsertData_%.object_id%();
		}, 1000);
	} else if(diff > 600 && diff <= 7200) {
		beautyText = secondsToHms(diff, '<#LANG_DEVICES_PASSED_NEW_HOURS_AGO#>', '<#LANG_DEVICES_PASSED_NEW_MINUTES_AGO#>', '') + ' <#LANG_DEVICES_PASSED_AGO#>';
		$('.updatedText-JS-' + sID).text(beautyText);
		
		window.intervalUpdateDate_%.object_id% = setInterval(function() {
			var currentTime = parseInt(new Date().getTime()/1000);
			var diff = currentTime-sDATA;

			beautyText = secondsToHms(diff, '<#LANG_DEVICES_PASSED_NEW_HOURS_AGO#>', '<#LANG_DEVICES_PASSED_NEW_MINUTES_AGO#>', '') + ' <#LANG_DEVICES_PASSED_AGO#>';
			$('.updatedText-JS-' + sID).text(beautyText);
			
			setInsertData_%.object_id%();
		}, 61000);
	} else if(diff > 7200 && diff < 25200) {
		beautyText = secondsToHms(diff, '<#LANG_DEVICES_PASSED_NEW_HOURS_AGO#>', '', '') + ' <#LANG_DEVICES_PASSED_AGO#>';
		$('.updatedText-JS-' + sID).text(beautyText);
			
		window.intervalUpdateDate_%.object_id% = setInterval(function() {	
			var currentTime = parseInt(new Date().getTime()/1000);
			var diff = currentTime-sDATA;
			
			//Считаем и делаем красиво
			beautyText = secondsToHms(diff, '<#LANG_DEVICES_PASSED_NEW_HOURS_AGO#>', '', '') + ' <#LANG_DEVICES_PASSED_AGO#>';
			$('.updatedText-JS-' + sID).text(beautyText);
			
			setInsertData_%.object_id%();
		}, 1800000);
	} else {
		//Дропаем интервал
		if(window.intervalUpdateDate_%.object_id%) {
			window.clearInterval(intervalUpdateDate_%.object_id%);
		}
		
		timeConvertVar = timeConvert(sDATA);
		currentTime = new Date();

		if((currentTime.getDate() - timeConvertVar[0]) == 0) {
			beautyText = '<#LANG_DEVICES_PASSED_TODAY_IN#> ' + timeConvertVar[3] + ':' + timeConvertVar[4];
		} else if((currentTime.getDate() - timeConvertVar[0]) == 1) {
			beautyText = '<#LANG_DEVICES_PASSED_YESTERDAY_IN#> ' + timeConvertVar[3] + ':' + timeConvertVar[4] + ':' + timeConvertVar[5];
		} else {
			beautyText = timeConvertVar[0] + '.' + timeConvertVar[1] + '.' + timeConvertVar[2] + ' ' + timeConvertVar[3] + ':' + timeConvertVar[4] + ':' + timeConvertVar[5];
		}
		
		$('.updatedText-JS-' + sID).text(beautyText);
	}
}

$(function() {
	if(window.intervalUpdateDate_%.object_id%) {
		window.clearInterval(intervalUpdateDate_%.object_id%);
	}
	
	setInsertData_%.object_id%();
	window.intervalUpdateDate_%.object_id% = setInterval(function() {	
		setInsertData_%.object_id%();
	}, 1000);
}); 

</script>

<div class="device-widget motion %.alive|"offline;online"%"  onclick="var url=('<#ROOTHTML#>pChart/?p=%.object_title%'+'.status&op=log&subop=24h&minimal=1');parent.$.fancybox.open({ src: url, type: 'iframe',iframe:{preload:false} });return false;">
    <div class="device-icon motion %.status|"off;on"%"></div>
    <div class="device-header">%.object_description%</div>
    <!---<div class="device-details">%.updatedText%</div>--->
    <div class="updatedText-JS-%.object_id%" style="font-size: 11px;">...</div>
</div>
В коде вы можете найти строчки с:

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

beautyText = secondsToHms(diff, '<#LANG_DEVICES_PASSED_NEW_HOURS_AGO#>', '', '') + ' <#LANG_DEVICES_PASSED_AGO#>';
В данном случае будут выводиться только часы и слово "назад", пример: 4 час. назад.
Если указать вот так:

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

beautyText = secondsToHms(diff, '<#LANG_DEVICES_PASSED_NEW_HOURS_AGO#>', '<#LANG_DEVICES_PASSED_NEW_MINUTES_AGO#>', '<#LANG_DEVICES_PASSED_NEW_SECONDS_AGO#>') + ' <#LANG_DEVICES_PASSED_AGO#>';
Будут выводиться и часы и минуты и секунды.

Если анимация не нужна, а нужен только вывод даты в формате:
Вчера в 15:00 или Сегодня в 13:00 без анимации и таймеров - используем такой код:
КодПоказать

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

<script>
$(function() {
	sID = '%.object_id%';
	sDATA = '%.updated%';
	
	timeConvertVar = timeConvert(sDATA);
	currentTime = new Date();

	if((currentTime.getDate() - timeConvertVar[0]) == 0) {
		beautyText = '<#LANG_DEVICES_PASSED_TODAY_IN#> ' + timeConvertVar[3] + ':' + timeConvertVar[4];
	} else if((currentTime.getDate() - timeConvertVar[0]) == 1) {
		beautyText = '<#LANG_DEVICES_PASSED_YESTERDAY_IN#> ' + timeConvertVar[3] + ':' + timeConvertVar[4] + ':' + timeConvertVar[5];
	} else {
		beautyText = timeConvertVar[0] + '.' + timeConvertVar[1] + '.' + timeConvertVar[2] + ' ' + timeConvertVar[3] + ':' + timeConvertVar[4] + ':' + timeConvertVar[5];
	}

	$('.updatedText-JS-' + sID).text(beautyText);
}); 

</script>

<div class="device-widget controller loadtype_%.loadType%"
     onClick='$(".icon%.object_id%_light").addClass("pressed");
     setTimeout("$(\".icon%.object_id%_light\").removeClass(\"pressed\");",300);
     callMethod("%.object_title%.switch");
     $.get("<#ROOTHTML#>ajax/devices.html?op=clicked&object="+encodeURIComponent("%.object_title%"));'>
<div class="device-icon %.status|"off;on"% icon%.object_id%_light" id="icon%.object_id%_light" style='%.icon|"background-image:url(%.icon%)"%'></div>
<div class="device-header">%.object_description%</div>
<div class="updatedText-JS-%.object_id%" style="font-size: 11px;">...</div>
</div>
Естественно, возможно где то, что то подправить руками, т.к. типы устройств разные. Исходный код всегда можно посмотреть тут: /var/www/templates/classes/views и сделать по аналогии.
За это сообщение автора SmoKE_xDDD поблагодарили (всего 14):
Chainik (Сб фев 13, 2021 12:30 pm) • AK1 (Сб фев 13, 2021 2:15 pm) • Sergey.Chek (Сб фев 13, 2021 10:59 pm) • Alexander Znamensky (Вс фев 14, 2021 11:28 am) • Dasisfakt (Вс фев 14, 2021 5:41 pm) • Samir77 (Вс мар 14, 2021 8:50 pm) • London (Вс мар 28, 2021 10:37 pm) • Yevgen16 (Вс мар 28, 2021 10:43 pm) • savenko_egor (Вс мар 28, 2021 10:46 pm) • mer (Пн мар 29, 2021 1:06 am) и ещё 4
Рейтинг: 16.28%
oikworld
Сообщения: 5
Зарегистрирован: Пн мар 23, 2020 7:04 pm
Благодарил (а): 5 раз
Поблагодарили: 3 раза

Re: Простые устройства / Simple Devices

Сообщение oikworld » Чт фев 25, 2021 12:41 am

alexfrolkin писал(а):
Чт янв 07, 2021 7:04 pm
Всем привет, подскажите пожалуйста, как сделать открытие графика при нажатии на ПУ Датчик открытия/закрытия ? По аналогии допустим с ПУ датчиком температуры или Датчик состояния.
В файле \templates\classes\views\SOpenClose.html меняем
Это:

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

<div class="device-widget %.alive|"offline;online"%">
На это:

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

<div class="device-widget %.alive|"offline;online"%" onclick="var url=('<#ROOTHTML#>pChart/?p=%.object_title%'+'.status&op=log&subop=24h&minimal=1');parent.$.fancybox.open({ src: url, type: 'iframe',iframe:{preload:false} });return false;">
За это сообщение автора oikworld поблагодарили (всего 3):
Gasinskiy (Чт фев 25, 2021 7:29 pm) • Jilber (Пт фев 26, 2021 1:02 pm) • Spell (Пт апр 09, 2021 8:06 pm)
Рейтинг: 3.49%
Аватара пользователя
~220v
Сообщения: 96
Зарегистрирован: Пн дек 23, 2019 5:56 pm
Благодарил (а): 109 раз
Поблагодарили: 18 раз

Re: Простые устройства / Simple Devices

Сообщение ~220v » Вс фев 28, 2021 12:56 am

Приветствую!
Подредактировал SButtons.html добавил <div class="device-details">%.updatedText%</div> (по аналогии как в SOpenClose.html) получилось вот так:
ПУ - Звонок.png
ПУ - Звонок.png (1.97 КБ) 5440 просмотров
Дата съехала...


А хочу чтоб было красиво, как в SOpenClose.html:
ПУ - защёлка.png
ПУ - защёлка.png (1.14 КБ) 5440 просмотров

Подскажите пожалуйста, как сделать...
Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр
Благодарил (а): 100 раз
Поблагодарили: 1 раз

Re: Простые устройства / Simple Devices

Сообщение vitosmaxim80sad145 » Чт мар 04, 2021 11:15 pm

Подскажите есть лампочка rgb на радио пульту ,привязал каждую кнопку через бродлинк и создал в девайс-контролер-ржб свойства red,blu ,и так далее а как связать теперь с цветовым кругом ?
laptevd
Сообщения: 12
Зарегистрирован: Чт апр 16, 2020 6:57 pm
Благодарил (а): 2 раза
Поблагодарили: 5 раз

Re: Простые устройства / Simple Devices

Сообщение laptevd » Пт мар 05, 2021 11:04 pm

Парни, прошу прощения может быть за глупый вопрос, но поиск результатов не дал
Датчики вибрации xiaomi через простые устройства не связать?
У них там три параметра, вибрация наклон и удар
Получается только через объекты вручную создавать?
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Простые устройства / Simple Devices

Сообщение nick7zmail » Сб мар 06, 2021 6:06 am

laptevd писал(а):Парни, прошу прощения может быть за глупый вопрос, но поиск результатов не дал
Датчики вибрации xiaomi через простые устройства не связать?
У них там три параметра, вибрация наклон и удар
Получается только через объекты вручную создавать?
В теории тремя датчиками состояния заводите и ок...если нужен один, который является результатом обработки всех 3х величин - так же можете ПУ датчик состояния создать, а значение записывать через метод, который будет выполнять анализ всех 3 параметров.

Отправлено с моего Xperia XZ1 Compact через Tapatalk

Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
vmaster
Сообщения: 5
Зарегистрирован: Пт апр 03, 2020 7:52 am
Благодарил (а): 0
Поблагодарили: 0

Re: Простые устройства / Simple Devices

Сообщение vmaster » Пн мар 22, 2021 9:29 am

Доброго дня.Подскажите пож решение. Есть камера в простых устройствах Camera01 сохраняет снимок в папке, с подписью дата _время, при исполнении метода takeSnapshot.Как скорректировать метод что бы снимок сохранялся с подписью Camera01.
Аватара пользователя
~220v
Сообщения: 96
Зарегистрирован: Пн дек 23, 2019 5:56 pm
Благодарил (а): 109 раз
Поблагодарили: 18 раз

Re: Простые устройства / Simple Devices

Сообщение ~220v » Сб мар 27, 2021 2:24 am

Не понимаю, на хрена делать такие изменения - в SDevices_statusUpdated.php

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

Было:
if ($this->class_title != 'SMotions' || $params['NEW_VALUE']) {
    $this->setProperty('updated', time());
    $this->callMethodSafe('setUpdatedText');     # зачем удалили эту строчку???
}

Стало:
if ($this->class_title != 'SMotions' || $params['NEW_VALUE']) {
    $this->setProperty('updated', time());
}
По какой причине удалили строку с вызовом метода - х3
Ладно я уже потратил час времени на поиск проблемы - почему updatedText перестал обновляться. Хуже другое - вернут строчку взад, а у меня и останется двойной вызов метода :x :x :x :x :evil: :evil: :evil: :evil:
так как я его добавил в свойствах :evil: :evil: :evil:
За это сообщение автора ~220v поблагодарил:
nickneo (Чт апр 01, 2021 2:22 pm)
Рейтинг: 1.16%
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Простые устройства / Simple Devices

Сообщение fandaymon » Сб мар 27, 2021 3:22 am

~220v писал(а):
Сб мар 27, 2021 2:24 am
Не понимаю, на хрена делать такие изменения - в SDevices_statusUpdated.php

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

Было:
if ($this->class_title != 'SMotions' || $params['NEW_VALUE']) {
    $this->setProperty('updated', time());
    $this->callMethodSafe('setUpdatedText');     # зачем удалили эту строчку???
}

Стало:
if ($this->class_title != 'SMotions' || $params['NEW_VALUE']) {
    $this->setProperty('updated', time());
}
По какой причине удалили строку с вызовом метода - х3
Ладно я уже потратил час времени на поиск проблемы - почему updatedText перестал обновляться. Хуже другое - вернут строчку взад, а у меня и останется двойной вызов метода :x :x :x :x :evil: :evil: :evil: :evil:
так как я его добавил в свойствах :evil: :evil: :evil:
Согласно новому курсу обновление этого свойства не нужно. Свойство использовалось для изменения надписи на веб-страничке, сейчас это изменение делается js. Так концептуально правильнее - в старом варианте ПУ сильно нагружали базу, при том что само по себе это свойство является вычисляемым и никакой информации в себе не несёт
За это сообщение автора fandaymon поблагодарили (всего 3):
SmoKE_xDDD (Сб мар 27, 2021 8:46 am) • Samir77 (Сб мар 27, 2021 7:43 pm) • ~220v (Сб мар 27, 2021 7:48 pm)
Рейтинг: 3.49%
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Простые устройства / Simple Devices

Сообщение Logrus » Сб мар 27, 2021 5:20 pm

~220v писал(а):
Сб мар 27, 2021 2:24 am
Не понимаю, на хрена делать такие изменения - в SDevices_statusUpdated.php

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

Было:
if ($this->class_title != 'SMotions' || $params['NEW_VALUE']) {
    $this->setProperty('updated', time());
    $this->callMethodSafe('setUpdatedText');     # зачем удалили эту строчку???
}

Стало:
if ($this->class_title != 'SMotions' || $params['NEW_VALUE']) {
    $this->setProperty('updated', time());
}
По какой причине удалили строку с вызовом метода - х3
Ладно я уже потратил час времени на поиск проблемы - почему updatedText перестал обновляться. Хуже другое - вернут строчку взад, а у меня и останется двойной вызов метода :x :x :x :x :evil: :evil: :evil: :evil:
так как я его добавил в свойствах :evil: :evil: :evil:
это был последний пул реквест, у меня это несколько лет поправлено и жил тихо и довольно, а выслушивать матьки имхо надоело (
За это сообщение автора Logrus поблагодарили (всего 2):
Samir77 (Сб мар 27, 2021 7:43 pm) • ~220v (Сб мар 27, 2021 7:48 pm)
Рейтинг: 2.33%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Ответить