Po połączeniu z internetem ustawiają się błędne stany w aplikacji

Post Reply
krystianmen
Posts: 70
Joined: Fri Nov 16, 2018 7:25 am

Wed Mar 13, 2019 8:00 pm

Mam problem ze scenariuszem :
1. dodaję przekaźnik:
add_Relay(13)

2. start kontrolera
3. w chmurze przekaźnik domyślnie ustawiony na ON
digitalWrite(13) zwraca 1
digitalRead(13) zwraca 1

4. przełączam w chmurze na OFF
digitalWrite(13) zwraca 0
digitalRead(13) zwraca 0

5. rozłączam połączenie z netem
6. po połączeniu nie wywołauje się digitalWrite oraz digitalRead, przekaźnik fizycznie jest nadal wyłączony ale w chmurze ustawia się na ON...


Może po połączeniu z netem dało by się jakoś wymusić wywołanie digitalWrite oraz digitalRead aby pobrać aktualne stany ?
User avatar
pzygmunt
Posts: 6236
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Wed Mar 13, 2019 8:06 pm

digitalWrite nie wysyła raportu do serwera
krystianmen
Posts: 70
Joined: Fri Nov 16, 2018 7:25 am

Wed Mar 13, 2019 8:09 pm

pzygmunt wrote:
Wed Mar 13, 2019 8:06 pm
digitalWrite nie wysyła raportu do serwera
Czy mogę jakoś to wymusić ?
User avatar
pzygmunt
Posts: 6236
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Wed Mar 13, 2019 8:15 pm

Użyj metod relayOn/relayOff
krystianmen
Posts: 70
Joined: Fri Nov 16, 2018 7:25 am

Wed Mar 13, 2019 9:09 pm

pzygmunt wrote:
Wed Mar 13, 2019 8:15 pm
Użyj metod relayOn/relayOff
Niestety ale efekt jest identyczny ;/

do tej pory serwer informuję o zmianie stanu w taki sposób:

Code: Select all

void supla_DigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {
  if ( pin == PIN_BUTTON) {
    SuplaDevice.channelValueChanged(channelNumber, val);
    return;
  }
  }
próbowałem również w taki sposób:

Code: Select all

TSD_SuplaChannelNewValue value;
value.SenderID = 0;
value.ChannelNumber = 0;
value.DurationMS = 0; 
value.value[0] = 0; 

SuplaDevice.channelSetValue(&value);
Dla każdej metody jest identyczny problem.
User avatar
pzygmunt
Posts: 6236
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Wed Mar 13, 2019 9:16 pm

Nie widzę całego Twojego kodu więc trudno jest mi pomóc
krystianmen
Posts: 70
Joined: Fri Nov 16, 2018 7:25 am

Thu Mar 14, 2019 6:43 pm

Dzisiaj się upewniłem na nowo pobranej bibliotece SuplaDevice oraz troszeczkę zmodyfikowanym domyślny przykład, efekt jest identyczny jak w moim przypadku.

czyli start kontrolera
przekaźnik OFF w chmurze też OFF
przełączam w chmurze na ON przekaźnik też ON
rozłączam połączenie z netem przekaźnik jest ON
po połączeniu z internet przekaźnik nadal jest ON a w chmurze już jest OFF

o testowy kod na którym to widać:

Code: Select all

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

#define PIN_BUTTON 5

const char* ssid     = "";
const char* password = "";

unsigned long wifi_checkDelay = 40000;
unsigned long wifimilis;

WiFiClient client;
uint8_t mac[WL_MAC_ADDR_LENGTH];

//SUPLA ****************************************************************************************************

char GUID[SUPLA_GUID_SIZE] = {};
// with GUID that you can retrieve from https://www.supla.org/arduino/get-guid
const char* Supla_server = "";
const int Location_id = ;
const char* Location_Pass = "";

void setup() {
  Serial.begin(74880);
  my_mac_adress();

  SuplaDevice.addRelay(PIN_BUTTON);


  SuplaDevice.setName("test");
  SuplaDevice.setDigitalReadFuncImpl(&supla_DigitalRead);
  SuplaDevice.setDigitalWriteFuncImpl(&supla_DigitalWrite);
  
  SuplaDevice.begin(GUID,           // Global Unique Identifier
                    mac,           // Ethernet MAC address
                    Supla_server,  // SUPLA server address
                    Location_id,   // Location ID
                    Location_Pass);
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi_up();
  }
  SuplaDevice.iterate();
}

int supla_DigitalRead(int channelNumber, uint8_t pin) {

  int result = digitalRead(pin);
  if (pin == PIN_BUTTON) {
    Serial.print("Read(");
    Serial.print(pin);
    Serial.print("): ");
    Serial.println(result); 
  }
  return result;
}

void supla_DigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {
  if ( pin == PIN_BUTTON) {
    Serial.print("Write(");
    Serial.print(pin);
    Serial.print(",");
    Serial.print(val);
    Serial.println(")");
  }
  digitalWrite(pin, val);
}

// Supla.org ethernet layer
int supla_arduino_tcp_read(void *buf, int count) {
  _supla_int_t size = client.available();

  if ( size > 0 ) {
    if ( size > count ) size = count;
    return client.read((uint8_t *)buf, size);
  };

  return -1;
};

int supla_arduino_tcp_write(void *buf, int count) {
  return client.write((const uint8_t *)buf, count);
};

bool supla_arduino_svr_connect(const char *server, int port) {
  return client.connect(server, 2015);
}

bool supla_arduino_svr_connected(void) {
  return client.connected();
}

void supla_arduino_svr_disconnect(void) {
  client.stop();
}

void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {
  WiFi_up();
}

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
  SuplaDeviceCallbacks cb;

  cb.tcp_read = &supla_arduino_tcp_read;
  cb.tcp_write = &supla_arduino_tcp_write;
  cb.eth_setup = &supla_arduino_eth_setup;
  cb.svr_connected = &supla_arduino_svr_connected;
  cb.svr_connect = &supla_arduino_svr_connect;
  cb.svr_disconnect = &supla_arduino_svr_disconnect;
  cb.get_temperature = NULL;
  cb.get_temperature_and_humidity = NULL;
  cb.get_rgbw_value = NULL;
  cb.set_rgbw_value = NULL;

  return cb;
}
//*********************************************************************************************************

void WiFi_up() {
  boolean state = true;
  int i = 0;
  if (millis() > wifimilis)  {
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("Connecting to WiFi");

    // Wait for connection
    Serial.print("Connecting");
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
      if (i > 10) {
        state = false;
        wifimilis = (millis() + wifi_checkDelay) ;
        break;
      }
      i++;
    }
    if (state) {
      Serial.print("\nlocalIP: ");
      Serial.println(WiFi.localIP());
      Serial.print("subnetMask: ");
      Serial.println(WiFi.subnetMask());
      Serial.print("gatewayIP: ");
      Serial.println(WiFi.gatewayIP());
      long rssi = WiFi.RSSI();
      Serial.print("siła sygnału (RSSI): ");
      Serial.print(rssi);
      Serial.println(" dBm");
    } else {
      Serial.println("");
      Serial.println("Brak połączenia.");
    }
  }
}

String my_mac_adress(void) {
  WiFi.macAddress(mac);
  return String(mac[WL_MAC_ADDR_LENGTH - 6], HEX) + ":" + String(mac[WL_MAC_ADDR_LENGTH - 5], HEX) + ":" + String(mac[WL_MAC_ADDR_LENGTH - 4], HEX) + ":" + String(mac[WL_MAC_ADDR_LENGTH - 3], HEX) + ":" + String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + ":" + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
}
krystianmen
Posts: 70
Joined: Fri Nov 16, 2018 7:25 am

Fri Mar 15, 2019 10:26 am

Problem rozwiązałem w taki to sposób:

Code: Select all

int supla_arduino_tcp_read(void *buf, int count) {
  _supla_int_t size = client.available();

  if ( size > 0 ) {
    int status = client.read((uint8_t *)buf, size);
    
    if ( status == 26 ) SuplaDevice.channelValueChanged(0, digitalRead(PIN_BUTTON));
    if ( size > count ) size = count;
    
    return status;
  }
  return -1;
}
Ale wydaje mi się, że to chmura powinna pamiętać ostatni stan przekaźnika jeżeli stan przekaźnika się nie zmienił to po nawiązaniu połączenia go przywrócić.
User avatar
pzygmunt
Posts: 6236
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Fri Mar 15, 2019 5:16 pm

Chmura wywala z pamięci urządzenia które są offline. Urządzenie musi pamiętać swój stan i go przywracać przy podniesieniu zasilania o ile takie jest założenie
Post Reply