Rs485 et sofar solar

Bonjour, j'ai un sofar solar HYD 6000-EP.

Je voudrais pour pouvoir récupéré au minium la puissance produite par le panneau et qui est indiqué sur l'écran.

ecran

Celle qui est entouré en rouge.

J'ai acheter deux carte RS485 et une carte bus Can.

Carte rs485
carte rs485
Carte can bus

Je vous met le tableau de communication:

J'ai tenté avec les pins 5 et 6 et aussi 15 et 16 pour le rs485 et pour le can les pins 1 et 2

Pour le câblage rien bien compliqué par conte pour le code j'ai entré plusieurs code trouvé sur le net mais pour la plus part j'ai une erreur E1 ou E2.

Je dispose esp32, Arduino Uno.Je précise que je n'es pas besoin de home assistant, ni esphome.

L'objectif de récupéré la puissance produite par les panneaux et fonction de cette puissance d'activé du chauffage ou chauffe eau.

Tous sa pour dire que j'aurais besoin de votre aide pour la partie du codage.

Merci par avance

Haut

Je viens de testé ce code:

#include <ModbusMaster.h>

// Configuration RS485
#define RS485TransmitPin 17 // GPIO2 sur ESP32
#define RS485ReceivePin 16  // GPIO3 sur ESP32

// Initialiser l'objet Modbus
ModbusMaster node;

void setup() {
  // Initialiser la communication série pour le débogage
  Serial.begin(9600);
 
  // Initialiser la communication série pour RS485
  Serial2.begin(9600, SERIAL_8N1, RS485ReceivePin, RS485TransmitPin);
}

void loop() {
  uint8_t result;
  uint16_t data[6];

  // Activer la transmission RS485
  digitalWrite(RS485TransmitPin, HIGH);
  delay(2);  // Attendre un court instant après avoir activé la transmission

  // Lire les registres Modbus de l'esclave
  result = node.readHoldingRegisters(0x0000, 6); // Adresse de début et nombre de registres à lire

  // Désactiver la transmission RS485
  digitalWrite(RS485TransmitPin, LOW);

  // Vérifier si la lecture a réussi
  if (result == node.ku8MBSuccess) {
    // Stocker les données dans le tableau 'data'
    for (uint8_t i = 0; i < 6; i++) {
      data[i] = node.getResponseBuffer(i);
    }

    // Faire quelque chose avec les données (par exemple, les imprimer)
    for (uint8_t i = 0; i < 6; i++) {
      Serial.print("Register ");
      Serial.print(i);
      Serial.print(": ");
      Serial.println(data[i]);
    }
  } else {
    // En cas d'erreur de lecture
    Serial.print("Erreur: ");
    Serial.println(result);
  }

  delay(5000); // Attendre une seconde entre les lectures
}

Voila ce que sa donne:

Il faudrait identifier l'endroit qui fait rebooter l'ESP32.
Deux cas possibles :

  1. Si tu as l'IDE Arduino version 1.xxx, tu peux installer et utiliser le ESP32 exception decoder. C'est un plug-in qui s'installe dans l'IDE (voir instructions dans le lien), tu n'as plus qu'à copier le backtrace et il t'indique où se trouve le problème. Ce plug-in n'est pas (à ma connaissance) compatible de l'IDE V2.
  2. Sinon, il faut mettre des Serial.println() un peu partout et suivre l'exécution de ton code pour voir où il s'arrête.

NB: évite de copier les messages d'erreur sous forme d'image, ça ne nous aide pas, il vaut mieux les copier / coller en texte.

Pour le message d'erreur en image, je n'ai pu copier le résultat dans le moniteur. Je les recopier à la mains:

ELF file SHA256: 82a40974a580c3c8

Rebooting....
q⸮⸮⸮ Gure Maditation Erreur: core l panic'ed (LoadProhibited). Exception was unhandled.

Core l register dump:
PC : 0x400d15b4 PC : 0x00060a30 A0 : 0x800dla3d A1 : 0x3ffb2100
A2: : 0x00000008 A3 : 0x00000003 A4 : 0x3ffc0f00 A5 : 0x3ffb211c
A6 : 0x3ffb2121 A7 : 0x00000000 A8 : 0x3ffb2123 A9: : 0x3ffb211c
A10 : 0x00000000 A11 : 0x00000000 A12 : 0xffffffff A13 : 0x3ffc18f4
A14: : 0x000000le A15 : 0x00000004 SAR : 0x00000011 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400d1890 LEND : 0x400d18a0 LCOUNT : 0x00000000

