logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Rejestracja temperatury maksymalnej i minimalnej w Node-Red: funkcja i wartości ujemne

starob 09 Mar 2021 18:21 1968 6
REKLAMA
  • #1 19307311
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Mam noda z funkcją jak poniżej.
    Potrzebuję zarejestrować temperaturą maksymalną i minimalną jaka wystąpi w ciągu doby.
    Funkcja działa do pierwszego wystąpienia temperatury ujemnej, pierwszy "minus" jest zarejestrowany i później już warunek t < TMin nie jest spełniony.
    Czego jeszcze nie wiem? ..byłbym wdzięczny za pomoc

    [syntax=javascript]
    var t = (msg.payload*1).toFixed (1);
    var Tmax = flow.get("tempMax");
    var Tmin = flow.get("tempMin");
    node.warn("t="+t);
    node.warn("min="+Tmin);
    node.warn("max="+Tmax);
    
    
    if (t > Tmax){
      flow.set("tempMax",t);  
      node.warn("=max");
    }
    if (t < Tmin){
       flow.set("tempMin",t); 
      node.warn("=min");
    }
    
    return msg;
    [/syntax]
    
  • REKLAMA
  • Pomocny post
    #2 19309943
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1498
    Skrypt w ogóle nie zadziała. Powód taki, że najpierw czytasz zawartość np. flow.get("tempMax"), a jeśli takiej nie ma to zmienna przypiera postać undefined. Po drugie by działały poprawnie operatory porównania to obie strony muszą być liczbami i to typu float (ujemne dane)
    Kod: Javascript
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 19310835
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    xury napisał:
    Po drugie by działały poprawnie operatory porównania to obie strony muszą być liczbami i to typu float (ujemne dane)

    Tak coś przeczuwałem, stąd próby wykonania jakieś operacji arytmetycznej w nadziej, że to coś zmieni (msg.payload*1).toFixed (1)
    node.warn() wyświetlał prawidłowe wartości, więc wywnioskowałem problem w warunkach "if".
    Tu była dziwna sprawa bo z prób i wyników działania warunek operuje na wartościach bezwzględnych - kupuje wartości ujemne i traktuje jako abs.

    xury napisał:
    Skrypt w ogóle nie zadziała. Powód taki, że najpierw czytasz zawartość np. flow.get("tempMax"),

    Nie powiedziałem tego, warunki początkowe ustawiam w "inject" po starcie flow i o północy.
    Dzięki temu dowiedziałem się, że można tak :)
    if (flow.get("tempMax") === undefined){
    flow.set("tempMax",t);
    Za co duże podziękowania

    Wytłumacz może dlaczego nie użyłeś parseFloat() w Tmax = flow.get("tempMax") - dla pewności wstawiłem dla wszystkich trzech zmiennych;

    Ostatnie pytanie: Wydawać by się mogło, że tak prostą funkcję da się "wyklikać" za pomocą noda switch?
    Próbowałem tak na początku, jednak działał (tzn. nie działa) tak samo jak funkcja.
  • REKLAMA
  • Pomocny post
    #4 19311529
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1498
    Nie użyłem, bo w zasadzie ta zmienna t nie może sama się zmienić na inny typ. Ale jak dałeś to to nie zaszkodzi.
    W zasadzie też mało co używam node switch. W node function możesz też zrobić wiele wyjść. W function można zrobić wiele działań na raz co oszczędza ilość node.

    Dodano po 8 [godziny] 2 [minuty]:

    To samo tylko trochę krócej napisane:
    Kod: Javascript
    Zaloguj się, aby zobaczyć kod

    A o północy poślij to:
    Kod: Javascript
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 19312961
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Pewnie nie pamiętasz, ale to Ty całkiem niedawno namówiłeś mnie na przejście z Domoticza na HA i node-red.
    Jestem więc początkujący i stąd moje elementarne pytania.
    Kod jest schludny, podoba mi się i nauczył mnie czegoś nowego. Intuicyjnie wyczuwam o co chodzi, a szczegóły doczytam.
    Nie bardzo rozumiem to:
    t > Tmax && flow.set("tempMax",t);
    ale bardziej mnie zastanawia to:
    flow.set(["tempMax","tempMin"],[void 0,void 0]);
    Nie pod względem poprawności samego działania, ale poprawności algorytmu.
    Tak sobie głośno myślę, więc jak nie chcesz nie musisz odpowiadać.
    .. o północy ustawia max/min na "beztypowe" 0st?

    .. co będzie gdy mierzona temperatura bieżąca w ciągu doby nigdy nie przejdzie przez zero (lato, duży móz) - jedna z wartości będzie trwałym zerem (co będzie nieprawdą)?

    .. wydaje mi się, że powinna być ustawiana na aktualne t , a nie na zero?
  • #6 19313452
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1498
    Nie ustawia na beztypowe 0 tylko kasuje flow'y.
    Czyli tak jak jest po restarcie, zanim zadziała flow.set.
    Co do pierwszego działania to podobnie jest jak w bash'u
    Jeśli porównanie t>Tmax jest prawdziwe to wykona się to po &&
    Jeśli jest fałszywe to się nie wykona. Zupełnie tak jak if tylko jak dla mnie lepiej do ogarnięcia wzrokiem.
  • #7 19313572
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Pojąłem... pewnie jak każdym języku jest mnóstwo podobnych "sztuczek" :)
    Gdy nie robi się tego zawodowo, tylko doraźnie dla siebie, to się ich nie pozna a na koniec i tak zapomni.
    Serdeczne dzięki. Temat zamykam.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zadał pytanie dotyczące rejestracji maksymalnej i minimalnej temperatury w Node-Red, zwracając uwagę na problem z wartościami ujemnymi, które uniemożliwiają poprawne działanie skryptu. Odpowiedzi wskazały, że problem wynika z braku inicjalizacji zmiennych Tmax i Tmin, co prowadzi do ich wartości undefined. Zastosowanie funkcji parseFloat oraz odpowiedniego ustawienia warunków w kodzie pozwala na poprawne rejestrowanie temperatur. Użytkownicy podkreślili również, że można używać operatorów logicznych do uproszczenia kodu. Dodatkowo, omówiono kwestię resetowania wartości temperatury o północy oraz potencjalne problemy z ustawieniem wartości na zero, gdy temperatura nie przekracza zera przez całą dobę.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA