Browse Source

버그수정

pangs 5 years ago
parent
commit
29063981c0

+ 4 - 3
src/main/java/com/icontrols/kakao/common/SERVERINFO.java

@@ -20,7 +20,8 @@ public class SERVERINFO {
 	// public static final String SendEventIP = "http://112.220.212.226"; //이통사 상용서버
 	// public static final String SendEventIP = "http://112.220.212.226"; //이통사 상용서버
 	
 	
 	public static final String SendDevEventURL = "http://localhost"; // 중계서버로 변경해야함.
 	public static final String SendDevEventURL = "http://localhost"; // 중계서버로 변경해야함.
-	public static final String SendKakaoEventURL = "https://teldev.hdc-smart.com"; // 중계서버로 변경해야함.
+	public static final String SendKakaoEventURL = "https://telproxy.hdc-smart.com"; // 중계서버로 변경해야함.
+//	public static final String SendKakaoEventURL = "https://teldev.hdc-smart.com"; // 중계서버로 변경해야함.
 //	public static final String SendKakaoEventURL = "https://kakaohome-api.i.kakao.com"; // 중계서버로 변경해야함.
 //	public static final String SendKakaoEventURL = "https://kakaohome-api.i.kakao.com"; // 중계서버로 변경해야함.
 	
 	
 	public static String SendEventURL = "https://hdc-smart.com";
 	public static String SendEventURL = "https://hdc-smart.com";
@@ -37,8 +38,8 @@ public class SERVERINFO {
 
 
 	public static boolean GasCount_HardCoding_One = false;
 	public static boolean GasCount_HardCoding_One = false;
 
 
-	public static final String KAKAO_HEADER_CLIENT_ID = "XMPHQZVWXI";
-	public static final String KAKAO_HEADER_CLIENT_SECRET = "SCJMXYNDVSNKOPRCRKHS";
+	public static final String KAKAO_HEADER_CLIENT_ID = "MPAHXKWELS";
+	public static final String KAKAO_HEADER_CLIENT_SECRET = "SHDPEOWJSKDZALQXLDNS";
 	
 	
 	public static final String KAKAO_EVENT_CLIENT_ID = "pkevk1F4cKHzs7rN4MHe25wYnUm3kRvh";
 	public static final String KAKAO_EVENT_CLIENT_ID = "pkevk1F4cKHzs7rN4MHe25wYnUm3kRvh";
 	public static final String KAKAO_EVENT_CLIENT_SECRET = "pF2UrvbhkAqbptG4SyrsUU5pTB1DWtqm";
 	public static final String KAKAO_EVENT_CLIENT_SECRET = "pF2UrvbhkAqbptG4SyrsUU5pTB1DWtqm";

+ 23 - 23
src/main/java/com/icontrols/kakao/common/THINGS_INFO.java

@@ -23,7 +23,7 @@ public final class THINGS_INFO {
 		LIGHT("light","{\"capabilities\" : [ { \"name\" : \"Power\" } ]}"),
 		LIGHT("light","{\"capabilities\" : [ { \"name\" : \"Power\" } ]}"),
 		LIGHT_DIMMER("dimming","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Brightness\" } ]}"),
 		LIGHT_DIMMER("dimming","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Brightness\" } ]}"),
 		COLOR_LIGHT("colorLight", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"ColorMode\"}, { \"name\" : \"ColorTemperature\"} ]}"),
 		COLOR_LIGHT("colorLight", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"ColorMode\"}, { \"name\" : \"ColorTemperature\"} ]}"),
-		COLOR_LIGHT_DIMMER("colorDimming", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Brightness\" }, { \"name\" : \"ColorMode\"}, { \"name\" : \"ColorTemperature\"} ]}"),
+		COLOR_LIGHT_DIMMER("colorDimming", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Brightness\" }, { \"name\" : \"ColorMode\"}, { \"name\" : \"ColorTemperature\", \"attributes\" : { \"colorTemperature\": { \"min\":3000, \"max\":5700 } } } ]}"),
 		TEMPER("temper", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Temperature\" }, { \"name\" : \"TemperatureSetpoint\" } ]}"),
 		TEMPER("temper", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Temperature\" }, { \"name\" : \"TemperatureSetpoint\" } ]}"),
 		VENTIL("ventil","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"AirFlow\" } ]}"),
 		VENTIL("ventil","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"AirFlow\" } ]}"),
 		GAS("gas","{\"capabilities\" : [ { \"name\" : \"Lock\" } ] }"),
 		GAS("gas","{\"capabilities\" : [ { \"name\" : \"Lock\" } ] }"),
@@ -53,33 +53,33 @@ public final class THINGS_INFO {
 	
 	
 	public enum DEVICE_DETAIL{
 	public enum DEVICE_DETAIL{
 		LIVINGLIGHT					("livinglight", 				"Light", 			"거실조명"),
 		LIVINGLIGHT					("livinglight", 				"Light", 			"거실조명"),
-		LIGHT01						("light01",						"Light",			"방조명"),
-		LIGHT02						("light02",						"Light",			"서재조명"),
-		LIGHT03						("light03",						"Light",			"작은방조명"),
-		LIGHT04						("light04",						"Light",			"방조명"),
+		LIGHT01						("light01",						"Light",			"방조명"),
+		LIGHT02						("light02",						"Light",			"방1조명"),
+		LIGHT03						("light03",						"Light",			"방2조명"),
+		LIGHT04						("light04",						"Light",			"방3조명"),
 		DIMMER_LIVINGLIGHT			("dimmer_livinglight", 			"LightDimmer", 		"거실조명"),
 		DIMMER_LIVINGLIGHT			("dimmer_livinglight", 			"LightDimmer", 		"거실조명"),
-		DIMMER_LIGHT01				("dimmer_light01",				"LightDimmer",		"방조명"),
-		DIMMER_LIGHT02				("dimmer_light02",				"LightDimmer",		"서재조명"),
-		DIMMER_LIGHT03				("dimmer_light03",				"LightDimmer",		"작은방조명"),
-		DIMMER_LIGHT04				("dimmer_light04",				"LightDimmer",		"방조명"),
+		DIMMER_LIGHT01				("dimmer_light01",				"LightDimmer",		"방조명"),
+		DIMMER_LIGHT02				("dimmer_light02",				"LightDimmer",		"방1조명"),
+		DIMMER_LIGHT03				("dimmer_light03",				"LightDimmer",		"방2조명"),
+		DIMMER_LIGHT04				("dimmer_light04",				"LightDimmer",		"방3조명"),
 		COLOR_DIMMER_LIVINGLIGHT	("colorDimmer_livinglight", 	"ColorLightDimmer",	"거실조명"),
 		COLOR_DIMMER_LIVINGLIGHT	("colorDimmer_livinglight", 	"ColorLightDimmer",	"거실조명"),
-		COLOR_DIMMER_LIGHT01		("colorDimmer_light01",			"ColorLightDimmer",	"방조명"),
-		COLOR_DIMMER_LIGHT02		("colorDimmer_light02",			"ColorLightDimmer",	"서재조명"),
-		COLOR_DIMMER_LIGHT03		("colorDimmer_light03",			"ColorLightDimmer",	"작은방조명"),
-		COLOR_DIMMER_LIGHT04		("colorDimmer_light04",			"ColorLightDimmer",	"방조명"),
+		COLOR_DIMMER_LIGHT01		("colorDimmer_light01",			"ColorLightDimmer",	"방조명"),
+		COLOR_DIMMER_LIGHT02		("colorDimmer_light02",			"ColorLightDimmer",	"방1조명"),
+		COLOR_DIMMER_LIGHT03		("colorDimmer_light03",			"ColorLightDimmer",	"방2조명"),
+		COLOR_DIMMER_LIGHT04		("colorDimmer_light04",			"ColorLightDimmer",	"방3조명"),
 		VENTIL						("ventil",						"AirVentilator",	"환기"),
 		VENTIL						("ventil",						"AirVentilator",	"환기"),
 		GAS							("gas",							"GasValve",			"가스밸브"),
 		GAS							("gas",							"GasValve",			"가스밸브"),
-		ELEVATOR					("ElevatorCaller",				"ElevatorCaller",	"엘리베이터"),
+		ELEVATOR					("elevator",					"ElevatorCaller",	"엘리베이터"),
 		TEMPER1						("temper_1",					"FloorHeater",		"거실난방"),
 		TEMPER1						("temper_1",					"FloorHeater",		"거실난방"),
-		TEMPER2						("temper_2",					"FloorHeater",		"방난방"),
-		TEMPER3						("temper_3",					"FloorHeater",		"서재난방"),
-		TEMPER4						("temper_4",					"FloorHeater",		"작은방난방"),
-		TEMPER5						("temper_5",					"FloorHeater",		"방난방"),
+		TEMPER2						("temper_2",					"FloorHeater",		"방난방"),
+		TEMPER3						("temper_3",					"FloorHeater",		"방1난방"),
+		TEMPER4						("temper_4",					"FloorHeater",		"방2난방"),
+		TEMPER5						("temper_5",					"FloorHeater",		"방3난방"),
 		ELECTRIC01					("electric01",					"PowerOutlet",		"거실콘센트"),
 		ELECTRIC01					("electric01",					"PowerOutlet",		"거실콘센트"),
-		ELECTRIC02					("electric02",					"PowerOutlet",		"방콘센트"),
-		ELECTRIC03					("electric03",					"PowerOutlet",		"서재콘센트"),
-		ELECTRIC04					("electric04",					"PowerOutlet",		"작은방콘센트"),
-		ELECTRIC05					("electric05",					"PowerOutlet",		"방콘센트")
+		ELECTRIC02					("electric02",					"PowerOutlet",		"방콘센트"),
+		ELECTRIC03					("electric03",					"PowerOutlet",		"방1콘센트"),
+		ELECTRIC04					("electric04",					"PowerOutlet",		"방2콘센트"),
+		ELECTRIC05					("electric05",					"PowerOutlet",		"방3콘센트")
 		;
 		;
 		
 		
 		
 		
@@ -138,7 +138,7 @@ public final class THINGS_INFO {
 		PARCEL			(11, "PARCEL", 			"parcel", 				"택배도착"),
 		PARCEL			(11, "PARCEL", 			"parcel", 				"택배도착"),
 		HEMS			(12, "HEMS", 			"hems", 				"원격검침"),
 		HEMS			(12, "HEMS", 			"hems", 				"원격검침"),
 		CARIN			(13, "CARIN", 			"carin", 				"주차관제(입차/출차)"),
 		CARIN			(13, "CARIN", 			"carin", 				"주차관제(입차/출차)"),
-		ELEVATOR		(14, "ELEVATORCALLER",	"ElevatorCaller", 		"엘리베이터"),
+		ELEVATOR		(14, "elevator",		"ElevatorCaller", 		"엘리베이터"),
 		VISITOR			(15, "VISITOR", 		"visitor", 				"방문자"),
 		VISITOR			(15, "VISITOR", 		"visitor", 				"방문자"),
 		EMERGENCY		(16, "EMERGENCY", 		"emergency", 			"방범"),
 		EMERGENCY		(16, "EMERGENCY", 		"emergency", 			"방범"),
 		LIGHTDIMMER		(17, "DIMMER", 	"LightDimmer", 			"디밍제어 조명"),
 		LIGHTDIMMER		(17, "DIMMER", 	"LightDimmer", 			"디밍제어 조명"),

+ 3 - 3
src/main/java/com/icontrols/kakao/service/impl/AccessTokenServiceImpl.java

@@ -108,7 +108,7 @@ public class AccessTokenServiceImpl implements AccessTokenService {
 			
 			
 			e.printStackTrace();
 			e.printStackTrace();
 		}finally {
 		}finally {
-			logger.info("AccessTokenService [CREATE] - " + retMap.toString());
+			logger.info("AccessTokenService [CREATE] - [END] - " + retMap.toString());
 		}
 		}
 		
 		
 		return retMap;
 		return retMap;
@@ -176,7 +176,7 @@ public class AccessTokenServiceImpl implements AccessTokenService {
 			retMap.put("error", errMap);
 			retMap.put("error", errMap);
 			e.printStackTrace();
 			e.printStackTrace();
 		}finally {
 		}finally {
-			logger.info("AccessTokenService [REFRESH] - " + retMap.toString());
+			logger.info("AccessTokenService [REFRESH] - [END] - " + retMap.toString());
 		}
 		}
 		return retMap;
 		return retMap;
 	}
 	}
@@ -243,7 +243,7 @@ public class AccessTokenServiceImpl implements AccessTokenService {
 			
 			
 			retMap.put("error", errMap);
 			retMap.put("error", errMap);
 		}finally {
 		}finally {
-			logger.info("AccessTokenService [GET] - " + retMap.toString());
+			logger.info("AccessTokenService [GET] - [END] - " + retMap.toString());
 		}
 		}
 		return retMap;
 		return retMap;
 	}
 	}

