Strona 1 z 28

Automatyczny reset - da się?

: sob lip 13, 2019 4:38 pm
autor: t0mek
Witam!
jeżeli dubluję temat to przepraszam ale nie znalazłem tego.
Chodzi mi o automatyczny reset np routera, serwera itp.
Można byłoby dodać w automacie schodowym taką funkcjonalność : cały czas włączony a po kliknięciu wyłącza zasilanie na zadaną ilość sekund - taka jakby odwrócona logika. ?
ps wiem że jest watchdog od @Zybi ale na początku działał na kanale Gate. nie wiem jak teraz, no i hardware trochę się pozmieniał.

Re: Automatyczny reset - da się?

: pn lip 15, 2019 3:32 am
autor: mareks6
Tylko czy do tego jest potrzebna supla? Jeśli wystarczy Ci takie coś co działa lokalnie to wystarczy odpowiedni układ zrobiony na scalaku NE555.

Zrobiłem sobie kiedyś taki na szynę DIN do rozdzielnicy. Zmieściło się w pojedynczym module (jak bezpiecznik 1F) i działa dokładnie jak potrzebujesz - po naciśnięciu klawisza monostabilnego przerywa obwód 240V na 10s.

Jeśli umiesz robić samemu płytki jednostronne to mogę Ci w, wolnej chwili podesłać projekt z programu Eagle.

Re: Automatyczny reset - da się?

: pn lip 15, 2019 6:06 am
autor: piomar2
Rozwiązanie markas6 jest dobre ale niestety działa tylko lokalnie. Co jeżeli system zawiesi się jak jesteś na wakacjach? Polecam zdecydowanie rozwiązanie resetu systemu zdalne, z niezależnego układu GSM. Kolega QLQ mocno działa w temacie... Ja u siebie mam takie rozwiązanie i sprawdza się w 100%. Jak coś nie gra to wysyłasz sms-a i po kłopocie.

pozdrawiam

Re: Automatyczny reset - da się?

: pn lip 15, 2019 8:39 am
autor: mareks6
No oczywiście że tak jest, dlatego zaznaczyłem że moje rozwiązanie działa tylko lokalnie. Akurat w, moim przypadku to nie problem bo zawsze jest ktoś w, domu więc w, każdej chwili mogę zadzwonić do teścia że ma iść nacisnąć przycisk ;)
Ale takie coś się może zdarzyć max raz w roku bo prawie cały czas jest żona w, domu i sama wie kiedy trzeba zresetować :P

Re: Automatyczny reset - da się?

: pn lip 15, 2019 9:39 am
autor: piomar2
Zdecydowanie lepszym rozwiązaniem jest człowiek :D Tylko nie może bać się techniki. Moja "połówka" z daleka od niej niestety a chałupa przesycona pilotami, suplą itd, itd. Na szczęście ja prawie cały czas już w domciu.

pozdrawiam

Re: Automatyczny reset - da się?

: pn lip 15, 2019 11:04 am
autor: elmaya
Obrazek

Dioda LED alarmu D1: LOW = połączenie OK. HIGH = brak połączenia.
Dioda stanu D4: flash 0,2 = konfiguracja.flash 0.8 = brak WiFi.flash 5.0 = Normalny
TRIGGER PIN D3: konfiguracja.
Relay D2: normalny NISKI. Zresetuj 5 sekund WYSOKI

System ping co 30 sekund do www.google.com (można zmienić w konfiguracji Wifi), jeśli jest w porządku. Alarm Led gaśnie.
Jeśli nie ma połączenia(przez 15 minut)dioda Led alarmu włącza się i liczy czas na resetowanie.

unsigned long reset_delay = 900000; 15 minut = 15 x 60 x 1000

i Zresetuj, jeśli nie ma wifi

Kod: Zaznacz cały

#include <FS.h>       // ---- esp board manager 2.4.2 --- iwip Variant V2 higher Bandwidth
#include <ESP8266Ping.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h>     //--------- https://github.com/tzapu/WiFiManager/tree/0.14 -------------
#include <ArduinoJson.h>     //--------- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 ------
#include <Ticker.h>     
Ticker ticker;
WiFiManager wifiManager;  

