Jak przesłać dane z apk do urządzenia?

User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

SOYER wrote: Sat Mar 11, 2023 10:48 am Serio, nie można przy pomocy jakiejś funkcji zaimplementowanej w Supli wyciągnąć info, że ktoś kliknął on lub off?
Skoro ma być KPOP, to jeszcze wnoszę o KPDDOP :D :D :D . Kanał przesyłowy dwustronnego działania ogólnego przeznaczenia. Coś jak blynk.write() blynk.read(). Przesyłało się z aplikacji, albo do aplikacji dowolną wartość, dowolnie ją opisywało w apk, lub dowolnie obrabiało w urządzeniu.
Ponawiam jednak pytanie:
"nie można przy pomocy jakiejś funkcji zaimplementowanej w Supli wyciągnąć info, że ktoś kliknął on lub off?"
Ta informacja jest dostępna.
Możesz np. wziąć sobie "VirtualRelay". Każde uruchomienie przekaźnika z apki, powoduje odpalenie metody turnOn(). Analogicznie dla wyłączenia jest turnOff().
Są też powiadomienia poprzez "akcje" (relay->addAction(AKCJA, cel_akcji, Supla::ON_TURN_ON);) ale one działają tylko przy zmianie stanu, a tutaj pewnie kilka razy pod rząd będzie wciskane "włącz".
Wystarczy więc podzeidziczyć po VirtualRelay i napisać sobie co tam chcesz w metodach turnOn() i turnOff().
Możesz nawet do tej klasy wstawić obiekt VirtualThermometer i na nim zmieniać wartość temperatury.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

Niestety, moja wiedza programistyczna i suplowa nie pozwoli mi na napisanie tego fragmentu szkicu. Jeśli jakiś bardziej zaawansowany user, chciałby mnie naprowadzić na to jak to prawidłowo napisać, będę zobowiązany. ;)
if(na relay1 odpalono funkcję turnOn){
tempZadana = tempZadana +1;
}
else if( na relay1 odpalono funkcję turnOFF){
tempZadana --;
}
}
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

SOYER wrote: Sat Mar 11, 2023 12:24 pm Niestety, moja wiedza programistyczna i suplowa nie pozwoli mi na napisanie tego fragmentu szkicu. Jeśli jakiś bardziej zaawansowany user, chciałby mnie naprowadzić na to jak to prawidłowo napisać, będę zobowiązany. ;)
if(na relay1 odpalono funkcję turnOn){
tempZadana = tempZadana +1;
}
else if( na relay1 odpalono funkcję turnOFF){
tempZadana --;
}
}
Czy chcesz aby ten też dodany był termometr, który pokaże ustawioną wartość w apce?
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

Tak, może być.
Chcę tą zmienną też wyświetlić na lcd, ale w apce też może być.
Jeśli faktycznie chcesz mi pomóc to świetnie, ale proszę z komentarzami w linijkach, bym wiedział co robię. :D Może mi coś zaświeci ;)
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

Termostaty już działają, kumpel chciał na sztywno ustawione wartości, ale co mi szkodzi to dodać, ja sie czegos nauczę, a on zawsze może to ukryć w apk jeśli będzie mu przeszkadzać.
You do not have the required permissions to view the files attached to this post.
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

SOYER wrote: Sat Mar 11, 2023 1:03 pm Termostaty już działają, kumpel chciał na sztywno ustawione wartości, ale co mi szkodzi to dodać, ja sie czegos nauczę, a on zawsze może to ukryć w apk jeśli będzie mu przeszkadzać.
Miałem pisać, ale veeroos wrzucił przykład ze sterowaniem nastawą temperatury przy pomocy przekaźnika ;)
viewtopic.php?p=147161#p147161

Co prawda są tam zmienne globalne, które wychodzą poza klasę, więc możesz dodać tylko jeden taki przekaźnik.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

SOYER wrote: Sat Mar 11, 2023 1:03 pm Termostaty już działają, kumpel chciał na sztywno ustawione wartości, ale co mi szkodzi to dodać, ja sie czegos nauczę, a on zawsze może to ukryć w apk jeśli będzie mu przeszkadzać.
Poniżej wklejam kod mojego nieeleganckiego ustawiania wartości ;P

Code: Select all

#include <supla/storage/storage.h>
#include <supla/control/virtual_relay.h>
#include <supla/sensor/virtual_thermometer.h>

class RelayAsInput : public Supla::Control::VirtualRelay {
 public:
  explicit RelayAsInput(double step = 0.5) : step(step) {
  }
  virtual ~RelayAsInput() {}

  void turnOn(_supla_int_t duration = 0) override {
    (void)(duration);
    double newTemp = temp.getValue() + step;
    if (newTemp > 50) {
      newTemp = 50;
    }
    temp.setValue(newTemp);
    Supla::Storage::ScheduleSave(2000);
  }

