Tryb konfiguracyjny i różne inputy do wprowadzania parametrów

zzrr
Posts: 470
Joined: Wed Oct 26, 2022 7:35 pm

Post

klew wrote: Thu May 30, 2024 2:29 pm Masz pełne logi, tak aby było widać moment gdy się coś psuje? Może tam będzie jakaś wskazówka
No właśnie nie mogę tego dokładnie namierzyć. Coś mi się zdaje że to się dziej przy przy wykonywaniu akcji na VirtualRelay. A póxnije to przy resecie w logach już pusto. Dodam że właśnie przy akcji przełączania zapisuję do EEPROMa stan przełącznika. Więc wszystko wskazuje na ten brak offsetu wcześniej. A tak zapytam. Czy jakiejś drobnej zmianie kodu przy ponownym wgraniu skasują się te inputy. Bo tak z autopsji to jak coś tam dogrywałem to pamięć zostawała.
User avatar
klew
Posts: 9236
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Można wgrać samą aplikację bez kasowania obszaru "eeprom".
Domyślnie tak się wygrywa
Widzimy się na Supla Offline Party - 19.10.2024
https://forum.supla.org/viewtopic.php?t=15820
zzrr
Posts: 470
Joined: Wed Oct 26, 2022 7:35 pm

Post

klew wrote: Thu May 30, 2024 3:18 pm Można wgrać samą aplikację bez kasowania obszaru "eeprom".
Domyślnie tak się wygrywa
No właśnie. Czyli to że dograłem poprawkę w kodzie to raczej nie było powodem
:roll:
User avatar
klew
Posts: 9236
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Może nie, a może tak. W Arduino w ustawieniach boarda to się ustawia. Poszukaj tam
Widzimy się na Supla Offline Party - 19.10.2024
https://forum.supla.org/viewtopic.php?t=15820
zzrr
Posts: 470
Joined: Wed Oct 26, 2022 7:35 pm

Post

klew wrote: Thu May 30, 2024 3:36 pm Może nie, a może tak. W Arduino w ustawieniach boarda to się ustawia. Poszukaj tam
Używam VSC z PlatformIO. Na razie poustawiałem jeszcze raz i potestuję.
zzrr
Posts: 470
Joined: Wed Oct 26, 2022 7:35 pm

Post

Urządzenie po każdym takim zdarzeniu po wprowadzeniu danych od nowa zgłasza się jako nowe urządzenie. To może być jakaś wskazówka?
User avatar
klew
Posts: 9236
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

zzrr wrote: Thu May 30, 2024 3:47 pm Urządzenie po każdym takim zdarzeniu po wprowadzeniu danych od nowa zgłasza się jako nowe urządzenie. To może być jakaś wskazówka?
To znaczy że kasuje się obszar flasha, gdzie jest przechowywana konfiguracja. Jeśli używasz czegoś na bazie webinterface to jest to obszar używany przez littlefs
Widzimy się na Supla Offline Party - 19.10.2024
https://forum.supla.org/viewtopic.php?t=15820
zzrr
Posts: 470
Joined: Wed Oct 26, 2022 7:35 pm

Post

klew wrote: Thu May 30, 2024 3:56 pm To znaczy że kasuje się obszar flasha, gdzie jest przechowywana konfiguracja. Jeśli używasz czegoś na bazie webinterface to jest to obszar używany przez littlefs
Używam webinterface i mam własne inputy. Coś podpowiesz na co zwrócić uwagę?
Czy littlefs_config.h może jakoś wchodzić w konflikt z eeprom.h i EEPROM.h?
Jeżeli hipotetycznie błąd powstawał w związku z brakiem Offsetu dla eeproma to może taki błąd powodować kasowanie danych w pamięci flash?
User avatar
klew
Posts: 9236
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Offset eeproma suplowego na pewno może kolidować z Twoimi danymi, ale nie będzie kolidował z konfiguracją webinterface.
Pokaż kod, to rzucę okiem co tam może być
Widzimy się na Supla Offline Party - 19.10.2024
https://forum.supla.org/viewtopic.php?t=15820
zzrr
Posts: 470
Joined: Wed Oct 26, 2022 7:35 pm

Post

Code: Select all

#include "Arduino.h"
#include "arduino-timer.h"
#include <EEPROM.h>
#include <SuplaDevice.h>
#include <supla/network/esp_wifi.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/control/virtual_relay.h>
#include <supla/control/relay.h>
#include <supla/control/button.h>
#include <supla/control/action_trigger.h>
#include <supla/network/html/custom_text_parameter.h>
// #include <supla/events.h>
#include <supla/storage/eeprom.h>
#include <supla/sensor/binary.h>
#include <supla/sensor/virtual_binary.h>
#include <supla/sensor/general_purpose_measurement.h>
#include <Pushover.h>
#include <SoftwareSerial.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/device/notifications.h>
#include <supla/time.h>

