Kilka Out w nodzie Funkction

Mam proces kontrolujący pracę przepustnicy w kominku na podstawie temperatury , wszystko działa , tylko chcę dołożyć sprawdzanie aktualnego stanu tej przepustnicy , żeby niepotrzebnie nie wysyłać poleceń ustaw na 60% skoro już się tak ustawiła .
Ustawiłem w nodzie events: state tak jak na foto
3
I w zmiennych odczytuję takie parametry
2
Idąc dalej chciałem zrobić noda funkction z trzema wyjściami , robię coś takiego

var poziom = msg.data.new_state.attributes.current_position;
if (poziom != 60) {
    msg.payload == 60;
    return [msg, null, null];  
}

if (poziom != 40) {
    msg.payload == 40;
    return [null, msg, null];
}

if (poziom != 20) {
    msg.payload == 20;
    return [null, null, msg];
}    

ale nie dosć , że dostaję błędy , to jeszcze nie mam trzech out , tylko jedno , niestety opornie mi idzie skryptowanie node.js , dlatego proszę o wskazówkę co tu skopałem ?

out

z w/w powodu - różny return z ilością wyjść.

Warunek if != (inaczej różny) prawie zawsze zadziała. Masz cały zestaw warunków do wyboru : >=, ==, <=

1 polubienie

Super znowu coś do przodu, ale mimo wszystko coś robię źle. Za każdym razem błąd atrybutu, więc tak się zastanawiam, skoro chcę w funkcji sprawdzić new_state , czy old_state current_position w zmiennej flow, to powinienem sprawdzać zmienną, a nie sam atrybut current_ position?
Jeśli tak, to jak to zapisać w funkcji? I jaką msg wystawić do noda call service , w którym mam już ustalony poziom, tak jak poniżej ?

dokładnie tak… w zmiennej flow zapamiętałeś cały obiekt. Musisz go najpierw odczytać przez flow.get()
i dopiero wtedy możesz się odwoływać za pomocą new_state.attributes.current_position
Coś około tego:)

let obj =flow.get('zmienna');
var poziom = obj.new_state.attributes.current_position;

Można to zapisać w jednej linii tylko tylko nie pamiętam jak.

Błędów nie ma , ale proces przechodzi dalej mimo takiej sytuacji
1

let obj = flow.get('przepust');
var poziom = obj.new_state.attributes.current_position;
if (poziom != 40 ) {
    msg.payload = "1"
} 
return msg;

Poziom w GUI też się zgadza z wartością zmiennej . Dlaczego tak ?
edit…
Dodam, że przy old_state jest to samo , czyli node funnkcji jest jakby przezroczysty. Może można jakoś inaczej sprawdzać pozycję cover ?

… bo tak to zapisałeś:

  • dla wartości różnych od 40 przechodzi niezmieniony msg
  • dla równych 40 przechodzi ze zmieniowym msg.payload =1

Nie wiem dokładnie czego oczekujesz ale np. ma przechodzić tylko dla wartości większych równych 40 to warunek będzie wyglądać.

if (poziom >= 40 ) {
    msg.payload = "1";
    return msg;
} 
return null;

Pooglądaj trochę przykładów na temat Node.js :index_pointing_at_the_viewer:

1 polubienie

Łatwo wskazać drogę, trudniej znaleźć przydatne przykłady.
Chcę żeby proces się zatrzymał gdy poziom osiągnie założoną wartość , dlatego chcę wysyłać dotąd, aż nie będzie np 40, zmieniłem zapis na

if (poziom != 40 ) {
    msg.payload = "1";
    return msg;
} 
return null;

Na razie Dziękuję

Ja tam się nie znam na NR, ale mam taką podpowiedź: warunek, który użyłeś - a sprawdzasz czy wartość jest RÓŻNA od 40 nie jest właściwy dla Twoich założeń.
Być może znasz swoje warunki wejściowe i wiesz, ze wartość w warunkach normalnych będzie się zwiększała lub zmniejszała krokami po 1, ale musisz też brać pod uwagę inne scenariusze (np. komunikacja zostanie zakłócona lub po prostu wartość będzie się zwiększać na tyle szybko, że przeskoczy nie o 1, a o 2) i wtedy potencjalnie możesz mieć sytuację gdy po 39 nastąpi 41 i poleci dalej w górę i w ogóle nie wystąpi wartość 40.

1 polubienie

Dziękuję za podpowiedź, moje warunki wstępne są bardzo sprecyzowane , otwieram przepustnicę w zalezności od temperatury w kilku krokach o równe wartości, tj 100%, 80%, 60%,… 20% , Off. Sprawdzenie czy wartość jest rózna od wymaganej, w zupełności wystarczy. Gdy “wskoczy” np 39, to przy następnym odczycie temperatury proces ma to skorygować do 40, ale jak już jest 40 , to ma nic więcej nie robić. To co podpowiedział @RobinI30 , w ostatnim swoim poście , realizuje moje potrzeby.