Autor Zpráva
jirkam
Profil
Dobrý den, potřeboval bych lépe zjistit, ve kterých řádcích daného jednoho sloupce proběhly změny dat. Sloupec může mít například 1000 řádků, ale změna může být například každých 10s třeba v 10 různých řádcích. Do teď to dělám tak, že každou sekundu testuji ve smyčce všechny řádky daného sloupce. A tam kde je změna oproti předpokládanému předchozímu stavu, tak se podle toho zařídím. Chtěl bych to nějak zrychlit a netuším jak.
Principielně mám v tom sloupci číselnou hodnotu statusu komunikace, hodnota je v rozsahu 0-7. Každé číslo něco znamená. Do sloupce jednak šahá PHP kód a potom céčkový program. Napadlo mně využít něco jako Trigger, ale netuším jak. ¨
Máte prosím někdo nápad a chcete se podělit ?
Děkuji za přečtení
Jirka
Tomášeek
Profil
jirkam:
Ukládej si čas poslední změny a filtruj pak dle něj (např. záznamy, kde čas poslední změny je > 30s).
Kajman
Profil
jirkam:
Pomocí triggeru můžete plnit logovací tabulku, kde bude zaznamenána na každém řádku informace, že byl změněn sloupec v hlídané tabulce nebo tam byl přidán či smazán celý řádek. V řádku logu bude číselný identifikátor logovací tabulky, id odkazující na primární klíč hlídané tabulky a nová hodnota sloupce, případně i stará hodnota, pokud to aplikaci zajímá.

Aplikaci se pak při dotazu na hlídanou tabulku zeptá i na maximální id z logovací tabulky a pak se periodicky bude dotazovat jen na řádky s id větším než dosavadní zpracované maximum. Dostane pak rychle seznam změn. Dotaz lze případně i upravit, aby ignoroval změny, které byly přepsány jinými změnami v rámci jedné kontroly.
jirkam
Profil
Děkuji za podněty.
Ještě popíšu, co to tedy dělá, třeba z toho vzejde další nápad:
web zobrazí hodnotu parametru (přednastavená teplota), vedle teploty jsou tlačítka načíst a zapsat. Stisknu načíst a PHP mi zapíše do určitého řádku (budu říkat prvního, je to sloupec pojmenovaný status) hodnotu 1. Céčkový prográmek periodicky kontroluje hodnotu v tomto řádku. Je tam 1 a tak vytvoří příkaz pro komunikaci po sériové lince pro hodnotu z jednočipu, zároveň změní hodnotu 1 na 3. Pokud by došlo k chybě komunikace (timeout), tak céčko zvýší hodnotu na 5. Pokud se správně vyčte hodnota, tak céčko zvýší hodnotu v řádku 1 na 7 a do jiné tabulky uloží vyčtenou hodnotu teploty.
PHP nevím, jak to dělá, ale vyhodnocuje tentýž řádek 1 a když tam bude 3, tak vypíše do webu, že se komunikuje, jakmile tam skočí 5, tak vypíše hlášku timeout a pokud v řádku 1 bude 7, tak vezme hodnotu teploty z té jiné tabulky a zobrazí na webu a zároveň snuluje status v řádku 1.
Pokud bych chtěl zapisovat, tak použiju obdobný mechanismus, s tím, že mi nejprve vyskočí okno, kam zapíšu požadovanou hodnotu a následně stisknu tlačítko vložit. Status se změní na 2, protože je požadavek na komunikaci - zápis, pokud vyskočí timeout, tak se status změní na 4 a pokud proběhne OK, tak se změní na 6 a následně po zobrazení zprávy na webu, že zápis dopadl dobře, se status snuluje.