Backtrace: 0x400d15b1:0x3ffb2100 0x400dla3a:3x3ffb2240 0x400d148e:0x3ffb2260 0x400d280d:0x3ffb2290

j'ai changé de carte pour passé à arduino uno et un module RS485 avec les pins:
DI sur la pin 1 de arduino
DE sur la pin 2 de arduino
RE sur la pin 3 de arduino
RO sur la pin 0 de arduino

Je suis passé sur ce code:

#include <ModbusMaster.h>

// Définir le nombre de registres que vous souhaitez lire
const int numRegs = 2;

// Définir l'objet Modbus
ModbusMaster node;

void setup() {
  // Initialiser la communication série
  Serial.begin(9600);

  // Configurer le module RS485
  node.begin(1, Serial);  // Adresse 01

  // Définir les pins DE et RE du module RS485
  pinMode(2, OUTPUT);  // DE sur pin 2
  pinMode(3, OUTPUT);  // RE sur pin 3
  digitalWrite(2, 1); // Activer la transmission
  digitalWrite(3, 1); // Activer la réception
}

void loop() {
  static uint32_t i;

  // Lire les registres de l'onduleur
  uint8_t result = node.readHoldingRegisters(0, numRegs);

  // Vérifier si la lecture a réussi
  if (result == node.ku8MBSuccess) {
    Serial.print("Registre 0: "); 
    Serial.println(node.getResponseBuffer(0), HEX);
    Serial.print("Registre 1: ");
    Serial.println(node.getResponseBuffer(1), HEX);
  } else {
    Serial.print("Erreur de lecture: ");
    Serial.println(result, HEX);
  }

  delay(5000);
}

J'obtiens une erreur E2 par conte cette fois j'ai bien le logo RS485 qui réparé sur l'écran de l'onduleur

Serial utilise les pins 0 et 1 donc si tu connectes ton bus avec ces pins, tu risques des problèmes. Essaye avec d'autres pins.

je veux bien mais je vois pas comment modifier le code

C'est ce que tu as écrit ici, mais je ne sais pas comment c'est traduit dans le code. Je ne connais ni la bibliothèque ModbusMaster que tu utilises, ni ton câblage, ni l'équipement avec lequel tu communiques.

Peux-tu faire une photo de ton montage (côté Arduino) et expliquer bien comment tout ça est connecté.

Pour la cablage:

La carte rs485
Carte

Je sais que l'adresse dans onduleur est 01 et la vitesse est 9600 bauds

Donc la carte RS485, c'est ça :
image
Si le connecteur est dans l'ordre de ton schéma :

DI --> pin 2 du Uno
DE --> pin 4
RE --> pin 4
RO --> pin 3

On est bon ? Parce que c'est pas ce qui est dans ton code.
Dans ce cas, ton module RS485 ne va pas interférer avec la communication entre Arduino et console (via Serial). Mais tu dois communiquer avec ton module avec un protocole série. Il faut utiliser une bibliothèque qui émule ce protocole : il y a AltSoftSerial par exemple.

Je te conseille d'étudier l'exemple fourni ici et de t'en inspirer pour ton code.

