Распределение переменных по классам

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

Модератор: immortal

akininav
Сообщения: 12
Зарегистрирован: Ср мар 06, 2019 7:55 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Распределение переменных по классам

Сообщение akininav » Вт мар 12, 2019 8:57 pm

nightwind писал(а):
Вт мар 12, 2019 8:55 pm
самый простой вариант - это в твоем этом отдельном от мажора скрипте сделать публикацию в mqtt топик. это очень просто, примеров миллион. а у мажора есть готовый mqtt клиент (который к тому же сам распарсит все твои данные, если хочешь)
Создавать на лету неопределенное количество объектов в дереве - это мазохизм и расточительство. зачем тебе оно надо? создаешь один объект leases, свойство value, onvalueupdate создаешь скрипт, который разбирает пришедшую строку и делает что тебе надо.
Большое спасибо, сейчас почитаю, буду пробовать, потом при любом результате напишу.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1754 раза
Контактная информация:

Re: Распределение переменных по классам

Сообщение skysilver » Вт мар 12, 2019 9:46 pm

akininav писал(а):
Вт мар 12, 2019 6:30 pm
но тогда встает вопрос, что устройства на dhcp сервере могут появляться новые и тогда каждое устройство нужно будет вручную добавлять. А в отдельном php можно сделать что бы создавались новые объекты в зависимости от полученного результата.
В сценарии/методе тоже можно автоматом создавать объекты и писать в их свойства нужные данные. Но, как сказали выше, нужен ли тебе этот зоопарк всех клиентов роутера в виде объектов в МДМ? Тут уж на усмотрение.

Технически я бы взял за основу сценарий работы с ESP8266 на базе прошивки wifi-iot. Тут на форуме где-то он есть. Он как раз подходит под твою задачу - парсит данные из ГЕТ-запросов от ЕСП-шек и рассовывает их по объектам, а если объявилась новая ЕСП-шка, то сначала создает под нее объект и затем пишет данные в его свойства.

ПыСы: благодарность на форуме принято выражать кнопкой "палец вверх".
За это сообщение автора skysilver поблагодарили (всего 2):
akininav (Ср мар 13, 2019 10:58 am) • Samir77 (Сб авг 10, 2019 12:58 pm)
Рейтинг: 2.33%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
akininav
Сообщения: 12
Зарегистрирован: Ср мар 06, 2019 7:55 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Распределение переменных по классам

Сообщение akininav » Чт мар 14, 2019 8:57 am

Получилось пока другим способом (таким как я изначально и думал, но не получалось). Остальные методы в любом случае рассмотрю.

Я просто перенес 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);
    }
}
На самом микротике переделал скрипт что бы делать проверку online/ofline
Теперь он берет 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
offline.PNG
device_offline
offline.PNG (33.77 КБ) 2933 просмотра
Если online
online.PNG
device_online
online.PNG (34.04 КБ) 2933 просмотра
akininav
Сообщения: 12
Зарегистрирован: Ср мар 06, 2019 7:55 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Распределение переменных по классам

Сообщение akininav » Сб мар 16, 2019 11:43 am

Вот итоговый результат :)
Безымянный.png
Безымянный.png (191.09 КБ) 2891 просмотр
За это сообщение автора akininav поблагодарили (всего 2):
Nail (Ср мар 20, 2019 11:11 pm) • Samir77 (Сб авг 10, 2019 1:20 pm)
Рейтинг: 2.33%
Аватара пользователя
Nail
Сообщения: 376
Зарегистрирован: Пн мар 05, 2018 7:09 am
Откуда: Самара
Благодарил (а): 174 раза
Поблагодарили: 28 раз

Re: Распределение переменных по классам

Сообщение Nail » Ср мар 20, 2019 8:59 pm

akininav писал(а):
Сб мар 16, 2019 11:43 am
Вот итоговый результат :)
Если не секрет как такую сцену создать? Знать когда и что "отлетело" от роутера(круто).
Mini AMD A6 1450 Quad-core.Ubuntu Server 18.04 (64-bit). MegaD. Zigbee2mqtt+SLS DIN Mini. Broadlink.
akininav
Сообщения: 12
Зарегистрирован: Ср мар 06, 2019 7:55 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Распределение переменных по классам

Сообщение akininav » Ср мар 20, 2019 10:59 pm

Nail писал(а):
Ср мар 20, 2019 8:59 pm
Если не секрет как такую сцену создать? Знать когда и что "отлетело" от роутера(круто).
Конечно не секрет :)

Распишу полностью, что бы не собирать инфу по всей теме.
Создаешь 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);
    }
}
На микротике Systems -> Scripts создаешь скрипт:

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

: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!" }
script.PNG
script.PNG (54.14 КБ) 2837 просмотров
Потом в System -> Scheduler добавляешь задачу:
scheduler.PNG
scheduler.PNG (37.43 КБ) 2837 просмотров
Не забудь всем устройствам прописать комментарий, так как заголовок в дальнейшем строится из этого значения, а иначе будет пустота.
(все устройства присутствующие в микротике Ip -> DHCP Server -> Leases)
dhcpserver.PNG
dhcpserver.PNG (21.34 КБ) 2837 просмотров
Далее после первого запуска скрипта на микротике у тебя в mdm создастся класс WiFiDevice заполненный объектами.
objects.PNG
objects.PNG (31.24 КБ) 2837 просмотров
Там же выбираешь шаблон отображения и вставляешь 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>
Сохраняешь и на этом все готово, остается добавить объект в сцену или меню управления.
Создай пустую сцену:
scenes.PNG
scenes.PNG (47.5 КБ) 2837 просмотров
В элементах сцены создай элемент с типом объект и выбери любое необходимое устройство:
element.PNG
element.PNG (21.25 КБ) 2837 просмотров
Ну и на этом все))
scenes_preview.PNG
scenes_preview.PNG (256.24 КБ) 2837 просмотров
Ответить