[Сценарий] Проверка уровня заряда аккумулятора телефона

Не требует установки программ или изменения файлов

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

Ответить
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 55 раз
Контактная информация:

[Сценарий] Проверка уровня заряда аккумулятора телефона

Сообщение S_Nick » Пт окт 25, 2019 11:10 pm

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

Умный дом сообщает уровни заряда аккумуляторов домочадцев.
А также, если выполнять в Cron, к примеру, каждые 15 минут (чаще не рекомендую), с параметром "level=0", будет сообщать только когда у кого-то из домочадцев садится смартфон, либо если он перестал передавать данные телеметрии.
Если есть мысли как оптимизировать улучшить код, пишите в теме.

Работает в связке с дополнением GPS-трекер.

На смартфонах пользователей данные отправляет на сервер Majordomo приложение Tasker каждые 5 минут.

backup.xml:

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

<TaskerData sr="" dvi="1" tv="5.5.bf2">
	<Profile sr="prof5" ve="2">
		<cdate>1558354268194</cdate>
		<edate>1558354582100</edate>
		<id>5</id>
		<mid0>3</mid0>
		<nme>Sync5min</nme>
		<Time sr="con0">
			<fh>-1</fh>
			<fm>-1</fm>
			<rep>2</rep>
			<repval>5</repval>
			<th>-1</th>
			<tm>-1</tm>
		</Time>
	</Profile>
	<Project sr="proj0" ve="2">
		<cdate>1559129981374</cdate>
		<mdate>1559130966340</mdate>
		<name>Base</name>
		<pids>5,4</pids>
		<tids>3,2</tids>
		<Img sr="icon" ve="2">
			<nme>mw_action_home</nme>
		</Img>
	</Project>
	<Task sr="task3">
		<cdate>1558353566729</cdate>
		<edate>1559131146614</edate>
		<id>3</id>
		<nme>GPS</nme>
		<pri>6</pri>
		<Action sr="act0" ve="7">
			<code>902</code>
			<Int sr="arg0" val="2"/>
			<Int sr="arg1" val="100"/>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
		</Action>
		<Action sr="act1" ve="7">
			<code>590</code>
			<Str sr="arg0" ve="3">%LOC</Str>
			<Str sr="arg1" ve="3">,</Str>
			<Int sr="arg2" val="0"/>
		</Action>
		<Action sr="act2" ve="7">
			<code>118</code>
			<Str sr="arg0" ve="3">%MajorServer</Str>
			<Str sr="arg1" ve="3">gps.php</Str>
			<Str sr="arg2" ve="3">latitude=%LOC1
longitude=%LOC2
altitude=%LOCALT
provider=%TNET
speed=%LOCSPD
battlevel=%BATT
deviceid=%IDTEL
accuracy=%LOCACC</Str>
			<Str sr="arg3" ve="3"/>
			<Str sr="arg4" ve="3"/>
			<Int sr="arg5" val="10"/>
			<Str sr="arg6" ve="3"/>
			<Str sr="arg7" ve="3"/>
			<Int sr="arg8" val="0"/>
		</Action>
	</Task>
</TaskerData>
Код сценария battLevelCheck:

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

if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }
if (isset($params["change"])) $change = $params["change"];

$ret = "Уровень заряда аккумулятора смартфона: ";
$objects = getObjectsByClass("Users");
foreach($objects as $obj) {
	if (gg($obj['TITLE'] . ".BattLevel") > 1) { //если заряд больше 1%
		callMethod($obj['TITLE'] . ".BattLevel");
		$fio = gg($obj['TITLE'] . ".fullName");
     	$name_arr = explode(" ", $fio);
     	$name = $name_arr[0];
     	$ret .= morpher_inflect($name, 1) . " " . gg($obj['TITLE'] . ".BattLevel") . "%";
      	$new_ts = date_timestamp_get(date_create()); //текущий таймштамп
 		$get_ts = gg($obj['TITLE'] . ".CoordinatesUpdatedTimestamp");
 		$dif_ts = $new_ts - $get_ts;
 		if (round($dif_ts / 60) >= 15) { //если телефон не передает данные более 15 минут
 			$ret .= ". Данные получены " . round($dif_ts / 60) . " мин. назад.";
    	} else {
         	if (gg($obj['TITLE'] . ".BattLevel") <= 10) { //если осталось менее 10% батареи
         		$ret_warning = $name . ", осталось всего " . gg($obj['TITLE'] . ".BattLevel") . "% заряда аккумулятора вашего смартфона";
        	}
        }
     	if (round($dif_ts / 60) >= 60) { //если телефон не передает данные более 60 минут
        	$ret_warning = "Смартфон " . morpher_inflect($name, 1) . " не передает данные уже более " . date("H:i", mktime(0, 0, $dif_ts));
         	$ret_warning .= ". Уровень заряда был " . gg($obj['TITLE'] . ".BattLevel") . "%.";
         	if (gg($obj['TITLE'] . ".BattLevel") < 10) {
             	$ret_warning .= ". Вероятно он рязрядился.";
            }
        }
     	$ret .= "; ";
    }
}

if ($ret) {
	say($ret, $level);
	echo "<br>" . $ret;
}

if ($ret_warning) {
 	$level = 1;
 	if (round($dif_ts / 60) >= 300) $level = 0; //более 5 часов
	say($ret_warning, $level);
	echo "<br>" . $ret_warning;
}
Код для Cron (Рекомендую выполнять не чаще 15 минут):
Crontab: */15 * * * *

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

runScript("battLevelCheck", array("level"=>"0"));
Пример выполнения:
Уровень заряда аккумулятора смартфона: Николая 95%; Натальи 57%; Галины 46%; Даниила 4%. Данные получены 84 мин. назад.; Авт+о-Тойота-Приуса 81%;
Смартфон Даниила не передает данные уже более 01:23. Уровень заряда был 4%.. Вероятно он рязрядился.
(У меня в авто лежит старый сматрфон в качестве gps-трекера)

P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
За это сообщение автора S_Nick поблагодарили (всего 2):
Sergey.Chek (Пт окт 25, 2019 11:26 pm) • Bolik.Stav (Ср окт 30, 2019 11:53 pm)
Рейтинг: 2.33%
Ответить