В связи с производственной необходимостью мониторинга температурных состояний объектов и устройств был разработан данный комплексный экран.
Цветами выделены состояния, критический, предупреждение и т.д. Также прикручена аналитика температурного тренда(повышается понижается)
Данные берутся через Zabbix.
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <InetConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
#include <ScreenCapture.au3>
#include <GUIConstantsEx.au3>
#include <FontConstants.au3>
#include <ColorConstants.au3>
#include <Word.au3>
#include <Array.au3>
#include <Date.au3>
#include "Encoding.au3"
#include "..\log_print.au3"
#include "..\_DockToScreenSide.au3"
#AutoIt3Wrapper_Icon=temp2.ico
;*********************************************************************************************************************************
;*
;*********************************************************************************************************************************
;-----------------------------------------------------
Global $table[38][4] ;массив хранит температурную карту
Global $labl[38][4] ;хэндлы температурных кнопок
Global $bold[38][4] ;хранит карту выделения жирным цветом изменённые данные
Global $prognoz[38][4] ;таблица прогноза движения температуры
Global $last_data[38][4][4];
Global $gradus="°";
Global $sy=27; высота кнопок
Global $sy_offset=16; отступ таблицы от верха
Global $sx_offset=10; отсутп таблицы от края бока
Global $step_y=0;
Global $width_city = 200; ширина кнопки населенногго пункта
Global $width_temp = 70; ширина кнопок температуры
Global $form_height = 1043; высота формы
Global $form_width = $width_temp*3 + $width_city + $sx_offset*2
Global $font_size_city = 14;
Global $font_size_temp = 14;
;$step_x =10;
;-----------------------------------------------------
;create FORM
Local $hGUI = GUICreate("Температурная карта объектов", $form_width, $form_height)
;GUISetIcon(@ScriptDir & "\Ping-Pong.ico")
GUICtrlCreateLabel("M1",20 + $sx_offset + $width_city , 0, $width_temp, $sy-2)
GUICtrlSetFont(-1, 10, $FW_BOLD )
GUICtrlSetColor(-1, 0x111111);
GUICtrlCreateLabel("M2",20 + $sx_offset + $width_city + $width_temp , 0, $width_temp, $sy-2)
GUICtrlSetFont(-1, 10, $FW_BOLD )
GUICtrlSetColor(-1, 0x111111);
GUICtrlCreateLabel("SDK",15 + $sx_offset + $width_city + $width_temp*2, 0, $width_temp, $sy-2)
GUICtrlSetFont(-1, 10, $FW_BOLD )
GUICtrlSetColor(-1, 0x111111);
;GUICtrlCreateLabel(" Zabbix technology for KnA",$sx_offset , $form_height-25, $form_width-$sx_offset*2, 30)
;GUICtrlSetFont(-1, 15, $FW_BOLD )
;GUICtrlSetBkColor(-1, 0xFF);
;GUICtrlSetColor(-1, 0xEEEEEE);
CreateForm();заполняем форму кнопками
GUISetState(@SW_SHOW, $hGUI)
;-----------------------------------------------------
;login
Local $hDownload = InetGet("http://10.10.10.10/?request=&name=Komsomolsk&password=password&autologin=1&enter=Sign+in", @TempDir + "\temp.html", 1, 0)
InetClose($hDownload);
;-----------------------------------------------------
;заполняем фому
BuildForm();
;_ArrayDisplay($table);
$exit=false;флаг выхода из программы
;-----------------------------------------------------
AdlibRegister("BuildForm", 1000 * 60 * 5);каждые 5 минут происходит обновление температурных данных
;-----------------------------------------------------
;бесконечный цикл , ожидание команды выхода из приложения и обработка гуий
While $exit=false;
$idMsg = GUIGetMsg()
if $idMsg = $GUI_EVENT_CLOSE Then $exit=true;
if $idMsg = $GUI_EVENT_CLOSE Then ExitLoop;
;if $idMsg = $GUI_EVENT_MOUSEMOVE Then _DockToScreenSide($hGUI);
WEnd
Exit
;*********************************************************************************************************************************
;*Создаём на форме батоны, заполняется таблица $labl[40][4]
;*********************************************************************************************************************************
Func CreateForm()
For $i = 0 To UBound($table)-1
;y =
$labl[$i][0] = GUICtrlCreateButton("ожидание даных...", $sx_offset , $sy_offset + $sy*$i, $width_city-3, $sy+1)
$labl[$i][1] = GUICtrlCreateButton("?" & $gradus , $sx_offset + $width_city, $sy_offset + $sy*$i, $width_temp, $sy+1)
$labl[$i][2] = GUICtrlCreateButton("?" & $gradus, $sx_offset + $width_city + $width_temp, $sy_offset + $sy*$i, $width_temp, $sy+1)
$labl[$i][3] = GUICtrlCreateButton("?" & $gradus, $sx_offset + $width_city + $width_temp*2, $sy_offset + $sy*$i, $width_temp, $sy+1)
Next
EndFunc
;*********************************************************************************************************************************
;*заполняет данными батону из таблицы $table[][]
;*********************************************************************************************************************************
Func set_data($sdi, $sdoffset)
Local $gc;
$hnd = $labl[$sdi][$sdoffset]; получаем дескриптор батоны
GUICtrlSetData($hnd, $table[$sdi][$sdoffset] & $gradus & " " & $prognoz[$sdi][$sdoffset]);
$k=($bold[$sdi][$sdoffset] == $FW_BOLD) ? 1 : 0; высчитываем коэффициент увеличения шрифта при изменении данных
GUICtrlSetFont($hnd, $font_size_temp + $k, $bold[$sdi][$sdoffset] );
if $sdoffset == 3 Then;для блока СДК другие цветовые пороги от температуры
$gc = get_color_SDK($table[$sdi][$sdoffset]);
EndIf
if $sdoffset == 0 Then
$gc = get_color($table[$sdi][1], $table[$sdi][2], $table[$sdi][3]);
EndIf
if $sdoffset == 1 Or $sdoffset == 2 Then
$gc = get_color($table[$sdi][$sdoffset], $table[$sdi][$sdoffset], $table[$sdi][$sdoffset]);
EndIf
GUICtrlSetBkColor($hnd, $gc);
GUICtrlSetColor($hnd, ($gc == $COLOR_RED) ? 0xFFFFFF : 0x0); если фон батоны будет красный то текст надо рисовать белым
EndFunc
;*********************************************************************************************************************************
;*Считывание и заполение температурной карты
;*********************************************************************************************************************************
Func BuildForm()
log_print("BuildForm start");
GetParse();качаем, парсим данные и заполняе table[40][3] температурами, tab[40][3] данные изменений жирным цветом
;---------------------------------------------------------
For $i = 0 To UBound($table)-1
;CITY--------------
$hnd = $labl[$i][0];
$gc = get_color($table[$i][1],$table[$i][2],$table[$i][3])
GUICtrlSetData($hnd, $table[$i][0]);
GUICtrlSetFont($hnd, $font_size_city, $FW_BOLD );
GUICtrlSetBkColor($hnd, $gc);
GUICtrlSetColor($hnd, ($gc == $COLOR_RED) ? 0xFFFFFF : 0x0); если фон батоны будет красный то текст надо рисовать белым
;set_data($i,0);
;GUICtrlSetFont($labl[$i][0], 12, $FW_BOLD );
;MUX1-------------
set_data($i,1);
;MUX2-------------
set_data($i,2);
;SDK---------------
set_data($i,3);
;--------------------
Next
log_print("BuildForm end");
EndFunc
;*********************************************************************************************************************************
;* Температурные цвето пороги передатчиков
;*********************************************************************************************************************************
Func get_color($c1,$c2,$c3)
if $c1 >= 55 then return $COLOR_RED;
if $c2 >= 55 then return $COLOR_RED;
if $c1 >= 50 then return $COLOR_YELLOW;
if $c2 >= 50 then return $COLOR_YELLOW;
if $c1 >= 25 then return $COLOR_SKYBLUE;
if $c2 >= 25 then return $COLOR_SKYBLUE;
if $c1 > 20 then return 0xEEEEEE;
if $c2 > 20 then return 0xEEEEEE;
return 0xFFFFFF;
EndFunc
;*********************************************************************************************************************************
;*Температурные цвето пороги помещения
;*********************************************************************************************************************************
Func get_color_SDK($c3)
if $c3 >= 45 then return $COLOR_RED;
if $c3 >= 40 then return $COLOR_YELLOW;
if $c3 >= 20 then return $COLOR_SKYBLUE;
if $c3 >= 10 then return 0xEEEEEE;
return 0xFFFFFF;
EndFunc
;*********************************************************************************************************************************
;*
;*********************************************************************************************************************************
;*********************************************************************************************************************************
;*Качаем страницу и парсим ее
;*********************************************************************************************************************************
Func GetParse_old()
EndFunc
Func GetParse()
log_print("GetParse start");
;считываем страницу комплексного экрана
Local $dData = BinaryToString(InetRead("http://10.100.0.9/screens.php?ddreset=1&elementid=67", $INET_FORCERELOAD ))
;ConsoleWrite($dData);
;--------------------------------------------------------------------------------------------
Local $str_in = 1; StringInStr($dData, '<td class="pre">', 0, 1, 1);
Local $str_continue = 1;
;ConsoleWrite("$str_start = " & $str_start & @CRLF);
;$tag_find = '<td class="pre">'
Local $tag_find_in = '<tr class=""><td class="cntr_mdl screenitem" colspan="1" rowspan="1">'
Local $tag_find_out = '</table></div></td></tr>'
Local $tag_find_len = StringLen($tag_find_in);
;--------------------------------------------------------------------------------------------
Local $i = 0;
While $str_in >= 1
;в $str получим блок из трёх параметров
$str_in = StringInStr($dData, $tag_find_in, 0, 1, $str_continue);
if $str_in = 0 then ExitLoop;
$str_in+=$tag_find_len;
;ConsoleWrite("$str_in = " & $str_in & @CRLF);
$str_out = StringInStr($dData, $tag_find_out, 0, 1, $str_in);
;ConsoleWrite("$str_out = " & $str_out & @CRLF);
$str = StringMid($dData, $str_in, $str_out-$str_in);
;ConsoleWrite("$str = " & $str & @CRLF);
;-------------------------------
;в $str получили цельный блок из трёх параметров
;делим блок на четыре части в каждом свои данные будут
$str_temp = StringSplit($str, '<tr class="header">', 1);
;ConsoleWrite("$str_temp[0] = " & $str_temp[0] & @CRLF);
; for $t = 2 to 4;$str_temp[0]
; ConsoleWrite(" = " & $str_temp[$t] & @CRLF);
; next
$str1 = $str_temp[2]
$str2 = $str_temp[3]
$str3 = $str_temp[4]
;-------------------------------
;_Get_tag($str);
;$s1=0;
;$s2=0;
;$s3=0;
;Local $s1_in=0; адрес начала вхождения строки вподстроку
;Local $s2_in=0;
;Local $s3_in=0;
;Local $s1_out=1000;
;Local $s2_out=1000;
;Local $s3_out=1000;
#cs
;MUX1--------------------------------------------------------------------------------
$s1_in = StringInStr($str1, '<td class="pre">', 0, 1, 1);
;ConsoleWrite("$s1_in = " & $s1_in & @CRLF);
if $s1_in>=1 then
$s1_in += 16;
$s1_out = StringInStr($str1, '</td>', 0, 1, $s1_in);
$s1 = Number(StringMid($str1, $s1_in , $s1_out - $s1_in));
Else
$s1_in = StringInStr($str1, '<td class="message">', 0, 1, $s1_out);
$s1_out = StringInStr($str1, '</td>', 0, 1, $s1_in);
EndIf
;MUX2--------------------------------------------------------------------------------
$s2_in = StringInStr($str2, '<td class="pre">', 0, 1, 1);
if $s2_in>=1 then
$s2_in += 16;
$s2_out = StringInStr($str2, '</td>', 0, 1, $s2_in);
$s2 = Number(StringMid($str2, $s2_in, $s2_out - $s2_in));
Else
$s2_in = StringInStr($str2, '<td class="message">', 0, 1, $s1_out);
$s2_out = StringInStr($str2, '</td>', 0, 1, $s2_in);
EndIf
;SDK-------------------------------------------------------------------------------
$s3_in = StringInStr($str3, '<td class="pre">', 0, 1, 1) ;
if $s3_in>=1 then
$s3_in += 16;
$s3_out = StringInStr($str3, '</td>', 0, 1, $s3_in);
$s3 = Number(StringMid($str3, $s3_in, $s3_out - $s3_in));
EndIf
;-------------------------------
#ce
$s1 = _get_rasparse($str1);
$s2 = _get_rasparse($str2);
$s3 = _get_rasparse($str3);
_get_prognoz($i,1, $s1);
_get_prognoz($i,2, $s2);
_get_prognoz($i,3, $s3);
;Заполняем таблицу полученными данными
$table[$i][0] = _Get_city($str);
$table[$i][1] = $s1;
$table[$i][2] = $s2;
$table[$i][3] = $s3;
logprint($table[$i][0] & " = " & $table[$i][1] & " , " & $table[$i][2] & " , " & $table[$i][3]);
;-------------------------------
$i += 1;
;-------------------------------
$str_continue = $str_out ;+ 20;
WEnd
;--------------------------------------------------------------------------------------------
log_print("GetParse end");
return
EndFunc
;*********************************************************************************************************************************
;*Выпарсивает из кусочка текста нужный параметр выходной мощности
;*********************************************************************************************************************************
Func _get_rasparse($stroka)
Local $s1_in=0;
Local $s1_out=0;
Local $s1 = "0";
;MUX1--------------------------------------------------------------------------------
$s1_in = StringInStr($stroka, '<td class="pre">', 0, 1, 1);
;ConsoleWrite("$s1_in = " & $s1_in & @CRLF);
if $s1_in>=1 then
$s1_in += 16;
$s1_out = StringInStr($stroka, '</td>', 0, 1, $s1_in);
$s1 = Number(StringMid($stroka, $s1_in , $s1_out - $s1_in));
;Else
; $s1_in = StringInStr($stroka, '<td class="message">', 0, 1, $s1_out);
; $s1_out = StringInStr($stroka, '</td>', 0, 1, $s1_in);
EndIf
return $s1;
EndFunc
;*********************************************************************************************************************************
;Делает прогноз температурного движения и ляпает стрелку в куды
;*********************************************************************************************************************************
Func _get_prognoz($it, $t, $s)
$prognoz[$it][$t] = ""
$bold[$it][$t] = $FW_NORMAL;
;если предыдущее значение меньше нового то идёт рост
if $table[$it][$t] < $s then
$bold[$it][$t] = $FW_BOLD;
$prognoz[$it][$t] = "↑"
endif
;если предыдущее значение больше нового то идёт падение
if $table[$it][$t] > $s then
$bold[$it][$t] = $FW_BOLD;
$prognoz[$it][$t] = "↓"
endif
EndFunc
;*********************************************************************************************************************************
;* Извлекаем название населённого пункта, костыльно, но так проще и быстрее
;*********************************************************************************************************************************
Func _Get_city($s)
;$s = _Encoding_StringToUTF8($s);
;$s = Unicode2Asc($s);
;ConsoleWrite("$s = " & $s & @CRLF);
if StringInStr($s,_Encoding_StringToUTF8("Амгунь"))>=2 then return "Амгунь"
if StringInStr($s,_Encoding_StringToUTF8("Амурск"))>=2 then return "Амурск"
if StringInStr($s,_Encoding_StringToUTF8("Берёзовый"))>=2 then return "Берёзовый"
if StringInStr($s,_Encoding_StringToUTF8("Березовый"))>=2 then return "Берёзовый"
if StringInStr($s,_Encoding_StringToUTF8("Боктор"))>=2 then return "Боктор"
if StringInStr($s,_Encoding_StringToUTF8("Болен"))>=2 then return "Болен"
if StringInStr($s,_Encoding_StringToUTF8("Бриакан"))>=2 then return "Бриакан"
if StringInStr($s,_Encoding_StringToUTF8("Ванино"))>=2 then return "Ванино"
if StringInStr($s,_Encoding_StringToUTF8("Верхнетамбовское"))>=2 then return "Верхнетамбовское"
if StringInStr($s,_Encoding_StringToUTF8("Высокогорный"))>=2 then return "Высокогорный"
if StringInStr($s,_Encoding_StringToUTF8("Галичный"))>=2 then return "Галичный"
if StringInStr($s,_Encoding_StringToUTF8("Главный"))>=2 then return "Главный Стан"
if StringInStr($s,_Encoding_StringToUTF8("Горин"))>=2 then return "Горин"
if StringInStr($s,_Encoding_StringToUTF8("Горный"))>=2 then return "Горный"
if StringInStr($s,_Encoding_StringToUTF8("Гурское"))>=2 then return "Гурское"
if StringInStr($s,_Encoding_StringToUTF8("Даппы"))>=2 then return "Даппы"
if StringInStr($s,_Encoding_StringToUTF8("Джамку"))>=2 then return "Джамку"
if StringInStr($s,_Encoding_StringToUTF8("Известковый"))>=2 then return "Известковый"
if StringInStr($s,_Encoding_StringToUTF8("Осипенко"))>=2 then return "П.Осипенко"
if StringInStr($s,_Encoding_StringToUTF8("Кенай"))>=2 then return "Кенай"
if StringInStr($s,_Encoding_StringToUTF8("Комсомольск"))>=2 then return "Комсомольск"
if StringInStr($s,_Encoding_StringToUTF8("Кондон"))>=2 then return "Кондон"
if StringInStr($s,_Encoding_StringToUTF8("Малмыж"))>=2 then return "Малмыж"
if StringInStr($s,_Encoding_StringToUTF8("Нижнетамб"))>=2 then return "Нижнетамбовское"
if StringInStr($s,_Encoding_StringToUTF8("Халбы"))>=2 then return "Нижние Халбы"
if StringInStr($s,_Encoding_StringToUTF8("Селихино"))>=2 then return "Селихино"
if StringInStr($s,_Encoding_StringToUTF8("Снежный"))>=2 then return "Снежный"
if StringInStr($s,_Encoding_StringToUTF8("Советская"))>=2 then return "Советская Гавань"
if StringInStr($s,_Encoding_StringToUTF8("Солнечный"))>=2 then return "Солнечный"
if StringInStr($s,_Encoding_StringToUTF8("Тумнин"))>=2 then return "Тумнин"
if StringInStr($s,_Encoding_StringToUTF8("Удское"))>=2 then return "Удское"
if StringInStr($s,_Encoding_StringToUTF8("Уктур"))>=2 then return "Уктур"
if StringInStr($s,_Encoding_StringToUTF8("Чегдомын"))>=2 then return "Чегдомын"
if StringInStr($s,_Encoding_StringToUTF8("Черный"))>=2 then return "Черный Мыс"
if StringInStr($s,_Encoding_StringToUTF8("Чумикан"))>=2 then return "Чумикан"
if StringInStr($s,_Encoding_StringToUTF8("Эворон"))>=2 then return "Эворон"
if StringInStr($s,_Encoding_StringToUTF8("Эльбан"))>=2 then return "Эльбан"
if StringInStr($s,_Encoding_StringToUTF8("Этыркэн"))>=2 then return "Этыркэн"
if StringInStr($s,_Encoding_StringToUTF8("Ягодный"))>=2 then return "Ягодный"
return "неизвестно"
EndFunc