Bienvenue sur le forum de la ZiGate !

Ici, nous échangeons sur les produits ZiGate (matériellement) et les firmware.

Pour que vous puissiez gagner du temps, je vous conseille de visiter, dans un premier temps, les forums et documentations des plugins et box domotique que vous avez choisi :

Jeedom :

Forum : https://community.jeedom.com/
Plugin ZiGate : https://github.com/Jeedom-Zigate/jeedom-plugin-zigate
Plugin Abeille : https://github.com/KiwiHC16/Abeille + http://kiwihc16.free.fr/

Domoticz :

Forum Francophonehttps://easydomoticz.com/forum/viewforum.php?f=28
Forum Anglophonehttps://www.domoticz.com/forum/viewforum.php?f=68
Développeur: @pipiche38 disponible sur keybase.io en chat

EEdomus :

Forum : https://forum.eedomus.com/

Home-assistant :

Plugin : https://github.com/doudz/homeassistant-zigate
Zigpy : https://www.home-assistant.io/integrations/zha/

Veuillez pour créer des messages et des sujets de discussion.

PiZigate FW 3.1c et erreurs de CRC

Salut

Je ne comprends pas comment je peux avoir des erreurs de CRC avec un PiZigate (FW 3.1c mais idem 3.1b)

J'arrive à reproduire ce problème de maniere systématique en mode INCLUSION d'un périph Xiaomi (Detecteur de luminosité). Apres l'inclusion ca semble se calmer. Je ne vois plus de pbs de CRC.

[2020-05-05 15:46:11][debug] Reçu: "80000005921503010000"
[2020-05-05 15:46:12][debug] Reçu: "80000005951504010000"
[2020-05-05 15:46:12][debug] Reçu: "801100071a000a8701000000"
[2020-05-05 15:46:12][debug] ERREUR CRC: calc=0xa5, att=0x95, mess=8102001f9500...e4
[2020-05-05 15:46:12][debug] Reçu: "8102001f95000a870100000005004200126c756d692e73656e5f696c6c2e6d676c31e4"
[2020-05-05 15:46:12][debug] Reçu: "801100071a000a8701000000"
[2020-05-05 15:46:12][debug] Reçu: "8102000d8e010a87010000001086ff0000e4"
[2020-05-05 15:46:13][debug] Reçu: "80000005810005010000"
[2020-05-05 15:46:13][debug] Reçu: "800000052600e6004500"
[2020-05-05 15:46:13][debug] Reçu: "801100071a000a8701000000"
[2020-05-05 15:46:13][debug] ERREUR CRC: calc=0xa7, att=0x97, mess=8102001f9702...e4
[2020-05-05 15:46:13][debug] Reçu: "8102001f97020a870100000005004200126c756d692e73656e5f696c6c2e6d676c31e4"
[2020-05-05 15:46:14][debug] Reçu: "80000005820006010000"

A noter que lors de mes essais j'ai l'impression qu'il y  a de temps en temps des erreurs de lecture du port.

Des idées ? Des suggestions ?

Merci

Bonjour,

difficile de vous aider sans le code source... apparemment vous utilisez une librairie développée vous-même.

Il n'y a pas de problèmes de ce type sur les autres librairies. Je ne pense pas que le problème soit du côté de la ZiGate.

Fred

Salut Fred

Le code est un code PHP assez simple et ressemble à ca. J'ai viré des commentaires ou autres "print" pour simplifier.

Il est le même pendant l'inclusion et hors inclusion. C'est pourquoi je laisse quand meme la possibilité d'un souci caché.

Résumé des manips

  • Err de CRC pendant l'inclusion capteur luminosité Xiaomi sur PiZigate 3.1c
  • Idem sur une autre PiZigate 3.1c
  • Pas visible sur une Zigate USB 3.1c
  • Les erreurs sont à priori presentes pendant l'inclusion seulement
<?php
$arg1   = $argv[1]; // Zigate name (ex: Abeille1)
$serial = $argv[2]; // Zigate port (ex: /dev/ttyUSB0)
$abeille = (int)substr($arg1, 7); // Zigate number (ex: 1)

exec(system::getCmdSudo().' chmod 777 '.$serial.' > /dev/null 2>&1');
_exec("stty -F ".$serial." sane", $out);
_exec("stty -F ".$serial." speed 115200 cs8 -parenb -cstopb -echo raw", $out);

$f = fopen($serial, "r");
if ($f == FALSE) {
    /* Error message */
    exit(4);
}
stream_set_blocking($f, TRUE); // Should be blocking read but is it default ?

$transcode = false;
$trame = ""; // Transcoded message from Zigate
$step = "WAITSTART";
$ecrc = 0; // Expected CRC
$ccrc = 0; // Calculated CRC
$byteIdx = 0; // Byte number

