[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 active sur MQTT
    • MQTT password: à saisir si authentification active 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

Hello,

J’ai le même besoin. J’ai réussi à paramétrer les relais mais pour les inputs et à remonter l’info globale comme ce que tu indiques mais comment faire pour remonter l’info d’une entrée pour l’exploiter ?

Bonjour

Si j’ai bien compris les entrées sont sous la forme binaire d’après la ligne rouge exemple: 11100000

Tu peux créer un équipement virtuel comme celui-ci:

Remplacer: 00101011 par la commande.

le principe:
La fonction bindec en php est la conversion binaire en décimal
Le and (&) est un filtre binaire bit à bit avec la valeur du filtre pour les relais:

Relais 1: 1
Relais 2: 2
Relais 3: 4
Relais 4: 8
Relais 5: 16
Relais 6: 32
Relais 7: 64
Relais 8: 128

Ne pas oublier de mettre les types en binaire.
Je ne connais pas la carte relais, le relais 1 est peut être le relais 8 etc…

Je n’ai pas la chaine complète je pense que l’on peux la traiter en php pour extraire les 8 bits. Peux tu la transmettre.

Merci pour ce début de piste, j’ai essayé d’appliquer (sauf erreur de ma part) mais les Etat ne bouge pas sur jeedom. Je t’envoie quelques screen shots de mon script ( ma carte n’est pas compatible jmqtt, c’est une ancienne génération) ainsi que d’autres info qui pourraient te permettre de m’aider.


image


Bonjour

Peut tu me transmettre la valeur de la commande contact en texte. Il faut auparavant extraire les 8 bits correspondant aux entrées avant d’appliquer le filtrage.

J’ai aussi trouvé ça: GitHub - Naruto-kyun/ha-zm-web: Simple HA integration of 8 relay "ZM_WEB" bought on AliExpress

Si ça peut aider…

Le texte que tu m’as demandé:
{« cmd »:« state »,« output »:« 10000000 »,« input »:« 11001000 »,« sn »:« 0014fff00eaf3614 »}

Bonjour

Mon équipement virtuel:

Les commandes du virtuel:

Dans la valeur de la commande chaine il faut mettre l’équipement « contact ».

valeur binaire extraite :substr(#[Aucun][valeurbinaire][chaine]#, 33, 8)

Il y a peut être une façon plus élégante. Mais à priori cela fonctionne.

Nota; j’ai mis relais 1 à 8 mais ce sont les entrées de 1 à 8.
On peut appliquer la même méthode pour connaitre l’état des relais.

parfait ! ca fonctionne, merci beaucoup !!! :grinning: cependant le retour d’état est très long sur Jeedom

Dans l’auto-actualisation de l’équipement tu peux mettre 1mn. Mais cela prend des ressources CPU. Après tu peux aussi faire un scénario déclenché cycliquement toutes les minutes qui va lancer la commande HTTP plusieurs fois avec un bloc boucle de 1 à 5 avec un sleep de 10 secondes.

Si ta carte dans les settings peut travailler en modbus sur IP en utilisant le plugin MyModbus tu pourras avoir des remontées d’informations de tes entrées beaucoup plus rapidement.

Bonjour, je ne l’utilise pas encore, parce que je n’ai pas besoin de contrôler l’état des entrées et que étant sur Debian 11, le plugin ZmWeb marche très bien, mais si ca intéresse quelqu’un, j’ai fait un truc en Nodered pour renvoyer les états (relais et Bp) au format binaire en Mqtt (genre ZmWeb2Mqtt)
En gros l’info est récupéré et traité dans NodeRed puis renvoyer sur Mqtt, la remonter est quasi instantanée ( pour un bp il faut un appuis légèrement long) , on peut aussi envoyer des commandes bien qu’il soit peut être plus simple de lancer une requête http depuis jeedom vers la carte

image

Ca doit pouvoir être optimiser mais c’est fonctionnel