#include "moje_funkcje.h"

SoftwareSerial mySerial(D2, D3); // Definiuje obiekt SoftwareSerial o nazwie mySerial i określa piny RX (D2) i TX (D3)
#define END_CHAR '>'

Timer<1, millis> timerSprSuplaOn;  // 200ms
Timer<1, millis> timerSprSuplaOff; // 200ms
Timer<1, millis> timerPushover;

Supla::Eeprom eeprom(512);
Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;
Supla::EspWebServer suplaServer;

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

#define BUTTON_CFG_RELAY_GPIO 14 // D5

bool stanIntruz = false;
bool stan_uzbr = false;
bool stan_intruz = false;

unsigned long start_wl_wyl_alarm;
bool flag_start_wl_wyl_alarm;
bool flagCurrentRelayState = false;
bool flagstanDrzwi = true;
bool restart = false;
bool flaga_send_Push_RSSI = true;
bool WiFiConected = false;
int s;
char Supla_status[51] = ("No server address");
unsigned long TempDisp_lasttime;
unsigned long dimm_lasttime;
unsigned long dimm_mtbs = 15000U;
unsigned long TempDisp_mtbs = 5000U;

// const char *messageRSSI;
String messageRSSI;

char PUSH_API_KEY[200] = {};
char PUSH_USER[200] = {};
char PUSH_SOUND[200] = {};
char PUSH_MESSAGE[200] = {};
char PUSH_API_KEY_RSSI[200] = {};
char PUSH_SOUND_RSSI[200] = {};
const char PARAM1[] = "param1"; // PUSH_API_KEY
const char PARAM2[] = "param2"; // PUSH_USER
const char PARAM3[] = "param3"; // PUSH_SOUND
const char PARAM4[] = "param4"; // PUSH_MESSAGE
const char PARAM5[] = "param5"; // PUSH_API_KEY_RSSI
const char PARAM6[] = "param6"; // PUSH_SOUND_RSSI

void status_func(int status, const char *msg)
{ //    ------------------------ Status --------------------------

    static int previous_s = 10; // zainicjowanie zmiennej przechowującej poprzednią wartość

    if (s != status)
    {
        if (status != 10 && previous_s == 10)
        {
            mySerial.print("SUPLA_FALSE");
            mySerial.print(END_CHAR);
            // Serial.println("Brak połączenia z SUPLĄ !!!");
        }
        previous_s = s; // aktualizacja poprzedniej wartości

        s = status;

        if (s != 10)
        {
            strcpy(Supla_status, msg);
        }
        if (s == 10)
        {
            mySerial.print("w_gotowy");
            mySerial.print(END_CHAR);
        }
    }
}

void TH_Overlay() // funkcja odświeżająca wyświetlacz
{
    static bool wasConnected = false;

    if (WiFiConected)
    {
        if (!wasConnected)
        {
            mySerial.print("WIFI_TRUE");
            mySerial.print(END_CHAR);
            wasConnected = true;
        }
        if (s == STATUS_REGISTERED_AND_READY)
        {
            // Serial.println("Jest !!!STATUS_REGISTERED_AND_READY!!!");
        }
        else if (s != 10)
        {
            // display.setFont(ArialMT_Plain_16);
        }
    }

    else
    {
        if (wasConnected)
        {
            // Serial.println("WiFi jest teraz rozłączone!");
            mySerial.print("WIFI_FALSE");
            mySerial.print(END_CHAR);

            wasConnected = false;
        }
    }
}

enum NoweAkcje
{
    MOJA_AKCJA_1,
    MOJA_AKCJA_2,
    MOJA_AKCJA_3,
    MOJA_AKCJA_4,
    MOJA_AKCJA_5,
    MOJA_AKCJA_6
};

class MojaAkcja : public Supla::ActionHandler
{

public:
    MojaAkcja(){};