Tu vois, le problème avec ce genre de module c'est qu'un Uno n'a qu'un seul port série (un ESP32 ou un Méga en ont plusieurs, c'est plus facile avec eux). Donc si tu veux afficher des choses sur la console Arduino, il faut créer un second port série pour réserver les pins 0 et 1 à la com avec la console.

Je suis repasser sur esp32, j'ai suivi ce site:

Modbut

Failed, Response Code: E0

Et je ne vois pas le RS485 d'afficher sur onduleur

Tu as bien utilisé un MAX485 ?
Tu as utilisé le même code ?
Est-ce que l'onduleur que tu interroges est le même que celui du tutoriel ? Le code définit trois registres :
uint16_t data_register[3] = {0x0000, 0x0008, 0x002A};
Il faut vérifier que ce sont les bonnes adresses pour ton onduleur, sinon ça ne marchera pas. Je pense que c'est indiqué dans la datasheet.

Je mets dans le message suivant le code entier ESPHOME pour controler le sofar HYD X000EP, ca marche super bien avec mon hyd 5000EP et un esp32 avec une max 3485 Rouge. Vérifier les liaisons TX RX et RS A B, parfois faut inverser.
Choix du mode (Auto passif etc...,) Recharge manuel de la batterie, ou décharge... Dans homeassistant ou autre. Page Web inclus.
:wink:

1 Like
esphome:
  name: onduleur
  on_boot:
    then:
      - switch.turn_on: commande_marche_arret
 
esp32:
  board: esp32dev
  framework:
    type: arduino

ota:
  password: "........"

substitutions:
  devicename: onduleur
  friendly_name: Onduleur

wifi:
  ssid: "....."
  password: ".........."

  ap:
    ssid: "Onduleur Fallback Hotspot"
    password: "BsUY3yORyjG7"

captive_portal:

api:
   #password: ""

web_server:
  port: 80

logger:
    level: INFO
    baud_rate: 0
    
time:
  - platform: sntp
    id: sntp_time   
    timezone: "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" #https://sites.google.com/a/usapiens.com/opnode/time-zones
    servers: "de.pool.ntp.org"
          
globals:
  - id: index_mode_fonctionnement
    type: int
    restore_value: true
    initial_value: '0'
  
  - id: index_controle_mode_timing
    type: int
    restore_value: true
    initial_value: '0' 

uart:
  id: mod_bus
  tx_pin: GPIO16 
  rx_pin: GPIO17 
  baud_rate: 9600
  stop_bits: 1

modbus:
  id: mod_bus_sofar
  send_wait_time: 200ms

modbus_controller:
  - id: sofarsolar
    address: 0x01
    modbus_id: mod_bus_sofar
    #command_throttle: 200ms
    #setup_priority: -10
    update_interval: 1s

text_sensor:
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Etat
    id: etat
    register_type: holding
    address: 0x0404
    response_size: 2
    lambda: |-
      auto z = "Unknown";
      char d = data[item->offset+1];
      if (d == 0) z = "Waiting";
      else if (d == 1) z = "Checking";
      else if (d == 2) z = "On-Grid";
      else if (d == 3) z = "Emergency Mode";
      else if (d == 4) z = "Recoverable Fault";
      else if (d == 5) z = "Permanent Fault";
      else if (d == 6) z = "Upgarding";      
      else if (d == 7) z = "Self-charging";      
      return {z};
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Défaut
    id: defaut
    register_type: holding
    address: 0x0405
    response_size: 10
    lambda: |-
      std::string z = "";
      int idx = item->offset;
      //if ((id(defaut).state) == "") z = "Aucun,";
      //Fault 1 Byte 1
      if ((data[idx] & 0x1) != 0) z += "GridOVPInstant1,";
      if ((data[idx] & 0x2) != 0) z += "GridOVPInstant2,";
      if ((data[idx] & 0x4) != 0) z += "VGridLineFault,";
      if ((data[idx] & 0x8) != 0) z += "InvOVP,";
      if ((data[idx] & 0x16) != 0) z += "ID013,";
      if ((data[idx] & 0x32) != 0) z += "ID014,";
      if ((data[idx] & 0x64) != 0) z += "ID015,";
      if ((data[idx] & 0x128) != 0) z += "ID016,";
      //Fault 1 Byte 0
      idx++;
      if ((data[idx] & 0x1) != 0) z += "GridOVP,";
      if ((data[idx] & 0x2) != 0) z += "GridUVP,";
      if ((data[idx] & 0x4) != 0) z += "GridOFP,";
      if ((data[idx] & 0x8) != 0) z += "GridUFP,";
      if ((data[idx] & 0x16) != 0) z += "GFCI,"; //10 remplace par 16
      if ((data[idx] & 0x32) != 0) z += "OVRT,"; //20 remplace par 32
      if ((data[idx] & 0x64) != 0) z += "LVRT,"; //40 remplace par 64
      if ((data[idx] & 0x128) != 0) z += "IslandFault,"; //80 remplace par 128
      //Fault 2 Byte 1
      idx++;
      if ((data[idx] & 0x1) != 0) z += "HwADFaultDCI(DC),";
      if ((data[idx] & 0x2) != 0) z += "HwADFaultIdcBranch,";
      if ((data[idx] & 0x4) != 0) z += "ID027,";
      if ((data[idx] & 0x8) != 0) z += "ID028,";
      if ((data[idx] & 0x16) != 0) z += "ConsistentFault_GFCI,";
      if ((data[idx] & 0x32) != 0) z += "ConsistentFault_Vgrid,";
      if ((data[idx] & 0x64) != 0) z += "ConsistentFault_DCI,";
      if ((data[idx] & 0x128) != 0) z += "ID032,";
      //Fault 2 Byte 0
      idx++;
      if ((data[idx] & 0x1) != 0) z += "HwADFaultIGrid,";
      if ((data[idx] & 0x2) != 0) z += "HwADFaultDCI,";
      if ((data[idx] & 0x4) != 0) z += "HwADFaultVGrid_DC,";
      if ((data[idx] & 0x8) != 0) z += "HwADFaultVGrid_AC,";
      if ((data[idx] & 0x16) != 0) z += "GFCIDeviceFault_DC,";
      if ((data[idx] & 0x32) != 0) z += "GFCIDeviceFault_AC,";
      if ((data[idx] & 0x64) != 0) z += "HwADFaultDCV,";
      if ((data[idx] & 0x128) != 0) z += "HwADFaultdc,";
      //Fault 3 Byte 1
      idx++;
      if ((data[idx] & 0x1) != 0) z += "RelayFail,";
      if ((data[idx] & 0x2) != 0) z += "IsoFault,";
      if ((data[idx] & 0x4) != 0) z += "PEConnectFault,";
      if ((data[idx] & 0x8) != 0) z += "PvConfigError,";
      if ((data[idx] & 0x16) != 0) z += "CTDisconnect,";
      if ((data[idx] & 0x32) != 0) z += "ReversalConnection,";
      if ((data[idx] & 0x64) != 0) z += "ParallelFault,";
      if ((data[idx] & 0x128) != 0) z += "SNTypeFault,";
      //Fault 3 Byte 0
      idx++;
      if ((data[idx] & 0x1) != 0) z += "SpiCommFault(DC),";
      if ((data[idx] & 0x2) != 0) z += "SpiCommFault(AC),";
      if ((data[idx] & 0x4) != 0) z += "SChip_Fault,";
      if ((data[idx] & 0x8) != 0) z += "MChip_Fault,";
      if ((data[idx] & 0x16) != 0) z += "HwAuxPowerFault,";
      if ((data[idx] & 0x32) != 0) z += "InverterSoftStartFail,";
      if ((data[idx] & 0x64) != 0) z += "ID039,";
      if ((data[idx] & 0x128) != 0) z += "ID040,";
      //Fault 4 Byte 1
      idx++;
      if ((data[idx] & 0x1) != 0) z += "TempFault_Env1,";
      if ((data[idx] & 0x2) != 0) z += "TempFault_Env2,";
      if ((data[idx] & 0x4) != 0) z += "TempFault_Inv1,";
      if ((data[idx] & 0x8) != 0) z += "TempFault_Inv2,";
      if ((data[idx] & 0x16) != 0) z += "TempFault_Inv3,";
      if ((data[idx] & 0x32) != 0) z += "ID062,";
      if ((data[idx] & 0x64) != 0) z += "ID063,";
      if ((data[idx] & 0x128) != 0) z += "ID064,";
      //Fault 4 Byte 0
      idx++;
      if ((data[idx] & 0x1) != 0) z += "TempFault_Bat,";
      if ((data[idx] & 0x2) != 0) z += "TempFault_HeatSink1,";
      if ((data[idx] & 0x4) != 0) z += "TempFault_HeatSink2,";
      if ((data[idx] & 0x8) != 0) z += "TempFault_HeatSink3,";
      if ((data[idx] & 0x16) != 0) z += "TempFault_HeatSink4,";
      if ((data[idx] & 0x32) != 0) z += "TempFault_HeatSink5,";
      if ((data[idx] & 0x64) != 0) z += "TempFault_HeatSink6,";
      if ((data[idx] & 0x128) != 0) z += "ID056,";
      //Fault 5 Byte 1
      idx++;
      if ((data[idx] & 0x1) != 0) z += "SwBusInstantOVP,";
      if ((data[idx] & 0x2) != 0) z += "FlyingCapOVP,";
      if ((data[idx] & 0x4) != 0) z += "ID075,";
      if ((data[idx] & 0x8) != 0) z += "ID076,";
      if ((data[idx] & 0x16) != 0) z += "ID077,";
      if ((data[idx] & 0x32) != 0) z += "ID078,";
      if ((data[idx] & 0x64) != 0) z += "ID079,";
      if ((data[idx] & 0x128) != 0) z += "ID080,";
      //Fault 5 Byte 0
      idx++;
      if ((data[idx] & 0x1) != 0) z += "VbusRmsUnbalance,";
      if ((data[idx] & 0x2) != 0) z += "VbusInstantUnbalance,";
      if ((data[idx] & 0x4) != 0) z += "BusUVP,";
      if ((data[idx] & 0x8) != 0) z += "BusZVP,";
      if ((data[idx] & 0x16) != 0) z += "PVOVP,";
      if ((data[idx] & 0x32) != 0) z += "BatOVP,";
      if ((data[idx] & 0x64) != 0) z += "LLCBusOVP,";
      if ((data[idx] & 0x128) != 0) z += "SwBusRmsOVP,";
      if(z.length() > 0){
        z.pop_back();
      }
      else {z = "Aucun ";}
      return {z};

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Lecture Mode Fonctionnement
    id: lecture_mode_stockage_energie
    register_type: holding
    address: 0x1110
    response_size: 2
    lambda: |-
      auto z = "Unknown";
      char d = data[item->offset+1];
      if (d == 0) z = "Auto Utilisation";
      else if (d == 1) z = "Temps d'Utilisation";
      else if (d == 2) z = "Timing";
      else if (d == 3) z = "Passif"; 
      return {z};

  - platform: wifi_info
    ip_address:
      name: ${friendly_name} IP
    ssid:
      name: ${friendly_name} SSID
    mac_address:
      name: ${friendly_name} Adresse Mac


sensor:
  
  - platform: wifi_signal
    id: signal_wifi
    name: ${friendly_name} Signal Wifi
    update_interval: 60s
  
  - platform: uptime
    id: inverter_uptime
    name: ${friendly_name} Uptime
    filters:
      - lambda: return x / 60.0;
    unit_of_measurement: minutes
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Tension Entrée DC1
    id: tension_entree_dc1
    register_type: holding
    address: 0x0584
    unit_of_measurement: "V"
    device_class: "voltage"
    icon: "mdi:alpha-v-circle-outline"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2     
      - multiply: 0.1
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Intensité Entrée DC1
    id: intensite_entree_dc1
    register_type: holding
    address: 0x0585
    unit_of_measurement: "A"
    device_class: "current"
    icon: "mdi:alpha-a-circle-outline"
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2      
      - multiply: 0.01
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Tension Entrée DC2
    id: tension_entree_dc2
    register_type: holding
    address: 0x0587
    unit_of_measurement: "V"
    device_class: "voltage"
    icon: "mdi:alpha-v-circle-outline"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2   
      - multiply: 0.1
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Intensité Entrée DC2
    id: intensite_entree_dc2
    register_type: holding
    address: 0x0588
    unit_of_measurement: "A"
    device_class: "current"
    icon: "mdi:alpha-a-circle-outline"
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2      
      - multiply: 0.01
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Puissance Entrée DC1
    id: puissance_entree_dc1
    register_type: holding
    address: 0x0586
    unit_of_measurement: "W"
    device_class: "power"
    value_type: U_WORD
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 10
  
  - platform: total_daily_energy
    name: ${friendly_name} Production Jour Entrée DC1
    power_id: puissance_entree_dc1
    unit_of_measurement: "kWh"
    method: trapezoid
    device_class: "energy"
    accuracy_decimals: 2
    filters:
      - multiply: 0.001
   #0.00100993782887751608127865850995
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Puissance Entrée DC2
    id: puissance_entree_dc2
    register_type: holding
    address: 0x0589
    unit_of_measurement: "W"
    device_class: "power"
    value_type: U_WORD
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 10

  - platform: total_daily_energy
    name: ${friendly_name} Production Jour Entrée DC2
    power_id: puissance_entree_dc2
    unit_of_measurement: "kWh"
    method: trapezoid
    device_class: "energy"
    accuracy_decimals: 2
    filters:
      - multiply: 0.001

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Production Totale Entrées DC 
    id: production_totale_entrees_dc
    register_type: holding
    address: 0x05C4
    unit_of_measurement: "kW"
    device_class: "power"
    icon: "mdi:solar-power"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Production Instantanée
    id: production_instantanee
    register_type: holding
    address: 0x0485
    unit_of_measurement: "kW"
    device_class: "power"
    icon: "mdi:solar-power"
    value_type: S_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Fréquence Réseau
    id: frequence_reseau
    register_type: holding
    address: 0x0484
    unit_of_measurement: "Hz"
    device_class: "frequency"
    icon: "mdi:current-ac"
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2      
      - multiply: 0.01
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Consommation Instantanée Réseau
    id: consommation_instantanee_reseau
    register_type: holding
    address: 0x0488
    unit_of_measurement: "kW"
    device_class: "power"
    icon: mdi:flash
    value_type: S_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: -0.01 


  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Consommation Instantanée Maison
    id: consommation_instantanee_maison
    register_type: holding
    address: 0x04AF
    unit_of_measurement: "kW"
    device_class: "power"
    icon: mdi:home-lightning-bolt-outline
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2      
      - multiply: 0.01 

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Tension AC
    id: tension_ac
    register_type: holding
    address: 0x048D
    unit_of_measurement: "V"
    device_class: "voltage"
    icon: "mdi:alpha-v-circle-outline"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.1
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Intensité AC
    id: intensite_ac
    register_type: holding
    address: 0x048E
    unit_of_measurement: "A"
    device_class: "current"
    icon: "mdi:alpha-a-circle-outline"
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2      
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Production Totale
    id: production_totale
    register_type: holding
    address: 0x0686
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: "mdi:solar-power"
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.1
 
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Production Jour
    id: production_jour
    register_type: holding
    address: 0x0684
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: "mdi:solar-power"
    value_type: U_DWORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Consommation Maison Totale
    id: consommation_maison_totale
    register_type: holding
    address: 0x068A
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: mdi:home-lightning-bolt-outline
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.1
 
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Consommation Maison Jour
    id: consommation_maison_jour
    register_type: holding
    address: 0x0688
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: mdi:home-lightning-bolt-outline
    value_type: U_DWORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Consommation Réseau Totale
    id: consommation_reseau_totale
    register_type: holding
    address: 0x068E
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: mdi:transmission-tower-export
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.1
 
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name:  ${friendly_name} Consommation Réseau Jour
    id: consommation_reseau_jour
    register_type: holding
    address: 0x068C
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: mdi:transmission-tower-export
    value_type: U_DWORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Injection Réseau Totale
    id: injection_reseau_totale
    register_type: holding
    address: 0x0692
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: mdi:transmission-tower-import
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.1
 
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Injection Réseau Jour
    id: injection_reseau_jour
    register_type: holding
    address: 0x0690
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: mdi:transmission-tower-import
    value_type: U_DWORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Température
    id: temperature_onduleur
    register_type: holding
    address: 0x041A
    unit_of_measurement: "°C"
    device_class: "temperature"
    icon: mdi:thermometer
    value_type: U_WORD
    filters:
      - median:
          window_size: 3
          send_every: 2  
  
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Lecture Injection Max Réseau
    id: lecture_injection_max_reseau
    register_type: holding
    address: 0x1024
    unit_of_measurement: "W"
    device_class: "power"
    value_type: U_WORD
    filters:
      - multiply: 100

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Retour Commande Marche/Arrêt
    id: retour_commande_marche_arret
    register_type: holding
    address: 0x1104
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Tension Batterie 1
    id: tension_batterie_1
    icon: "mdi:alpha-v-circle-outline"
    register_type: holding
    address: 0x0604
    unit_of_measurement: "V"
    device_class: "voltage"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:      
      - median:
          window_size: 3
          send_every: 2 
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Courant Batterie 1
    id: courant_batterie_1
    icon: "mdi:alpha-a-circle-outline"
    register_type: holding
    address: 0x0605
    unit_of_measurement: "A"
    device_class: "current"
    value_type: S_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2 
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Puissance Batterie 1
    id: puissance_batterie_1
    icon: "mdi:battery-charging-high"
    register_type: holding
    address: 0x0606
    unit_of_measurement: "kW"
    device_class: "power"
    value_type: S_WORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2 
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Température Batterie 1
    id: temperature_batterie_1
    icon: "mdi:thermometer"
    register_type: holding
    address: 0x0607
    unit_of_measurement: "°C"
    device_class: "temperature"
    value_type: S_WORD
    filters:
      - median:
          window_size: 3
          send_every: 2 

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} SOC Batterie 1
    id: soc_batterie_1
    icon: "mdi:battery-charging-high"
    register_type: holding
    address: 0x0608
    unit_of_measurement: "%"
    device_class: "battery"
    value_type: U_WORD
    filters:
      - median:
          window_size: 3
          send_every: 2 

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} SOH Batterie 1
    id: soh_batterie_1
    icon: "mdi:battery-heart-outline"
    register_type: holding
    address: 0x0609
    unit_of_measurement: "%"
    device_class: "battery"
    value_type: U_WORD
    filters:
      - median:
          window_size: 3
          send_every: 2 

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Nombres Cycles Batterie 1
    id: nombres_cycles_batterie_1
    icon: "mdi:battery-sync-outline"
    register_type: holding
    address: 0x060A
    unit_of_measurement: "Cycles"
    value_type: U_WORD
    filters:
      - median:
          window_size: 3
          send_every: 2 
          
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Charge Batterie 1 Jour
    id: charge_batterie_1_jour
    icon: "mdi:battery-arrow-up-outline"
    register_type: holding
    address: 0x0694
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: total_increasing
    value_type: U_DWORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2 
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Décharge Batterie 1 Jour
    id: decharge_batterie_1_jour
    icon: "mdi:battery-arrow-down-outline"
    register_type: holding
    address: 0x0698
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: total_increasing
    value_type: U_DWORD
    accuracy_decimals: 2
    filters:
      - median:
          window_size: 3
          send_every: 2
      - multiply: 0.01