#define alarm_led   5  //D1     // High if no net connection (Dodatkowa dioda LED(czerwona) przez rezystor 330 ohm do masy.) GIPO5
#define Relay       4  //D2     // High for 5 seconds on reset ( Przekaźnik ) GIPO 4
#define TRIGGER_PIN 0  //D3     // wifi config ( Do masy ) GIPO0
#define onboard_led 2  //D4     // Status Led  (Dioda wemosa d1 mini.) GIPO2

char host[40] = "www.google.com";
bool shouldSaveConfig = false;
bool initialConfig = false;
bool net_ok = false;
unsigned long reset_delay = 900000;   // 900000 --- Reset Delay in miliseconds --- ( Czas 15 min - do resetu. )
unsigned long time_last = 30000;
unsigned long time_last_chek;
unsigned long Chek_delay = 30000;       //  Ping co 30 sek. --- Ping Delay ---
int timeout           = 120; // Wifi manager timeout
int C_W_state = HIGH;            
int last_C_W_state = HIGH;       
unsigned long time_last_C_W_change = 0;   
long C_W_delay = 3000;               // config delay 3 seconds  ------------ opóźnienie konfiguracji 3 sekund
 

void tick()
{
  int state = digitalRead(onboard_led);  
  digitalWrite(onboard_led, !state);     
}
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  ticker.attach(0.2, tick);

  WiFiManagerParameter custom_host("host", "host", host, 40);

  wifiManager.setBreakAfterConfig(true); 
  
  wifiManager.setSaveConfigCallback(saveConfigCallback);

  wifiManager.addParameter(&custom_host);

  wifiManager.setMinimumSignalQuality();

    wifiManager.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("AutoReset")) {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      ESP.restart();
      delay(5000);
    }
    Serial.println("connected...yeey :)");

    strcpy(host, custom_host.getValue());  
}
void check_host (){
  
  Serial.print("Pinging host ");
  Serial.println(host);

  if(Ping.ping(host)) {
    Serial.println("Success!!");
    
    digitalWrite(onboard_led, LOW);              // Mrugnięcie podczas pinga.
    delay(100);                                  //        - II -
    digitalWrite(onboard_led, HIGH);             //        - II -
   
    digitalWrite(alarm_led, LOW);
    time_last = millis();
    net_ok = true;
  } else {
    digitalWrite(alarm_led, HIGH);
    Serial.println("Error :(");
    net_ok = false;
  }
}


void setup() {
  Serial.begin(115200);

   pinMode(TRIGGER_PIN, INPUT_PULLUP);
   pinMode(onboard_led, OUTPUT);
   pinMode(Relay, OUTPUT);
   pinMode(alarm_led, OUTPUT);
   
  ticker.attach(0.8, tick);

    if (WiFi.SSID()==""){   
    initialConfig = true;
  }
  //read configuration from FS json
  Serial.println("mounting FS...");
  
  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        Serial.println(jsonBuffer.size());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");

          strcpy(host, json["host"]);

        } else {
          Serial.println("failed to load json config");
          
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  } 
  WiFi.mode(WIFI_STA);
}

void loop() {
    
  if (initialConfig){    //   ----------enter WiFi configuration if there is no data in memory---------------
    ondemandwifiCallback () ;
    initialConfig = false; 
  }
  
  checkButton();           //   ------------------------------------ NEW Settings delay 3" --------------------------------------
  
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["host"] = host;

    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");
    shouldSaveConfig = false;
    WiFi.mode(WIFI_STA);
    ticker.detach();
    digitalWrite(onboard_led, HIGH);
    ESP.restart();
    delay(5000); 
    }
  
  if (WiFi.status() != WL_CONNECTED) 
   {
    ticker.attach(0.8, tick);
    WiFi_up();
   }
  if ((millis() - time_last_chek) > Chek_delay) {    
      check_host();
      time_last_chek = millis();
    }
  if  (net_ok == false){
   
   if ((millis() - time_last) > reset_delay) {
     Serial.println("Reset");
     digitalWrite(Relay, HIGH);
     delay(5000);                             // Czas włączenia przekaźnika
     digitalWrite(Relay, LOW);
     time_last = millis();
     }
    }
    yield();   
}
void checkButton(){    //   ------------------------------------ NEW Settings delay 3" --------------------------------------
  // check for button press
  int C_W_read = digitalRead(TRIGGER_PIN);{    
   if (C_W_read != last_C_W_state) {            
     time_last_C_W_change = millis();
   }
   if ((millis() - time_last_C_W_change) > C_W_delay) {     
     if (C_W_read != C_W_state) {     
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        Serial.println("Triger config");
      ondemandwifiCallback () ;
       }
     }    
    }
   last_C_W_state = C_W_read;            
   }
}
void WiFi_up() 

{
  WiFi.begin(); 

  for (int x = 20; x > 0; x--) 
  {
    if (WiFi.status() == WL_CONNECTED) 
    {
      break;                           
    }
    else                                 
    {
      checkButton();    //   ------------------------------------ NEW Settings delay 3" --------------------------------------
      Serial.print(".");                
      delay(200);                      
    }

  }

  if (WiFi.status() == WL_CONNECTED)
  {
  //  ticker.attach(5.0, tick);  // 5.0 sek dioda ON i 5.0 sek dioda OFF podczas połączenia z WiFi
   
    ticker.detach();                                // Dioda wyłączona podczas połączenia z wifi ( źeby mrugneła podczas pingowania ).
      if (digitalRead(onboard_led == LOW)) {        //                          - II -
          digitalWrite(onboard_led, HIGH);          //                          - II -
          }                                         //                          - II -
           
    Serial.println("");
    Serial.println("Connected");
    Serial.println("Adres IP: ");
    Serial.print(WiFi.localIP());
    Serial.print(" / ");
    Serial.print(WiFi.subnetMask());
    Serial.print(" / ");
    Serial.println(WiFi.gatewayIP());
    long rssi = WiFi.RSSI();
    Serial.print("(RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm");
    time_last = millis();
  }
  else    
  {
    Serial.println("");
    Serial.println("connection failed");
    net_ok = false;                                // new
  }
}
reset_router_v3.rar
compiled firmware
(322.74 KiB) Pobrany 269 razy

Re: Automatyczny reset - da się?

: pn lip 15, 2019 11:56 am
autor: Patryk
Działa idealnie !!!
Od czasu zabudowy, zero problemów z internetem  ( poza miejscem zamieszkania ).
Osobiście to wpiąłem między zasilacz routera, a router. Żeby nie stosować dodatkowego zasilacza.
Zdjecie poniżej.
Ps.
Na obecną chwilę zrobił bym to na Yunshan - ie, ale wtedy to były moje początki.
Dzięki !!! @elmaya

Re: Automatyczny reset - da się?

: pn lip 15, 2019 2:47 pm
autor: t0mek
I tyle w temacie. Dzięki :D

Re: Automatyczny reset - da się?

: ndz paź 13, 2019 6:59 pm
autor: PioKar
elmaya pisze: pn lip 15, 2019 11:04 am Obrazek

Dioda LED alarmu D1: LOW = połączenie OK. HIGH = brak połączenia.
Dioda stanu D4: flash 0,2 = konfiguracja.flash 0.8 = brak WiFi.flash 5.0 = Normalny
TRIGGER PIN D3: konfiguracja.
Relay D2: normalny NISKI. Zresetuj 5 sekund WYSOKI
@elmaya
dziękuję
Tego mi było trzeba,
Działa ok.
Pozdrawiam.
Piotr.

Re: Automatyczny reset - da się?

: śr paź 16, 2019 3:23 pm
autor: bulek68
Patryk pisze: pn lip 15, 2019 11:56 am Działa idealnie !!!
Od czasu zabudowy, zero problemów z internetem  ( poza miejscem zamieszkania ).
Osobiście to wpiąłem między zasilacz routera, a router. Żeby nie stosować dodatkowego zasilacza.
Zdjecie poniżej.
Ps.
Na obecną chwilę zrobił bym to na Yunshan - ie, ale wtedy to były moje początki.
Dzięki !!! @elmaya
Podzielisz się koncepcją na Yunshan?
Mam kilka luźnych w szafie to zamontuje sobie takie coś bo czasem moje AP UBIQUITI świrują co szczerze mówiąc lekko mnie rozczarowuje przy sprzęcie za takie pieniądze. 🤨