je suis entrain de faire une petite application pour créer de la logique et pour créer / éditer / modifier la logique j'utilise le socket Linknx.
<write><config><rules><rule id="lb_001_001_New" init="false">
<condition type="not">
<condition type="and">
<condition type="object" id="lb_7_1_0" value="on" trigger="true"/>
</condition>
</condition>
<actionlist type="if-true">
<action type="set-value" id="lb_7_1_1" value="1" delay="0ms"/>
</actionlist>
<actionlist type="on-true">
<action type="set-value" id="lb_7_1_2" value="1" delay="0ms"/>
</actionlist>
<actionlist type="if-false">
<action type="set-value" id="lb_7_1_3" value="on"/>
</actionlist>
<actionlist type="on-false">
<action type="set-value" id="lb_7_1_4" value="1" delay="0ms"/>
</actionlist>
</rule></rules></config></write>
Il me met les actions de "on-false" dans "if-false" et les action de "on-true" dans "if-true".
Si j'envoie 4 XML avec une condition après l'autre, dès qu'il voit qu'il a une commande actionlist, il efface toute celledéjà écrite et les remplacent par la nouvelle donc je n'aurais que dans mon exemple "on-false".
void Rule::importXml(ticpp::Element* pConfig)
{
pConfig->GetAttribute("id", &id_m, false);
std::string value = pConfig->GetAttribute("active");
setActive(value != "off" && value != "false" && value != "no");
pConfig->GetAttribute("description", &descr_m, false);
std::string init = pConfig->GetAttributeOrDefault("init", "");
flags_m &= ~(InitEval|InitTrue);
if (init != "")
{
if (init == "eval")
flags_m |= InitEval;
else if (init == "true")
flags_m |= InitTrue;
else if(init != "false")
logger_m.warnStream() << "Unknown init value \"" << init << "\", assuming \"false\" instead." << endlog;
}
else
logger_m.infoStream() << "Initial value is not set, assuming \"false\". Please add init=\"false|true|eval\" to rule config." << endlog;
logger_m.infoStream() << "Rule: Configuring " << getID() << " (active=" << ((flags_m & Active) != 0) << ")" << endlog;
ticpp::Element* pCondition = pConfig->FirstChildElement("condition");
condition_m = Condition::create(pCondition, this);
ticpp::Iterator<ticpp::Element> actionListIt("actionlist");
for ( actionListIt = pConfig->FirstChildElement("actionlist"); actionListIt != actionListIt.end(); actionListIt++ )
{
std::string type = (*actionListIt).GetAttribute("type");
bool isFalse = ((type == "if-false") || (type == "on-false"));
if (type == "if-false")
flags_m |= StatelessIfFalse;
else if (type == "if-true")
flags_m |= StatelessIfTrue;
else if (!isFalse)
type = "on-true"; // this is just for log display below.
logger_m.infoStream() << "ActionList: Configuring '" << type << "' action list" << endlog;
ticpp::Iterator<ticpp::Element> actionIt("action");
for (actionIt = (*actionListIt).FirstChildElement("action", false); actionIt != actionIt.end(); actionIt++ )
{
Action* action = Action::create(&(*actionIt));
if (isFalse)
actionsListFalse_m.push_back(action);
else
actionsList_m.push_back(action);
}
}
// If init value is "eval", we better wait for a bus connection before we evaluate the condition
// If init value is "true", we can set prevValue_m even if no bus connection is available
if (Services::instance()->getKnxConnection()->isReady())
initialize();
else
prevValue_m = (flags_m & InitTrue);
logger_m.infoStream() << "Rule: Configuration done" << endlog;
}
Je remarque que vous créez 2 tableaux action les actions et non 4 mais vous avez deux flags ? pour cette solution ? on ne peut pas avec les 4 conditions dans une seule rules ?