Intégration Carte Ethernet 8 relais

Bonjour, je bascule de Jeedom vers HA, j’avance à petit pas.
Aujourd’hui je cherche à intégrer ma carte Ethernet 8 relais à HA
J’ai cette carte :


Dans Jeedom j’utilise le plugin

Carte Ethernet 8 Relais (relaynet)

Est-ce que quelqu’un à déjà intégré cette carte ?

salut
As tu fait une recherche?
il y a eu une demande identique il y a moins d’un mois

Salut @romu044
Je ne suis pas un spécialiste , mais je suis passé par là il y a pas longtemps.
Vérifi d’abord que ta carte a bien dans le setting 'RS485 to mqtt enable"
Ensuite tu colles dans ton config.yaml ceci:
(j’ai gardé le user et password par défaut, fais gaffe aux majuscules et espaces)

command_line:
  - switch:
      name: "Relay 1"
      command_on: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayon1=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayoff1=off'  --user admin:12345678"
      unique_id: Relay_1
    
  - switch:
      name: "Relay 2"
      command_on: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayon2=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayoff2=off'  --user admin:12345678"
      unique_id: Relay_2

  - switch:
      name: "Relay 3"
      command_on: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayon3=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayoff3=off'  --user admin:12345678"
      unique_id: Relay_3
    
  - switch:
      name: "Relay 4"
      command_on: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayon4=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayoff4=off'  --user admin:12345678"
      unique_id: Relay_4
    
  - switch:
      name: "Relay 5"
      command_on: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayon5=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayoff5=off'  --user admin:12345678"
      unique_id: Relay_5
    
  - switch:
      name: "Relay 6"
      command_on: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayon6=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayoff6=off'  --user admin:12345678"
      unique_id: Relay_6
    
  - switch:
      name: "Relay 7"
      command_on: "/usr/bin/curl -x GET 'http://192.168.1.166/relay.cgi?relayon7=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -x GET 'http://192.168.1.166/relay.cgi?relayoff7=off'  --user admin:12345678"
      unique_id: Relay_7
    
  - switch:
      name: "Relay 8"
      command_on: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayon8=on'  --user admin:12345678"
      command_off: "/usr/bin/curl -X GET 'http://192.168.1.166/relay.cgi?relayoff8=off'  --user admin:12345678"
      unique_id: Relay_8

et tu devrais avoir ca sur le dash

Bonjour,

Oui j’ai fais des recherches avant de poster, mais avec

carte 8 relais IP
Carte 8 relais ethernet

Bonjour @Franck42

Non ma carte n’a pas cette option, c’est exactement la même que celle que tu présente au début de ton post.

ha ok, désolé alors, je ne peux pas t’aider, car je l’ai changé dans la foulé par le bon modele. Sinon il aurait falu changer le firmware, j’ai fait des recherches mais j’ai abandonné .

Je pense que le plugin de Jeedom doit dialoguer avec la carte en HTTP car à part son adresse IP et le port aucune autre information n’est nécessaire (il faut que le user configuré sur la carte soit admin et le mdp 12345678)

J’ai trouvé ça :

mais je ne comprends pas tout

Bonjour
Ta carte ressemble bcp a une carte de chez cge

J’avais réussi a la piloter via http. Je regarde ce soir ou demain.
voici ce que j’avais dans mon configuration.yaml

switch: !include switchs.yaml

et dans le fichier : switchs.yaml

- platform: command_line
  switches:
    ipx800v2_relais1:
      command_on: 'curl http://192.168.1.69/preset.htm?led1=1 >/dev/null'
      command_off: 'curl http://192.168.1.69/preset.htm?led1=0 >/dev/null'
      command_state: 'curl http://192.168.1.69/status.xml'
      value_template: '{% set status = value | regex_findall_index("<led0>(.*)</led0>") %} {% if status == "1" %} true {%- endif -%}'
      friendly_name: 'ipx800v2 relais1'
    ipx800v2_relais2:
      command_on: 'curl http://192.168.1.69/preset.htm?led2=1 >/dev/null'
      command_off: 'curl http://192.168.1.69/preset.htm?led2=0 >/dev/null'
      command_state: 'curl http://192.168.1.69/status.xml'
      value_template: '{% set status = value | regex_findall_index("<led1>(.*)</led1>") %} {% if status == "1" %} true {%- endif -%}'
      friendly_name: 'ipx800v2 relais2'
   ipx800v2_relais3:
      command_on: 'curl http://192.168.1.69/preset.htm?led3=1 >/dev/null'
      command_off: 'curl http://192.168.1.69/preset.htm?led3=0 >/dev/null'
      command_state: 'curl http://192.168.1.69/status.xml'
      value_template: '{% set status = value | regex_findall_index("<led2>(.*)</led2>") %} {% if status == "1" %} true {%- endif -%}'
      friendly_name: 'ipx800v2 relais3'

