Pull Request #840 - Allow Config Files to specify different Alarm Type Lists

This commit is contained in:
Justin Hammond 2016-04-25 14:00:35 +08:00
commit fa333a6cff
3 changed files with 44 additions and 21 deletions

View file

@ -32,27 +32,25 @@
<!-- COMMAND_CLASS_ALARM. -->
<CommandClass id="113" name="COMMAND_CLASS_ALARM">
<Instance index="1" />
<Instance index="2" />
<Value type="byte" genre="user" instance="1" index="0" label="Power Applied" value="2">
<Help>
Once the power has been applied, Alarm Report Command will be sent to
Nodes in Grouping 1 to confirm the power applied status for HSM02.
</Help>
<Value type="byte" genre="user" instance="1" index="0" label="Alarm Type" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="12">
<Help>Grouping 1, afterward, LED will light up for 1 sec to remind user when HSM02 is triggered due to open or close incidents.</Help>
</Value>
<Value type="byte" genre="user" instance="1" index="1" label="low battery" value="255">
<Value type="list" genre="user" instance="1" index="1" label="Alarm Report" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" vindex="0" value="0" size="1">
<Help>
When HSM02 automatically wakes up, it will check the battery usage. When
No alarm : There is no alarm to report.
Power applied : Once the power has been applied, Alarm Report Command will be sent to
Nodes in Grouping 1 to confirm the power applied status for HSM02.
Tamper event : Grouping 1, afterward, LED will light up for 1 sec to remind user when HSM02 is
triggered due to open or close incidents.
Low battery : When HSM02 automatically wakes up, it will check the battery usage. When
low battery is detected, Alarm Report Command will be sent to Nodes in
Grouping 1, afterward, LED will light up for 1 sec to remind user when HSM02 is
triggered due to open or close incidents.
</Help>
</Value>
<Value type="byte" genre="user" instance="2" index="0" label="Tamper event" value="17">
<Help>
Grouping 1, afterward, LED will light up for 1 sec to remind user when HSM02 is
triggered due to open or close incidents.
</Help>
<Item label="No alarm" value="0" />
<Item label="Power applied" value="2" />
<Item label="Tamper event" value="17" />
<Item label="Low battery" value="255" />
</Value>
</CommandClass>

View file

@ -2517,7 +2517,6 @@ bool Node::CreateValueFromXML
if( value )
{
value->ReadXML( m_homeId, m_nodeId, _commandClassId, _valueElement );
ValueStore* store = GetValueStore();
if( store->AddValue( value ) )
{
@ -2567,8 +2566,16 @@ void Node::ReadValueFromXML
{
if( Value* value = store->GetValue( id.GetValueStoreKey() ) )
{
value->ReadXML( m_homeId, m_nodeId, _commandClassId, _valueElement );
value->Release();
// Check if values type are the same
ValueID::ValueType v_type = value->GetID().GetType();
if ( v_type == type ) {
value->ReadXML( m_homeId, m_nodeId, _commandClassId, _valueElement );
value->Release();
} else {
Log::Write( LogLevel_Info, m_nodeId, "xml value type (%s) is different to stored value type (%s). Value is recreate with xml params.", value->GetTypeNameFromEnum(type), value->GetTypeNameFromEnum(v_type) );
store->RemoveValue( value->GetID().GetValueStoreKey() );
CreateValueFromXML( _commandClassId, _valueElement );
}
}
else
{

View file

@ -229,12 +229,30 @@ bool Alarm::HandleMsg
value->OnValueRefreshed( _data[1] );
value->Release();
}
if( (value = static_cast<ValueByte*>( GetValue( _instance, AlarmIndex_Level ) )) )
// For device on version 1 the level could have different value. This level value correspond to a list of alarm type.
if ( Value* value = GetValue( _instance, AlarmIndex_Level ) )
{
value->OnValueRefreshed( _data[2] );
switch ( value->GetID().GetType() )
{
case ValueID::ValueType_Byte:
{
ValueByte* valueByte = static_cast<ValueByte*>( value );
valueByte->OnValueRefreshed( _data[2] );
break;
}
case ValueID::ValueType_List:
{
ValueList* valueList = static_cast<ValueList*>( value );
valueList->OnValueRefreshed( _data[2] );
break;
}
default:
{
Log::Write( LogLevel_Info, GetNodeId(), "Invalid type (%d) for Alarm Level %d", value->GetID().GetType(), _data[2] );
}
}
value->Release();
}
// With Version=2, the data has more detailed information about the alarm
if(( GetVersion() > 1 ) && ( _length >= 7 ))
{