.items
Код: Выделить всё
//Item-ы управления кондиционером
// HVAC1_Mode Режим работы
// HVAC_HOT = 1
// HVAC_COLD = 2
// HVAC_DRY = 3
// HVAC_VENT = 4
// HVAC_AUTO = 10
// HVAC1_Temp Температура
// min 16 max 31
// HVAC1_FanMode Режим работы вентилятора
// FAN_SPEED_1 = 1
// FAN_SPEED_2 = 2
// FAN_SPEED_3 = 3
// FAN_SPEED_4 = 4
// FAN_SILENT = 5
// FAN_AUTO = 10
// HVAC1_VanneMode Режим работы заслонок
// VANNE_H1 = 1
// VANNE_H2 = 2
// VANNE_H3 = 3
// VANNE_H4 = 4
// VANNE_H5 = 5
// VANNE_AUTO_MOVE = 6
// VANNE_AUTO = 10
// HVAC1_Power ВКЛ/ВЫКЛ
// ON/OFF
Number HVAC1_Temp "HVAC1 Температура [%d °C]" <temperature>
Number HVAC1_Mode "HVAC1 Режим [%d]"
Number HVAC1_FanMode "HVAC1 Вентилятор [%d]"
Number HVAC1_VanneMode "HVAC1 Заслонки [%d]"
Switch HVAC1_Power "HVAC1 Вкл/Выкл"
//Item Ошибки кондиционера
Number HVAC1_Err "HVAC1 Ошибка [%d]" //0-no 1-IR send error
//Item-ы для тестирования
String HVAC1_Command "HVAC1 ИК-команда: [%s]"
Switch HVAC1_SendIRCommand "HVAC1 Послать ИК"
Код: Выделить всё
//Функция отправки ИК-команды Меге
// Параметры:
// String IP MegaD
// String пароль к MegaD
// Integer порт MegaD
// String ИК-команда (ir=....)
// Integer Количество повторений посылки
// Integer Пауза между посылками (милисек)
// Возвращает Bollean true-OK false-Ошибка
//Для отправки HTTP Get запроса используется sendHttpGetRequest
//timeout ожидания ответа задается в Services/http.cfg (конфиг HTTP-биндинга), default 5 сек
val Functions$Function6<String,String,Integer,String,Integer,Integer,Boolean>
SendIRCommand = [
MegaIP,MegaPass,MegaPort,IR_Command,NumOfRepeat,Pause
|
var String http_request
var String ret
var int i
if(NumOfRepeat<1)return false
http_request="http://"+MegaIP+"/"+MegaPass+"/?pt="+MegaPort+"&"+IR_Command
for(i=0;i<NumOfRepeat;i++)
{
ret=sendHttpGetRequest(http_request)
if(ret!="Done")
{
return false
}
if(i<(NumOfRepeat-1))Thread::sleep(Pause)
}
return true
]
//Функция генерации строки ИК-команды MegaD
//для кондиционеров Mitsubishi Electric MSZ-SF, функционал пульта SG15D
// Параметры:
// NumberItem Item Режим работы
// HVAC_HOT = 1
// HVAC_COLD = 2
// HVAC_DRY = 3
// HVAC_VENT = 4
// HVAC_AUTO = 10
// NumberItem Item Температура
// min 16 max 31
// NumberItem Item Режим работы вентилятора
// FAN_SPEED_1 = 1
// FAN_SPEED_2 = 2
// FAN_SPEED_3 = 3
// FAN_SPEED_4 = 4
// FAN_SILENT = 5
// FAN_AUTO = 10
// NumberItem Item Режим работы заслонок
// VANNE_H1 = 1
// VANNE_H2 = 2
// VANNE_H3 = 3
// VANNE_H4 = 4
// VANNE_H5 = 5
// VANNE_AUTO_MOVE = 6
// VANNE_AUTO = 10
// SwitchItem Item ВКЛ/ВЫКЛ
// ON/OFF
// Возвращает String ИК-Команда в формате MegaD: ir=...
val Functions$Function5<NumberItem,NumberItem,NumberItem,NumberItem,SwitchItem,String>
Generate_MitsubishiSG15D_IRCommand = [
HVAC_Mode,HVAC_Temp,HVAC_FanMode,HVAC_VanneMode,HVAC_Power
|
//HvacMode
val int HVAC_HOT = 1
val int HVAC_COLD = 2
val int HVAC_DRY = 3
val int HVAC_VENT = 4
val int HVAC_AUTO = 10
//HvacFanMode
val int FAN_SPEED_1 = 1
val int FAN_SPEED_2 = 2
val int FAN_SPEED_3 = 3
val int FAN_SPEED_4 = 4
val int FAN_AUTO = 10
val int FAN_SILENT = 5
//HvacVanneMode
val int VANNE_H1 = 1
val int VANNE_H2 = 2
val int VANNE_H3 = 3
val int VANNE_H4 = 4
val int VANNE_H5 = 5
val int VANNE_AUTO_MOVE = 6
val int VANNE_AUTO = 10
val int HVAC_DEF_TEMP = 22
var int[] data = newArrayList( 0x23, 0xCB, 0x26, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 )
//массив "отзеркаленных" (00110000 -> 00001100) байт в HEX-формате, мега в ИК понимает только так
//используется для быстрого преобразования
var String[] MirrorBytes = newArrayList ("00","80","40","c0","20","a0","60","e0","10","90","50","d0","30","b0","70","f0","08","88","48","c8","28","a8","68","e8","18","98","58","d8","38","b8","78","f8","04","84","44","c4","24","a4","64","e4","14","94","54","d4","34","b4","74","f4","0c","8c","4c","cc","2c","ac","6c","ec","1c","9c","5c","dc","3c","bc","7c","fc","02","82","42","c2","22","a2","62","e2","12","92","52","d2","32","b2","72","f2","0a","8a","4a","ca","2a","aa","6a","ea","1a","9a","5a","da","3a","ba","7a","fa","06","86","46","c6","26","a6","66","e6","16","96","56","d6","36","b6","76","f6","0e","8e","4e","ce","2e","ae","6e","ee","1e","9e","5e","de","3e","be","7e","fe","01","81","41","c1","21","a1","61","e1","11","91","51","d1","31","b1","71","f1","09","89","49","c9","29","a9","69","e9","19","99","59","d9","39","b9","79","f9","05","85","45","c5","25","a5","65","e5","15","95","55","d5","35","b5","75","f5","0d","8d","4d","cd","2d","ad","6d","ed","1d","9d","5d","dd","3d","bd","7d","fd","03","83","43","c3","23","a3","63","e3","13","93","53","d3","33","b3","73","f3","0b","8b","4b","cb","2b","ab","6b","eb","1b","9b","5b","db","3b","bb","7b","fb","07","87","47","c7","27","a7","67","e7","17","97","57","d7","37","b7","77","f7","0f","8f","4f","cf","2f","af","6f","ef","1f","9f","5f","df","3f","bf","7f","ff")
var int i = 0
var int b = 0
var String MegaDir_Command_String = ""
//Инициализция, если нужно
if(HVAC_Temp.state == NULL)HVAC_Temp.postUpdate(HVAC_DEF_TEMP)
if(HVAC_Mode.state == NULL)HVAC_Mode.postUpdate(HVAC_AUTO)
if(HVAC_FanMode.state == NULL)HVAC_FanMode.postUpdate(FAN_AUTO)
if(HVAC_VanneMode.state == NULL)HVAC_VanneMode.postUpdate(VANNE_AUTO)
if(HVAC_Power.state == NULL)HVAC_Power.postUpdate(OFF)
// Byte 0 - 4 Constant Header
// Byte 5 - On / Off
if (HVAC_Power.state==OFF)
{
data.set(5, 0x0)// Turn OFF HVAC
}
else
{
data.set(5, 0x20) // Turn ON HVAC
}
// Byte 6 - Mode
switch (HVAC_Mode.state)
{
case HVAC_HOT: data.set(6, 0x08)
case HVAC_COLD: data.set(6, 0x18)
case HVAC_DRY: data.set(6, 0x10)
case HVAC_VENT: data.set(6, 0x38)
case HVAC_AUTO: data.set(6, 0x20)
default://если неверное значение
{
data.set(6, 0x20)
HVAC_Mode.postUpdate(HVAC_AUTO)
}
}
// Byte 7 - Temperature
// Check Min Max For Hot Mode
if((HVAC_Mode.state!=HVAC_DRY)&&(HVAC_Mode.state!=HVAC_VENT))
{
b=(HVAC_Temp.state as DecimalType).intValue
if ( b > 31)
{
HVAC_Temp.postUpdate(31)
b=31
}
else if (b < 16)
{
HVAC_Temp.postUpdate(16)
b=16
}
data.set(7, b-16)
}
else data.set(7, 0x08)//v rezhime DRY,VENT pult shlet 24 gradusa
// Byte 8 - Mode v2???
switch (HVAC_Mode.state)
{
case HVAC_HOT: data.set(8, 0x30)
case HVAC_COLD: data.set(8, 0x36)
case HVAC_DRY: data.set(8, 0x32)
case HVAC_VENT: data.set(8, 0x30)
case HVAC_AUTO: data.set(8, 0x36)
default:
{
data.set(8, 0x36)//если неверное значение
HVAC_Mode.postUpdate(HVAC_COLD)
}
}
// Byte 9 - FAN / VANNE
switch (HVAC_FanMode.state)
{
case FAN_SPEED_1: i=0x01
case FAN_SPEED_2: i=0x02
case FAN_SPEED_3: i=0x03
case FAN_SPEED_4: i=0x04
case FAN_SILENT: i=0x05
case FAN_AUTO: i=0x00
default://если неверное значение
{
i=0x00
HVAC_FanMode.postUpdate(FAN_AUTO)
}
}
switch (HVAC_VanneMode.state)
{
case VANNE_AUTO: i+=0x40
case VANNE_H1: i+=0x48
case VANNE_H2: i+=0x50
case VANNE_H3: i+=0x58
case VANNE_H4: i+=0x60
case VANNE_H5: i+=0x68
case VANNE_AUTO_MOVE: i+=0x78
default://если неверное значение
{
i+=0x40
HVAC_VanneMode.postUpdate(VANNE_AUTO)
}
}
data.set(9,i)
// Byte 17 - CRC
for (i = 0, b = 0; i < 17; i++)
{
b+=data.get(i); // CRC is a simple bits addition
}
b%=256
data.set(17,b)
//Command string
for(i=0;i<18;i++)
{
b=data.get(i)
MegaDir_Command_String+=MirrorBytes.get(b)
}
return "ir="+MegaDir_Command_String+"&irp0=3400&irp1=1650&irp2=450&irp3=1230&irp4=390"
]
//Инициализация при старте системы/перезагрузке правил
//Item-ы управления кондиционером инициализируются при первой попытке генерации ИК-команды
rule "HVAC1 on System Start"
when
System started
then
postUpdate(HVAC1_SendIRCommand,OFF)
postUpdate(HVAC1_Err,0)
postUpdate(HVAC1_Command,"No command, system start...")
end
//Если нажата кнопка отправки ИК-команды
rule "HVAC1 Send IR Command"
when
Item HVAC1_SendIRCommand changed to ON
then
var String ir_command
//генерируем ИК команду
ir_command=Generate_MitsubishiSG15D_IRCommand.apply(HVAC1_Mode, HVAC1_Temp, HVAC1_FanMode, HVAC1_VanneMode, HVAC1_Power)
//пытаемся послать ее Меге
if(SendIRCommand.apply("192.168.0.14","sec",12,ir_command,2,15)==false)
{
HVAC1_Err.postUpdate(1)
}
//выключаем Switch отправки команды
HVAC1_SendIRCommand.postUpdate(OFF)
//выводим для отладки отправленную ИК-команду
HVAC1_Command.postUpdate(ir_command)
end
Код: Выделить всё
Switch item=HVAC1_SendIRCommand
Switch item=HVAC1_Power
Setpoint item=HVAC1_Temp minValue=16 maxValue=31 step=1
Switch item=HVAC1_Mode mappings=[ "1" = "HOT", "2" = "COLD" ,"3" = "DRY", "4" = "VENT", "10" = "AUTO" ]
Switch item=HVAC1_FanMode mappings=[ 1 = "s1", 2 = "s2" ,3 = "s3", 4 = "s4" , 5 = "SILENT", 10 = "AUTO"]
Switch item=HVAC1_VanneMode mappings=[ "1" = "p1", "2" = "p2" ,"3" = "p3", "4" = "p4" , "5" = "p5", "6" = "MOVE", "10" = "AUTO"]
Text item=HVAC1_Command
Text item=HVAC1_Err