pour savoir quoi mettre après les curl, il faudrait que tu testes sous chrome d’envoyer des commandes et voir si les relais bougent

http://192.168.1.166/L1 \r\n
ou 
http://192.168.1.166:1234/L1 \r\n
(pour ouvrir le relais 1)
et
http://192.168.1.166/D1 \r\n
ou
http://192.168.1.166:1234/D1 \r\n
(pour fermer le relais 1)

Bonjour,
Merci je regarde et te dis

je viens de tester, cela ne fonctionne pas
avec la 1ere commande (en mettant la bonne @ip de la carte) j’ai ça :

Error 404 - Not Found

et avec la seconde il ne se passe rien

Est-ce qu’il y aurait un gourou du code :slightly_smiling_face: qui pourrait regarder comment le plugin Relaynet de Jeedom fait pour gérer cette carte.
Voici les différents répertoires du plugin :
relaynet1
je pense que les fichiers qui gèrent la carte sont dans le rep core

Bonjour je ne suis pas un gourou mais tu pourrais rechercher ( avec notepad++ par exemple) les fichiers qui contienne D1 ou L1, y a peut être dans le même fichier la’commande qui va bien.

Je pense que c’est dans le fichier nommé relaynet.class.php, je vois bien une section où il y a :

// on va changer l’état d’un relais

mais après pour décrypter !!!

<?php

/* This file is part of Jeedom.
*
* Jeedom is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Jeedom is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jeedom. If not, see <http://www.gnu.org/licenses/>.
*/

/* * ***************************Includes********************************* */
require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php';

class relaynet extends eqLogic {
  public static function cron() {
    foreach (eqLogic::byType('relaynet',true) as $relaynet) {
      log::add('relaynet', 'debug', 'pull cron');
      $relaynet->getInformations();
    }

  }

  public function preUpdate() {
    if ($this->getConfiguration('addr') == '') {
      throw new Exception(__('L\'adresse ne peut être vide',__FILE__));
    }
    if ($this->getConfiguration('port') == '') {
      throw new Exception(__('Le porrt ne peut être vide',__FILE__));
    }
  }

  public function preSave() {
    $this->setLogicalId($this->getConfiguration('addr'));
  }

  public function postSave() {
    $number = 1;
    while ($number <= 8) {
      $com = 1;
      while ($com <= 5) {
        switch ($com) {
          case '1' :
          $type = 'status';
          $name = 'Relais ' . $number;
          $request = '0';
          $generictype = 'ENERGY_STATE';
          break;
          case '2' :
          $type = 'relais';
          $request = '0';
          $name = 'Relais ' . $number . ' Off';
          $generictype = 'ENERGY_OFF';
          break;
          case '3' :
          $type = 'relais';
          $request = '1';
          $name = 'Relais ' . $number . ' On';
          $generictype = 'ENERGY_ON';
          break;
          case '4' :
          $type = 'input';
          $request = '0';
          $name = 'Input ' . $number;
          break;
          case '5' :
          $type = 'relais';
          $request = 'P';
          $name = 'Impulsion ' . $number;
          break;
        }
        $cmdId = $type.$number.$request;
        $cmdlogic = relaynetCmd::byEqLogicIdAndLogicalId($this->getId(),$cmdId);
        if (!is_object($cmdlogic)) {
          log::add('relaynet', 'debug', 'Information non existante, création');
          $newrelaynet = new relaynetCmd();
          $newrelaynet->setEqLogic_id($this->getId());
          $newrelaynet->setEqType('relaynet');
          if ($type == 'relais') {
            $newrelaynet->setType('action');
            $newrelaynet->setSubType('other');
          } else {
            $newrelaynet->setType('info');
            $newrelaynet->setSubType('binary');
          }
          $newrelaynet->setIsVisible(1);
          $newrelaynet->setIsHistorized(0);
          $newrelaynet->setLogicalId($cmdId);
          $newrelaynet->setName( $name );
          $newrelaynet->setConfiguration('name', $name);
          $newrelaynet->setConfiguration('type', $type);
          $newrelaynet->setConfiguration('number', $number);
          $newrelaynet->setConfiguration('request', $request);
          $newrelaynet->setConfiguration('value', $request);
          if ($com <= 3) {
            $newrelaynet->setDisplay('generic_type',$generictype);
          }
          $newrelaynet->save();
        }
        $com++;
      }
      $number++;
    }
    $cmdlogic = relaynetCmd::byEqLogicIdAndLogicalId($this->getId(),'refresh');
    if (!is_object($cmdlogic)) {
      log::add('relaynet', 'debug', 'Rafraichir non existant, création');
      $newrelaynet = new relaynetCmd();
      $newrelaynet->setEqLogic_id($this->getId());
      $newrelaynet->setEqType('relaynet');
      $newrelaynet->setType('action');
      $newrelaynet->setSubType('other');
      $newrelaynet->setIsVisible(1);
      $newrelaynet->setIsHistorized(0);
      $newrelaynet->setLogicalId('refresh');
      $newrelaynet->setName('Rafraichir');
      $newrelaynet->setConfiguration('request', 'refresh');
      $newrelaynet->save();
    }
    $this->getInformations();
  }

