KLOP - Ogólny kanał licznikowy - Działający przykład
-
klew
- Posts: 13907
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
- Has thanked: 134 times
- Been thanked: 137 times
Są plusy dodanie i plusy ujemnekrycha88 wrote: Wed Apr 24, 2024 9:34 am A jakie są plusy tego klopa czego nie ma normalny kanał impulsów? bo może dodać taki kanał do GG?
+ jest większa swoboda konfiguracji (prefix, suffix, ilość miejsc po przecinku)
+ można wysyłać z urządzenia wartości double, a nie int64 (np. czytając po wmbusmeters licznik wody, nie trzeba przeliczać "23.872" na 23872, tylko można od razu double wysyłać
+ można ustawić licznik jako "always increment", "always decrement", lub "increment and decrement" (zwykły IC obecnie jest zawsze traktowany jako "always increment"
- nie ma przeliacznia na złotówki
- obecna implementacja KLOP nie ma przechowywania stanu (bo nie zawsze jest to potrzebne) i nie ma implementacji np. zliczania impulsów z GPIO.
Najlepsze suple dla Twojego domu 
-
krycha88
- Posts: 5575
- Joined: Fri Nov 16, 2018 7:25 am
- Been thanked: 5 times
Może jakiś parametr do tego lub jakaś druga klasa która będzie robić to samo co aktualny licznik impulsów tylko na klopie? dla większości to pewnie jest traktowane jako brakklew wrote: Wed Apr 24, 2024 9:45 am - obecna implementacja KLOP nie ma przechowywania stanu (bo nie zawsze jest to potrzebne) i nie ma implementacji np. zliczania impulsów z GPIO.
edit:
mogę to zrobić ale w GG, jeżeli będziesz chciał to dodać to po co powielać robotę
https://gui-generic-builder.supla.io/
-
klew
- Posts: 13907
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
- Has thanked: 134 times
- Been thanked: 137 times
Możesz dodać do supla-devicekrycha88 wrote: Wed Apr 24, 2024 9:57 amMoże jakiś parametr do tego lub jakaś druga klasa która będzie robić to samo co aktualny licznik impulsów tylko na klopie? dla większości to pewnie jest traktowane jako brakklew wrote: Wed Apr 24, 2024 9:45 am - obecna implementacja KLOP nie ma przechowywania stanu (bo nie zawsze jest to potrzebne) i nie ma implementacji np. zliczania impulsów z GPIO.
edit:
mogę to zrobić ale w GG, jeżeli będziesz chciał to dodać to po co powielać robotę![]()
Najlepsze suple dla Twojego domu 
-
iM@rek
- Posts: 376
- Joined: Thu Feb 09, 2023 1:25 pm
W oczekiwaniu na lepsze, uczę się dalej:
Na bazie GG.ino dołożyłem obsługę FRAM za pomocą ADAFruit.
Czyli nie kompiluję Licznika Imp. z GG, a wstawiam KLOP oraz dokładam procedury obsługi FRAM z bibliotekami Ady.
Wiem, że to z lekka nieelegancko, ale inaczej nie umiem.
Działa zliczanie imp (KLOP), działa zapisywanie w FRAM i odtwarzanie stanu po ponownym uruchomieniu.
Nie działa reset licznika z poziomu strony i KLOPa - no bo nie ma jak działać w tej "równoległej" konfiguracji.
Chcę jakoś przekazać info o resecie do głównej pętli w GG.ino, np. za pomocą zmiennej ResetIMP
Znalazłem, że reset licznika ze strony powoduje uruchomienie w GeneralPurposeMeter.cpp.
Tam jest w linii 248 info: "CALCFG reset counter received":
W GG.ino zadeklerowałem:
Monitoruję tę zmienną i ma wartość 0 podczas działania programu.
Po wywołaniu resetu licznika, jej wartość w GeneralPurposeMeter zmienia się na 1, ale nie wraca do pętli w GG.ino
Tam jest ciągle 0.
Jak mam przekazać do pętli GG zmienioną wartość ResetIMP z GeneralPurposeMeter?
Na bazie GG.ino dołożyłem obsługę FRAM za pomocą ADAFruit.
Czyli nie kompiluję Licznika Imp. z GG, a wstawiam KLOP oraz dokładam procedury obsługi FRAM z bibliotekami Ady.
Wiem, że to z lekka nieelegancko, ale inaczej nie umiem.
Działa zliczanie imp (KLOP), działa zapisywanie w FRAM i odtwarzanie stanu po ponownym uruchomieniu.
Nie działa reset licznika z poziomu strony i KLOPa - no bo nie ma jak działać w tej "równoległej" konfiguracji.
Chcę jakoś przekazać info o resecie do głównej pętli w GG.ino, np. za pomocą zmiennej ResetIMP
Znalazłem, że reset licznika ze strony powoduje uruchomienie w GeneralPurposeMeter.cpp.
Tam jest w linii 248 info: "CALCFG reset counter received":
Code: Select all
int GeneralPurposeMeter::handleCalcfgFromServer(
TSD_DeviceCalCfgRequest *request) {
if (request) {
if (request->Command == SUPLA_CALCFG_CMD_RESET_COUNTERS) {
if (!request->SuperUserAuthorized) {
return SUPLA_CALCFG_RESULT_UNAUTHORIZED;
}
SUPLA_LOG_INFO("GPM[%d]: CALCFG 248 reset counter received",
getChannelNumber());
setCounter(resetToValue);
int ResetIMP = 1; \\ moja wstawka
Serial.printf("ResetIMP: %d\n\n",ResetIMP); \\ zmienia z 0->1 i wyświetla <1> na monitorze
return SUPLA_CALCFG_RESULT_DONE, ResetIMP; \\ dołożyłem zwrot tej zmiennej
}
}
return SUPLA_CALCFG_RESULT_FALSE;
}Code: Select all
extern int ResetIMP; // zmienna/flaga resetu licznika, ma być globalna i zwracana do GG.ino
int ResetIMP = 0; // normalnie 0Po wywołaniu resetu licznika, jej wartość w GeneralPurposeMeter zmienia się na 1, ale nie wraca do pętli w GG.ino
Tam jest ciągle 0.
Jak mam przekazać do pętli GG zmienioną wartość ResetIMP z GeneralPurposeMeter?
-
vajera
- Posts: 7290
- Joined: Wed Oct 31, 2018 7:58 am
- Location: Biedrusko
- Has thanked: 289 times
- Been thanked: 161 times
Tak na szybko - w tej funkcji deklarujesz LOKALNĄ zmienną ResetIMP (używając tego int - to jest deklaracja zmiennej).iM@rek wrote: Thu Apr 25, 2024 9:15 amCode: Select all
i setCounter(resetToValue); int ResetIMP = 1; \\ moja wstawka Serial.printf("ResetIMP: %d\n\n",ResetIMP); \\ zmienia z 0->1 i wyświetla <1> na monitorze return SUPLA_CALCFG_RESULT_DONE, ResetIMP; \\ dołożyłem zwrot tej zmiennej } } return SUPLA_CALCFG_RESULT_FALSE; }
Poza tym ta funkcja zwraca jedną wartość typu int a Ty próbujesz zwrócić 2, co może prowadzić do nieokreślonych konsekwencji łącznie z crashem stosu.
Zmienna ResetIMP musi być zadeklarowana poza funkcją - wtedy będzie globalna, a w GG.ino zostaw tylko linijkę z extern bo w kolejną deklarujesz ją ponownie.
Czyli, np.
Code: Select all
int ResetIMP = 0;
int GeneralPurposeMeter::handleCalcfgFromServer(
TSD_DeviceCalCfgRequest *request) {
if (request) {
if (request->Command == SUPLA_CALCFG_CMD_RESET_COUNTERS) {
if (!request->SuperUserAuthorized) {
return SUPLA_CALCFG_RESULT_UNAUTHORIZED;
}
SUPLA_LOG_INFO("GPM[%d]: CALCFG 248 reset counter received",
getChannelNumber());
setCounter(resetToValue);
ResetIMP = 1;
Last edited by vajera on Thu Apr 25, 2024 9:35 am, edited 2 times in total.
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
-
klew
- Posts: 13907
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
- Has thanked: 134 times
- Been thanked: 137 times
A czemu nie zrobisz po prostu:
Code: Select all
klop->setCounter(0);
Najlepsze suple dla Twojego domu 
-
iM@rek
- Posts: 376
- Joined: Thu Feb 09, 2023 1:25 pm
To chyba spowoduje zerowanie klop z poziomu GG, ale ja nie chcę go zerować z poziomu GG.ino, a ze strony, czyli info ze strony o resecie ma trafić do głównej pętli GG.ino.klew wrote: Thu Apr 25, 2024 9:33 amA czemu nie zrobisz po prostu:?Code: Select all
klop->setCounter(0);
Chyba, że to źle rozumiem?
-
iM@rek
- Posts: 376
- Joined: Thu Feb 09, 2023 1:25 pm
ok, zrozumiałem obie uwagi.vajera wrote: Thu Apr 25, 2024 9:32 am Tak na szybko - w tej funkcji deklarujesz LOKALNĄ zmienną ResetIMP (używając tego int - to jest deklaracja zmiennej).
Poza tym ta funkcja zwraca jedną wartość typu int a Ty próbujesz zwrócić 2, co może prowadzić do nieokreślonych konsekwencji łącznie z crashem stosu.
Zmienna ResetIMP musi być zadeklarowana poza funkcją - wtedy będzie globalna, a w GG.ino zostaw tylko linijkę z extern bo w kolejną deklarujesz ją ponownie.
Usunąłem deklarację zmiennej z funkcji, zostało: ResetIMP = 1;
przesunąłem deklarację int ResetIMP = 0; na górę general_purpose_meter.cpp, po deklaracjach "#include..."
oraz usunąłem zwrot drugiej zmiennej z Return
EDIT:
Poczytałem, zrozumiałem (mam nadzieję), wprowadziłem poprawki i działa.
Deklaracja została w GG.ino, definicja trafiła do "general_purpose_meter.cpp".
Klikam "Resetuj licznik" na stronie Supli i zerują się:
1. licznik KLOP i
2. moja zmienna jego wartości,
3. następuje zapis wartości do FRAM i
4. licznik startuje od zera.
Dziękuję za pomoc.