while (true) {
    $byte = fread($f, 01);
    if ($byte == FALSE) {
        /* An error occured. Why ? */
        continue;
    }

    $byteS = bin2hex($byte); // String format of $byte
    if ($step == "WAITSTART") {
        /* Waiting for "01" start byte.
        Bytes outside 01..03 markers are unexpected. */
        if ($byteS != "01") {
            $trame .= $byteS; // Unexpected outside 01..03 markers => error
        } else {
           /* "01" start found */
           if ($trame != "")
              /* Error message */
           $trame = "";
           $step = "WAITEND";
           $byteIdx = 1; // Next byte is index 1
           $ccrc = 0;
        }
    } else {
        /* Waiting for "03" end byte */
        if ($byteS == "03") {
           if ($ccrc != $ecrc)
              daemonlog('error', 'ERREUR CRC: calc=0x'.dechex($ccrc).', att=0x'.dechex($ecrc).', mess='.substr($trame, 0, 12).'...'.substr($trame, -2, 2));

           /* Putting msg in queue */
           /* ... */

           $trame = ""; // Already transmitted or displayed
           $step = "WAITSTART";
        } else {
            if ($byteS == "02") {
                $transcode = true; // Next char to be transcoded
            } else {
                if ($transcode) {
                    $byteS = sprintf("%02x", (hexdec($byteS) ^ 0x10));
                    $transcode = false;
                }
                $trame .= $byteS;
                if ($byteIdx == 5)
                    $ecrc = hexdec($byteS); // Byte 5 is expected CRC
                else
                    $ccrc = $ccrc ^ hexdec($byteS);
                    $byteIdx++;
                }
           }
        }
    }
fclose($f);
?>

Une autre info. Je n'en ai pas parlé jusque la mais j'ai constaté que chaque fois qu'il y a une erreur CRC, il y a eu une erreur de lecture (fread) dans la trame.
J'ai implémenté une trace permettant de montrer à quel endroit dans la trame (XX) l'erreur apparait. Et c'est plutot bien stable.

En esperant que ca t'inspire des suggestions.

[2020-05-07 15:30:56][debug] Reçu: "8045000787c60039120101a8"
[2020-05-07 15:30:56][error] ERREUR CRC: calc=0x4f, att=0x7f, mess=8102001f7f00...a8
[2020-05-07 15:30:56][debug] Reçu: "8102001f7f0039120100000005004200126c756d692e73656e5f696c6c2e6d676c31a8"
[2020-05-07 15:30:56][debug] ERR : "8102001f7f0039120100000005004200126c756d692e73656e5f696c6c2e6d676cXX31a8"
[2020-05-07 15:30:57][debug] Reçu: "800000050700c7004500"
...
[2020-05-07 15:30:58][debug] Reçu: "80000005981509010000"
[2020-05-07 15:30:58][error] ERREUR CRC: calc=0x50, att=0x60, mess=8102001f6006...b1
[2020-05-07 15:30:58][debug] Reçu: "8102001f600639120100000005004200126c756d692e73656e5f696c6c2e6d676c31b1"
[2020-05-07 15:30:58][debug] ERR : "8102001f600639120100000005004200126c756d692e73656e5f696c6c2e6d676cXX31b1"
[2020-05-07 15:30:58][debug] Reçu: "8102000d7b073912010000001086ff0000b1"
[2020-05-07 15:30:58][error] ERREUR CRC: calc=0x41, att=0x71, mess=8102001f7108...ae
[2020-05-07 15:30:58][debug] Reçu: "8102001f710839120100000005004200126c756d692e73656e5f696c6c2e6d676c31ae"
[2020-05-07 15:30:58][debug] ERR : "8102001f710839120100000005004200126c756d692e73656e5f696c6c2e6d676cXX31ae"
[2020-05-07 15:30:59][debug] Reçu: "800000058e000a010000"
...
[2020-05-07 15:31:26][debug] Reçu: "8102000d542d3912010000001086ff0000b4"
[2020-05-07 15:31:27][debug] Reçu: "80000005ab002f010000"
[2020-05-07 15:31:27][error] ERREUR CRC: calc=0x91, att=0xa1, mess=80000005a115...00
[2020-05-07 15:31:27][debug] Reçu: "80000005a115010000"
[2020-05-07 15:31:27][debug] ERR : "80000005a115XX010000"
[2020-05-07 15:31:27][debug] Reçu: "8043001883d700391212010104010601040000040000030001010003b4"
[2020-05-07 15:31:28][debug] Reçu: "80000005b50031010000"

 

Ce pb peut être cloturé.

Le souci semble venir de mon code de check suivant

    $byte = fread($f, 01);
    if ($byte == FALSE) {
        /* An error occured. Why ? */
        continue;
    }

 

Translate »