Parametrů typu teplota nebo třeba čas, tlak, vlhkost, může být třeba 1000. Každý parametr má svůj řádek ve sloupci status.
Možná je to špatná cesta, ale je funkční. Bohužel nedělám v PHP, pracuju pouze na kódu v C, takže jsem chtěl mířit k tomu, že by mi do C přišla nějaká událost nebo ukazatel na pole všech statusů, které jsou větší jak 0 a menší jak 3. Z tohoto pole si sestavím do fronty komunikační rámce
a odkomunikuju fyzicky s jednočipy. Zároveň zapisuju do statusů získané hodnoty statusů.
Nápady na lepší cestu uvítám.
Pěkný den, Jirka
Kajman
Profil
Nad jakou je to databází? Program v C je na stejném stroji jako databáze? Program v C je spuštěn neustále a periodicky se ptá, nebo se pouští periodicky? Php běží na stejném stroji jako program v C a je případně povolené ho z php spustit?
jirkam
Profil
Běží to na MySQL 5.5.47 vše běží na jednom stroji, dá-li se tomu ještě říkat stroj (Alix 2d13).
C běží stále. Každých 10s zakomunikuje s všemi jednočipy a vyčte z nich pole 128 bajtů s proměnnými, které se mohou měnit - jsou to teploty z čidel. Tyto hodnoty se hned strkají do tabulky a web si tyto hodnoty periodicky bere k zobrazení. Na jiné stránce jsou parametry - požadované hodnoty, ty se teď aktualizují stisknutím tlačítka na stránce (vytvoří se komunikační rámec, odkomunikuje se a vrácená hodnota se zobrazí jedna po druhé).
Nenapadlo mně jak jinak předávat data mezi C a PHP, než přes MySQL. Celé to funguje dobře, jen bych v tom chtěl nějak pokročit, protože jsem na to pár let našáhnul a tak jsem si řekl, že bych začal tím zautomatizovaným vyčítáním statusu kolem komunikace s parametry jednočipů.
Jirka
Kajman
Profil
Možná by to šlo vystavět tak, že na webu budou tlačítka, která ajaxem zavolají php skript s žádostí o předností obnovu hodnoty. Ten php skript spustí nějaký program v C, který řekne tomu stále běžícímu programu v C, že chce přednostně obnovit přednostně nějakou hodnotu. Dočasný C program počká na odpověď stále běžícího C programu. Php skript také počká na odpověd a javascriptu pak vrátí novou hodnotu a tu javascript uživateli aktualizuje.

