Температурная карта объектов ver1

В связи с производственной необходимостью мониторинга температурных состояний объектов и устройств был разработан данный комплексный экран.



Цветами выделены состояния, критический, предупреждение и т.д. Также прикручена аналитика температурного тренда(повышается понижается)

Данные берутся через 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