Управление кондиционерами Mitsubishi Electric по ИК

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Ответить
Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Управление кондиционерами Mitsubishi Electric по ИК

Сообщение Igor78 » 03 мар 2018, 19:36

Выкладываю рабочие конфиги OpenHAB2 для генерации и отправки ИК-команд для управления кондиционерами Mitsubishi Electric серии MSZ-SF, но, скорее всего, будет работать и с другими сериями. При написании использована информация из статьи https://www.analysir.com/blog/2015/01/0 ... -protocol/

.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 Послать ИК"
.rules

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

//Функция отправки ИК-команды Меге
//	Параметры:
//		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
.sitemap

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

		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
С уважением, Игорь

Ответить