  /*public function alphatobin($etat){
  if(strpos($etat,'on') !== false){
  return "1";
}elseif(strpos($etat,'off') !== false){
return "0";
}elseif(strpos($etat,'L') !== false){
return "0";
}elseif(strpos($etat,'H') !== false){
return "1";
}else{
return $etat;
}
}*/

public function interactRelaynet($addr, $type, $number, $request) {
  $elogic = self::byLogicalId($addr, 'relaynet');
  $cmdId = $type.$number.$request;
  $cmdlogic = relaynetCmd::byEqLogicIdAndLogicalId($elogic->getId(),$cmdId);
  $port = $elogic->getConfiguration('port');
  $port = preg_replace('/\s/','',$port);
  log::add('relaynet', 'debug', 'interact ' . $type . $number . ' sur ' . $addr . ':' . $port);
  $socket_client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  $err = socket_connect($socket_client, $addr, $port);
  if ($err === FALSE) {
    log::add('relaynet', 'error', 'Erreur de connexion ' . $err);
  }
  if ($type == 'relais'){ // on va changer l'état d'un relais
    if ($request == '1'){
      $msg = 'L'.$number.'.\r\n.';
    }
    if ($request == '0'){
      $msg = 'D'.$number.'.\r\n.';
    }
    if ($request == 'P'){
      $msg = 'P'.$number.'.\r\n.';
    }
    $taille = strlen($msg);
    log::add('relaynet', 'debug', 'interact msg ' . $msg . ' taille ' . $taille);
    if(socket_send($socket_client, $msg, $taille, 0x100) !== FALSE) {
      if($request != 'P') {
        $infoId = 'status'.$number.'0';
        $infologic = relaynetCmd::byEqLogicIdAndLogicalId($elogic->getId(),$infoId);
        $infologic->setConfiguration('value', $request);
        $infologic->save();
        $infologic->event($request);
      }
    } else {
      log::add('relaynet', 'error', 'Erreur lors de l\'envoi de paquet');
    }
  } else { // on va chercher une info
    if ($type == 'status') { // on requête l'état d'un relais
      $msg = 'R'.$number;
    } else { // on requête l'état d'un input
      $msg = 'I'.$number;
    }
    $taille = strlen($msg);
    if(socket_send($socket_client, $msg, $taille, 0x100) !== FALSE){
      $string = socket_read($socket_client,11100);
      if(strpos($string,'on') !== false){
        $value = "1";
      }elseif(strpos($string,'off') !== false){
        $value = "0";
      }elseif(strpos($string,'L') !== false){
        $value = "0";
      }elseif(strpos($string,'H') !== false){
        $value = "1";
      }else{
        $value = $string;
      }
      $cmdlogic->setConfiguration('value', $value);
      $cmdlogic->save();
      $cmdlogic->event($value);
    } else {
      log::add('relaynet', 'error', 'Erreur lors de l\'envoi de paquet');
    }
  }
  socket_close($socket_client);
}

public function getInformations() {
  $addr = $this->getConfiguration('addr');
  log::add('relaynet', 'info', 'getInformations ' . $addr);
  foreach ($this->getCmd() as $cmd) {
    log::add('relaynet', 'debug', 'Vérification ' . $cmd->getName());
    if($cmd->getConfiguration('type') === "input" || $cmd->getConfiguration('type') === "status"){
      $type = $cmd->getConfiguration('type');
      $number = $cmd->getConfiguration('number');
      relaynet::interactRelaynet($addr,$type,$number,'0');
      log::add('relaynet', 'debug', 'Vérification ' . $type . $number . ' sur ' . $addr);
    }
  }
  return ;
}
}

