hej,
Mam stan ON i chciałbym aby wykonanie akcji TURN_ON ponownie wykonało handleAction. Jak to osiągnąć? Bo teraz jeżeli stan się zgadza ze stanem przekaźnika to nie wykonuje się handleAction.
Wykonanie wielokrotnie handleAction dla tego samego stanu
-
- Posts: 3162
- Joined: Fri Dec 27, 2019 6:22 pm
- Location: Żerniki Wrocławskie
No bo po co włączać coś, co melduje, że jest włączone? I odwrotniekrycha88 wrote: Wed Sep 29, 2021 8:00 am hej,
Mam stan ON i chciałbym aby wykonanie akcji TURN_ON ponownie wykonało handleAction. Jak to osiągnąć? Bo teraz jeżeli stan się zgadza ze stanem przekaźnika to nie wykonuje się handleAction.
Widzimy się na Supla Offline Party Season 2025
-
- Posts: 10022
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Na jakim elemencie? Relay? Jeśli tak, to Relay po otrzymaniu "TURN_ON" za każdym razem odpali "handleAction", które odpali metodę "turnOn", która wykona to co turnOn ma wykonać.
Nie ma tam nigdzie sprawdzenia aktualnego stanu.
Nie ma tam nigdzie sprawdzenia aktualnego stanu.
-
- Posts: 5417
- Joined: Fri Nov 16, 2018 7:25 am
akurat testowałem to na VirtualRelay.
https://gui-generic-builder.supla.io/
-
- Posts: 5417
- Joined: Fri Nov 16, 2018 7:25 am
to u mnie coś nie działa
w swojej klasie mam dodaną metodę:
i log wygląda następująco:
stan zmieniam z aplikacji, jak widać handleAction wykonuję się tylko raz.
Code: Select all
relay[size]->addAction(Supla::TURN_ON, rf, Supla::ON_TURN_ON);
relay[size]->addAction(Supla::TURN_OFF, rf, Supla::ON_TURN_OFF);
Code: Select all
void RFBridge::handleAction(int event, int action) {
(void)(event);
Serial.println("handleAction");
Serial.print("event:");
Serial.println(event);
Serial.print("action: ");
Serial.println(action);
switch (action) {
case TURN_ON: {
turnOn();
break;
}
case TURN_OFF: {
turnOff();
break;
}
}
}
i log wygląda następująco:
Code: Select all
**** Digital write[0], pin: 5; value: 1
handleAction
event:18
action: 1
Channel(0) value changed to 0
**** Digital write[0], pin: 5; value: 1
**** Digital write[0], pin: 5; value: 1
**** Digital write[0], pin: 5; value: 1
**** Digital write[0], pin: 5; value: 1
Wrote 1 bytes to storage at 19
Commit
**** Digital write[0], pin: 5; value: 0
handleAction
event:17
action: 0
Channel(0) value changed to 1
**** Digital write[0], pin: 5; value: 0
**** Digital write[0], pin: 5; value: 0
**** Digital write[0], pin: 5; value: 0
Wrote 1 bytes to storage at 19
Commit
https://gui-generic-builder.supla.io/
-
- Posts: 10022
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
ok, ale tutaj robisz coś innego niż myślałem.
Akcja "ON_TURN_ON" odpala się "on turn on" przekaźnika. Tzn. stan musi się zmienić. Jak był "on", to nie zmienia się na "on", więc relay nie odpali powiadomienia, bo ono leci tylko przy zmianie stanu.
Ja bym to inaczej zrobił. Zmień tą klasę "RF bridge", aby dziedziczyła po "Relay" i nadpisz metodę "turnOn" (analogicznie jak to jest w VirtualRelay). Wtedy ta metoda "turnOn" odpali się za każdym razem, gdy przyjdzie taki sygnał z apki.
Akcja "ON_TURN_ON" odpala się "on turn on" przekaźnika. Tzn. stan musi się zmienić. Jak był "on", to nie zmienia się na "on", więc relay nie odpali powiadomienia, bo ono leci tylko przy zmianie stanu.
Ja bym to inaczej zrobił. Zmień tą klasę "RF bridge", aby dziedziczyła po "Relay" i nadpisz metodę "turnOn" (analogicznie jak to jest w VirtualRelay). Wtedy ta metoda "turnOn" odpali się za każdym razem, gdy przyjdzie taki sygnał z apki.
-
- Posts: 5417
- Joined: Fri Nov 16, 2018 7:25 am
dzięki za podpowiedź ale ja bym chciał działać na VirtualRelay lub Relay. Nie chciał bym traktować "RF bridge" jako osobnego kanału w aplikacji.
Bramka RF nad którą pracuję będzie dwukierunkowa. Będzie można załączyć Relay lub VirtualRelay na podstawie kodu RF oraz będzie potrafiła wysłać kod do innego urządzenia.
Bramka RF nad którą pracuję będzie dwukierunkowa. Będzie można załączyć Relay lub VirtualRelay na podstawie kodu RF oraz będzie potrafiła wysłać kod do innego urządzenia.
https://gui-generic-builder.supla.io/