Node-RED - Function - TypeError: Cannot read property 'startsWith' of undefined

Witam,

Mam taki niezrozumiały kłopot z funkcją.
Wywala mi błąd: “TypeError: Cannot read property ‘startsWith’ of undefined”

var SekundyOff = 300; // ustaw liczbę sekund opuszczonego szlabanu

// Obliczenia
var dN=Date.now();
var tsTemp=dN+(SekundyOff*1000); 
var tSOn =context.get(tSOn) || tsTemp;

if (dN<tSOn) {
    // Bramka zamknięta
    var i=(tSOn-dN)/1000;
    node.status({fill:"red",shape:"dot",text:"Pozostało: "+i+"[s]"}); 
    return [null,msg];
} else {
    // Bramka otwarta
    node.status({fill:"green",shape:"dot",text:"POSZŁO"});    
    context.set("tSOn", tSOn);
    return [msg,null];
}

Fa funkcja działa jak szlaban. Jeśli na wejściu pojawi się msg. to sprawdza czy nie została wcześniej utworzona zmienna tSOn dla funkcji. Jeśli tak to ją odczytuje (jest w niej przechowywany timestemp od którego ma puszczać dalej msg.) jeśli nie, to tworzy ją i nadaje wartość aktualnej daty + liczba sekund zdefiniowana w SekundyOff

CZyli po ludzku bramka, która powstrzyma wysyłanie wiadomości z częstotliwością większą niż co zdefiniowana liczba sekund.

Kiedy nie pobieram zmiennej z context (a to jest niezbędne do prawidłowego jej działania), to wszystko jest w porządku…
image

:frowning:

@Marcin_Domański A jak ustawiasz pierwszy raz tą zmienną kontekstową? Bo tu na samym początku robisz get, a gdzie jest pierwszy set?

Do tego służy operator OR (||) oznacza to że jeśli nie może jej odczytać (nie istnieje) to ją deklaruje dlatego na początku jest VAR. Taki JavaScript’owy myk.
var tSOn =context.get(tSOn) || tsTem

@Marcin_Domański zobacz to. U mnie bez błędu ale nie testowałem logiki działania. Jednak teraz nie masz błędu.

var SekundyOff = 300; // ustaw liczbę sekund opuszczonego szlabanu

// Obliczenia
var dN=Date.now();
var tsTemp=dN+(SekundyOff*1000); 
var tSOn = context.get('tSOn') || tsTemp;

if (dN<tSOn) {
    // Bramka zamknięta
    var i=(tSOn-dN)/1000;
    node.status({fill:"red",shape:"dot",text:"Pozostało: "+i+"[s]"}); 
    return [null,msg];
} else {
    // Bramka otwarta
    node.status({fill:"green",shape:"dot",text:"POSZŁO"});    
    context.set('tSOn', tSOn);
    return [msg,null];
}

Aktualizacja
Tak jeszcze patrzę na tego Twojego if’a i chyba tam coś jest nie tak z logicznego punktu widzenia bo dN na start zawsze będzie mniejsze od tsOn. A ponieważ w if’ie dla prawdy brakuje ustawienia zmiennej kontekstowej to to tak będzie działało zawsze jak za pierwszym uruchomieniem. Nigdy nie wejdzie do else aby ustawić zmienną kontekstową. Tak mi się wydaje jak na to patrzę ale nie mam dzisiaj chwili aby to sprawdzić i testować.