  void turnOff(_supla_int_t duration = 0) override {
    (void)(duration);
    double newTemp = temp.getValue() - step;
    if (newTemp < -50) {
      newTemp = -50;
    }
    temp.setValue(newTemp);
    Supla::Storage::ScheduleSave(2000);
  }

  double getValue() {
    return temp.getValue();
  }

  void setValue(double value) {
    temp.setValue(value);
    Supla::Storage::ScheduleSave(2000);
  }

  void onLoadState() override {
    double temperature = 0;
    Supla::Storage::ReadState(reinterpret_cast<unsigned char *>(&temperature),
                              sizeof(double));
    temp.setValue(temperature);
  }

  void onSaveState() override {
    double temperature = temp.getValue();
    Supla::Storage::WriteState(reinterpret_cast<unsigned char *>(&temperature),
                               sizeof(double));
  }

 protected:
  Supla::Sensor::VirtualThermometer temp;
  double step = 0.5;
};
Wystarczy, że wstawisz powyższy kod w pliku ino Twojego projektu (gdzieś przed setup).

Następnie jak stworzysz instancję klasy RelayAsInput, to zostanie dodany przekaźnik i termometr (do wyświetlania ustawionej warotści).
Ustawioną wartość możesz w kodzie pobierać metodą "getValue". Klasa zapisuje w pamięci ostatnio ustawioną wartość i przywraca po resecie.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

@klew jesteś gość.
Bardzo dziękuję. Zapomniałem o zapisie nowo ustawionych wartości do eepromu. Fajno, że Ty o tym pamiętałeś.
Po śniadaniu biorę się za testy. Jeszcze raz dziękuję za chęci i czas.
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

klew wrote: Sat Mar 11, 2023 9:44 pm
SOYER wrote: Sat Mar 11, 2023 1:03 pm Termostaty już działają, kumpel chciał na sztywno ustawione wartości, ale co mi szkodzi to dodać, ja sie czegos nauczę, a on zawsze może to ukryć w apk jeśli będzie mu przeszkadzać.
Poniżej wklejam kod mojego nieeleganckiego ustawiania wartości ;P

Code: Select all

#include <supla/storage/storage.h>
#include <supla/control/virtual_relay.h>
#include <supla/sensor/virtual_thermometer.h>

class RelayAsInput : public Supla::Control::VirtualRelay {
 public:
  explicit RelayAsInput(double step = 0.5) : step(step) {
  }
  virtual ~RelayAsInput() {}

  void turnOn(_supla_int_t duration = 0) override {
    (void)(duration);
    double newTemp = temp.getValue() + step;
    if (newTemp > 50) {
      newTemp = 50;
    }
    temp.setValue(newTemp);
    Supla::Storage::ScheduleSave(2000);
  }

  void turnOff(_supla_int_t duration = 0) override {
    (void)(duration);
    double newTemp = temp.getValue() - step;
    if (newTemp < -50) {
      newTemp = -50;
    }
    temp.setValue(newTemp);
    Supla::Storage::ScheduleSave(2000);
  }

  double getValue() {
    return temp.getValue();
  }

  void setValue(double value) {
    temp.setValue(value);
    Supla::Storage::ScheduleSave(2000);
  }

  void onLoadState() override {
    double temperature = 0;
    Supla::Storage::ReadState(reinterpret_cast<unsigned char *>(&temperature),
                              sizeof(double));
    temp.setValue(temperature);
  }

  void onSaveState() override {
    double temperature = temp.getValue();
    Supla::Storage::WriteState(reinterpret_cast<unsigned char *>(&temperature),
                               sizeof(double));
  }

 protected:
  Supla::Sensor::VirtualThermometer temp;
  double step = 0.5;
};
Wystarczy, że wstawisz powyższy kod w pliku ino Twojego projektu (gdzieś przed setup).

Następnie jak stworzysz instancję klasy RelayAsInput, to zostanie dodany przekaźnik i termometr (do wyświetlania ustawionej warotści).
Ustawioną wartość możesz w kodzie pobierać metodą "getValue". Klasa zapisuje w pamięci ostatnio ustawioną wartość i przywraca po resecie.
Hej, generalnie ustawianie pięknie działa, jedynie coś nie tak z zapisem do eepromu bo po wypieciu z gniazdka i ponownym podłączeniu zaczyna znowu od wartości minimalnych. Jest problem albo z zapisem albo z odczytem. Używam nodeMCU na esp8266, w menedżerze płytek nodeMCu v1.0.
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

Teraz jeszcze sprawdziłem w serial monitorze, wprawdzie nie wiem co tam się powinno drukować przy zapisie, ale po zmianie wartości prze virtual relay i wyświetleniu jej na termometrze, nie widzę żadnych zapisów o storage na serialu.
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79

Return to “Pomoc”