+ 3 - 0
src/main/java/com/icontrols/kakao/service/impl/KakaoExtensionServiceImpl.java

@@ -256,12 +256,15 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 		List<ThingsInfo> thingsInfoList = thingsInfoRepository.findByDongAndHoAndEndpointId(Integer.toString(dong), Integer.toString(ho), endpointId);
 		List<ThingsInfo> thingsInfoList = thingsInfoRepository.findByDongAndHoAndEndpointId(Integer.toString(dong), Integer.toString(ho), endpointId);
 		
 		
 		if(thingsInfoList == null || thingsInfoList.size() == 0) {
 		if(thingsInfoList == null || thingsInfoList.size() == 0) {
+			logger.error("[UPDATE-ERROR] - " + dong + "/" + ho + " - "+ endpointId + " is not exist");
 			retMap = new HashMap<String, Object>();
 			retMap = new HashMap<String, Object>();
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 		}else {
 		}else {
 			retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired);
 			retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired);
 		}
 		}
+		
 		logger.debug("UPDATE-->>retMap : " + retMap.toString());
 		logger.debug("UPDATE-->>retMap : " + retMap.toString());
+		
 		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
 		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
 			param.remove(KEY_INFO.HTTP_KEY_BODY);
 			param.remove(KEY_INFO.HTTP_KEY_BODY);
 			param.putAll(retMap);
 			param.putAll(retMap);

