ESP8266/ESP32 + CC1101 - projekt "everblu-meters" 433MHz

Czy jest możliwość dodania obsługi licznika Itron AnyQuest Cyble ?

Moim komponentem wmbus jest to niemożliwe, tam na naklejce masz 433MHz a CC1101 u mnnie jest ustawiony na 868MHz.
Szybki przegląd internetu wskazuje że (najprawdopodobniej), produkują też inną wersję dla wM-Bus.

1 polubienie

Zakupiłem cc1101 w wersji 433MHz

Ten licznik działa na trochę innej zasadzie i do tego na 433MHz.
Potrzebny osobny interfejs z CC1101 (433MHz), który bedzię odpytywał ten licznik (licznik odpowiada na zapytanie w okreslonych godzinach).
Mam taki jako główny na budynku i swietnie działa z projektem :slight_smile:
psykokwak-com/everblu-meters-esp8266: Fetch water usage data from Cyble meters for esp8266 (github.com)
Integracja z HA przez MQTT.

2 polubienia

Maiłeś jakieś problemy z uruchomieniem ? W HA nie mam odczytu ale w serial monitor odczyt działa:
Test frequency : 433.760010


Got frequency : 433.760010


Liters : 814833

Battery (in months) : 84

Counter : 63

@_Szczepan, czy to ma szansę działać z nakładką Itron na 433MHz? Kupiłem cc1101 na 433MHz, podłączyłem, ale w logach nie widzę, żeby coś znalazł.

@szeryf
Pytanie przeniosłem tutaj (to już wcześniej wydzielony fragment tamtego wątku).
Odpowiedź jest niestety negatywna, ale popatrz czy opisywany tu projekt nie podejdzie do twojej nakładki.

Witam jakiego programu używaliście do skompilowania

Tutaj jest pełny opis ale nie mam pojęcia jak sprawdzić freqwency key. Używam programu Arduino na Windows a próbuję zrobić według tej instrukcji

Możesz użyć chmurowego środowiska Gitpod, wystarcza przeglądarka z dostępem do internetu i konto na Github.

Dziękuję będę dalej kombinowal uczył się
Coś o liczniku anyquest

1 polubienie

Użyj Gitpod, masz wówczas zawsze aktualne biblioteki i platformę tę samą co Ardiuno.

teraz moge edytować pliki wszystko działa a w którym miejscu wystepuje kompilacja?>

Może się przydać

Jak dostanę części spróbuję zrobić bo esphome z poziomu HA to jest bajka

1 polubienie

Plik został skompilowany na ARDUINO INO (chociaż próbowałem na Visual Studio ale bez rezultatu )i uruchomiony na ESP 32 Devkit 1 bez anteny Wszystko się uruchomiło ,złapał sygnał ale brak go w HA czy kto wie czy mam coś tutaj zmienić

char *jsonTemplate = 
"{                    \
\"liters\": %d,       \
\"counter\" : %d,     \
\"battery\" : %d,     \
\"timestamp\" : \"%s\"\
}";

int _retry = 0;
void onUpdateData()
{
  struct tmeter_data meter_data;
  meter_data = get_meter_data();

  time_t tnow = time(nullptr);
  struct tm *ptm = gmtime(&tnow);
  Serial.printf("Current date (UTC) : %04d/%02d/%02d %02d:%02d:%02d - %s\n", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, String(tnow, DEC).c_str());

  char iso8601[128];
  strftime(iso8601, sizeof iso8601, "%FT%TZ", gmtime(&tnow));

  if (meter_data.reads_counter == 0 || meter_data.liters == 0) {
    Serial.println("Unable to retrieve data from meter. Retry later...");

    // Call back this function in 10 sec (in miliseconds)
    if (_retry++ < 10)
      mqtt.executeDelayed(1000 * 10, onUpdateData);

    return;
  }

  digitalWrite(LED_BUILTIN, LOW); // turned on

  Serial.printf("Liters : %d\nBattery (in months) : %d\nCounter : %d\n\n", meter_data.liters, meter_data.battery_left, meter_data.reads_counter);

  mqtt.publish("everblu/cyble/liters", String(meter_data.liters, DEC), true);
  delay(50); // Do not remove
  mqtt.publish("everblu/cyble/counter", String(meter_data.reads_counter, DEC), true);
  delay(50); // Do not remove
  mqtt.publish("everblu/cyble/battery", String(meter_data.battery_left, DEC), true);
  delay(50); // Do not remove
  mqtt.publish("everblu/cyble/timestamp", iso8601, true); // timestamp since epoch in UTC
  delay(50); // Do not remove

  char json[512];
  sprintf(json, jsonTemplate, meter_data.liters, meter_data.reads_counter, meter_data.battery_left, iso8601);
  mqtt.publish("everblu/cyble/json", json, true); // send all data as a json message
}