    void handleAction(int event, int action) override
    {
        if (action == MOJA_AKCJA_1)
        {
            Pushover po = Pushover(PUSH_API_KEY, PUSH_USER, UNSAFE);
            po.setMessage(PUSH_MESSAGE);
            po.setTitle("GARAŻ !!!");
            po.setSound(PUSH_SOUND);
            if (po.send())
            {
                SUPLA_LOG_DEBUG("Pushover send success!");
                Serial.println(ESP.getFreeHeap());
            }
            else
            {
                SUPLA_LOG_DEBUG("Pushover send failed!");
                Serial.println(ESP.getFreeHeap());
            }
        }
        if (action == MOJA_AKCJA_2)
        {
            Pushover po1 = Pushover(PUSH_API_KEY_RSSI, PUSH_USER, UNSAFE);
            po1.setMessage(messageRSSI);
            po1.setTitle("RSSI !!!");
            po1.setSound(PUSH_SOUND_RSSI);
            if (po1.send())
            {
                SUPLA_LOG_DEBUG("PushoverRSSI send success!");
            }
            else
            {
                SUPLA_LOG_DEBUG("PushoverRSSI send failed!");
            }

        }
        if (action == MOJA_AKCJA_3)
        {
            if (!stan_uzbr) // potrzebne żeby przy włączaniu z przycisków centralki nie wracał z wemosa komunikat w_alarm_start
            {
                mySerial.print("w_alarm_start");
                mySerial.print(END_CHAR);
                timerSprSuplaOn.cancel();
                timerSprSuplaOn.in(1000, func_SprSuplaOn);
                // Serial.println("wl Start");
            }
            Serial.println(ESP.getFreeHeap());

        }
        if (action == MOJA_AKCJA_4)
        {
            if (stan_uzbr)
            {
                mySerial.print("w_alarm_stop");
                mySerial.print(END_CHAR);

                stan_intruz = false;
                timerPushover.cancel();
                timerSprSuplaOff.cancel();
                timerSprSuplaOff.in(1000, func_SprSuplaOff);
            }
            Serial.println(ESP.getFreeHeap());

        }
        if (action == MOJA_AKCJA_5)
        {
            EEPROM.write(5, 1);
            EEPROM.commit();
            Serial.println(ESP.getFreeHeap());
        }
        if (action == MOJA_AKCJA_6)
        {
            EEPROM.write(5, 0);
            EEPROM.commit();
            Serial.println(ESP.getFreeHeap());
        }
    }
};

MojaAkcja *custMojaAkcja = new MojaAkcja;

Supla::Control::VirtualRelay *r1_1 = nullptr;
Supla::Control::VirtualRelay *r2_2 = nullptr;
Supla::Sensor::VirtualBinary *r3 = nullptr;

Supla::Sensor::GeneralPurposeMeasurement *gpm = nullptr;

void setup()
{
    Serial.begin(9600);
    delay(100);
    mySerial.begin(9600);
    EEPROM.begin(1000);

    wifi.enableSSL(false);
    flaga_send_Push_RSSI = true;

    new Supla::Html::CustomTextParameter(PARAM1, "Pushover API Key", 100);
    new Supla::Html::CustomTextParameter(PARAM2, "Pushover USER Key", 100);
    new Supla::Html::CustomTextParameter(PARAM3, "Pushover Sound", 100);
    new Supla::Html::CustomTextParameter(PARAM4, "Pushover Message", 100);
    new Supla::Html::CustomTextParameter(PARAM5, "Pushover API Key RSSI", 100);
    new Supla::Html::CustomTextParameter(PARAM6, "Pushover Sound RSSI", 100);

    r1_1 = new Supla::Control::VirtualRelay();
    r2_2 = new Supla::Control::VirtualRelay();

    r3 = new Supla::Sensor::VirtualBinary();

    auto buttonCfgRelay =
        new Supla::Control::Button(BUTTON_CFG_RELAY_GPIO, true, true);
    r1_1->addAction(MOJA_AKCJA_3, custMojaAkcja, Supla::ON_TURN_ON);
    r1_1->addAction(MOJA_AKCJA_4, custMojaAkcja, Supla::ON_TURN_OFF);
    r2_2->addAction(MOJA_AKCJA_5, custMojaAkcja, Supla::ON_TURN_ON);
    r2_2->addAction(MOJA_AKCJA_6, custMojaAkcja, Supla::ON_TURN_OFF);

    buttonCfgRelay->setHoldTime(5000);
    buttonCfgRelay->setMulticlickTime(500);
    buttonCfgRelay->addAction(Supla::TOGGLE_CONFIG_MODE, SuplaDevice, Supla::ON_HOLD);

    gpm = new Supla::Sensor::GeneralPurposeMeasurement();
    gpm->setDefaultValueDivider(0);    // in 0.001 steps, 0 is ignored
    gpm->setDefaultValueMultiplier(0); // in 0.001 steps, 0 is ignored
    gpm->setDefaultValueAdded(0);      // in 0.001 steps
    gpm->setDefaultUnitBeforeValue("before");
    gpm->setDefaultUnitAfterValue("after");
    gpm->setDefaultValuePrecision(3); // 0..4 - number of decimal places


    Supla::Notification::RegisterNotification(-1); // dla pushover SUPLA_NOTIFICATION_TYPE_PUSHOVER
    SuplaDevice.setSuplaCACert(suplaCACert);
    SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);
    SuplaDevice.setStatusFuncImpl(&status_func); // status połączenia
    SuplaDevice.setName("ALARM_Zam");
    SuplaDevice.begin();
    r1_1->getChannel()->setDefault(SUPLA_CHANNELFNC_POWERSWITCH);
    r2_2->getChannel()->setDefault(SUPLA_CHANNELFNC_POWERSWITCH);

    r3->getChannel()->setDefault(SUPLA_CHANNELFNC_OPENINGSENSOR_DOOR);

    int switchState = EEPROM.read(5); // Odczytanie stanu przełącznika RSSI z EEPROM
    if (switchState == 1)
    {
        r2_2->turnOn();
    }
    else
    {
        r2_2->turnOff();
    }

    if (Supla::Storage::ConfigInstance()->getString(PARAM1, PUSH_API_KEY, 200))
    {
        SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM1, PUSH_API_KEY);
    }
    else
    {
        SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM1);
    }

    if (Supla::Storage::ConfigInstance()->getString(PARAM2, PUSH_USER, 200))
    {
        SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM2, PUSH_USER);
    }
    else
    {
        SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM2);
    }

    if (Supla::Storage::ConfigInstance()->getString(PARAM3, PUSH_SOUND, 200))
    {
        SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM3, PUSH_SOUND);
    }
    else
    {
        SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM3);
    }

    if (Supla::Storage::ConfigInstance()->getString(PARAM4, PUSH_MESSAGE, 200))
    {
        SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM4, PUSH_MESSAGE);
    }
    else
    {
        SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM4);
    }

    if (Supla::Storage::ConfigInstance()->getString(PARAM5, PUSH_API_KEY_RSSI, 200))
    {
        SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM5, PUSH_API_KEY_RSSI);
    }
    else
    {
        SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM5);
    }

    if (Supla::Storage::ConfigInstance()->getString(PARAM6, PUSH_SOUND_RSSI, 200))
    {
        SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM6, PUSH_SOUND_RSSI);
    }
    else
    {
        SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM6);
    }

}

