Большое спасибо, сейчас почитаю, буду пробовать, потом при любом результате напишу.nightwind писал(а): ↑Вт мар 12, 2019 8:55 pmсамый простой вариант - это в твоем этом отдельном от мажора скрипте сделать публикацию в mqtt топик. это очень просто, примеров миллион. а у мажора есть готовый mqtt клиент (который к тому же сам распарсит все твои данные, если хочешь)
Создавать на лету неопределенное количество объектов в дереве - это мазохизм и расточительство. зачем тебе оно надо? создаешь один объект leases, свойство value, onvalueupdate создаешь скрипт, который разбирает пришедшую строку и делает что тебе надо.
Распределение переменных по классам
Модератор: immortal
-
- Сообщения: 12
- Зарегистрирован: Ср мар 06, 2019 7:55 pm
- Благодарил (а): 2 раза
- Поблагодарили: 4 раза
Re: Распределение переменных по классам
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1754 раза
- Контактная информация:
Re: Распределение переменных по классам
В сценарии/методе тоже можно автоматом создавать объекты и писать в их свойства нужные данные. Но, как сказали выше, нужен ли тебе этот зоопарк всех клиентов роутера в виде объектов в МДМ? Тут уж на усмотрение.
Технически я бы взял за основу сценарий работы с ESP8266 на базе прошивки wifi-iot. Тут на форуме где-то он есть. Он как раз подходит под твою задачу - парсит данные из ГЕТ-запросов от ЕСП-шек и рассовывает их по объектам, а если объявилась новая ЕСП-шка, то сначала создает под нее объект и затем пишет данные в его свойства.
ПыСы: благодарность на форуме принято выражать кнопкой "палец вверх".
- Рейтинг: 2.33%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram
-
- Сообщения: 12
- Зарегистрирован: Ср мар 06, 2019 7:55 pm
- Благодарил (а): 2 раза
- Поблагодарили: 4 раза
Re: Распределение переменных по классам
Получилось пока другим способом (таким как я изначально и думал, но не получалось). Остальные методы в любом случае рассмотрю.
Я просто перенес php файл в папку scripts и нашел какие библиотеки подключить.
На самом микротике переделал скрипт что бы делать проверку online/ofline
Теперь он берет mac адреса на с registration-table, а с dhcp-server lease и проверяет их наличие в registration-table
И как только скрипт срабатывает в scheduler на микротике, сразу отрабатывает php занося данные в мдм.
В итоге получается:
Если offline Если online
Я просто перенес php файл в папку scripts и нашел какие библиотеки подключить.
Код: Выделить всё
<?php
chdir(dirname(__FILE__) . '/../');
include_once('./config.php');
include_once('./lib/loader.php');
$ip = $_SERVER['REMOTE_ADDR'];
$array = $_POST['wifi'];
//print_r($array);
$tmp1 = explode('|', $array);
foreach ($tmp1 as $i) {
list($getcomment, $hostname, $capnumber, $rxsignal, $ip, $mac, $uptime, $timenow, $status) = explode(";", $i);
if ($mac != '') {
$wificlienttmp['getcomment'] = $getcomment;
$wificlienttmp['hostname'] = $hostname;
$wificlienttmp['capnumber'] = $capnumber;
$wificlienttmp['rxsignal'] = $rxsignal;
$wificlienttmp['ip'] = $ip;
$wificlienttmp['mac'] = $mac;
$wificlienttmp['uptime'] = $uptime;
$wificlienttmp['timenow'] = $timenow;
$wificlienttmp['status'] = $status;
$wificlient[] = $wificlienttmp;
addClassObject('WiFiDevice', 'wifi_' . $wificlienttmp['mac']);
$obj = getObject('wifi_' . $wificlienttmp['mac']);
$obj->setProperty('getcomment', $wificlienttmp['getcomment']);
$obj->setProperty('hostname', $wificlienttmp['hostname']);
$obj->setProperty('capnumber', $wificlienttmp['capnumber']);
$obj->setProperty('rxsignal', $wificlienttmp['rxsignal']);
$obj->setProperty('ip', $wificlienttmp['ip']);
$obj->setProperty('mac', $wificlienttmp['mac']);
$obj->setProperty('uptime', $wificlienttmp['uptime']);
$obj->setProperty('lastActive', 'Последняя проверка в ' . $wificlienttmp['timenow']);
$obj->setProperty('status', $wificlienttmp['status']);
//print_r($wificlienttmp);
}
}
Теперь он берет mac адреса на с registration-table, а с dhcp-server lease и проверяет их наличие в registration-table
И как только скрипт срабатывает в scheduler на микротике, сразу отрабатывает php занося данные в мдм.
Код: Выделить всё
:local url "http://192.168.88.100/scripts/mikrot.php";
:set $str "";
:foreach i in=[/ip dhcp-server lease find] do={
:local mac [/ip dhcp-server lease get $i mac-address];
:local timenow [/system clock get time];
:local ip [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] address];
:local getcomment [/ip dhcp-server lease get [/ip dhcp-server lease find where address="$ip"] comment];
:local hostname [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] host-name];
:local capnumber
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set capnumber "device not found"
} else={
:set capnumber [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] interface]
}
:local rxsignal
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set rxsignal "device not found"
} else={
:set rxsignal [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] rx-signal]
}
:local uptime
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set uptime "device not found"
} else={
:set uptime [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] uptime]
}
:local status
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set status "offline"
} else={
:set status "online"
}
:set $str "$str|$getcomment;$hostname;$capnumber;$rxsignal;$ip;$mac;$uptime;$timenow;$status";
}
:do {
/tool fetch mode=http url=$url keep-result=no http-method="post" http-data="wifi=$str";
} on-error={ log warning "Mojerdomo: Send to server Failed!" }
Если offline Если online
-
- Сообщения: 12
- Зарегистрирован: Ср мар 06, 2019 7:55 pm
- Благодарил (а): 2 раза
- Поблагодарили: 4 раза
- Nail
- Сообщения: 376
- Зарегистрирован: Пн мар 05, 2018 7:09 am
- Откуда: Самара
- Благодарил (а): 174 раза
- Поблагодарили: 28 раз
Re: Распределение переменных по классам
Если не секрет как такую сцену создать? Знать когда и что "отлетело" от роутера(круто).
Mini AMD A6 1450 Quad-core.Ubuntu Server 18.04 (64-bit). MegaD. Zigbee2mqtt+SLS DIN Mini. Broadlink.
-
- Сообщения: 12
- Зарегистрирован: Ср мар 06, 2019 7:55 pm
- Благодарил (а): 2 раза
- Поблагодарили: 4 раза
Re: Распределение переменных по классам
Конечно не секрет