+ 2 - 1
src/main/java/com/icontrols/kakao/socket/utils/SSLClient.java

@@ -83,7 +83,8 @@ public class SSLClient {
 			logger.info("-->ip address -- " + mInetAddress + " -- " + port);
 			logger.info("-->ip address -- " + mInetAddress + " -- " + port);
 			sslSocket = sf.createSocket(mInetAddress, port);
 			sslSocket = sf.createSocket(mInetAddress, port);
 		} catch (Exception e) {
 		} catch (Exception e) {
-			logger.info("[SSLClient] TLS Socket Make Exception Error");
+			logger.error("[SSLClient] TLS Socket Make Exception Error");
+			logger.error("[SSLClient] message : " + e.getMessage());
 			e.printStackTrace();
 			e.printStackTrace();
 		}
 		}
 	}
 	}

+ 16 - 7
src/main/java/com/icontrols/kakao/socket/wallpad/KakaoEventHandler.java

@@ -13,6 +13,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.client.HttpClients;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.http.MediaType;
@@ -34,6 +35,7 @@ import com.icontrols.kakao.entity.DonghoInfo;
 import com.icontrols.kakao.entity.UserInfo;
 import com.icontrols.kakao.entity.UserInfo;
 import com.icontrols.kakao.repo.DonghoInfoRepository;
 import com.icontrols.kakao.repo.DonghoInfoRepository;
 import com.icontrols.kakao.repo.UserInfoRepository;
 import com.icontrols.kakao.repo.UserInfoRepository;
+import com.icontrols.kakao.service.AuthService;
 
 
 @Service("kakaoEventHandler")
 @Service("kakaoEventHandler")
 public class KakaoEventHandler {
 public class KakaoEventHandler {
@@ -48,6 +50,9 @@ public class KakaoEventHandler {
 	@Resource(name="wallpadMsgSender")
 	@Resource(name="wallpadMsgSender")
 	private WallpadMsgSender wallpadMsgSender;
 	private WallpadMsgSender wallpadMsgSender;
 	
 	
+	@Autowired
+	private AuthService authService;
+	
 	@Async("eventExecutor")
 	@Async("eventExecutor")
 	public CompletableFuture<Map<String, Object>> sendEventAsync(UserInfo userInfo, Map<String, Object> params) throws InterruptedException{
 	public CompletableFuture<Map<String, Object>> sendEventAsync(UserInfo userInfo, Map<String, Object> params) throws InterruptedException{
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		Map<String, Object> retMap = new HashMap<String, Object>();
@@ -82,7 +87,7 @@ public class KakaoEventHandler {
 			Map<String, Object> sendResult = sendStatusResult(userInfo, params);
 			Map<String, Object> sendResult = sendStatusResult(userInfo, params);
 			
 			
 			int code = (int) sendResult.get("result");
 			int code = (int) sendResult.get("result");
-			
+			logger.info("[EVENT RESULT] - ["+code+"]");
 			UserInfoRepository repo = null;
 			UserInfoRepository repo = null;
 			switch(code) {
 			switch(code) {
 			case KAKAO_RESULT.FAIL_INTERNAL:
 			case KAKAO_RESULT.FAIL_INTERNAL:
@@ -108,6 +113,7 @@ public class KakaoEventHandler {
 				retMap.put("message", "ID-["+userInfo.getId() + "]-FAIL_UNLINKEXTENSION_SERVICE");
 				retMap.put("message", "ID-["+userInfo.getId() + "]-FAIL_UNLINKEXTENSION_SERVICE");
 				
 				
 				// 월패드 해지요청
 				// 월패드 해지요청
+				new UnlinkExtensionHandler(userInfo.getDonghoInfo().getDong(), userInfo.getDonghoInfo().getHo()).start();
 				
 				
 				break;
 				break;
 			case KAKAO_RESULT.FAIL_EXPIREDTOKEN:  // 만료된 토큰, 토큰 재발급 뒤 재시도.
 			case KAKAO_RESULT.FAIL_EXPIREDTOKEN:  // 만료된 토큰, 토큰 재발급 뒤 재시도.
@@ -144,10 +150,9 @@ public class KakaoEventHandler {
 			}
 			}
 		}catch(Exception e) {
 		}catch(Exception e) {
 			retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL);
 			retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL);
-			
-			retMap.put("message", "ID-["+userInfo.getId() + "]-" + e.getMessage());
-			logger.error("ERROR" + e.getStackTrace());
+			logger.error("[ERROR] - " + e.getMessage());
 			e.printStackTrace();
 			e.printStackTrace();
+			retMap.put("message", "event send Error = " + e.getMessage());
 		}
 		}
 		
 		
 		return CompletableFuture.completedFuture(retMap);
 		return CompletableFuture.completedFuture(retMap);
@@ -255,8 +260,8 @@ public class KakaoEventHandler {
 		HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(parameters, headers);
 		HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(parameters, headers);
 		
 		
 		String url = SERVERINFO.isDev?SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events/token":SERVERINFO.SendKakaoEventURL + ":" + SERVERINFO.SendKakaoEventPort +"/events/token";
 		String url = SERVERINFO.isDev?SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events/token":SERVERINFO.SendKakaoEventURL + ":" + SERVERINFO.SendKakaoEventPort +"/events/token";
-//		String url = "https://kakaohome-api.i.kakao.com/events/token";
 		
 		
+//		String url = "https://kakaohome-api.i.kakao.com/events/token";
 		logger.debug("[TOKEN REFRESH REQUEST] URL : " + url);
 		logger.debug("[TOKEN REFRESH REQUEST] URL : " + url);
 		logger.debug("[TOKEN REFRESH REQUEST] header : " + headers.toString());
 		logger.debug("[TOKEN REFRESH REQUEST] header : " + headers.toString());
 		logger.debug("[TOKEN REFRESH REQUEST] return value : " + entity.toString());
 		logger.debug("[TOKEN REFRESH REQUEST] return value : " + entity.toString());
@@ -293,9 +298,13 @@ public class KakaoEventHandler {
 				return userInfo;
 				return userInfo;
 			}
 			}
 		}catch(Exception e) {
 		}catch(Exception e) {
-			logger.error("[TOKEN REFRESH REQUEST ERROR] - " + e.getMessage());
 			
 			
-			e.printStackTrace();
+			if( e != null) {
+				logger.error("[TOKEN REFRESH REQUEST ERROR] - " + e.getMessage());
+			
+				e.printStackTrace();
+			}else
+				logger.error("Token REFRESH REQUEST ERROR]");
 		}
 		}
 		
 		
 		logger.error("****************************************************");
 		logger.error("****************************************************");

+ 41 - 10
src/main/java/com/icontrols/kakao/socket/wallpad/KakaoMsgHandler.java

@@ -275,7 +275,14 @@ public class KakaoMsgHandler {
 									String childName = j < 10 ? tmpModelId+"0"+j : tmpModelId+j;
 									String childName = j < 10 ? tmpModelId+"0"+j : tmpModelId+j;
 									Node childNode = (Node)xpath.evaluate("//imap/service/devinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODE);
 									Node childNode = (Node)xpath.evaluate("//imap/service/devinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODE);
 									logger.debug("childName = " + childName);
 									logger.debug("childName = " + childName);
-									childCount = Integer.parseInt(XmlUtil.getAttributeWithItem(childNode, "value"));
+									
+									if(childNode == null) break;
+									
+									String tmpValue = XmlUtil.getAttributeWithItem(childNode, "value");
+									
+									if(tmpValue == null) break;
+									
+									childCount = Integer.parseInt(tmpValue);
 									
 									
 									NodeList childList = (NodeList)xpath.evaluate("//imap/service/devinfo/subdevinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODESET);
 									NodeList childList = (NodeList)xpath.evaluate("//imap/service/devinfo/subdevinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODESET);
 									
 									
@@ -306,8 +313,8 @@ public class KakaoMsgHandler {
 			
 			
 			eleMap.put("displayType", THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName());
 			eleMap.put("displayType", THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName());
 			eleMap.putAll(getDeviceCapabilities(THINGS_INFO.THINGS.ELEVATOR.getThingsName(), null));
 			eleMap.putAll(getDeviceCapabilities(THINGS_INFO.THINGS.ELEVATOR.getThingsName(), null));
-			eleMap.put("endpointId", "elevator");
-			eleMap.put("name", THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName());
+			eleMap.put("endpointId", THINGS_INFO.DEVICE_DETAIL.ELEVATOR.getModelId());
+			eleMap.put("name", THINGS_INFO.THINGS.ELEVATOR.getDesc());
 			eleMap.put("state", new HashMap<String, Object>());
 			eleMap.put("state", new HashMap<String, Object>());
 			
 			
 			body.put("elevator", eleMap);
 			body.put("elevator", eleMap);
@@ -388,7 +395,11 @@ public class KakaoMsgHandler {
 		String[] tmpSplit = endpointId.split("_");
 		String[] tmpSplit = endpointId.split("_");
 		String modelId = (tmpSplit[0].equals("dimmer") || tmpSplit[0].equals("colorDimmer"))?tmpSplit[1]:tmpSplit[0];
 		String modelId = (tmpSplit[0].equals("dimmer") || tmpSplit[0].equals("colorDimmer"))?tmpSplit[1]:tmpSplit[0];
 		
 		
-		if(tmpSplit.length == 1 && !modelId.equals(THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName())) {
+		//엘리베이터 특정. -> 엘리베이터는 tmpSplit length가 1이다.
+		// 모드 endpoint id는 _ <- 언더바가 포함돼 있지만 엘리베이터는 그렇지 않음
+		// 엘리베이터가 아닌데도 tmpSplit length가 1인경우는 존재하지 않는 디바이스로 간주.
+		if(tmpSplit.length == 1 && !modelId.equals(THINGS_INFO.DEVICE_DETAIL.ELEVATOR.getModelId())) {
+			logger.error("[sendDeviceAction ERROR] - this is NonExist => " + modelId);
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 			return retMap;
 			return retMap;
 		}
 		}
@@ -396,7 +407,7 @@ public class KakaoMsgHandler {
 		int devNum = 1;
 		int devNum = 1;
 		
 		
 		if(tmpSplit[0].equals("dimmer") || tmpSplit[0].equals("colorDimmer")) devNum = Integer.parseInt(tmpSplit[2]);
 		if(tmpSplit[0].equals("dimmer") || tmpSplit[0].equals("colorDimmer")) devNum = Integer.parseInt(tmpSplit[2]);
-		else if(modelId.equals(THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName())) devNum = 1;
+		else if(modelId.equals(THINGS_INFO.DEVICE_DETAIL.ELEVATOR.getModelId())) devNum = 1;
 		else devNum = Integer.parseInt(tmpSplit[1]);
 		else devNum = Integer.parseInt(tmpSplit[1]);
 		THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(endpointId);
 		THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(endpointId);
 		
 		
@@ -736,7 +747,7 @@ public class KakaoMsgHandler {
 		logger.debug("ACTION STATUS --> " + desired.toString());
 		logger.debug("ACTION STATUS --> " + desired.toString());
 		try {
 		try {
 			int brightness = 1;
 			int brightness = 1;
-			int colorTemer = 1;
+			int colorTemper = 1;
 			switch(things.getEndPoint()) {
 			switch(things.getEndPoint()) {
 				
 				
 			case THINGS_INFO.THINGS_LIGHT:
 			case THINGS_INFO.THINGS_LIGHT:
@@ -775,19 +786,39 @@ public class KakaoMsgHandler {
 				
 				
 				if(desired.containsKey("brightness")) {
 				if(desired.containsKey("brightness")) {
 					brightness = ((int)desired.get("brightness"))/10 == 0 ? 1: ((int)desired.get("brightness"))/10;
 					brightness = ((int)desired.get("brightness"))/10 == 0 ? 1: ((int)desired.get("brightness"))/10;
-					sb.append("/").append(brightness);
+					if(desired.containsKey("power"))
+						sb.append("/").append(brightness);
+					else
+						sb.append("on/").append(brightness);
 				}else {
 				}else {
 					sb.append("/null");
 					sb.append("/null");
 				}
 				}
 				
 				
 				
 				
 				if(desired.containsKey("colorTemperature")) {
 				if(desired.containsKey("colorTemperature")) {
-					colorTemer = ((int)desired.get("colorTemperature"))/1000 == 0 ? 1:((int)desired.get("colorTemperature"))/1000;
-					sb.append("/").append(colorTemer);
+//					colorTemper = ((int)desired.get("colorTemperature"))/1000 == 0 ? 1:((int)desired.get("colorTemperature"))/1000;
+					int tmpColorTemp = (int)desired.get("colorTemperature");
+					
+					if(tmpColorTemp < 3000) tmpColorTemp = 3000;
+					else if(tmpColorTemp > 5700) tmpColorTemp = 5700;
+					
+					colorTemper = (tmpColorTemp)/300 - 9;
+					if(desired.containsKey("power"))
+						sb.append("/").append(colorTemper);
+					else {
+						if(desired.containsKey("brightness")) {
+							sb.append("/").append(colorTemper);	
+						}else {
+							sb = new StringBuffer();
+							sb.append("on/null/").append(colorTemper);
+						}
+						
+					}
 				}else {
 				}else {
 					sb.append("/null");
 					sb.append("/null");
 				}
 				}
 				
 				
+				
 				break;
 				break;
 				
 				
 			case THINGS_INFO.THINGS_TEMPER:
 			case THINGS_INFO.THINGS_TEMPER:
@@ -888,7 +919,7 @@ public class KakaoMsgHandler {
 			}
 			}
 			
 			
 			if(splitStr[2] != null && !splitStr[2].equals("null")) {
 			if(splitStr[2] != null && !splitStr[2].equals("null")) {
-				temp2 = (Integer.parseInt(splitStr[2])*1000);
+				temp2 = ((Integer.parseInt(splitStr[2])+9)*300);
 				state.put("colorMode", "colorTemperature");
 				state.put("colorMode", "colorTemperature");
 				state.put("colorTemperature", temp2);
 				state.put("colorTemperature", temp2);
 			}
 			}

+ 10 - 4
src/main/java/com/icontrols/kakao/socket/wallpad/ThreadServerHandler.java

@@ -223,8 +223,8 @@ public class ThreadServerHandler extends Thread {
 				logger.debug(service.getAttributes().getNamedItem("type").getTextContent());
 				logger.debug(service.getAttributes().getNamedItem("type").getTextContent());
 
 
 				model_id = (String) xpath.evaluate("//imap/service/model_id ", doc, XPathConstants.STRING);
 				model_id = (String) xpath.evaluate("//imap/service/model_id ", doc, XPathConstants.STRING);
-				dev_num = Integer.parseInt((String) xpath.evaluate("//imap/service/dev_num", doc, XPathConstants.STRING));
 				status = (String) xpath.evaluate("//imap/service/status", doc, XPathConstants.STRING);
 				status = (String) xpath.evaluate("//imap/service/status", doc, XPathConstants.STRING);
+				dev_num = status.equalsIgnoreCase("unsubscription")?1:Integer.parseInt((String) xpath.evaluate("//imap/service/dev_num", doc, XPathConstants.STRING));
 				
 				
 				logger.debug("[DeviceEventMsgHandler] - model_id : " + model_id);
 				logger.debug("[DeviceEventMsgHandler] - model_id : " + model_id);
 				logger.debug("[DeviceEventMsgHandler] - dev_num  : " + dev_num);
 				logger.debug("[DeviceEventMsgHandler] - dev_num  : " + dev_num);
@@ -241,6 +241,12 @@ public class ThreadServerHandler extends Thread {
 					//dong ho 가  같은 유저 모두 조회
 					//dong ho 가  같은 유저 모두 조회
 					
 					
 					List<DonghoInfo> dList = repo.findByDongAndHo(dong, ho);
 					List<DonghoInfo> dList = repo.findByDongAndHo(dong, ho);
+					
+					if(dList.size() == 0) {
+						logger.info("[EVENT] - 해동 동 호 인원 없음 프로세스 종료");
+						
+						return;
+					}
 					KakaoEventHandler kakaoEventHandler = (KakaoEventHandler)BeanUtils.getBean("kakaoEventHandler");
 					KakaoEventHandler kakaoEventHandler = (KakaoEventHandler)BeanUtils.getBean("kakaoEventHandler");
 					
 					
 					List<CompletableFuture<Map<String, Object>>> fList = new ArrayList<>();
 					List<CompletableFuture<Map<String, Object>>> fList = new ArrayList<>();
@@ -248,22 +254,22 @@ public class ThreadServerHandler extends Thread {
 					
 					
 					Map<String, Object> state = KakaoMsgHandler.setDeviceState(endpointId, status);
 					Map<String, Object> state = KakaoMsgHandler.setDeviceState(endpointId, status);
 					
 					
-					logger.info(userSet.toString());
 					userSet.stream()
 					userSet.stream()
 						.filter(userInfo -> userInfo.getDeleteFlag().equals("N"))
 						.filter(userInfo -> userInfo.getDeleteFlag().equals("N"))
 						.forEach(userInfo -> {
 						.forEach(userInfo -> {
 						try {
 						try {
 							UserInfoRepository uRepo = (UserInfoRepository)BeanUtils.getBean("userInfoRepository");
 							UserInfoRepository uRepo = (UserInfoRepository)BeanUtils.getBean("userInfoRepository");
 							Map<String, Object> sendMap = null;
 							Map<String, Object> sendMap = null;
-							
 							if(status.equalsIgnoreCase("unsubscription")) {
 							if(status.equalsIgnoreCase("unsubscription")) {
 								// 구독해지 처리.
 								// 구독해지 처리.
 								userInfo.setDeleteFlag("Y");
 								userInfo.setDeleteFlag("Y");
 								userInfo.setDeleteType("unsubscription");
 								userInfo.setDeleteType("unsubscription");
 								uRepo.save(userInfo);
 								uRepo.save(userInfo);
-								
+								logger.info("[해지처리]-["+userInfo.getDonghoInfo().getDonghoId()+"]-[userID = " + userInfo.getId()+"]");
 								// 삭제 이벤트 전송해야...
 								// 삭제 이벤트 전송해야...
 								sendMap = kakaoMsgHandler.setKDeleteIdsMsg(dong, ho, userInfo);
 								sendMap = kakaoMsgHandler.setKDeleteIdsMsg(dong, ho, userInfo);
+								logger.info("[UNSUBSCRIPTION] - [sendMap] - " + sendMap.toString());
+								
 							}else {
 							}else {
 								if(state.containsKey("colorTemperature") && state.containsKey("brightness")) {
 								if(state.containsKey("colorTemperature") && state.containsKey("brightness")) {
 									body.put("colorDimmer_"+endpointId, state);
 									body.put("colorDimmer_"+endpointId, state);

+ 72 - 0
src/main/java/com/icontrols/kakao/socket/wallpad/UnlinkExtensionHandler.java

@@ -0,0 +1,72 @@
+package com.icontrols.kakao.socket.wallpad;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.icontrols.kakao.common.utils.BeanUtils;
+import com.icontrols.kakao.entity.DonghoInfo;
+import com.icontrols.kakao.entity.UserInfo;
+import com.icontrols.kakao.repo.DonghoInfoRepository;
+import com.icontrols.kakao.service.AuthService;
+
+public class UnlinkExtensionHandler extends Thread{
+	private static final Logger logger = LoggerFactory.getLogger(UnlinkExtensionHandler.class);
+	private String dong;
+	private String ho;
+	
+	Map<String, Object> subsMap = null;
+	
+	AuthService authService;
+	
+	public UnlinkExtensionHandler(String dong, String ho) {
+		this.dong = dong;
+		this.ho = ho;
+		
+		this.subsMap = new HashMap<String, Object>();
+		this.subsMap.put("type", "unsubs");
+		this.subsMap.put("dong", dong);
+		this.subsMap.put("ho", ho);
+		this.subsMap.put("devNum", "1");
+		this.subsMap.put("company", "kakao");
+		
+	}
+	
+	public void run() {
+		try {
+			logger.info("[UnlinkExtensionHandler] - [START]");
+			DonghoInfoRepository dRepo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
+			List<DonghoInfo> dList = dRepo.findByDongAndHo(this.dong, this.ho);
+			
+			// 해당 동호가 검색되지 않으면 프로세스 종료..
+			if(dList.size() == 0) return;
+			
+			DonghoInfo dInfo = dList.get(0);
+			
+			List<UserInfo> uList = dInfo.getUserInfos();
+			
+			int linkedUserCnt = 0;
+			for(UserInfo userInfo:uList) {
+				if(userInfo.getDeleteFlag().equalsIgnoreCase("N")) linkedUserCnt++;
+			}
+
+			// 아직 해지하지 않은 사용자가 있으면 구독 해지를 날리면 안된다.
+			if(linkedUserCnt > 0) return;
+			
+			
+			// 해당 동호수에 인원이 없을 경우 월패드 구독 해지를 진행해야 한다.
+			authService = (AuthService)BeanUtils.getBean("authServiceImpl");
+			Map<String, Object> retMap = authService.subscriptionProcess(subsMap);
+			
+			logger.info("[해지결과] - [" + dong + "]-[" + ho +"]" + retMap.toString());
+		}catch(Exception e) {
+			logger.error("[UnlinkExtensionHandler] - [ERROR] - " + e.getMessage());
+			e.printStackTrace();
+		}finally {
+			logger.info("[UnlinkExtensionHandler] - [END]");
+		}
+	}
+}

+ 2 - 2
src/main/resources/application.properties

@@ -7,11 +7,11 @@ logging.config=classpath:logback-spring.xml
 
 
 ## 배포용-테스트 단지서버
 ## 배포용-테스트 단지서버
 #spring.datasource.url=jdbc:mariadb://192.168.100.155:8005/platform_danzi?useUnicode=true&charaterEncoding=utf-8
 #spring.datasource.url=jdbc:mariadb://192.168.100.155:8005/platform_danzi?useUnicode=true&charaterEncoding=utf-8
-#spring.datasource.url=jdbc:mariadb://192.168.100.155:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
+spring.datasource.url=jdbc:mariadb://192.168.100.155:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
 
 
 ## 배포용-카카오데모서버
 ## 배포용-카카오데모서버
 ##spring.datasource.url=jdbc:mariadb://localhost:8005/platform_danzi?useUnicode=true&charaterEncoding=utf-8 
 ##spring.datasource.url=jdbc:mariadb://localhost:8005/platform_danzi?useUnicode=true&charaterEncoding=utf-8 
-spring.datasource.url=jdbc:mariadb://localhost:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
+#spring.datasource.url=jdbc:mariadb://localhost:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
 spring.datasource.username=valley
 spring.datasource.username=valley
 spring.datasource.password=valley123
 spring.datasource.password=valley123
 
 

+ 1 - 1
src/main/resources/logback-spring.xml

@@ -20,7 +20,7 @@
         </encoder>
         </encoder>
     </appender>
     </appender>
                                                                                                                            
                                                                                                                            
-    <logger name="com.icontrols.kakao" level="INFO"></logger>
+    <logger name="com.icontrols.kakao" level="DEBUG"></logger>
 
 
     <root level="INFO">
     <root level="INFO">
         <appender-ref ref="dailyRollingFileAppender" />
         <appender-ref ref="dailyRollingFileAppender" />