void loop()
{
    timerSprSuplaOn.tick();
    timerSprSuplaOff.tick();
    timerPushover.tick();

    SuplaDevice.iterate();

    if ((millis() - TempDisp_lasttime) > TempDisp_mtbs)
    {
        WiFiConected = (WiFi.status() == WL_CONNECTED);
        TempDisp_mtbs = 500;
        TH_Overlay();
        TempDisp_lasttime = millis();
    }

    if (mySerial.available())
    {
        String recData = mySerial.readStringUntil(END_CHAR);
        mySerial.read();

        if (recData.startsWith("RSSI"))
        {
            String rssiValue = recData.substring(4); // Wyodrębnienie trzech znaków tekstu po "RSSI"
                                                     // Serial.print("RSSI Value: ");
            int intRssiValue = rssiValue.toInt();

            if (intRssiValue == -1000)
            {
                gpm->setValue(NAN);
            }
            else
            {
                gpm->setValue(intRssiValue);
            }
        }
        else if (recData == "jest_start")
        {
            stan_uzbr = true;
            r1_1->turnOn();
        }
        else if (recData == "jest_stop")
        {
            stan_uzbr = false;
            stan_intruz = false;

            timerPushover.cancel();
            r1_1->turnOff();

            r3->clear();
        }
        else if (recData == "intruz" && stan_intruz == false)
        {
            r3->set();
            custMojaAkcja->handleAction(0, MOJA_AKCJA_1);
            /*task = */ timerPushover.every(30000, func_powt_pushover);
            stan_intruz = true;
        }

        else if (recData.startsWith("PushRSSI") && r2_2->isOn() == true)
        {


            String rssiValue = recData.substring(8);
            messageRSSI = "UWAGA Brak sygnału RSSI przez: " + rssiValue;

            custMojaAkcja->handleAction(0, MOJA_AKCJA_2);

        }

        recData = "";
    }


}

bool func_SprSuplaOn(void *)
{
    if (!stan_uzbr)
    {
        r1_1->turnOff();
    }
    return false; // repeat true
}

bool func_SprSuplaOff(void *)
{
    if (stan_uzbr)
    {
        r1_1->turnOn();
    }
    return false; // repeat true
}

bool func_powt_pushover(void *)
{
    custMojaAkcja->handleAction(0, MOJA_AKCJA_1);
    return true;
}
bool func_powt_pushover_RSSI(void *)
{
    custMojaAkcja->handleAction(0, MOJA_AKCJA_2);
    return true;
}
 */
@klew edytowałem i usunąłem zakomentowane linie. Za dużo ich zostało i nieczytelne to troche było. Kod niezmieniony.

Return to “Arduino IDE”