switch:
  - platform: restart
    name: ${friendly_name} Restart
  
  - platform: template
    name: ${friendly_name} Commande Marche/Arrêt
    id: commande_marche_arret
    icon: mdi:power
    optimistic: true
    turn_on_action:
      - lambda: |-
      - script.execute: marche
    turn_off_action:
      - lambda: |- 
      - script.execute: arret

binary_sensor:
  - platform: status
    name: ${friendly_name} Status

number:
  - platform: template
    name: ${friendly_name} Ecriture Injection Max Réseau
    id: ecriture_injection_max_reseau
    unit_of_measurement: "W"
    device_class: "power"
    optimistic: true
    min_value: 0
    max_value: 3500
    step: 100
    initial_value: 0
    restore_value: true
    mode: 'box'
    on_value:
      then:
        - script.execute: ecriture_injection

  - platform: template
    name: ${friendly_name} Réglage Puissance Mode Passif
    id: reglage_puissance_mode_passif
    unit_of_measurement: "W"
    device_class: "power"
    optimistic: true
    min_value: -3500
    max_value: 3000
    step: 500
    initial_value: 0
    restore_value: true
    mode: 'slider'
    on_value:
      then:
        - script.execute: ecriture_puissance_mode_passif

select:
  
  - platform: template
    name: ${friendly_name} Mode Fonctionnement
    id: mode_fonctionnement
    optimistic: true
    options:
      - "Auto Utilisation"
      - "Temps d'Utilisation"
      - "Timing"
      - "Passif"
    initial_option: "Auto Utilisation"
    on_value:
      then:
        - lambda: !lambda |-
           auto options = id(mode_fonctionnement).traits.get_options();
           id(index_mode_fonctionnement) = std::distance(options.begin(), std::find(options.begin(), options.end(),x) );
        - script.execute: ecriture_mode_onduleur

