[Tuto] Carte relais - passer de ZmWebRelay à (j)MQTT - IOTZone ZMRN0808

Bonjour,

Si comme moi, vous passez à Debian 12 (Armbian sur Odroid XU4 pour moi), vous avez bien galéré à tout installer ou rendre compatible (j’ai fini par faire une clean install à cause d’un manque de place) :face_exhaling:

Dans les plugins jeedom KO, il me reste XiaomiHome et ZmWebRelay (l’autre plugin de carte relais est aussi ko je crois)… Bref, des plugins non maintenus.

Ma carte relais était donc inaccessible par jeedom.
Vous avez plusieurs solutions :

  1. Acheter une autre carte
    Solution radicale et couteuse mais si c’est votre choix je vous conseille fortement une carte avec MQTT natif (ex dingtian) :heavy_dollar_sign:

  2. Passer par le plugin Script pour créer les requêtes HTTP manuellement pour chaque appel relai (on, off et pulse).
    Mais la limite est vite atteinte pour récupérer l’état des input et des relais :
    Les états sont aussi récupérés par requête HTTP mais elles ne sont pas lancées en temps réel (2000ms je crois sur le plugin zmWebRelay), il faut les lancer manuellement ou par un cron (minimum 1min sur jeedom je crois) :worried:

  3. Rendre la carte IOTZone « compatible » MQTT
    Et oui, cette carte est compatible mqtt sans forcément qu’on le sache (c’est caché).
    C’est le but de ce tutoriel :

0) Préquis :

  • serveur MQTT
  • Carte 8Ch IOTZone ou nom de code ZMRN0808-V5 pour moi (pe valable aussi pour les autres cartes?)
  • plugin jMQTT (adaptable pour tout autre client MQTT)

→ 1) Activation MQTT sur carte relais :

  • Se connecter sur l’interface de la carte relais (adresse ip)

  • Aller dans le menu « RS485 Interface »

  • Activer « RS485 to mqtt enable » en cliquant sur le bouton de la ligne ) :

    • Valider par le bouton « OK » en bas de page

→ 2) Paramétrer MQTT sur carte relais :

  • Se rendre sur la page de paramétrage du MQTT de la carte relais :
    Il faut saisir l’url suivante directement car il n’y a pas de lien vers ce menu :
    http://[ip carte relais]/zm.cgi :

    Avec :
    • MAC : l’adresse MAC de la carte (non modifiable) à priori
    • Update IP : aucune idée j’ai mis l’ip d e la carte ?? (si quelqu’un sait?)
    • MQTT : ip du serveur MQTT
    • MQTT domain : non pris en compte malgré mes modifications (la carte écrit sur MQTT dans la racine du MQTT)
    • MQTT Server port : Port du serveur MQTT (1883 par défaut)
    • MQTT user : à saisir si authentification actif sur MQTT
    • MQTT password: à saisir si authentification actif sur MQTT
    • MQTT period time : délais de maj MQTT ??? pas forcément pris en compte, réduire ne réduit pas la réactivité
    • MQTT Enable : passer à « Enable » pour activer le MQTT
    • device SN Code : Numéro de série - Nom du topic utilisé pour MQTT (ne pas modifier car tout redémarrage de la carte le réinitialise)
      (Italique = obligatoire)
  • Valider avec le bouton « OK » tout en bas de page
  • Redémarrer la carte

→ 3) Résultats sur MQTT :
2 Topics MQTT sont exploités par la carte relais dans la racine de votre MQTT :

[TODO ajouter copie écran MQTT Manager]

  • <num série>state : pour les états :
v5XXXXXXX4state/{"cmd":"post","output":"10000000","input":"00101010","sn":"v5XXXXXXX4"}

