Forum
Myslím že se na Node-red díváš z loxoňáckého pohledu, kde se nejspíše používají klasické logické hradla "prvky" AND, NAND, OR, XOR atp. a to že tě někdo u Node redu vytočil tomu asi taky neprospělo 😀 No offence.
Musím se zastat node-redu, protože jsem v podstatě nenarazil na problém, který bych tam nemohl nějakým způsobem vyřešit. V Node-redu můžeš vytvořit klasický program, sestávající se z IFů, proměnných, funkcí atp...
Tvůj příklad s porovnáváním různých hodnot je řešitelný vícero způsoby. Node-red umožňuje ukládat hodnoty tj. používat různé typy proměnných (Global, Flow, Context), ukládat data do DB, JSON atp. S těmito daty následně pracovat pomocí standartních nodů node-red IFy, delay, trigger, všechny potřebné funkce jsou k dispozici.
Takže teploty, vlhkosti, magnety v okně, stavy relé, vstupy atp. můžu načíst každých X sekund do proměnných a pak pouštím logiku nad těmito hodnotami.
Nerozepíšu to úplně detailně, ale např. u sebe doma tím řídím topení a ohřev bojleru pomocí kotle na peletky. Kde je kontrola na teplotu kotle, bojleru, akumulačky nahoře a dole, teplota v domě. Na základě těchto hodnot se ovládají čerpadla a spuštění kotle. Taky tam je logika využití odpadního tepla které se nashromáždí ve výměníku kotle po té co se dotopí a teplo se přesune do bojleru. Taky se sleduje množství pelet v zásobníku pomocí arduina a ultrazvukového senzoru -> kotel se nespustí pokud dojdou pelety a řve to mailem ať to běžím dosypat 🙂
Je to jenom část toho jak vypadá řízení kotle a čerpadel, je k tomu sousta návazností, ale jen pro představu:
Nechci tady nikoho konvertovat k node-red, ale myslím že si zaslouží šanci 🙂
Pokud by byl zájem můžu připravit nějaký srozumitelný flow, který by se dal importovat do Node-red, kde si to můžete projít a vyzkoušet.
>> Nejde mi přiložit JSON.
Opraveno. Dik, nevedel sem.
Diky za ukazku. Ten problem, co s tim MSK ma imho je, ze vychazi z toho, jak to resi Loxone.
Tam si ten posledni stav ta vazba pomatuje automaticky, zatimco v nodeRedu se musi pouzivat ukladani do promennych. Obcas je to trochu opruz, protoze by pritom stacilo jen natahat cary.
Ale sem rad, ze si priklad postl. Sam sem premyslel, jestli to nejde nejak jinak a sam takto uz par veci bohuzel resim (napriklad situaci, kdy si potrebuju pamatovat posledni stav svetla, ktere Loxone poslalo). Namisto,a by si to ta vazba pomatovala porad, je potreba to ulozit a priste pak nacist z promenne.
Ale je to jen o te filozofii pouzivani.
Je to přiliž dlouhé, kdyby vás cokoliv zajímalo pište, mé kódy jsou opensource
@mates Tak tohle mně hodně zajímá. Stavím systém do nového domku na podobné filosofii.
Základ jede na LOGO! a jako nádstavba NodeRed, který zatím testuju na RPi, ale uvažuju o nějakém robustnějším HW.
Když píšeš, že je tvůj systém opensource, nechceš to někam hodit? Minimálně pro studijní účely 😉
Zatím řeším světla a podlahové elektrické topení.
Tak jsem trochu prohledal inet a našel zajímavé řešení na implementaci (více vstupé) logiky do node-red.
https://github.com/Supergiovane/node-red-contrib-boolean-logic-ultimate
Ok, beriem ze v nodered si mozes ulozit nejake premenne do nejakeho scope (global, flow, subflow). Lenze potom ten diagram aj tak vyzera - keby si ho neokomentoval, netusim ktora bije. Je kludne mozne ze som mentalne zaseknuty vo flow co ma loxone a nie som schopny mind-switchu robit to inak. Ale mne pripada, ze nez to robit v nodered tak ako si popisal (cast je logika, cast len setuje premenne do kontextu, atd...), tak to uz mam jednoduchsie si to naprogramovat ako normalny kus kodu a vykaslat sa na graficke prepajanie obdlznickov.
Moj example v loxone vyzera pre porovnanie nejak takto:
Tu je to okomentovane este:
@mates Mě zaujaly ty obrázky, které jsi vložil, protože v nich jsou použité věci, které neznám, takže jsem myslel, že se přiučím. Díky i za ten příklad, který jsi připravil.
@skybor No, to je presne o com som hovoril. Vsetko to naroutujes do jedneho vstupu a potom vo vnutri toho logickeho bloku nerozlisis z kade a co to vlastne prislo.
Ano, booleany ktore mas or/and-ovat su v pohode ci ich tam posles 1 alebo 1000. Akonahle budu vstupy roznych typov z roznych zdrojov, si v koncoch (resp. riesi sa to tak, ze ten node, ktory POSLE tu spravu, jej musi dat nejaky custom atribut, podla ktoreho si to potom v tom inpute najdes. Co je uplne nahovno so zjavnych dovodov).
Co sa mne na nodered paci a v loxone mi strasne chyba je znovpouzitelne subflow. Proste z nejakej hromady blokov si spravim custom komponentu a tu mozem v projekte pouzit 100x. Pokial clovek riesi jednu a tu samu vec 100x, je to fakt neskutocny oser. Uz som par krat skoncil na tom, ze som si otvoril to ich xml-ko a tie nody som tam kopiroval priamo v nom (je nutne upravit nazov a priradit unikatne id-cka), ale nie je to zdaleka pre kazdeho a nikto za to potom samozrejme neruci.
Mat tak cas ktory som mal pred cca 15 rokmi a knowhow ktore mam dnes, vysmrknem komplet nahradu loxplanu a nodered do roka s prstom v nose. Nejaky PoC nastrel som ukazoval v hospode pred snad 2 rokmi, logicky engine nie je az tak zlozity, najvacsi oser pre mna bolo naprogramovat graficky designer - najprv som to skusal v j2se (hnus), potom v javascripte v browseri (este vacsi hnus). Ale fungovalo to. Je samozrejme mozne, ze by som casom narazil na nejake chyby v navrhu, ktore by boli showstoppermi (ze by neslo predist deadlockom pri dorucovani eventov, alebo performance problemom), ale snazil som sa zurocit vedomosti co mam a zdalo sa mi to fakt zivotaschopne. A to bolo prosim pekne nakodene v goovy (ten engine), ktory nie je zrovna z najrychlejsich jazykov (aj ked v porovnani s javascriptom [nodered] to nebude nejaky extra rozdiel).
@dusanmsk jojo, mit tak cas. vecny to problem ;-). Jinak jak pises, cely engine i vizualizace neni nic sloziteho, jen to pak naroubovat na nejaky HW. Coz by mohl byt ten Martinuv smartcrumbs, coz by byla pecka.
Jenze, casu uz davno neni tolik co driv.
Drobná ukázka, jak se programuje Logic Machine. Žádné klikání, vše je nachystané na uživatelské skripty. Smartcrumbs ještě žije?
PS: Nodered by tam taky mělo jít nainstalovat, i 3G modem, BT4 apod. Fajn je, že DMX jede nativně přes RS485 a člověk si může rozmyslet, co a jak použít.
-- Function to control shutters: -- maxTime - Maximum shutter rolling time, -- btnDown - Button-down object -- btnUp - Button-up object -- relayDown - relay-down object -- relayUp - relay-up object -- statusGrp - status object (percentage value) -- event - currently active event function shutter_control(maxTime, btnDown, btnUp, relayDown, relayUp, statusGrp, event) local time = os.time() local pressed -- delay step 0.5% local delay = maxTime/200 local main, rev, relayMain, relayRev,step if event.dst == btnDown then main, rev, relayMain, relayRev = btnDown, btnUp, relayDown, relayUp step = 0.5 elseif event.dst == btnUp then main, rev, relayMain, relayRev = btnUp, btnDown, relayUp, relayDown step = -0.5 else return --Invalid object end local origin = grp.getvalue(statusGrp) or 0 local val = origin -- Do not allow switching the opposite relay if grp.getvalue(relayRev) or not grp.getvalue(main) then return end grp.write(relayMain, true) while true do -- main object in "stop" state pressed = grp.getvalue(main) if not pressed and math.abs(val-origin) < 1/delay then break end -- reverse object in "start" state if grp.getvalue(rev) or os.difftime(os.time(),time) > maxTime or not grp.getvalue(relayMain) then break end -- get new value newVal = math.min(100, val + step) newVal = math.max(0, newVal) -- no change, stop if newVal == val and not pressed then break end -- write new value val = newVal grp.write(statusGrp, newVal, dt.scale) -- wait for next run os.sleep(delay) end grp.write(relayMain, false) end
@mafraf fuj, to vypada jak nejakej visual basic ;-). Ono to programovani je fajn, ale jen na ty pokrocile veci. osobne bych nechtel programovat zase uplne cely dum v nejakem jazyku. Spousta veci je jen o propojovani a ta vizualizace je o dost prehlendejsi a mene nachylna na chyby.
Crumbs zije, jen klasicky neni cas. pry maji uz 3 instalace (sve vlastni + 1 kamos). ale jak se nastehovali, resi furt neco jineho 😉
Na jednodušší věci (typu světla) se dá použít přímé propojení objektů mezi sebou. Na port 1 z obrázku je napojené relé světla na chodbě. Jakmile nějaké zařízení pošle datagram s jeho adresou, výstup se nastaví podle zprávy. Tohle je klasické řešení podle KNX.