Zainspirowany kompasem z Integracja Burze_dzis_net, odczytująca ilość wyładowań w pobliżu - Node-RED - ArturHome
próbuję zrobić prawie to samo, ale korzystając z integracji.
Do określenia informacji czy burza się zbliża czy oddala potrzebuję zapamiętać dwie wartości encji: aktualną i poprzednią. Niestety nie mam pomysłu jak to ugryźć.
Odczytuję atrybut:
W przytoczonym wątku kolega @RobinI30 w NR liczył czy burza się zbliża czy oddala (odległość maleje lub rośnie) i na tej podstawie wyświetlał strzałkę do wewnątrz lub na zewnątrz.
Będę kombinował z dodaniem atrybutu czasu i zapamiętywaniem dwóch wartości encji, a tymczasem liczę gradient odległości: jak jest ujemny to burza się zbliża, jak dodatni to oddala:
[
{
"id": "process_storm_data",
"type": "function",
"z": "75a368fecd04c615",
"name": "Przetwórz dane o burzy",
"func": "const data = msg.payload.return;\nconst record = {\n liczba: data.liczba.$value,\n odleglosc: parseFloat(data.odleglosc.$value),\n kierunek: data.kierunek.$value,\n okres: data.okres.$value,\n timestamp: Date.now()\n};\n\n// Pobierz poprzednie dane z kontekstu\nlet stormData = context.get('stormData') || [];\n\n// Dodaj nowe dane\nstormData.push(record);\n\n// Zachowaj tylko ostatnie 6 zapisów (ostatnia godzina)\nif (stormData.length > 6) {\n stormData.shift();\n}\n\n// Zapisz dane w kontekście\ncontext.set('stormData', stormData);\n\nmsg.payload = stormData;\nreturn msg;",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 850,
"y": 80,
"wires": [
[
"af74adccd16db17b",
"4f329dff26e49519"
]
]
},
{
"id": "af74adccd16db17b",
"type": "function",
"z": "75a368fecd04c615",
"name": "Analizuj dane o burzy",
"func": "let stormData = msg.payload;\nif (stormData.length < 2) {\n msg.payload = {status: 'Zbyt mało danych do analizy'};\n return msg;\n}\n\nlet latest = stormData[stormData.length - 1];\nlet previous = stormData[stormData.length - 2];\n\nlet trend = {\n liczba: latest.liczba - previous.liczba,\n odleglosc: latest.odleglosc - previous.odleglosc,\n kierunek: latest.kierunek,\n okres: latest.okres\n};\n\nlet status = '';\n\nif (trend.liczba > 0) {\n status += 'Więcej wyładowań. ';\n} else if (trend.liczba < 0) {\n status += 'Mniej wyładowań. ';\n} else {\n status += 'Liczba wyładowań stabilna. ';\n}\n\nif (trend.odleglosc < 0) {\n status += 'Burza się zbliża. ';\n} else if (trend.odleglosc > 0) {\n status += 'Burza się oddala. ';\n} else {\n status += 'Odległość do burzy stabilna. ';\n}\n\nmsg.payload = {trend: trend, status: status};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 1100,
"y": 80,
"wires": [
[
"4f329dff26e49519"
]
]
}
]
W jednym node zbiera do 6 pomiarów z burze net (pobieram po soap), a w drugim mam analizę czy się zbliza, czy oddala oraz czy wyładowań jest wiecej/mniej
Niestety nie dałem rady zrobić na samych pomocnikach. Dodatkowa encja z platformy statystyki robi robotę.
Ale aby mieć obecną i poprzednią wartość encji zrobiłem dwa pomocniki typu tekst i w automatyzacji przepisuję wartości: