Blob Blame History Raw
diff --git a/hardware/OpenZWave.cpp b/hardware/OpenZWave.cpp
index 1f5c341c..51b2865b 100644
--- a/hardware/OpenZWave.cpp
+++ b/hardware/OpenZWave.cpp
@@ -1641,19 +1641,83 @@ void COpenZWave::AddValue(const OpenZWave::ValueID &vID, const NodeInfo *pNodeIn
 		if (newInstance != 0)
 		{
 			_device.instanceID = newInstance;
-			if (m_pManager->GetValueAsByte(vID, &byteValue) == true)
+            //Door lock device
+			if (
+				(vLabel == "Access Control") ||
+				(vLabel == "UserCode")
+				)
 			{
-				_device.devType = ZDTYPE_SWITCH_NORMAL;
-				if (byteValue == 0)
-					_device.intvalue = 0;
-				else
-					_device.intvalue = 255;
-				InsertDevice(_device);
+				if( ValueID::ValueType_List == vID.GetType() )
+				{
+					try
+					{
+						std::string vListStr;
+						if (m_pManager->GetValueListSelection(vID, &vListStr))
+						{
+							_device.devType = ZDTYPE_SWITCH_NORMAL;
+							_device.Alarm_Type = 6;
+							_device.intvalue = 0;
+							if (vListStr == "Access Control - RF Lock")
+								_device.intvalue = 24;
+							else if (vListStr == "Access Control - RF Unlock")
+								_device.intvalue = 25;
+							else if (vListStr == "Access Control - Manual Lock")
+								_device.intvalue = 21;
+							else if (vListStr == "Access Control - Manual Unlock")
+								_device.intvalue = 22;
+							else if (vListStr == "Access Control - KeyPad Lock")
+								_device.intvalue = 18;
+							else if (vListStr == "Access Control - KeyPad Unlock")
+								_device.intvalue = 19;
+							else if (vListStr == "Not Active")
+								_device.intvalue = 1;
+							else
+								_log.Log(LOG_STATUS, "OpenZWave: Value_Added: Unhandled List Selection: %s", vListStr.c_str());
+							InsertDevice(_device);
+						}
+					}
+					catch (...)
+					{
+						_log.Log(LOG_STATUS, "OpenZWave: Value_Added: GetValueListSelection Exception");
+					}
+				}
+				else {
+					_log.Log(LOG_STATUS, "OpenZWave: Value_Added: Unhandled Value for Label: %s", vLabel.c_str());
+				}
+			}
+			else if( ValueID::ValueType_Byte == vID.GetType() )
+			{
+				if (m_pManager->GetValueAsByte(vID, &byteValue) == true)
+				{
+					_device.devType = ZDTYPE_SWITCH_NORMAL;
+					if (byteValue == 0)
+						_device.intvalue = 0;
+					else
+						_device.intvalue = 255;
+					InsertDevice(_device);
+				}
 			}
+            else
+            {
+                _log.Log(LOG_STATUS, "OpenZWave: Value_Added: Unhandled Value: X, Type: %i", vID.GetType());
+            }
 		}
 		else
 		{
-			if (vLabel != "SourceNodeId")
+			if (vLabel == "UserCode") {
+				if ((vType == OpenZWave::ValueID::ValueType_Raw) || (vType == OpenZWave::ValueID::ValueType_String))
+				{
+					std::string strValue;
+					if (m_pManager->GetValueAsString(vID, &strValue) == true)
+						_log.Log(LOG_STATUS, "OpenZWave: Value_Added: UserCode: %s", strValue.c_str());
+				}
+				else
+				{
+					if (m_pManager->GetValueAsByte(vID, &byteValue) == true)
+						_log.Log(LOG_STATUS, "OpenZWave: Value_Added: UserCode: %i", byteValue);
+				}
+			}
+			else if (vLabel != "SourceNodeId")
 			{
 				_log.Log(LOG_STATUS, "OpenZWave: Value_Added: Unhandled Label: %s, Unit: %s", vLabel.c_str(), vUnits.c_str());
 			}
@@ -2395,7 +2459,7 @@ void COpenZWave::UpdateValue(const OpenZWave::ValueID &vID)
 	unsigned char byteValue = 0;
 	int32 intValue = 0;
 	std::string strValue = "";
-	int32 lValue = 0;
+	std::string lValue = "";
 
 	if (vType == OpenZWave::ValueID::ValueType_Decimal)
 	{
@@ -2833,16 +2897,40 @@ void COpenZWave::UpdateValue(const OpenZWave::ValueID &vID)
 				}
 				else if (vLabel == "Access Control")
 				{
+					if (!lValue.empty()) {
+						if (lValue == "Access Control - RF Lock")
+							byteValue = 24;
+						else if (lValue == "Access Control - RF Unlock")
+							byteValue = 25;
+						else if (lValue == "Access Control - Manual Lock")
+							byteValue = 21;
+						else if (lValue == "Access Control - Manual Unlock")
+							byteValue = 22;
+						else if (lValue == "Access Control - KeyPad Lock")
+							byteValue = 18;
+						else if (lValue == "Access Control - KeyPad Unlock")
+							byteValue = 19;
+						else if (lValue == "Not Active")
+							byteValue = 0;
+						else
+							byteValue = 0;
+					}
+
 					switch (byteValue) {
 					case 0x00: 	// Previous Events cleared
 					case 0x06:	//Keypad unlock/Arm Home
+					case 0x12: 	// KeyPad lock
+					case 0x15: 	// Manual Lock
 					case 0x17: 	// Door closed
+					case 0x18: 	// RF operated lock
 					case 0xfe:	// Unkown event; returned when retrieving the current state.
 						intValue = 0;
 						break;
 
 					case 0x05:	//Keypad Lock/Arm Away
+					case 0x13: 	// KeyPad unlock
 					case 0x16: 	// Door open
+					case 0x19: 	// RF operated unlock
 					default:	// all others, interpret as alarm
 						intValue = 255;
 						break;