// This function calls onUpdateData() every days at 10:00am UTC
void onScheduled()
{
  time_t tnow = time(nullptr);
  struct tm *ptm = gmtime(&tnow);


  // At 10:00:00am UTC
  if (ptm->tm_hour == 10 && ptm->tm_min == 0 && ptm->tm_sec == 0) {

    // Call back in 23 hours
    mqtt.executeDelayed(1000 * 60 * 60 * 23, onScheduled);

    Serial.println("It is time to update data from meter :)");

    // Update data
    _retry = 0;
    onUpdateData();

    return;
  }

  // Every 500 ms
  mqtt.executeDelayed(500, onScheduled);
}


String jsonDiscoveryDevice1(
"{ \
  \"name\": \"Compteur Eau Index\", \
  \"unique_id\": \"water_meter_value\",\
  \"object_id\": \"water_meter_value\",\
  \"icon\": \"mdi:water\",\
  \"state\": \"{{ states(sensor.water_meter_value)|float / 1 }}\",\
  \"unit_of_measurement\": \"L\",\
  \"device_class\": \"water\",\
  \"state_class\": \"total_increasing\",\
  \"qos\": \"0\",\
  \"state_topic\": \"everblu/cyble/liters\",\
  \"force_update\": \"true\",\
  \"device\" : {\
  \"identifiers\" : [\
  \"14071984\" ],\
  \"name\": \"Compteur Eau\",\
  \"model\": \"Everblu Cyble ESP8266/ESP32\",\
  \"manufacturer\": \"Psykokwak\",\
  \"suggested_area\": \"Home\"}\
}");

String jsonDiscoveryDevice2(
"{ \
  \"name\": \"Compteur Eau Batterie\", \
  \"unique_id\": \"water_meter_battery\",\
  \"object_id\": \"water_meter_battery\",\
  \"device_class\": \"battery\",\
  \"icon\": \"mdi:battery\",\
  \"unit_of_measurement\": \"%\",\
  \"qos\": \"0\",\
  \"state_topic\": \"everblu/cyble/battery\",\
  \"value_template\": \"{{ [(value|int), 100] | min }}\",\
  \"force_update\": \"true\",\
  \"device\" : {\
  \"identifiers\" : [\
  \"14071984\" ],\
  \"name\": \"Compteur Eau\",\
  \"model\": \"Everblu Cyble ESP8266/ESP32\",\
  \"manufacturer\": \"Psykokwak\",\
  \"suggested_area\": \"Home\"}\
}");

String jsonDiscoveryDevice3(
"{ \
  \"name\": \"Compteur Eau Compteur\", \
  \"unique_id\": \"water_meter_counter\",\
  \"object_id\": \"water_meter_counter\",\
  \"icon\": \"mdi:counter\",\
  \"qos\": \"0\",\
  \"state_topic\": \"everblu/cyble/counter\",\
  \"force_update\": \"true\",\
  \"device\" : {\
  \"identifiers\" : [\
  \"14071984\" ],\
  \"name\": \"Compteur Eau\",\
  \"model\": \"Everblu Cyble ESP8266/ESP32\",\
  \"manufacturer\": \"Psykokwak\",\
  \"suggested_area\": \"Home\"}\
}");

String jsonDiscoveryDevice4(
  "{ \
  \"name\": \"Compteur Eau Timestamp\", \
  \"unique_id\": \"water_meter_timestamp\",\
  \"object_id\": \"water_meter_timestamp\",\
  \"device_class\": \"timestamp\",\
  \"icon\": \"mdi:clock\",\
  \"qos\": \"0\",\
  \"state_topic\": \"everblu/cyble/timestamp\",\
  \"force_update\": \"true\",\
  \"device\" : {\
  \"identifiers\" : [\
  \"14071984\" ],\
  \"name\": \"Compteur Eau\",\
  \"model\": \"Everblu Cyble ESP8266/ESP32\",\
  \"manufacturer\": \"Psykokwak\",\
  \"suggested_area\": \"Home\"}\
}");

void onConnectionEstablished()
{
  Serial.println("Connected to MQTT Broker :)");

  Serial.println("> Configure time from NTP server.");
  configTzTime("UTC0", "pool.ntp.org");




  Serial.println("> Configure Arduino OTA flash.");
  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    }
    else { // U_FS
      type = "filesystem";
    }
    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd updating.");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("%u%%\r\n", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    }
    else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    }
    else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    }
    else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    }
    else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.setHostname("EVERBLUREADER");
  ArduinoOTA.begin();

  mqtt.subscribe("everblu/cyble/trigger", [](const String& message) {
    if (message.length() > 0) {

      Serial.println("Update data from meter from MQTT trigger");

      _retry = 0;
      onUpdateData();
    }
  });



  Serial.println("> Send MQTT config for HA.");
  // Auto discovery
  delay(50); // Do not remove
  mqtt.publish("homeassistant/sensor/water_meter_value/config", jsonDiscoveryDevice1, true);
  delay(50); // Do not remove
  mqtt.publish("homeassistant/sensor/water_meter_battery/config", jsonDiscoveryDevice2, true);
  delay(50); // Do not remove
  mqtt.publish("homeassistant/sensor/water_meter_counter/config", jsonDiscoveryDevice3, true);
  delay(50); // Do not remove
  mqtt.publish("homeassistant/sensor/water_meter_timestamp/config", jsonDiscoveryDevice4, true);
  delay(50); // Do not remove

  onScheduled();
}

void setup()
{
  Serial.begin(115200);
  Serial.println("\n");

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH); // turned off

  mqtt.setMaxPacketSize(1024);
  //mqtt.enableDebuggingMessages(true);

  /*
  // Use this piece of code to find the right frequency.
  for (float i = 433.76f; i < 433.890f; i += 0.0005f) {
    Serial.printf("Test frequency : %f\n", i);
    cc1101_init(i);

    struct tmeter_data meter_data;
    meter_data = get_meter_data();

    if (meter_data.reads_counter != 0 || meter_data.liters != 0) {
      Serial.printf("\n------------------------------\nGot frequency : %f\n------------------------------\n", i);

      Serial.printf("Liters : %d\nBattery (in months) : %d\nCounter : %d\n\n", meter_data.liters, meter_data.battery_left, meter_data.reads_counter);

      digitalWrite(LED_BUILTIN, LOW); // turned on

      while (42);
    }
  }
  */



  cc1101_init(FREQUENCY);

  /*
  // Use this piece of code to test
  struct tmeter_data meter_data;
  meter_data = get_meter_data();
  Serial.printf("\nLiters : %d\nBattery (in months) : %d\nCounter : %d\nTime start : %d\nTime end : %d\n\n", meter_data.liters, meter_data.battery_left, meter_data.reads_counter, meter_data.time_start, meter_data.time_end);
  while (42);
  */
}

void loop()
{
  mqtt.loop(); 
  ArduinoOTA.handle();
}

Czy masz na myśli “bez transceivera CC1101”?

tak narazie próbowałem skompilować na sucho bin który zakonczył się powodzeniem i dołaczeniem everblue cyble do sieci lokalej

Gratulacje, ale skoro nie mają się skąd brać dane, to dlaczego sądzisz, że firmware powinno publikować jakiekolwiek dane przez MQTT?

zrobiłem rownież na sucho czunik przeplywu wody i tutaj poszło jak wpisałem HA auto discovery tylko chyba mylę pojęcia

Czy ktoś wie jak ustawić 4pm?

// This function calls onUpdateData() every days at 10:00am UTC
void onScheduled()
{
  time_t tnow = time(nullptr);
  struct tm *ptm = gmtime(&tnow);


  // At 10:00:00am UTC
  if (ptm->tm_hour == 10 && ptm->tm_min == 0 && ptm->tm_sec == 0) {

    // Call back in 23 hours
    mqtt.executeDelayed(1000 * 60 * 60 * 23, onScheduled);

    Serial.println("It is time to update data from meter :)");

    // Update data
    _retry = 0;
    onUpdateData();

    return;
  }

Bez anteny też się daaaa
ccc
teraz czekamy na antenkę jeżeli ktoś bedzie miał problem z kompilacją wyjaśnie śmiało pisać

I tried the aformentioned setup with an Anyquest Cyble Enhanced. The final result was that the water company replaced the whole meter in 4 months. Because they were unable to read it anymore. Which is down to the fact that the read counter does not match to what is in their database. And once it does not match, they are unable to get the data. It is like a tamper flag for them.

Anyhow the meter can be read Monday to Friday in working hours. As it was meant to be read by the water company and nobody else.