XIAOMI LYWSD03MMC - odczyt przez ESP32

Awatar użytkownika
veeroos
Posty: 271
Rejestracja: ndz mar 20, 2022 9:30 am
Lokalizacja: Głogów

klew pisze: wt lut 14, 2023 8:30 pm
veeroos pisze: wt lut 14, 2023 8:23 pm Ale chciałbym podglądać logi z działania urządzenia, a nic nie widzę, może trzeba jakoś inaczej skonfigurować interfejs, albo na innych pinach czytać?
Podgląd seriala jest na tych samych pinach, co wgrywanie danych, także powinno działać.
Czego używasz do podglądu? Spróbuj różnych programów do tego (u mnie w sumie serial monitor z Arduino IDE działa prawie zawsze, putty też się dobrze sprawdza).

Jak nie będzie nadal działać, to wrzuć tam prawie pusty program w Arduino i dodaj tylko logowanie (np. "jesteś super" co 1 s).
No właśnie używam tego samego portu USB na tej płytce, używam serial monitora z Arduino, zawsze wszystko chodziło, a tutaj taka niespodzianka. Po skanowaniu bluetooth wrzucam do seriala dane o odczytanych czujnikach i wartości w ten sam sposób jak to zrobił kolega @Duch__
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4
kurus
Posty: 1038
Rejestracja: śr sty 15, 2020 8:17 pm

Myślałem że jestem w miarę zaawansowanych użytkownikiem supli, cały dom osuplowałem na różnych modułach od gotowcow zamela po sonoffy gosundy, shelly, loratap, wemosy i inne nodem mcu gdzie trzeba lutowac, wgrywać softy łączyć czujniki przekaźniki itp, i jak czytam taki temat to stwierdzam ze ja mocno początkujący jestem :lol: :lol:
Awatar użytkownika
veeroos
Posty: 271
Rejestracja: ndz mar 20, 2022 9:30 am
Lokalizacja: Głogów

kurus pisze: śr lut 15, 2023 8:33 am Myślałem że jestem w miarę zaawansowanych użytkownikiem supli, cały dom osuplowałem na różnych modułach od gotowcow zamela po sonoffy gosundy, shelly, loratap, wemosy i inne nodem mcu gdzie trzeba lutowac, wgrywać softy łączyć czujniki przekaźniki itp, i jak czytam taki temat to stwierdzam ze ja mocno początkujący jestem :lol: :lol:
Ja tam w ogóle nie jestem zaawansowany 😉, nawet nie uważam że znam się na programowaniu 😉, ale czasami gdzieś na forum znajduje się "takie perełki" i aż by się chciało uruchomić żeby działało. Od wczoraj mi wszystko chodzi, wrzucę dzisiaj na forum pod wieczór kod źródłowy, jest pisany na szybko, więc błędy pewnie ma. Chyba już znalazłem gdzie tkwi problem z brakiem odczytu po serialu, bo ESP32 S3 ma o wiele więcej ustawień podczas wgrywania przez Arduino programu i chyba jednej opcji nie przełączyłem. Oczywiście gdzieś tam mi od czasu do czasu zerwie połączenie z serwerem, ale z braku odczytu logów to nie widzę co się dzieje, jak wrzucę program to może ktoś gdzieś znajdzie błąd i wspólnymi siłami dopracujemy projekt bo jest całkiem ciekawy. 😉
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4
Awatar użytkownika
veeroos
Posty: 271
Rejestracja: ndz mar 20, 2022 9:30 am
Lokalizacja: Głogów

Dlatego iż program powstał na szybko może posiadać błędy, wiem, że wysyłanie danych można załatwić jedną klasą, ale tak jak pisałem na szybko wszystko pisałem tak aby sprawdzić funkcjonalność urządzenia.

Kod: Zaznacz cały