script:

  - id: marche
    then:
      - lambda: |-
          esphome::modbus_controller::ModbusController *controller = id(sofarsolar);
          std::vector<uint16_t> sofar_settings (1) ;
          sofar_settings [0]  = uint16_t(1);
          esphome::modbus_controller::ModbusCommandItem sofar_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x1104, sofar_settings.size() , sofar_settings);
          delay(200) ;
          controller->queue_command(sofar_command);
          delay(200) ;
          ESP_LOGI("Ecriture", "marche");     
  - id: arret
    then:
      - lambda: |-
          esphome::modbus_controller::ModbusController *controller = id(sofarsolar);
          std::vector<uint16_t> sofar_settings (1) ;
          sofar_settings [0]  = uint16_t(0);
          esphome::modbus_controller::ModbusCommandItem sofar_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x1104, sofar_settings.size() , sofar_settings);
          delay(200) ;
          controller->queue_command(sofar_command);
          delay(200) ;
          ESP_LOGI("Ecriture", "arret");
    
  - id: ecriture_injection
    then:
      - lambda: |-
          esphome::modbus_controller::ModbusController *controller = id(sofarsolar);
          std::vector<uint16_t> sofar_settings (2) ;
          sofar_settings [0]  = uint16_t(1);
          sofar_settings [1]  = uint16_t((id(ecriture_injection_max_reseau).state)*0.01);
          esphome::modbus_controller::ModbusCommandItem sofar_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x1023, sofar_settings.size() , sofar_settings);
          delay(200) ;
          controller->queue_command(sofar_command);
          delay(200) ;
          ESP_LOGI("Ecriture", "ecriture_injection");

  - id: ecriture_mode_onduleur
    then:
      - lambda: |-
          esphome::modbus_controller::ModbusController *controller = id(sofarsolar);
          std::vector<uint16_t> sofar_settings {uint16_t(id(index_mode_fonctionnement))};
          esphome::modbus_controller::ModbusCommandItem sofar_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x1110, sofar_settings.size() , sofar_settings);
          delay(200) ;
          controller->queue_command(sofar_command);
          delay(200) ;
          ESP_LOGI("Ecriture", "ecriture_mode_fonctionnement");

  - id: ecriture_puissance_mode_passif
    then:
      - lambda: |-
          if (id(reglage_puissance_mode_passif).state > 0) {
             esphome::modbus_controller::ModbusController *controller = id(sofarsolar);
             std::vector<uint16_t> sofar_settings (6) ;
             sofar_settings [0]  = int16_t(0);
             sofar_settings [1]  = int16_t(id(reglage_puissance_mode_passif).state);
             sofar_settings [2]  = int16_t(0);
             sofar_settings [3]  = int16_t(id(reglage_puissance_mode_passif).state);
             sofar_settings [4]  = int16_t(0);
             sofar_settings [5]  = int16_t(id(reglage_puissance_mode_passif).state);
             esphome::modbus_controller::ModbusCommandItem sofar_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x1187, sofar_settings.size() , sofar_settings);
             delay(200) ;
             controller->queue_command(sofar_command);
             delay(200) ;
             ESP_LOGI("Ecriture", "ecriture_injection");
             } else {
                   esphome::modbus_controller::ModbusController *controller = id(sofarsolar);
                   std::vector<uint16_t> sofar_settings (6) ;
                   sofar_settings [0]  = 0xFFFF;
                   sofar_settings [1]  = (int16_t(0xFFFF) + int16_t(id(reglage_puissance_mode_passif).state));
                   sofar_settings [2]  = 0xFFFF;
                   sofar_settings [3]  = (int16_t(0xFFFF) + int16_t(id(reglage_puissance_mode_passif).state));
                   sofar_settings [4]  = 0xFFFF;
                   sofar_settings [5]  = (int16_t(0xFFFF) + int16_t(id(reglage_puissance_mode_passif).state));
                   esphome::modbus_controller::ModbusCommandItem sofar_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x1187, sofar_settings.size() , sofar_settings);
                   delay(200) ;
                   controller->queue_command(sofar_command);
                   delay(200) ;
                   ESP_LOGI("Ecriture", "ecriture_injection");             
             }

bonsoir, je te remercie pour ton code et je vais le testé par conte home assistant est obligatoire ?

Je peux pas dire, injecte via esphome sous windows ou HA, et tu pourras lire en local, adresse ip de l'esp32 (page web local) ensuite à toi de l'importer HA ou peut être jeedom. Sinon avec la page web 80, on contrôle aussi. :slight_smile:

je pensais pas que s'était possible en local sans HA. je vais testé comme sa pour voir

Pour la carte: MAX 485

Je regarde pour testé votre code mais on fait comment pour mettre esphome sur esp32 sans home assistant du coup ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.