Problème avec Socket Linknx

43 views
Skip to first unread message

Raphael Fleury

unread,
Oct 26, 2017, 5:02:22 AM10/26/17
to Eibd / Linknx / KnxWeb
Bonjour à Tous,

J'ai un soucis avec le socket Linknx, je m'explique :

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.

Mon problème est que si j'envoie le XML suivant :

<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".

Quelqu'un a une idée ?

J'ai regarder le code et à mon avis le problème doit être par ici :

------------------------------------------------------------------

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 ?

Merci d'avance

Raphaël




Cyrille Defranoux

unread,
Oct 27, 2017, 4:28:54 PM10/27/17
to Eibd / Linknx / KnxWeb
Bonjour Raphaël,

Je viens de relire le code des règles de linknx. Et je pense qu'il n'est pas prévu de mélanger des actionlist "if-true" avec des "on-true". Comme tu l'as vu toi-même, c'est toute la règle qui est considérée comme StatelessIfTrue si une actionlist if-true est rencontrée. Donc si on a une actionlist "on-true" puis une actionlist "if-true", les actions de ces deux actionlists seront traitées comme si elles venaient toutes de l'actionlist if-true.
Le même raisonnement s'applique pour if-false / on-false.

Ce que je décris vient de ma compréhension du code. Et cela me semble coller à ce que tu as observé.

La documentation du wiki n'est pas précise sur ce point. Elle n'indique pas que les actionlists "if-xxx" et "on-xxx" ne sont pas faites pour être utilisées conjointement. Donc je suppose que l'intention de l'auteur était d'autoriser ce que tu souhaites faire. Et cela me semble légitime. On peut donc conclure qu'il s'agit d'un bug.

Il me semble qu'une correction est envisageable. C'est un peu délicat car ce code n'est pas couvert par les tests unitaires. Mais je peux tenter l'aventure.

Cyrille

Cyrille Defranoux

unread,
Oct 27, 2017, 5:00:48 PM10/27/17
to Eibd / Linknx / KnxWeb
J'ai créé une issue sur github pour suivre le problème : https://github.com/linknx/linknx/issues/33

Cyrille

Cyrille Defranoux

unread,
Nov 2, 2017, 5:55:04 PM11/2/17
to Eibd / Linknx / KnxWeb
J'ai commencé à travailler sur ce bug. Je voudrais d'abord ajouter quelques tests pour reproduire le bug et minimiser le risque de régression.

@Raphael, sous quel délai as-tu besoin d'une correction ? En guise de contournement, je pense que tu peux éclater chaque règle en deux, une règle ne contenant que des actionlists if-* et l'autre que des on-*. Chaque règle dupliquera la même condition. Ca n'est évidemment pas idéal mais ça devrait te permettre d'attendre le correctif.

Cyrille

Cyrille Defranoux

unread,
Dec 9, 2017, 5:09:26 PM12/9/17
to Eibd / Linknx / KnxWeb
Bonsoir à tous,

J'ai corrigé le bug et publié la version 0.0.1.35 de linknx sur github.

Merci à Raphaël d'avoir remonté ce bug !

A+
Cyrille

Cyrille Defranoux

unread,
Dec 10, 2017, 4:13:33 AM12/10/17
to Eibd / Linknx / KnxWeb
Bon, raté. J'ai vu ce matin qu'il y avait une régression critique sur les règles. J'ai détruis la release 0.0.1.35 et je vais investiguer ça...
Désolé pour la confusion.

Cyrille

Cyrille Defranoux

unread,
Dec 10, 2017, 5:44:31 AM12/10/17
to Eibd / Linknx / KnxWeb
J'ai corrigé la régression et publié la version 0.0.1.36 (pour éviter toute confusion avec la version 0.0.1.35 qui pose problème).

Cyrille
Reply all
Reply to author
Forward
0 new messages