/*
  Copyright (C) AC SOFTWARE SP. Z O.O.

  This program 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 2
  of the License, or (at your option) any later version.

  This program 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 this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#define STATUS_LED_GPIO 2
#define BUTTON_CFG_RELAY_GPIO 0
#include <sstream>
#include <BLEDevice.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>


#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/button.h>
#include <supla/control/action_trigger.h>
#include <supla/device/status_led.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/status_led_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/sensor/therm_hygro_meter.h>

#define SCAN_TIME  8 // 8 sekund wykrywa urządzenia

int urzadzenie1 = 0;
int urzadzenie2 = 0;
int urzadzenie3 = 0;
int wilg1 = 0;
float temp1 = -275;
int wilg2 = 0;
float temp2 = -275;
int wilg3 = 0;
float temp3 = -275;
int bat1;
int bat2;
int bat3;
unsigned long czas_pomiedzy_skanowaniem;
unsigned long wifimilis;
boolean METRIC = true; //Set true for metric system; false for imperial

String text01;
String text02;
String text03;
String text04;
String text05;
String text06;
String text07;
String text08;
String text09;
String text10;
String text11;
String text12;
String text13;
String text14;
String text15;
String zmienna;
String MAC_ADR;
byte BLE_DEVICE;
bool wyswietl = 0;

//================================Tutaj deklarujemy adresy MAC naszych czujników=================
#define XIAOMI_BLE_DEVICE_1_MAC "A4:C1:38:0D:AE:08"
#define XIAOMI_BLE_DEVICE_2_MAC "A4:C1:38:10:3D:44"
#define XIAOMI_BLE_DEVICE_3_MAC "A4:C1:38:43:6A:FE"
//===============================================================================================


#include <supla/storage/eeprom.h>
Supla::Eeprom eeprom;

Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;

Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true); // inverted state
Supla::EspWebServer suplaServer;

Supla::Html::DeviceInfo htmlDeviceInfo(&SuplaDevice);
Supla::Html::WifiParameters htmlWifi;
Supla::Html::ProtocolParameters htmlProto;
Supla::Html::StatusLedParameters htmlStatusLed;

int current_humidity;
int current_batt;

word val;

BLEScan *pBLEScan;

void IRAM_ATTR resetModule(){
    ets_printf("reboot\n");
    esp_restart();
}

float current_temperature;

class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice)
    {
        if (advertisedDevice.haveName() && advertisedDevice.haveServiceData() /*&& !advertisedDevice.getName().compare("ATC_9C1E8B")*/) {

            int serviceDataCount = advertisedDevice.getServiceDataCount();
            std::string strServiceData = advertisedDevice.getServiceData(0);

            uint8_t cServiceData[100];
            char charServiceData[100];

            strServiceData.copy((char *)cServiceData, strServiceData.length(), 0);

            for (int i=0;i<strServiceData.length();i++) {
                sprintf(&charServiceData[i*2], "%02x", cServiceData[i]);
            }

            std::stringstream ss;
            ss << "fe95" << charServiceData;

            

            text01 = String(charServiceData[0]) + String(charServiceData[1]);      //Serial.print(text1); Serial.print(" ");
            text02 = String(charServiceData[2]) + String(charServiceData[3]);      //Serial.print(text2); Serial.print(" ");
            text03 = String(charServiceData[4]) + String(charServiceData[5]);      //Serial.print(text3); Serial.print(" ");
            text04 = String(charServiceData[6]) + String(charServiceData[7]);      //Serial.print(text4); Serial.print(" ");
            text05 = String(charServiceData[8]) + String(charServiceData[9]);      //Serial.print(text5); Serial.print(" "); 
            text06 = String(charServiceData[10]) + String(charServiceData[11]);    //Serial.print(text6); Serial.print(" "); 
            text07 = String(charServiceData[12]) + String(charServiceData[13]);    //Serial.print(text7); Serial.print(" "); 
            text08 = String(charServiceData[14]) + String(charServiceData[15]);    //Serial.print(text8); Serial.print(" "); 
            text09 = String(charServiceData[16]) + String(charServiceData[17]);    //Serial.print(text9); Serial.print(" "); 
            text10 = String(charServiceData[18]) + String(charServiceData[19]);   //Serial.print(text10); Serial.print(" "); 
            text11 = String(charServiceData[20]) + String(charServiceData[21]);   //Serial.print(text11); Serial.print(" "); 
            text12 = String(charServiceData[22]) + String(charServiceData[23]);   //Serial.print(text12); Serial.print(" "); 
            
            //Serial.println();

            zmienna = text01; Zamien_litery(); text01 = zmienna;
            zmienna = text02; Zamien_litery(); text02 = zmienna;
            zmienna = text03; Zamien_litery(); text03 = zmienna;
            zmienna = text04; Zamien_litery(); text04 = zmienna;
            zmienna = text05; Zamien_litery(); text05 = zmienna;
            zmienna = text06; Zamien_litery(); text06 = zmienna;
            zmienna = text07; Zamien_litery(); text07 = zmienna;
            zmienna = text08; Zamien_litery(); text08 = zmienna;
            zmienna = text09; Zamien_litery(); text09 = zmienna;
            zmienna = text10; Zamien_litery(); text10 = zmienna;
            zmienna = text11; Zamien_litery(); text11 = zmienna;
            zmienna = text12; Zamien_litery(); text12 = zmienna;
            zmienna = text13; Zamien_litery(); text13 = zmienna;
            zmienna = text14; Zamien_litery(); text14 = zmienna;
            zmienna = text15; Zamien_litery(); text15 = zmienna;




            Konwersja();


            
        }
    }
};

class Czujnik1 : public Supla::Sensor::ThermHygroMeter {
 public:
  explicit Czujnik1()
{

  }

  double getTemp() {
    temperature = temp1;
    return temperature;
  }

  double getHumi() {
    humidity = wilg1;
    return humidity;
  }

 private:
  void iterateAlways() {
    if (millis() - lastReadTime > 10000) {
      lastReadTime = millis();
      channel.setNewValue(getTemp(), getHumi());
    }
  }

  void onInit() {
    channel.setNewValue(getTemp(), getHumi());
  }

 protected:
  double temperature;
  double humidity;
};

class Czujnik2 : public Supla::Sensor::ThermHygroMeter {
 public:
  explicit Czujnik2()
{

  }

  double getTemp() {
    temperature = temp2;
    return temperature;
  }

  double getHumi() {
    humidity = wilg2;
    return humidity;
  }

 private:
  void iterateAlways() {
    if (millis() - lastReadTime > 10000) {
      lastReadTime = millis();
      channel.setNewValue(getTemp(), getHumi());
    }
  }

  void onInit() {
    channel.setNewValue(getTemp(), getHumi());
  }

 protected:
  double temperature;
  double humidity;
};

class Czujnik3 : public Supla::Sensor::ThermHygroMeter {
 public:
  explicit Czujnik3()
{

  }

  double getTemp() {
    temperature = temp3;
    return temperature;
  }

  double getHumi() {
    humidity = wilg3;
    return humidity;
  }

 private:
  void iterateAlways() {
    if (millis() - lastReadTime > 10000) {
      lastReadTime = millis();
      channel.setNewValue(getTemp(), getHumi());
    }
  }

  void onInit() {
    channel.setNewValue(getTemp(), getHumi());
  }

 protected:
  double temperature;
  double humidity;
};
/*
class Bateria : public Supla::Sensor::Thermometer {
  public:
    Bateria(int bateria) {
    battery = bateria;
    }

    void onInit() {
      channel.setNewValue(getValue() );
    }
    double getValue() 
    {
    
      return battery;
    }
    void iterateAlways() {
      channel.setNewValue(getValue());
    }
    protected:
    int battery;

};

*/
void setup() {

  Serial.begin(115200);
  initBluetooth();
  
  auto buttonCfgRelay = new Supla::Control::Button(BUTTON_CFG_RELAY_GPIO, true, true);
  buttonCfgRelay->configureAsConfigButton(&SuplaDevice);
  new Czujnik1();
  new Czujnik2();
  new Czujnik3();
  //new Bateria(bat1);
  //new Bateria(bat2);
  //new Bateria(bat3);
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);

  SuplaDevice.begin();
}

void loop() {
  if (millis() - czas_pomiedzy_skanowaniem > 120000) {  // co 2 minuty skanowanie sieci
    czas_pomiedzy_skanowaniem = millis();
    BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan
    pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
    pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
    BLEScanResults foundDevices = pBLEScan->start(SCAN_TIME);
    int count = foundDevices.getCount();
    }
  SuplaDevice.iterate();
    if (WiFi.status() != WL_CONNECTED) {    
    if (millis() > wifimilis)  {               
    WiFi.begin(); 
    wifimilis = (millis() + 20000) ;
    }
  }
}
void initBluetooth()
{
    BLEDevice::init("");
    pBLEScan = BLEDevice::getScan(); //create new scan
    pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
    pBLEScan->setActiveScan(false); //active scan uses more power, but get results faster
    pBLEScan->setInterval(0x50);
    pBLEScan->setWindow(0x30);
}