Mohly by pak být o trochu kratší odezvy obnovy hodnoty než php -> db -> trvale spuštěný C program. Pokud C program bude poslouchat na nějakém portu, tak by tam mohl požádat o předběhnutí ve frontě asi i rovnou ten php skript.
jirkam
Profil
Můj problém největší je, že trpím nedostatkem vzdělanosti kolem webu (html, php, css, javascript...). Principy jsou mi známy, ale neumím je aplikovat. V tomto mi opravdu ujel vlak a nevidím ani koncová světla.
Možná to vyznělo tak, že nejsem spokojen s rychlostí odezvy na stávající systém, kdy vše dělám přes DB sloupec se statusy kolem parametrů. Prakticky mi to s cca 128 řádky nedělá problém, ale netuším, co to může dělat s rychlostí, pokud tam bude 256*32=8192 řádků. Tedy prohledání jeden po druhém. Ano, nejjednodušší je to vyzkoušet. Moje nedůvěra pochází z profesní postiženosti práce s jednočipy, kdy musím hlídat počet bajtů v RAM, omezenost výkonu procesoru, použití EEPROM atd. Dělá mi to obecně problém odpoutat se od tohoto stylu. Na druhou stranu dnešní "programátoři" tyto problémy neřeší, když dojde RAM, tak vyměníme modul v PC, když dojde disk, přidáme nebo vyměníme za větší, když dojde dech procesoru, tak dáme rychlejší. Tomu se chci vyhnout.
Celý projekt se v podstatě stává z cca 32 procesorů (někde používám 8051ED2, někde mám ATMEGA168, někde bude třeba nějaké malé Arduino). Všechny používají stejný protokol pro komunikaci, který umožňuje naadresovat jakoukoliv paměťovou oblast v procesoru a provézt čtení nebo i zápis (1-128 bajtů v jednom paketu). Jednotlivé procesory řeší úlohy jako ovladač předokeních rolet, ekvitermní regulace 2 topných okruhů, hlídání a ovládání přepouštění vody ze studny do zásobníku vody, potom spíš jen monitoring teplot - měření prostupu tepla konstrukcí zdi, stropu, střechy. Potom řízení lokální rekuperace v 8 místech (to funguje tak, že vždy 4 jednotky foukají ven a 4 dovnitř, po určitou dobu, pak se prohodí). No a další kravinky k tomu. Vrcholem snažení by měla být implementace do OpenHAB, protože neumím webové aplikace, tak chci použít UDP binding a mezi OpenHAB a mým C komunikátorem se budou předávat parametry přes UDP stylem #01 ?SP1 ?SP3... kde #01 značí adresu jednočipu a pak jsou to ? dotaz a název parametru. Zpět se pošle #01 SP1=26,5 SP3=-18,0. Obdobně bude probíhat požadavek na zápis #02 !SP1=13,5 !SP3=22,5 a zpět se pošle #02 SP1=13,5 SP3=22,5 jako potvrzení, že se zapsalo. Pokud by došlo k chybě zápisu, tak se vrátí SP1=Err nebo tak něco. Předpokládám, že tím, že už tam bude MySQL, kam já strkám pravidelně hodnoty třeba teplot nebo stavů z periodické komunikace, tak tyto se pak dají zpracovat do grafu nebo tabulky taktéž přes OpenHAB. A když už jsem narazil na MySQL, tak pořád válčím s formátem nebo spíš datovým typem. Protože v jednočipech nepoužívám pohyblivou řádovou čárku, ale vše počítám v celočíselné matematice a pro zobrazení vím, kam mám dát desetinou čárku, tak jsem tento princip použil i do DB. Prakticky to znamená, že jakákoliv hodnota je v DB v celočíselném formátu a ke každé veličině mám ještě sloupeček, kde říkám, kolik desetinných míst veličina má a pro zobrazení se tedy musí šáhnout do dvou sloupečků - pro hodnotu a pro počet desetinných míst. Nebo je výhodnější vše ukládat v textovém formátu včetně desetinné čárky ?
Mno fuj, to jsem se zase rozepsal, ale potřeboval jsem to nějak vyventilovat, tak se omlouvám.
Jirka
TomášK
Profil
Dat je tak málo, že řešení s MySQL funguje, ale jak píšeš, efektivní to zrovna není. Na posílání zpráv (keyword messaging) existují lepší věci než databáze. Pokud C program zjistí, že se změnila hodnota, chce poslat zprávu serveru, který pošle zprávu prohlížeči, aby hodnotu aktualizoval - push, ne pull. Neděje-li se nic, nikdo nic nedělá.

Pro komunikaci server <-> prohlížeč jsou vhodné web sockety,
pro komunikaci C <-> server protokol serveru nebo socket nebo knihovna typu ZeroMQ.

Server je něco, co dokáže přeložit zprávu z C na zprávu, kterou jde posílat přes web-socket. Bohužel nedokážu doporučit konkrétní. Sám používám PostgreSQL (narozdíl od MySQL má LISTEN + NOTIFY) a PostgREST-WS (github.com/aranwe/postgrest-ws), ale je to experimentální a určitě to jde udělat efektivněji. Jednoduché řešení by mohlo být vzít rozchodit nějaký server v nodejs (možná github.com/socketio/socket.io?) a posílat mu zprávy přes obyčejné sockety nebo PostgreSQL. Složitější najít vhodnější nástroj (RabbitMQ, Redis?).

Server by mohl posílat i zprávy opačným směrem - z prohlížeče do C, stejným způsobem. Kromě toho budeš ještě potřebovat všechna data při prvním načtení stránky. Na to se dá použít klidně MySQL nebo si nechat poslat z C zprávu se všemi hodnotami stejnou technologií jako aktualizce.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: