Wsparcie dla śpiących czujników

Zibi
Posty: 323
Rejestracja: śr lip 31, 2019 9:20 am
Lokalizacja: Białogard

pn lut 15, 2021 9:59 pm

pzygmunt czy są jakieś przykłady, opisy tych nazw do nowych bibliotek?
Jak bym chciał to użyć do czujnika temp DS18B20 takie coś właśnie potrzebuje żeby wydłużyć czas usypiania żeby solar mi się wyrabiał, ale żeby nie rozłączał z Cloud jak to było wcześniej po 120s.
Awatar użytkownika
pzygmunt
Posty: 11372
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontaktowanie:

pn lut 15, 2021 10:56 pm

@klew się tematem interesuje więc może on coś przygotuje.
Awatar użytkownika
klew
Posty: 2488
Rejestracja: czw cze 27, 2019 12:16 pm

pn lut 15, 2021 11:29 pm

Dorzuciłem to do biblioteki SuplaDevice.

Tworząc dany kanał należy ustawić mu ValidityTimeSec:

Kod: Zaznacz cały

void setup() {
  ...
  auto ds = new Supla::Sensor::DS18B20(...);
  ds->getChannel()->setValidityTimeSec(10*60); // 10 min
  ...
}
Ustawienie "validity time sec" na kanale powoduje wyłączenie możliwości używania "channel state" (ikonka (i) w apce na telefonie).
Jeśli ktoś bardzo chce to może sobie tą ikonkę włączyć:

Kod: Zaznacz cały

ds->getChannel()->setFlag(SUPLA_CHANNEL_FLAG_CHANNELSTATE);
Ale dla "sypiającego" urządzenia, to i tak nie będzie działać dobrze, bo channel state pobiera dane bezpośrednio z urządzenia, więc trzeba by trafić w moment, gdy urządzenie się obudziło i ma połącznie.

Powyższy kod dla "validity time sec" powinien działać z dowolnym programem i przykładem z biblioteki. Należałoby natomiast dopisać samodzielnie usypianie urządzenia na np. 9 min.

Warto też pamiętać, że ten "validity time sec" jest wysyłany przez urządzenie do serwera w momencie aktualizacji wartości kanału (a nie przy rejestracji urządzenia). Należy więc odczekać, aż wykona się pierwszy pomiar (i będzie on różny od poprzedniej wartości), aby zostało to wysłane do serwera.
Zibi
Posty: 323
Rejestracja: śr lip 31, 2019 9:20 am
Lokalizacja: Białogard

pn lut 15, 2021 11:54 pm

Dziękuje klew
sllawek66@wp.pl
Posty: 50
Rejestracja: czw lis 14, 2019 2:28 pm

wt lut 16, 2021 8:26 pm

viewtopic.php?f=9&t=6355
A czy do tego da się dopisać
Awatar użytkownika
klew
Posty: 2488
Rejestracja: czw cze 27, 2019 12:16 pm

wt lut 16, 2021 8:49 pm

sllawek66@wp.pl pisze:
wt lut 16, 2021 8:26 pm
viewtopic.php?f=9&t=6355
A czy do tego da się dopisać
To jest na bazie starej biblioteki i byłoby dużo przerabiania
Pier
Posty: 44
Rejestracja: śr lut 26, 2020 10:26 am

czw mar 11, 2021 8:41 pm

A skąd wziąć nową bibliotekę?
Awatar użytkownika
klew
Posty: 2488
Rejestracja: czw cze 27, 2019 12:16 pm

czw mar 11, 2021 9:18 pm

Pier pisze:
czw mar 11, 2021 8:41 pm
A skąd wziąć nową bibliotekę?
Możesz z brancha develop na oficjalnym repo Supli: https://github.com/SUPLA/supla-arduino/tree/develop
Albo ode mnie z githuba: https://github.com/klew/supla-arduino

U mnie zawsze jest trochę nowszych rzeczy i raz na jakiś czas robimy merge'a do oficjalnego repo.
Funkcja opisana w tym wątku nie była jeszcze merge'owana, więc bierz ode mnie z repo.
QLQ
Posty: 1581
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

sob kwie 03, 2021 10:22 am

Czyli jeżeli wykorzystamy opcję modem sleep, light sleep, (deep sleep raczej odpada bo na RST musi być wyzwolony impuls) moglibyśmy zasilić bateryjnie ESP z np BME280 i raz na przykładowo 30 min wybudzić esp , przesłać dane do Cloud i znów iść spać. Jestem ciekaw na ile wystarczyłaby bateria np 18650 ...hmm trzeba to sprawdzić...

EDIT :
do tego jak wykorzystamy wsparcie DEEP SLEP BME280 aby oszczędzać prąd to już będzie bajka.
Taki przykład znalazłem:

Kod: Zaznacz cały

/*
This software, the ideas and concepts is Copyright (c) David Bird 2019 and beyond.
All rights to this software are reserved.
It is prohibited to redistribute or reproduce of any part or all of the software contents in any form other than the following:
 1. You may print or download to a local hard disk extracts for your personal and non-commercial use only.
 2. You may copy the content to individual third parties for their personal use, but only if you acknowledge the author David Bird as the source of the material.
 3. You may not, except with my express written permission, distribute or commercially exploit the content.
 4. You may not transmit it or store it in any other website or other form of electronic retrieval system for commercial purposes.
 5. You MUST include all of this copyright and permission notice ('as annotated') and this shall be included in all copies or substantial portions of the software and where the software use is visible to an end-user.
 
THE SOFTWARE IS PROVIDED "AS IS" FOR PRIVATE USE ONLY, IT IS NOT FOR COMMERCIAL USE IN WHOLE OR PART OR CONCEPT.
FOR PERSONAL USE IT IS SUPPLIED WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Lolin D32 and BME280 board consumes 0.520mA in sleep mode with BME_280 not in sleep
Lolin D32 and BME280 board consumes 0.073mA in sleep mode with BME_280 not in sleep
Saves 0.443mA in sleep mode!
*/

#include <Adafruit_BME280.h>
#define sensor_address 0x76 // Adafruit devices use 0x77 all others use 0x76
Adafruit_BME280 bme;        // I2C mode

void setup() {
  Serial.begin(115200);
  if (!bme.begin(sensor_address)) Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
  Serial.println("-- Default Test --");
  Serial.println("Temperature = " + String(bme.readTemperature()) + "'C");
  Serial.println("   Pressure = " + String((bme.readPressure() / 100.0F) + 3.8) + " hPa"); // +4.3 Adjustment for current altitude, each device is different
  Serial.println("   Humidity = " + String(bme.readHumidity()) + " %");
  delay(10000);
}

void loop() {
  BME280_Sleep(sensor_address);                // Now place BME280 into sleep mode
  Serial.println(" ESP8266 to Sleep mode...");   // Say going to sleep
  ESP.deepSleep(20e6); // 20e6 is 20 microseconds
}

void BME280_Sleep(int device_address) {
  // BME280 Register 0xF4 (control measurement register) sets the device mode, specifically bits 1,0
  // The bit positions are called 'mode[1:0]'. See datasheet Table 25 and Paragraph 3.3 for more detail.
  // Mode[1:0]  Mode
  //    00      'Sleep'  mode
  //  01 / 10   'Forced' mode, use either '01' or '10'
  //    11      'Normal' mode
  Serial.println("BME280 to Sleep mode...");
  Wire.beginTransmission(device_address);
  Wire.write((uint8_t)0xF4);       // Select Control Measurement Register
  Wire.write((uint8_t)0b00000000); // Send '00' for Sleep mode
  Wire.endTransmission();
}
EDIT 2 :

Czyli kod ma wyglądać mniej więcej tak:?
.

Kod: Zaznacz cały

#include <SPI.h>
#include <SuplaDevice.h>

#include <supla/sensor/BME280.h>

#define sensor_address 0x76 // Adafruit devices use 0x77 all others use 0x76
Adafruit_BME280 bme;

#include <supla/network/esp_wifi.h>
Supla::ESPWifi wifi("XXX", "XXXXXXXX");



void setup() {

  Serial.begin(115200);
  
  if (!bme.begin(sensor_address)) Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
  Serial.println("-- Default Test --");
  Serial.println("Temperature = " + String(bme.readTemperature()) + "'C");
  Serial.println("   Pressure = " + String((bme.readPressure() / 100.0F) + 3.8) + " hPa"); // +4.3 Adjustment for current altitude, each device is different
  Serial.println("   Humidity = " + String(bme.readHumidity()) + " %");
  delay(10000);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {0x90, 0x7B, 0xD8, 0x9B, 0x7F, 0x9A, 0x71, 0x2E, 0xF5, 0x95, 0x36, 0xC6, 0xAE, 0x4D, 0x1A, 0x8D};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0xF0, 0xB5, 0xBC, 0xC7, 0x96, 0xA4, 0x00, 0x14, 0x93, 0x5E, 0xDD, 0x53, 0x08, 0x4A, 0xF6, 0x03};


  
 auto BT = new Supla::Sensor::BME280(0x76, 100);
  BT->getChannel()->setValidityTimeSec(2*60);  // co dwie minuty
 


  /*
     SuplaDevice Initialization.
  */
  SuplaDevice.setName("Test R@F");
  SuplaDevice.begin(GUID,              // Global Unique Identifier
                    "svrX.supla.org",  // SUPLA server address
                    "XX@Xmail.com",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key

}

void loop() {

  BME280_Sleep(sensor_address);                // Now place BME280 into sleep mode
  Serial.println(" ESP8266 to Sleep mode...");   // Say going to sleep
  ESP.deepSleep(20e6); // 120e6 is 120  seconds
	
  SuplaDevice.iterate();
}

void BME280_Sleep(int device_address) {
  // BME280 Register 0xF4 (control measurement register) sets the device mode, specifically bits 1,0
  // The bit positions are called 'mode[1:0]'. See datasheet Table 25 and Paragraph 3.3 for more detail.
  // Mode[1:0]  Mode
  //    00      'Sleep'  mode
  //  01 / 10   'Forced' mode, use either '01' or '10'
  //    11      'Normal' mode
  Serial.println("BME280 to Sleep mode...");
  Wire.beginTransmission(device_address);
  Wire.write((uint8_t)0xF4);       // Select Control Measurement Register
  Wire.write((uint8_t)0b00000000); // Send '00' for Sleep mode
  Wire.endTransmission();
}
Im urządzenie jest prostsze tym dłużej i lepiej działa.
QLQ
Posty: 1581
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

sob kwie 03, 2021 12:10 pm

ok mam już kod ale w Cloud znika mi czujnik (wartości)

jak @klew to ma być poprawnie zamiast tego zaremowanego?

Kod: Zaznacz cały

// new Supla::Sensor::BME280(0x76, 100);
 auto BT = new Supla::Sensor::BME280(0x76, 100);
  BT->getChannel()->setValidityTimeSec(5*60);
 
poza tym "i" jest przy kanale niewyłączone jak piszesz:
Ustawienie "validity time sec" na kanale powoduje wyłączenie możliwości używania "channel state" (ikonka (i) w apce na telefonie).
Jeśli ktoś bardzo chce to może sobie tą ikonkę włączyć:
Im urządzenie jest prostsze tym dłużej i lepiej działa.
ODPOWIEDZ

Wróć do „supla-server”