Распишу полностью, что бы не собирать инфу по всей теме.
Создаешь mikrot.php в папке scripts
Код: Выделить всё
<?php
chdir(dirname(__FILE__) . '/../');
include_once('./config.php');
include_once('./lib/loader.php');
$ip = $_SERVER['REMOTE_ADDR'];
$array = $_POST['wifi'];
//print_r($array);
$tmp1 = explode('|', $array);
foreach ($tmp1 as $i) {
list($getcomment, $hostname, $capnumber, $rxsignal, $ip, $mac, $uptime, $timenow, $status) = explode(";", $i);
if ($mac != '') {
$wificlienttmp['getcomment'] = $getcomment;
$wificlienttmp['hostname'] = $hostname;
$wificlienttmp['capnumber'] = $capnumber;
$wificlienttmp['rxsignal'] = $rxsignal;
$wificlienttmp['ip'] = $ip;
$wificlienttmp['mac'] = $mac;
$wificlienttmp['uptime'] = $uptime;
$wificlienttmp['timenow'] = $timenow;
$wificlienttmp['status'] = $status;
$wificlient[] = $wificlienttmp;
addClassObject('WiFiDevice', 'wifi_' . str_replace(":","",$wificlienttmp['mac']));
$obj = getObject('wifi_' . str_replace(":","",$wificlienttmp['mac']));
$obj->setProperty('getcomment', $wificlienttmp['getcomment']);
$obj->setProperty('hostname', $wificlienttmp['hostname']);
$obj->setProperty('capnumber', $wificlienttmp['capnumber']);
$obj->setProperty('rxsignal', $wificlienttmp['rxsignal']);
$obj->setProperty('ip', $wificlienttmp['ip']);
$obj->setProperty('mac', $wificlienttmp['mac']);
$obj->setProperty('uptime', $wificlienttmp['uptime']);
$obj->setProperty('lastActive', 'Последняя проверка в ' . $wificlienttmp['timenow']);
$obj->setProperty('status', $wificlienttmp['status']);
//print_r($wificlienttmp);
}
}
Код: Выделить всё
:local url "http://СВОЙ_IP/scripts/mikrot.php";
:set $str "";
:foreach i in=[/ip dhcp-server lease find] do={
:local mac [/ip dhcp-server lease get $i mac-address];
:local timenow [/system clock get time];
:local ip [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] address];
:local getcomment [/ip dhcp-server lease get [/ip dhcp-server lease find where address="$ip"] comment];
:local hostname [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] host-name];
:local capnumber
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set capnumber "-"
} else={
:set capnumber [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] interface]
}
:local rxsignal
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set rxsignal "-"
} else={
:set rxsignal [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] rx-signal]
}
:local uptime
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set uptime "-"
} else={
:set uptime [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] uptime]
}
:local status
:if ([ :len [/caps-man registration-table find where mac-address="$mac"] ] = 0 ) do={
:set status "offline"
} else={
:set status "online"
}
:set $str "$str|$getcomment;$hostname;$capnumber;$rxsignal;$ip;$mac;$uptime;$timenow;$status";
}
:do {
/tool fetch mode=http url=$url keep-result=no dst-path="result.txt" http-method="post" http-data="wifi=$str";
} on-error={ log warning "Mojerdomo: Send to server Failed!" }
(все устройства присутствующие в микротике Ip -> DHCP Server -> Leases) Далее после первого запуска скрипта на микротике у тебя в mdm создастся класс WiFiDevice заполненный объектами. Там же выбираешь шаблон отображения и вставляешь css и html:
Код: Выделить всё
<style>
table {
width: 290px;
margin-top: 3;
}
td .left {
width: 110px;
text-indent: 5;
}
td .right {
width: 180px;
text-indent: 5;
}
p {
margin: -9 0 5px;
text-align: center;
}
.panel-devices {
position: absolute;
bottom: 0;
background-color: rgba(100, 100, 100, 0.75);
border-radius: 5px;
}
.panel-devices .device {
height: 100%;
}
.panel-devices .device .title {
background-color: rgba(0, 0, 0, 0.5);
font-size: 18px;
line-height: 1.4;
font-weight: 500;
text-align: center;
color: #ff6f4d;
}
.panel-devices .device .status-online {
background-color: rgba(0, 0, 0, 0.5);
text-align: center;
font-size: 16;
text-transform: uppercase;
font-weight: 600;
color: #00ff45;
}
.panel-devices .device .status-offline {
background-color: rgba(0, 0, 0, 0.5);
text-align: center;
font-size: 16;
text-transform: uppercase;
font-weight: 600;
color: #ff0000;
}
.panel-devices .device img {
display: block;
width: 50%;
height: 17px;
margin: auto;
}
.panel-devices .device .data {
font-size: 14px;
}
</style>
<div class="panel-devices">
<div class="device">
<div class="title">%.getcomment%</div>
<div class="data">
<table>
<tbody>
<tr>
<td class="left">HostName</td>
<td class="right">%.hostname%</td>
</tr>
<tr>
<td class="left">Точка</td>
<td class="right">%.capnumber%</td>
</tr>
<tr>
<td class="left">Сигнал</td>
<td class="right">%.rxsignal%</td>
</tr>
<tr>
<td class="left">IP адрес</td>
<td class="right">%.ip%</td>
</tr>
<tr>
<td class="left">MAC адрес</td>
<td class="right">%.mac%</td>
</tr>
<tr>
<td class="left">Время в сети</td>
<td class="right">%.uptime%</td>
</tr>
</tbody>
</table>
<br>
<p>%.lastActive%
</div>
<div class="status-%.status%">%.status%</div>
</div>
</div>
Создай пустую сцену: В элементах сцены создай элемент с типом объект и выбери любое необходимое устройство: Ну и на этом все))