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
I w zmiennych odczytuję takie parametry
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 ?
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
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 ?
Ł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
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.
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.