input pour les boutons (la position dans la chaine correspond au numéro (ici : relai 2 off, relai 3 on,…)
output pour les relais (la position dans la chaine correspond au numéro (ici : input 1 on, les autres off)

  • <num série>ctr : pour donner des ordres à la carte :
v5XXXXXXX4ctr/{"cmd":"post","output":"2xxxx0x1"}

la position dans la chaine correspond au numéro du relai à contrôler - 0 pour off, 1 pour on, 2 pour pulse et x pour ne rien faire (ici : demande de relai 1 à pulse, relai 5 à off et relai 8 à on, les autres non contrôlés)

→ 4) Exploitation dans Jeedom :
Il est ensuite possible de récupérer ces informations dans Jeedom, par le plugin jMQTT dans mon cas.
ex on peut récupérer les états par jMQTT :

On récupère l’ensemble des valeurs des 8 inputs et output.
Pour avoir chaque valeur (1 à 8 ici), il faut effectuer des manipulations de chaines par la fonction substr.
Ce n’est pas possible directement dans jMQTT, il faut passer par un virtuel. Ex :


→ substr(‹ #[Garage][jmqtt-CarteRelayIOTGarage][Etat Relais Input]# ›,2,1)
Pour l'input 3 (on commence à la position 0 sur cette fonction)
Bien mettre la commande à lire entre ' ' car elle sera interprétée sinon et les 0 du début seront supprimés faussant la récupération de la valeur (00010000 deviendra 10000)

Pour les commandes d’actions sur les relais, on peut le faire directement dans jMQTT :


On peut même cumuler une commande pour plusieurs relais (comme dans l’ex plus haut) - pas mon besoin.

→ 3) Conclusions :
La solution est parfaitement fonctionnelle pour moi.
La latence semble égale au plugin ZmWebRelay (de l’ordre de 1 à 2s je pense)
Après des coupures électriques, j’ai cru que la carte relais avait du mal à se reconnecter au MQTT mais ca demande juste un peu de temps
Mais je mutualise et supprime un plugin :slight_smile:
J’espère ne pas avoir été trop long…

Source :
GitHub - mgx0/ZMRN0808-V5

3 « J'aime »

Et en passant par la formule de calcul de la commande info?

Capture d’écran du 2024-12-03 18-31-52

Bonjour,

Top pour pour le partage, mais ça ne le fera pas pour moi. Ma carte date de 2016 avec un firmware qui n’a pas ces options là. Sur le Github il y a le .hex de la carte, faut trouver la procédure pour mettre à jour. En attendant je fais avec des requêtes script.
Merci.

Bonjour Mmx, je suis dans le même cas que toi : cartes trop vieilles .
Pourrais-tu me communiquer ton script qui permet de lire les entrées de la carte ?
Merci d’avance

Je n’utilise pas les entrées, juste les relais. Il faut indiquer l’adresse IP de la carte et le port.
Pour les commandes (ON/OFF) on complète comme ceci:

/var/www/html/plugins/script/data/Relay.php 5 open
/var/www/html/plugins/script/data/Relay.php 5 close

C’est un script fait vite fait, et qui fonctionne pour mes besoins.

<?php
$ip = '192.168.1.40'; 
$port = 1234; 
$timeout = 30; 

if ($argc < 3) {
    exit(1);
}

$relayNumber = intval($argv[1]);
$action = strtolower(trim($argv[2])); 

function sendCommand($command) {
    global $ip, $port, $timeout;

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        return false;
    }

    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => $timeout, 'usec' => 0]);

    if (socket_connect($socket, $ip, $port) === false) {
        socket_close($socket);
        return false;
    }

    $command .= "\r\n"; 
    socket_write($socket, $command, strlen($command));

    socket_close($socket);
    return true;
}

function controlRelay($relayNumber, $action) {
    if ($relayNumber < 1 || $relayNumber > 8) {
        return "Numéro de relais invalide. Veuillez utiliser un numéro entre 1 et 8.";
    }

    switch ($action) {
        case 'open':
            sendCommand("L$relayNumber");
            return "Relay $relayNumber opened.";
        case 'close':
            sendCommand("D$relayNumber");
            return "Relay $relayNumber closed.";
    }


  
}

$response = controlRelay($relayNumber, $action);
echo $response; 
?>

Merci pour ta réponse, pour la commande des relais, j’avais déjà trouvé une solution, qui fonctionne mais m’a pas autant de contrôles que la tienne.


Ce qui me bloque c’est pour lire les infos des entrées, c’est à dire acquérir la ligne en rouge sur le log ci-dessous.
Si tu as une idée ?

Salut, tu peux récupérer cette ligne d’info avec http:// 192.168.1.39/state.cgi