ESPHome I2C scan

Skanowanie magistrali I2C następuje po wgraniu nowego softu ESPHome na urządzenie. Czy jest możliwość przeskanowania magistrali bez konieczności wgrywania oprogramoawnia ?

Zrebootuj ESP - skan magistral jest wykonywany zawsze przy starcie.

A czy da się jakąś komendą wymusić skanowanie bez konieczności fizycznego restartu urządzenia. Chodzi o zdalne wymuszenie skanowania.

Komend nie znam, ale możesz sobie dodać taki przełącznik:

lub przycisk

wtedy z poziomu HA to ogarniasz.

Niestety taki restart nie wywołuje skanowania magistrali I2C.

Nie wiem czy musi być koniecznie ESPHome, ale Tasmota ma sporo możliwości:

Creating an I2C driver~

Komenda:
I2CScan - Scan I2C bus and show addresses for found devices

Cytat

A masz w konfiguracji magistrali I2C wpis
scan: true
Cytat z dokumentacji ESPHome (przetłumaczony)
scan (Optional , boolean): Jeśli ESPHome powinien przeszukać przestrzeń adresową I²C podczas uruchamiania. Wartość domyślna to .true

Tak .

i2c:

  • id: bus_a
    sda: GPIO14
    scl: GPIO15
    scan: true
    frequency: 800kHz

@angler Akurat zrobiłem przesiadkę z Tasmoty na ESPHome :slight_smile: . Tasmota ma linię komend gdzie można wywołać skanowanie. Tasmotę zmieniłem na ESPHome ze względu na ograniczenia Tasmoty:

  • MCP23017 - tylko 1 szt. możliwa do podłączenia
  • rolety - obsługa tylko do 4 rolet

A tak na ESPHome na jednym układzie WT32-ETH obsługuję 4 płytki MCP23017 co daje mi 64 I/O .
I mogę dołożyć kolejne. Mam już 5 rolet i kolejne 4 czekają na przełączenie.
Jest dostęp do tego urządzenia przez WEB więc można pominąć w razie awarii HA.
Jedynie przy diagnostyce brakuje możliwości wywołania takiego skanu , sama funkcjonalność istnieje , bo skanowanie jest wykonywane przy fizycznym restarcie urządzenia. Brakuje sposobu by wywołać ją ponownie.

No cóż byłem przekonany, że wystarczy zwykły reboot, ale istotnie nie sprawdziłem tego rozwiązania w praktyce.

Spróbuj dodatkowo tego (lub podobnej konstrukcji, bo jak widzę jest tu szukane polecenie inicjalizacji wire)

To niestety nie ma wpływu na skanowanie magistrali I2C.

Należałoby podejrzeć jak ta kwestia jest zrealizowana w Tasmota, bo w sumie to można wrzucić własny kod (zgodny z arduino), nigdy tego nie robiłem, więc bardziej już nie jestem w stanie pomóc
https://esphome.io/custom/i2c.html

No to poszedłem tą drogą i wykorzystując kod Arduino do skanowania magistrali I2C i custom component łączący się z MQTT mam skanowanie magistrali. Znalezione adresy wyrzuca na konsolę na WWW EspHome oraz pod wskazanym tematem MQTT w my_custom_component.h.
Dzięki za wskazówki.

ESPHome .yaml

esphome:
  name: ${device_name}

  includes:
    - my_custom_component.h
  libraries:
    - Wire


custom_component:
- lambda: |-
    auto my = new MyCustomComponent();
    return {my};    

my_custom_component.h

#include "esphome.h"

class MyCustomComponent : public Component, public CustomMQTTDevice {
 public:
  void setup() override {
    // This will be called once to set up the component
    // think of it as the setup() call in Arduino
    Wire.begin();
    subscribe("esphome-komorka-1/I2C_scan/command", &MyCustomComponent::on_message);
  }

  void on_message(const std::string &payload) {

    byte error, address;
    int nDevices;
 
    if (payload == "scan") {
      byte error, address;
      int nDevices;
      char message_topic[50];
      char message_payload[50];
      String  MQTT_topic = "esphome-komorka-1/I2C_scan/state";
      String  MQTT_payload = "";
      MQTT_topic.toCharArray(message_topic, 50) ;
      String i2c_address_hex;
      nDevices = 0;
      ESP_LOGD("custom", "Started scanning I2C ...");
      publish("esphome-komorka-1/I2C_scan/state", "Started scanning I2C ...");
    

  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      i2c_address_hex = ("0x");
      i2c_address_hex += String(address, HEX);
      ESP_LOGD("Custom", "Found I2C device, address: %s ", i2c_address_hex);
      i2c_address_hex.toCharArray(message_payload, 50) ;
      publish(message_topic, message_payload);
      nDevices++;
    }
    else if (error==4) 
    {
      i2c_address_hex = ("0x");
      i2c_address_hex += String(address, HEX);
      ESP_LOGD("Custom", "Unknown error at address: %s ", i2c_address_hex);
      MQTT_payload = "Unknown error at address: ";
      MQTT_payload += i2c_address_hex ;
      MQTT_payload.toCharArray(message_payload, 50) ;
      publish(message_topic, message_payload);
      nDevices++;
    }    
  }
  if (nDevices == 0)
    {
        ESP_LOGD("Custom", "No I2C devices found");
        MQTT_payload = "No I2C devices found";
        MQTT_payload.toCharArray(message_payload, 50) ;
        publish(message_topic, message_payload);
    }
  else
    {
        ESP_LOGD("Custom", "I2C scan done.");
        MQTT_payload = "I2C scan done";
        MQTT_payload.toCharArray(message_payload, 50) ;
        publish(message_topic, message_payload);
    }

    } 
  }

};

tak to wygląda na konsoli WWW - Logs
image

1 polubienie