Retrieve a variable value on a CAN Bus

Bonjour,
Je recherche à récupérer puis transmettre une valeur provenant d’un réseau CanBus.
J’ai actuellement un système fonctionnel avec un ESP8266 et un MCP2515.
J’arrive à envoyer une valeur depuis Home assistant sur le réseau CAN.
Mais je n’arrive pas à récupérer une valeur du réseau CAN vers home assistante.

Je pense qu’il faut faire une lambda, mais je ne suis pas très bon dans le domaine.

// Envoyer une valeur d'Home Assistant en vers CANBUS 
  - platform: mcp2515
    id: my_mcp25153
    spi_id: McpSpi
    cs_pin: GPIO14
    can_id: 4
    bit_rate: 500kbps
    on_frame:
    - can_id: 0x100
      then:
        - lambda: |-  
// je ne sais pas ce qu'il faut mettre dans cette lambda pour transmettre la valeur provenant de l'ID 100 dans le capteur virtuel  id: "can_variable"

sensor:
  - platform: homeassistant
    name: "test"
    id: number_test
    entity_id: input_number.test
    on_value:
     then:
      - canbus.send:
         canbus_id: my_mcp25153
         can_id: 0x622
         data: !lambda
          return { (uint8_t) id(number_test).state};

  - platform: template
    name: "CAN variable"
    id: "can_variable"

Je pense que ça ne doit pas être très compliqué, merci pour votre aide.
:grinning:

1 Like

Please see the sticky post:

We can only support one language here, and that language is English. We appreciate that not everybody can read and write it, but there are a wide range of options out there.

En français:

S’il vous plaît voir le post collant:

Nous ne pouvons prendre en charge qu’une seule langue ici, et cette langue est l’anglais. Nous comprenons que tout le monde ne peut pas le lire et l’écrire, mais il existe un large éventail d’options.

Doing it via ESPHome will save you some headache, if only for the very detailed doc they have.

Merci pour votre réponse, j’avais déjà regardé cette page mais il ne dise pas comment transférer une valeur variable du CANBUS vers home Assistant.

TR:
Thank you for your answer, I had already looked at this page but it does not tell how to transfer a variable value from CANBUS to home Assistant.

Sure it does:

spi:
  id: McpSpi
  clk_pin: GPIO16
  mosi_pin: GPIO5
  miso_pin: GPIO4

binary_sensor:
  - platform: template
    name: "CAN Bus Button"
    id: "can_bus_button"

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO14
    can_id: 4
    bit_rate: 125kbps
    on_frame:
    - can_id: ${0x100}
      then:
        - lambda: |-
            if(x.size() > 0) {
              switch(x[0]) {
                case 0x0: id(can_bus_button).publish_state(false); break; // button release
                case 0x1: id(can_bus_button).publish_state(true); break;  // button down
              }
            }

This will publish the state of a can bus button. It will show up through the integration of ESPhome in HA as an entity with a boolean.

Note that you just need to specify what sensor you want, no need for the - platform: homeassistant

Oui j’ai vu cette possibilité là, et je l’ai essayé avec succès.

Mais moi je cherche à récupérer une valeur variable par exemple un pourcentage de batterie et à l’envoyer sur Home Assistant.

Yes I saw that possibility there, and I tried it with success.
But I’m trying to get a variable value, for example a battery percentage, and send it to Home Assistant.

So instead of defining a binary_sensor you would have to define a sensor.
And instead of sending a fixed value you would need to send the message. (Which would be x by looking at their code)

    on_frame:
    - can_id: 0x100
      then:
        - lambda: |-
          id(name_of_sensor).publish_state(x);

Might be worth a shot to see what HA shows in the debug state page with this entity.

Hello, Thanks for your answer, I suspected that the code should not be very complicated, but it does not work.
Here is my code :

canbus:
  - platform: mcp2515
    id: my_mcp25153
    spi_id: McpSpi
    cs_pin: GPIO14
    can_id: 4
    bit_rate: 500kbps
    on_frame:
    - can_id: 0x100
      then:
        - lambda: |-
            id(can_variable).publish_state(x);

          
sensor:
  - platform: template
    name: "CAN variable"
    id: "can_variable"

Here is the error in the compilation :

Compiling /data/esp-can/.pioenvs/esp-can/src/main.cpp.o
/config/esphome/esp-can.yaml: In lambda function:
/config/esphome/esp-can.yaml:74:36: error: no matching function for call to 'esphome::template_::TemplateSensor::publish_state(std::vector<unsigned char>&)'
            id(can_variable).publish_state(x);
                                    ^
/config/esphome/esp-can.yaml:74:36: note: candidate is:
In file included from src/esphome/core/application.h:15:0,
                 from src/esphome/components/api/api_connection.h:4,
                 from src/esphome.h:2,
                 from src/main.cpp:3:
src/esphome/components/sensor/sensor.h:119:8: note: void esphome::sensor::Sensor::publish_state(float)
   void publish_state(float state);
        ^
src/esphome/components/sensor/sensor.h:119:8: note:   no known conversion for argument 1 from 'std::vector<unsigned char>' to 'float'
*** [/data/esp-can/.pioenvs/esp-can/src/main.cpp.o] Error 1

I found why it didn’t work, you just had to add brackets [0]:

  - platform: mcp2515
    id: my_mcp25153
    spi_id: McpSpi
    cs_pin: GPIO14
    can_id: 4
    bit_rate: 500kbps
    on_frame:
    - can_id: 0x100
      then:
        - lambda: |-
           id(can_variable).publish_state(x[0]);

Thank you

1 Like