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.
Tryb konfiguracyjny i różne inputy do wprowadzania parametrów
-
- Posts: 470
- Joined: Wed Oct 26, 2022 7:35 pm
-
- Posts: 9236
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Można wgrać samą aplikację bez kasowania obszaru "eeprom".
Domyślnie tak się wygrywa
Domyślnie tak się wygrywa
Widzimy się na Supla Offline Party - 19.10.2024
https://forum.supla.org/viewtopic.php?t=15820
https://forum.supla.org/viewtopic.php?t=15820
-
- Posts: 9236
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
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
https://forum.supla.org/viewtopic.php?t=15820
-
- Posts: 470
- Joined: Wed Oct 26, 2022 7:35 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?
-
- Posts: 9236
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
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
https://forum.supla.org/viewtopic.php?t=15820
-
- Posts: 470
- Joined: Wed Oct 26, 2022 7:35 pm
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?
-
- Posts: 9236
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
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ć
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
https://forum.supla.org/viewtopic.php?t=15820
-
- Posts: 470
- Joined: Wed Oct 26, 2022 7:35 pm
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;
}
*/