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: 522
- Joined: Wed Oct 26, 2022 7:35 pm
-
- Posts: 9413
- 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
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 9413
- 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
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 522
- 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: 9413
- 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
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 522
- 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: 9413
- 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ć
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 522
- 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;
}
*/