void Konwersja()
{
  int number;
  String hexstring;
  int t1;
  int t2;


  hexstring = "#" + text07;
  number = (int) strtol( &hexstring[1], NULL, 16);
  t1 = number & 0xFF;                        

  hexstring = "#" + text08;
  number = (int) strtol( &hexstring[1], NULL, 16);
  t2 = number & 0xFF;

  current_temperature = t1 * 256;
  current_temperature = current_temperature + t2;
  current_temperature = current_temperature / 10;
  // Konwersja z Faranheitów na Celsjusze
                                      
  hexstring = "#" + text09;
  number = (int) strtol( &hexstring[1], NULL, 16);
  current_humidity = number & 0xFF;

  hexstring = "#" + text10;
  number = (int) strtol( &hexstring[1], NULL, 16);
  current_batt = number & 0xFF;
  
  MAC_ADR = "";
  MAC_ADR = MAC_ADR + text01 + ":";
  MAC_ADR = MAC_ADR + text02 + ":";
  MAC_ADR = MAC_ADR + text03 + ":";
  MAC_ADR = MAC_ADR + text04 + ":";
  MAC_ADR = MAC_ADR + text05 + ":";
  MAC_ADR = MAC_ADR + text06;

  BLE_DEVICE = 0;
  if(MAC_ADR == XIAOMI_BLE_DEVICE_1_MAC){BLE_DEVICE = 1; wyswietl = 1; Wyswietl();} 
  if(MAC_ADR == XIAOMI_BLE_DEVICE_2_MAC){BLE_DEVICE = 2; wyswietl = 1; Wyswietl();}
  if(MAC_ADR == XIAOMI_BLE_DEVICE_3_MAC){BLE_DEVICE = 3; wyswietl = 1; Wyswietl();} 
}
void Wyswietl(){
  if(wyswietl == 1){
    Serial.print("Urządzenie:");
    Serial.print(BLE_DEVICE);
    Serial.print(" MAC: "); 
    Serial.print(MAC_ADR);
                                   
    Serial.print(" Temp: ");
    Serial.print(current_temperature,1);
    Serial.print("stC. Wilgotnosc: ");
    Serial.print(current_humidity);
    Serial.print("%. Bateria: ");
    Serial.print(current_batt);
    Serial.println("%.");   
    if (BLE_DEVICE == 1) {
      temp1 = (current_temperature);
      wilg1 = current_humidity;
      bat1 = current_batt;
    }
    if (BLE_DEVICE == 2) {
      temp2 = (current_temperature);
      wilg2 = current_humidity;
      bat2 = current_batt;
    }
    if (BLE_DEVICE == 3) {
      temp3 = (current_temperature);
      wilg3 = (current_humidity);
      bat3 = (current_batt);
    }
    wyswietl = 0; 
  }
}

void Zamien_litery()  //Zamieniamy otrzymywane małe litery na duże
{
  zmienna.replace('a', 'A');
  zmienna.replace('b', 'B');
  zmienna.replace('c', 'C');
  zmienna.replace('d', 'D');
  zmienna.replace('e', 'E');
  zmienna.replace('f', 'F');
}
Urządzenie chodzi od wczoraj, jak zerwie połączenie z serwerem to łączy się ponownie od razu. Brakuje w kodzie jeszcze deklaracji jak parę razy nie znajdzie urządzenia to żeby wykasowało dane z serwera, ale to kosmetyka tylko.
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4
martinok
Posty: 126
Rejestracja: sob gru 17, 2016 10:12 am
Lokalizacja: Poznań

Wgrałem i dostaje takie coś co może być przyczyną?

Kod: Zaznacz cały

Establishing encrypted connection with: svr3.supla.org (port: 2016)
SSL error: -9984, X509 - Certificate verification failed, e.g. CRL, CA or signature check failed
Connection fail (0). Server: svr3.supla.org
Establishing encrypted connection with: svr3.supla.org (port: 2016)
"Wiedza bez Praktyki jest Bezużyteczna , praktyka bez wiedzy Niebezpieczna"...
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

martinok pisze: śr lut 15, 2023 8:32 pm Wgrałem i dostaje takie coś co może być przyczyną?

Kod: Zaznacz cały

Establishing encrypted connection with: svr3.supla.org (port: 2016)
SSL error: -9984, X509 - Certificate verification failed, e.g. CRL, CA or signature check failed
Connection fail (0). Server: svr3.supla.org
Establishing encrypted connection with: svr3.supla.org (port: 2016)
Wygląda jakby nie przechodziła weryfikacja certyfikatu serwera. Możesz spróbować w cfg mode wyłączyć weryfikację.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
veeroos
Posty: 271
Rejestracja: ndz mar 20, 2022 9:30 am
Lokalizacja: Głogów

IMG_20230216_054652.jpg
IMG_20230216_054652.jpg (124.15 KiB) Przejrzano 869 razy
U mnie od wtorku chodzi, na początku jak robiłem pierwsze testy z esp32 dev V1 też miałem problem tyle że mi wywalało się po chwili dopiero, też był błąd certyfikatów, ale zauważyłem też że nie mam połączenia z Wi-Fi, dopiero na ESP32 S3 dev module kupionym na szybko na Allegro, bo nie chciało mi się czekać na przesyłkę z Chin pracuje to w miarę dobrze
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4
martinok
Posty: 126
Rejestracja: sob gru 17, 2016 10:12 am
Lokalizacja: Poznań

klew pisze: śr lut 15, 2023 9:20 pm
martinok pisze: śr lut 15, 2023 8:32 pm Wgrałem i dostaje takie coś co może być przyczyną?

Kod: Zaznacz cały

Establishing encrypted connection with: svr3.supla.org (port: 2016)
SSL error: -9984, X509 - Certificate verification failed, e.g. CRL, CA or signature check failed
Connection fail (0). Server: svr3.supla.org
Establishing encrypted connection with: svr3.supla.org (port: 2016)
Wygląda jakby nie przechodziła weryfikacja certyfikatu serwera. Możesz spróbować w cfg mode wyłączyć weryfikację.
Niestety to samo
"Wiedza bez Praktyki jest Bezużyteczna , praktyka bez wiedzy Niebezpieczna"...
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

martinok pisze: czw lut 16, 2023 6:21 am Niestety to samo
Jeśli wyłączyłeś walidację certyfikatów, to nie powinno być to samo.
Pokaż proszę zrzut ekranu z trybu konfiguracyjnego urządzenia oraz kompletne logi od startu urządzenia. Możesz do mnie w wiadomości prywatnej wysłać.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
veeroos
Posty: 271
Rejestracja: ndz mar 20, 2022 9:30 am
Lokalizacja: Głogów

Kurcze bo już zgłupiałem i wgrałem program do takiego wynalazku, bo tylko taki esp32 mam tylko dzisiaj w pracy jest to zwykły esp32, nie mam czujników w pracy więc nie sprawdzę czy odczytuje je
IMG_20230216_101212.jpg
IMG_20230216_101212.jpg (2.89 MiB) Przejrzano 822 razy
Wgrałem program i wszystko chodzi poprawnie, dodałem moduł w aplikacji i odczyt jest...
Zobacz może jak masz ustawiony schemat partycji w arduino, może coś z tym jest problem, ja mam tak dla zwykłego esp32 bo on ma 4Mb pamięci
IMG_20230216_101921.jpg
IMG_20230216_101921.jpg (7.02 MiB) Przejrzano 821 razy
Znaczy się wybrana jest ta opcja z "ptaszkiem" czyli Minimal SPIFFS ;)
A Ty do jakiego modelu wgrywasz?


Aktualizacja: po 15 minutach wywaliło się połączenie, czyli jest tak jak w moich pierwszych testach ESP 32 zwykły nie nadaje się na taką bramkę, oczywiście mam te same błędy od certyfikatów jak kolega, ale są przeplatane z informacjami o braku połączenia z siecią wifi. Bramka na ESP32 S3 działa od wtorku. W aplikacji widać że zrywa połączenie.
IMG_20230216_103811.jpg
IMG_20230216_103811.jpg (115.87 KiB) Przejrzano 815 razy
Ale chodzi...
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4
ODPOWIEDZ

Wróć do „Zagadnienia ogólne”