class relaynetCmd extends cmd {

  public function execute($_options = null) {
    switch ($this->getType()) {
      case 'action' :
      $request = $this->getConfiguration('request');
      switch ($this->getSubType()) {
        case 'slider':
        $request = str_replace('#slider#', $value, $request);
        break;
        case 'color':
        $request = str_replace('#color#', $_options['color'], $request);
        break;
        case 'message':
        if ($_options != null)  {
          $replace = array('#title#', '#message#');
          $replaceBy = array($_options['title'], $_options['message']);
          if ( $_options['title'] == '') {
            throw new Exception(__('Le sujet ne peuvent être vide', __FILE__));
          }
          $request = str_replace($replace, $replaceBy, $request);

        }
        else
        $request = 1;
        break;
        default : $request == null ?  1 : $request;
      }

      $eqLogic = $this->getEqLogic();
      $LogicalID = $this->getLogicalId();

      if ($this->getLogicalId() != 'refresh') {
        relaynet::interactRelaynet(
          $eqLogic->getLogicalId() ,
          $this->getConfiguration('type') ,
          $this->getConfiguration('number'),
          $request );
        }  
      }
      $eqLogic->getInformations();
    }
  }

  ?>

:slightly_frowning_face: personne ne comprend le code du post précédent, pour me dire comment les commandes sont envoyées à la carte pour actionner les relais ?

Bonjour,

J’ai aussi cette carte dans une vielle version (2019).
J’utilise le protocole TCP pour la contrôler (j’ai fais la « conversion » du plugin Jeedom)

  - switch:
      unique_id: relais1
      command_on: echo -e "L1/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D1/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R1/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 1' in value  }}"
      name: Relai 1
      scan_interval: 5
  - switch:
      unique_id: relais2
      command_on: echo -e "L2/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D2/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R2/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 2' in value  }}"
      name: Relai 2
      scan_interval: 5
  - switch:
      unique_id: relais3
      command_on: echo -e "L3/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D3/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R3/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 3' in value  }}"
      name: Relai 3
      scan_interval: 5
  - switch:
      unique_id: relais4
      command_on: echo -e "L4/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D4/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R4/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 4' in value  }}"
      name: Relai 4
      scan_interval: 5
  - switch:
      unique_id: relais5
      command_on: echo -e "L5/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D5/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R5/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 5' in value  }}"
      name: Relai 5
      scan_interval: 5
  - switch:
      unique_id: relais6
      command_on: echo -e "L6/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D6/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R6/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 6' in value  }}"
      name: Relai 6
      scan_interval: 5
  - switch:
      unique_id: relais7
      command_on: echo -e "L7/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D7/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R7/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 7' in value  }}"
      name: Relai 7
      scan_interval: 5
  - switch:
      unique_id: relais8
      command_on: echo -e "L8/r/n" | nc 192.168.0.12 1234
      command_off: echo -e "D8/r/n" | nc 192.168.0.12 1234
      command_state: echo -e "R8/r/n" | nc 192.168.0.12 1234
      value_template: "{{ 'Relayon 8' in value  }}"
      name: Relai 8
      scan_interval: 5

Le seul « hic » c’est quand la carte est pas atteignable (dans mon cas quand le CPL déconne), ça fait beaucoup de logs (8 toutes les 5 secondes)

Et je trouve aussi que la remontée d’info est trop longue, donc je regardais pour voir si quelqu’un avait fait mieux, mais apparemment c’est pas le cas.
J’envisage de faire un flux nodered si je trouve rien, mais c’est ma première expérience avec cet outil, donc je promet rien.

J’ai oublié, c’est dans la section

command_line:

Bonjour @Naruto-kyun ,

C’est une bonne nouvelle ça.
j’ai ajouté ton script, en modifiant l’IP, mais après je fais comment pour avoir le bouton et l’état ?

Une fois HA redémarré, t’es sensé avoir des interrupteurs dans les entités avec « relais » dans le nom (1 à 8)
Et l’état est celui de l’interrupteur.
Je sais pas si je suis clair?

Si très clair, ça à l’air de fonctionner.
Effectivement la remontée d’info est assez lente.
La carte est donc maintenant gérable depuis HA et Jeedom.
Si je passe un relais à ON via HA il faut au moins 30s pour que son état passe ON dans Jeedom, et même chose pour OFF.
Par contre si je passe un relai à ON dans Jeedom, la remontée d’état est immédiate dans HA, même plus rapide que dans Jeedom :slightly_smiling_face:

En tout les cas, merci à toi, je vais pouvoir conserver ma carte