 |
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 09. 10. 2011 18:11
Poradte prosim,
posilam ze sveho zarizeni
http_get(88,86,113,152,'hrdlickovi.wz.cz','/data.php?teplota=22', ;
na sve stranky, ale na strankach se nic nezobrazi
ale pokud zadam primo.
www.hrdlickovi.wz/data.php?teplota=123
tak se hodnota na strankach zmeni.
Myslim, ze je problem v IP adrese serveru, nebo nasmerovani na me stranky. Ale nevim jak dal.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 18:23
Tipl bych si, že ta funkce se používá jinak:
http_get('http://hrdlickovi.wz.cz/data.php?teplota=22');
Kromě toho se IP adresa píše s tečkami a vůbec není rozumné adresovat svoji doménu přes IP adresu, protože ta se může kdykoli změnit.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 09. 10. 2011 18:37
Prikladam program ktery funguje.
Jen to chci posilat na svuj
odesli_S0_na_portal
{
//provedeme DNS překlad
dns_resolv('portal.merenienergie.cz');
//nachystame timeout pro http
sys[64] = 45; //sekund
//pockam az probehne funkce do konce
label cekam_na_dns:
//vyprsel cas drive nez dostaneme preklad?
if (sys[64] == 0) goto nemam_dns;
//otestujeme úspěch DNS překladu (512 = hotovo OK)
if (sys[65] == 512) goto mam_dns_preklad;
//cekame dale...
goto cekam_na_dns;
label nemam_dns:
//nemam uspesny DNS, takze to udelam s rucni IP (ziskano rucne)
http_get(77,93,211,207,'portal.merenienergie.cz','/data.php?devid=', '00890001D', '&T0imp1=', sys[493], '&T1imp1=', sys[526], '&T0imp2=', sys[494], '&T1imp2=', sys[527], '&T0imp3=', sys[495], '&T1imp3=', sys[528]);
goto cekat_na_http;
label mam_dns_preklad:
//mam DNS preklad - pouziju to !
http_get(sys[66],sys[67],sys[68],sys[69], 'portal.merenienergie.cz','/data.php?devid=', '00890001D', '&T0imp1=', sys[493], '&T1imp1=', sys[526], '&T0imp2=', sys[494], '&T1imp2=', sys[527], '&T0imp3=', sys[495], '&T1imp3=', sys[528]);
//pockam az probehne funkce do konce
label cekat_na_http:
//nachystame timeout pro http
sys[64] = 45; //sekund
label cekam_na_http_smycka:
//vyprsel cas drive nez skonci http?
if (sys[64] == 0) goto chyba_www_serveru;
//mam uz odpoved od http ?
if (sys[65] == 0) goto cekam_na_http_smycka;
//pokud server má problém:
if ((sys[65] != 1024)||(sys[75] != 200)) goto chyba_www_serveru;
//neni problem, takze ok
echo('S0 odeslano na server, OK.');
//vse hotovo
return;
label chyba_www_serveru:
//obsluha chyby - www server
echo('Chyba komunikace s www serverem, http: ', sys[75]);
}
main
{
echo('Start programu.');
label opakovat:
odesli_S0_na_portal();
//pockame patnact minut - pozor neni presne v 0,15,30,45 ale je to co 15 minut od okamziku zapnuti zarizeni !
//pokud chcete presne "v celou" ctvrthodinu, pouzijte jiny program (ke stazeni viz nase WiKi)
//nastav 6*60 sekund
sys[64] = 360;
label cekej:
if (sys[64] != 0) goto cekej;
//znovu
goto opakovat;
}
if (sys[64] != 0) goto cekej;
//znovu
goto opakovat;
}
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 18:48
To asi nebude PHP. Co je to za jazyk? Ten fungující program vypadá dost podivně.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 19:28
S PHP to má jen velmi málo společného. Už existence příkazu goto (o kterém jsem dosud v PHP neměl tušení), existence klíčového slova label, názvů proměnných bez "$", jiných definic funkcí a celkově jiném stylu programování svědčí o jiném jazyku. Spíš nějaký dialekt C.
Bohužel o tom zařízení nevím skoro nic, takže asi neporadím. Možná by se hodilo zjistit, jestli vůbec nějaká data dorazí, například vypsáním pole $_GET[].
|
|
| Reagovat
|
|
Autor: Tomík (tom.czweb.org)
Datum: 09. 10. 2011 19:32
Spíše bych hádal na jazyk Ruby. Ale ten tady na WZ nebude fungovat. Tady je pouze jazyk PHP.
Hlavním poznávacím znakem PHP je zápis proměnné do $ a ohraničení <?php ..kod.. ?>. Pokud toto tam není, pak se nejedná o PHP a ani o žádnou napodobeninu a nebude zde fungovat.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 19:40
To je klientský program, který je umístěn v tom čidle. Tady na WZ bude serverová část a ta už je doufám napsána v normálním PHP, i když jsem ji dosud neviděl.
|
|
| Reagovat
|
|
Autor: Tomík (tom.czweb.org)
Datum: 09. 10. 2011 19:42
Ale jak čtu, tak ten skript vlastně není spuštěn zde na WZ.
Jakýkoli GET dotaz na WZ musí směrovat přes DNS adresu. IP adresa ze své podstaty nebude fungovat, protože je zde aplikován virtualhost. To jest že přes jednu IP adresu lze mít více DNS adres. Laicky - jednu IP adresu sdílí několik stovek adres. Kdybys zadal jen IP adresu, tak se nasměruje pouze na centrální místo a ne na uživatelskou adresu.
Takže ve tvém případě musíš zavolat pouze adresu hrdlickovi.wz.cz, případně plnou http://hrdlickovi.wz.cz/data.php?teplota=123. Cokoli jiného nebude fungovat nebo se odešle jinam.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 19:47
Když se na to podíváš pořádně, tak 5. parametr je název domény. Předpokládám, že funkce http_get() v klientském programu ho strčí do hlavičky Host: v dotazu a tím by to mělo projít.
Jenže nemáme možnost ten dotaz analyzovat, takže jenom věštím.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 19:51
Stejně je mi divné, že v tuto hodinu dodávají solární panely vodu s teplotou 62 °C.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 09. 10. 2011 20:17
Tento program mi běží doma v zařízení a má posílat data na WZ.
Jde jen o ty řádky http_get.
pokud to takto zadám. Server píše zpět chyba 302
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 20:41
302 je přesměrování. Ještě se podívej na hlavičku Location: Pokud tam najdeš http://i.wz.cz/404.html, tak máš buď chybně název skriptu (ten je ovšem správně), anebo ten klientský program neumí správně poskládat dotaz HTTP 1.1 s atributem Host:
Dělal jsi něco s .htaccess?
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 09. 10. 2011 21:46
http://cz2.php.net/manual/en/function.http-get.php
funkce je součástí knihovny PECL, ta také a WZ funguje?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 22:01
Fatal error: Call to undefined function http_get() ...
Asi ne. Ale to není problém tohoto dotazu.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 09. 10. 2011 22:14
Možná sem můj problém nepatří, protože na serveru je asi vše ok.
mám zápis do souboru.txt, který potom čtu.
Pokud zadám hodnotu ručně
http://www.hrdlickovi.wz.cz/data.php?T01=122
tak se mi do souboru zapiše a na serveru je vlastně vše ok.
Ale pokud se jej pokouším posílat ze zařízení tak to nejde.
jak funguje toto? /3w/wz.cz/h/hrdlickovi
to je nějaká přímá cesta?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 22:24
To je přímá cesta, ale rozhodně bych ji nedával natvrdo do skriptu. Je lepší jako cestu použít výsledek funkce
realpath(dirname($_SERVER['SCRIPT_FILENAME']));
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 09. 10. 2011 22:42
Ano, do skriptu, který zapisuje výsledky do souboru. Tímto způsobem zjistíš absolutní cestu k němu.
Také bys mohl zapisovat výsledky místo do souboru, do databáze, např. SQLite. Bude se s tím pak lépe pracovat. Varuji před použitím MySQL na WZ, má časté výpadky.
Pokud zůstaneš u zápisu do souboru, dělej každý záznam jako zápis _jednoho_ řetězce. Při konkurenčním zápisu by se ti jinak mohla pomíchat data.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 09. 10. 2011 22:48
Napsalo mi to tu samou cestu co jsem psal.
Chtěl bych to zkusit rozchodit zde na WZ.
Pak si koupím vlastní domenu s pevnou IP.
S databazí také počítám, budu potřebovat i grafy. Ale jsem opravdu začátečník, tak v tom plavu.
Ale už mám knížku "PHP pro úplné začátečníky" :-)
Díky za rady.
|
|
| Reagovat
|
|
Autor: peta (peter-mlich.wz.cz)
Datum: 10. 10. 2011 10:45
"program ktery funguje." je napsan v jakem jazyce?
"Je to zřejmě ořezané PHP." ne, to neni php kod. V php kodu se promenne zapisuji s dolarem, pokud to nejsou konstanty. zapis s label/goto php take nezna v takovemto tvaru. Funkce se zapisuje slovem function. Dukaz je manual: (starsi verzi manualu jsem nekoukal)
http://php.net/manual/en/function.http-get.php
http://php.net/manual/en/control-structures.goto.php
Zkus tam pridat error_reporting, jestli to udajne php hlasi nejake chyby?
Cili, kdyz to neni php, tak ten problem je neresitelny.
/3w/wz.cz/h/hrdlickovi
realpath(dirname($_SERVER['SCRIPT_FILENAME']));
// to je realna cesta na serveru (tve slozky nebo scriptu)
Nevim, k cemu ti muze byt dobra?
"Ale pokud se jej pokouším posílat ze zařízení tak to nejde."
Co se pokousis ze zarizeni posilat?
Mozna bych zkusil funkci: http://www.php.net/manual/en/function.http-get-request-headers.php
Jaka je tedy cesta?
nejaky tvuj pc -> otevre adresu http://www.hrdlickovi.wz.cz/data.php?T01=666 -> data.php to zpracuje a prida radek
nejaky tvuj pc -> otevre adresu nevis jakou -> tvuj php to nezpracuje, protoze nic nedostal, asi, nebo dostal chybne udaje
Cili z meho pohledu neni problem v tom php ale v tom tvem pc, ktere posila nespravne udaje asi na nespravnou adresu? Nebo proste jen chybne udaje. Pro zacatek bys tedy mel zkusit zapisovat vsechny udaje, jestli se neco posila.
print_r($_GET);
print_r($_REQUEST);
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 11:57
peta:
Absolutní cesta na serveru je nutná při otvírání některých databází, např. SQLite nebo DBA. Může to fungovat i bez absolutní cesty, ale není to pravidlem.
Problém je řešitelný, i když to není PHP. Existuje mnoho zajímavých programovacích jazyků. Pokud ten jazyk umí HTTP 1.1, tak se to vyřešit dá.
Jeho PC posílá správné údaje, ale to speciální zařízení už ne. Funkce print_r() nic neřeší, protože to zařízení nemá monitor, který by výsledek zobrazil. Proto je nutné výsledek zaznamenat přímo na serveru.
|
|
| Reagovat
|
|
Autor: Tomík (tom.czweb.org)
Datum: 10. 10. 2011 12:52
peta: Měl by sis to přečíst znovu, pak bys zjistil, že tu kecáme o něčem úplně jiném. Ano. Ze začátku jsme na to také naletěli, ale pak to pochopili. Tak snad to pochopíš i ty.
Pokud to chápu, tak problém bude zřejmě v HTTP požadavku. Chtělo by to získat aspoň ten dotaz, který se snaží poslat na server.
Klient vrací 302 na adresu, která evidentně existuje. Což v případě WZ může znamenat pouze dvě věci. Buď špatná cesta nebo neúplný HTTP požadavek.
Jak jsem již vysvětlovat, zde na WZ se uplatňuje virtualhost, takže je potřeba, aby v dotazu byla hlavička Host: hrdlickovi.wz.cz, jinak se to neodešle na správné místo.
Cesta /3w/wz.cz/h/hrdlickovi je tzv absolutní cesta z pohledu serveru. Má smysl pouze při manipulaci v serveru. Ze strany klienta tento nemá žádný efekt. Si to představ stejně jako c:\windows. Je to jen cesta ve tvém počítači. Kdokoli z venku tuto cestu nevidí.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 16:20
Je mi divné, že na jiný server to jde a sem ne.
A přitom v programu vlastně změním jen IP adresu na server kde mám stránky tj. 88.86.113.152
a cestu k ménu souboru php tj. hrdlickovi.wz.cz/data.php
co myslíš tou hlavičkou? Host:
|
|
| Reagovat
|
|
Autor: Tomík (tom.czweb.org)
Datum: 10. 10. 2011 18:30
Princip fungování webu.
Zadáš adresu http://hrdlickovi.wz.cz/data.php.
Jelikož komunikace mezi počítači probíhá pouze formou IP adresy, tak je hrdlickovi.wz.cz přeloženo jako 88.86.113.152 a takto se to pak posílá na server.
Prohlížeč to přeloží a pošle jako http://88.86.113.152/data.php.
No a když zkusíš tuto adresu s IP, tak zjistíš v čem je zakopaný pes.
Aby to fungovalo správně, tak je potřeba do hlavičky přidat záznam, že se jedná o doménu hrdlickovi.wz.cz. A to se provádí právě zápisem HTTP hlavičky Host: hrdlickovi.wz.cz.
Takže ve tvém případě je potřeba zjistit, jak do http_get vložit buď doménu nebo aspoň tu hlavičku Host.
Jen tak ze zvědavosti, pokud používáš stejný kód, máš správně i příkaz dns_resolv()?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 18:30
tak jsem na to asi přišel, něco mi to již posílá.
Chybělo slovo "localhost"
To "Tomik" doky za nakopnuti
http_get(88,86,113,152,'localhost.hrdlickovi.wz.cz','/data.php?teplota=22', ;
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 19:23
Ještě jedna věc,
Dá se vyčíst ze souboru.txt určitý počet znaků?
třeba od 5 znaku do 10...
znám jen
<?php
$filename = FOpen ("teploty.txt","r");
$txt = FGetC($filename);
echo $txt;
FClose($filex);
?>
což vypíše první znak
pak FGetC který sice vypíše určitý počet znaků který si zadám ale od začátku, ne třeba od 20 znaku
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 19:43
tohle mi jde :-)
<?php
$filename = FOpen ("teploty.txt","r");
fseek($filename,19);
$txt = FGetS($filename,5);
echo $txt;
FClose($filex);
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 20:54
Koukám, že v tom souboru máš teploty oddělené středníky. To se dobře zpracovává například funkcí split() nebo strtok(). Záleží na tom, jestli ty hodnoty potřebuješ naráz nebo v cyklu.
Doporučuji každou hodnotu opatřit číslem senzoru a časovým razítkem. Každý záznam ukončit novým řádkem. Pak se to zpracovává poměrně lehce a vůbec se nemusíš trápit s funkcí fseek(). Asi takto:
s1;20111010204500;46.31
s1;20111010204600;13.31
s1;20111010204700;54.68
Čte se to pak opět funkcí fgets(), ale mnohem jednodušeji bez fseek().
Ještě jednodušší je to s databází, protože ta si časové razítko umí vygenerovat sama.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 21:01
čas a datum zaznamenávám také. Jen nezobrazuji.
spíše bych potřeboval, jak ukládat hotnoty do jednotlivých řádků
a ne vše na jeden.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 21:35
bohužel je
($raw_udaje["T01"]/100) . ";" .
($raw_udaje["T02"]/100) . ";" .
($raw_udaje["T03"]/100) . ";" .
($raw_udaje["T04"]/100) . ";" .
($raw_udaje["T05"]/100) . ";" .
($raw_udaje["T06"]/100) . ";" .
($raw_udaje["T07"]/100) . ";" .
($raw_udaje["T08"]/100) . ";" .
($raw_udaje["T09"]/100) . ";" .
($raw_udaje["T10"]/100) . ";" .
($raw_udaje["T11"]/100) . ";" .
($raw_udaje["T12"]/100) . ";" .
($raw_udaje["T13"]/100) . ";" .
($raw_udaje["T14"]/100) . ";" .
($raw_udaje["T15"]/100) . ";" .
($raw_udaje["T16"]/100) . ";" ."\n";
$handle = fopen("teploty.txt", "w+");
$načteno = fread($handle, 70);
fwrite($handle,$text);
fclose($handle);
};
zkoušel jsem to "\n" pasovat všude ale nic.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 22:06
Moment, to v PHP na WZ musí fungovat. Běžně to používám. Ještě můžeš zkusit DOSovský formát.
Poslyš, proč tak podivně pracuješ s tím souborem, když to jde mnohem jednodušeji?
$handle = fopen("teploty.txt", "a");
fwrite($handle,$text."\r\n");
fclose($handle);
Podívej se pořádně. Mezi $text a "\r\n" není čárka, ale tečka.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 22:24
Neumíš PHP a snažíš se dělat vychytávky, kterým se i já vyhýbám kvůli možným kolizím v kritické sekci? To není dobrý nápad. Vyzkoušej ten příklad, který jsem poslal v předchozím příspěvku. Samozřejmě je to kód, který přijde na server.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 22:28
vše co zatím chci, je posílat data z mého zařízení do souboru.txt a z něj vyčítat na webové stránky.
Později grafy.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 22:29
toto muj PHP
<?php
//
$raw_udaje["T01"] = htmlspecialchars($_GET['T01'], ENT_QUOTES, "UTF-8");
$raw_udaje["T02"] = htmlspecialchars($_GET['T02'], ENT_QUOTES, "UTF-8");
$raw_udaje["T03"] = htmlspecialchars($_GET['T03'], ENT_QUOTES, "UTF-8");
$raw_udaje["T04"] = htmlspecialchars($_GET['T04'], ENT_QUOTES, "UTF-8");
$raw_udaje["T05"] = htmlspecialchars($_GET['T05'], ENT_QUOTES, "UTF-8");
$raw_udaje["T06"] = htmlspecialchars($_GET['T06'], ENT_QUOTES, "UTF-8");
$raw_udaje["T07"] = htmlspecialchars($_GET['T07'], ENT_QUOTES, "UTF-8");
$raw_udaje["T08"] = htmlspecialchars($_GET['T08'], ENT_QUOTES, "UTF-8");
$raw_udaje["T09"] = htmlspecialchars($_GET['T09'], ENT_QUOTES, "UTF-8");
$raw_udaje["T10"] = htmlspecialchars($_GET['T10'], ENT_QUOTES, "UTF-8");
$raw_udaje["T11"] = htmlspecialchars($_GET['T11'], ENT_QUOTES, "UTF-8");
$raw_udaje["T12"] = htmlspecialchars($_GET['T12'], ENT_QUOTES, "UTF-8");
$raw_udaje["T13"] = htmlspecialchars($_GET['T13'], ENT_QUOTES, "UTF-8");
$raw_udaje["T14"] = htmlspecialchars($_GET['T14'], ENT_QUOTES, "UTF-8");
$raw_udaje["T15"] = htmlspecialchars($_GET['T15'], ENT_QUOTES, "UTF-8");
$raw_udaje["T16"] = htmlspecialchars($_GET['T16'], ENT_QUOTES, "UTF-8");
if ($raw_udaje["T01"])
{
$plny_cas = date("j.n.Y H:i:s");
$text= //$plny_cas . ";" .
($raw_udaje["T01"]/100) . ";" .
($raw_udaje["T02"]/100) . ";" .
($raw_udaje["T03"]/100) . ";" .
($raw_udaje["T04"]/100) . ";" .
($raw_udaje["T05"]/100) . ";" .
($raw_udaje["T06"]/100) . ";" .
($raw_udaje["T07"]/100) . ";" .
($raw_udaje["T08"]/100) . ";" .
($raw_udaje["T09"]/100) . ";" .
($raw_udaje["T10"]/100) . ";" .
($raw_udaje["T11"]/100) . ";" .
($raw_udaje["T12"]/100) . ";" .
($raw_udaje["T13"]/100) . ";" .
($raw_udaje["T14"]/100) . ";" .
($raw_udaje["T15"]/100) . ";" .
($raw_udaje["T16"]/100) . ";" . "\n";
$handle = fopen("teploty.txt", "a");
fwrite($handle,$text."\r\n");
fclose($handle);
};
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 22:36
No vida, už to vypadá mnohem lépe. Jen
($raw_udaje["T16"]/100) . ";" ."\n";
uprav raději zpátky na
($raw_udaje["T16"]/100) . ";";
ať to nezlobí. Máš tam teď za sebou LF, CR, LF a za to by tě programy, které budou dělat analýzu dat, neměly rády. Normálně stačí jen LF ("\n"), ale pokud to chceš prohlížet i ve Windows, je vhodnější CR LF.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 22:52
Nevím, čím to čteš, ale nyní je to perfektní:
46.87;15.62;52.5;19;21.87;15.25;167772.16;0;0;0;0;0;0;0;0;0;
46.31;15.68;52.31;18.93;21.81;15.31;167772.16;0;0;0;0;0;0;0;0;0;
46.18;15.68;52.18;19;21.81;15.25;167772.16;0;0;0;0;0;0;0;0;0;
46;15.68;52.18;19;21.81;15.31;167772.16;0;0;0;0;0;0;0;0;0;
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 22:56
I hexdump mi říká, že to teď nemá chybu:
000007b0 3b 30 3b 30 3b 30 3b 0d 0a 34 35 2e 37 35 3b 31 |;0;0;0;..45.75;1|
000007c0 35 2e 36 32 3b 35 32 2e 30 36 3b 31 39 3b 32 31 |5.62;52.06;19;21|
000007d0 2e 38 31 3b 31 35 2e 33 31 3b 31 36 37 37 37 32 |.81;15.31;167772|
000007e0 2e 31 36 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b |.16;0;0;0;0;0;0;|
000007f0 30 3b 30 3b 30 3b 0d 0a 34 35 2e 35 36 3b 31 35 |0;0;0;..45.56;15|
00000800 2e 36 32 3b 35 32 3b 31 39 3b 32 31 2e 38 31 3b |.62;52;19;21.81;|
00000810 31 35 2e 32 35 3b 31 36 37 37 37 32 2e 31 36 3b |15.25;167772.16;|
00000820 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b |0;0;0;0;0;0;0;0;|
00000830 30 3b 0d 0a 34 35 2e 34 33 3b 31 35 2e 36 32 3b |0;..45.43;15.62;|
00000840 35 31 2e 39 33 3b 31 39 3b 32 31 2e 37 35 3b 31 |51.93;19;21.75;1|
00000850 35 2e 32 35 3b 31 36 37 37 37 32 2e 31 36 3b 30 |5.25;167772.16;0|
00000860 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 |;0;0;0;0;0;0;0;0|
00000870 3b 0d 0a |;..|
00000873
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 22:57
Mohu měřit 16 teplot.
ale stále na jednom řádku.
Všimni si, že hodnoty nemají stále stejně znaků.
46 a pak 46.18. Tím pádem to nemuhu vyčítat z řádku jak jsem chtěl.
Rozhodí se mi pak včechny další udaje
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 23:02
Tak si přečti jeden řádek a použij funkci
$array=split(';',trim($line));
Výsledek se uloží do pole.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 23:10
Napsal jsem přečti a ne zapisuj. Když chceš analyzovat zapsaná data, tak do nich nesmíš psát.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 23:17
No dobrá, ale co znamenají tyto údaje?
44.18;Array
44.06;Array
44;Array
Jestliže to čteš funkcí readfile, tak je mi jasné, proč to máš na jednom řádku. Zkus tohle:
<?php
echo '<pre>';
readfile("teploty.txt");
echo '</pre>';
?>
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 10. 10. 2011 23:24
co něco takového
indent($s, $level=1, $indentationChar="\t")
Odsadí víceřádkový text zleva. Počet odsazení určuje druhý parametr, čím odsazovat parametr třetí (výchozí hodnotou je tabulátor).
echo Strings::indent('Nette'); // ' Nette'
echo Strings::indent('Nette', 2, '+'); // '++Nette'
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 23:25
Tak zkus ještě tohle, je to napsané narychlo:
<?php
$fd=fopen('teploty.txt','r');
echo "<table>\n";
while(!feof($fd)){
$line=fgets($fd);
$arr=(split(';',trim($line)));
echo "<tr>";
foreach($arr as $val){
echo "<td>$val</td>";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 10. 10. 2011 23:36
Jakýkoli pokus o formátování pomocí mezer, tabulátorů a entrů skončí fiaskem, protože všechny prohlížeče z toho dělají obyčejnou mezeru. Ovšem pomocí PHP se s tím dá úplně normálně pracovat a generovat například HTML i s tabulkami a řádkováním.
Hlavně se nesnaž do souboru teploty.txt ukládat HTML značky, ať se z toho pak nezblázníš. Ty používej až na generování výstupu pro prohlížeč.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 11. 10. 2011 17:19
Poradí prosím někdo, jak v programu výše udělat odřádkování?
Píše mi to do souboru všechny hodnoty za sebou oddělené středníkem.
Nebo jak je ze souboru číst.
díky
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 11. 10. 2011 18:25
Varoval jsem tě, abys do toho souboru teploty.txt nedával značky HTML. Můžeš si za to sám. Ty se dávají až při prezentaci. Včerejší soubor jsi krásně mohl přečíst funkcí split() a zobrazit dle potřeby. S tím dnešním už toho moc dělat nejde, snad jen namlátit další značky HTML. Ale grafy z toho budeš dělat jen velmi obtížně.
|
|
| Reagovat
|
|
Autor: Freeze (dreamer.kvalitne.cz)
Datum: 11. 10. 2011 18:26
Záleží, v jakém programu ten soubor otevíráš. Typicky základní Windows Notepad potřebuje pro odřádkování \r\n (tzn. klasicky). Jiným programům (Viewer v TC, PSpad a další) stačí pro odřádkování \n.
Ad čtení.. funkce fread(). Případně prohnat přes explode() nebo sscanf().
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 11. 10. 2011 18:36
Tak si přečti ten řádek teploty.txt a aplikuj funkci
$arr=split(';',trim($line));
V poli $arr budeš mít všechny hodnoty jak na dlani. Nebo rovnou použij skript, který jsem napsal 10. 10. 2011 23:25. Mně funguje.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 11. 10. 2011 18:42
takto?
<?php
readfile("teploty.txt");
$arr=split(';',trim($line));
?>
ten hotovy skript nic nedela, je to to same jako bez něj.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 11. 10. 2011 19:02
To pole $arr budeš asi chtít vypsat, ne? Podívej se ještě jednou na skript z 10. 10. 2011 23:25.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 11. 10. 2011 19:49
Děkuji o velkomožný :-)
a příště hurá na
http://programujte.com/clanek/2007122800-grafy-grafy-grafy-a-jak-na-ne-v-php/
díky (pro dnešek)
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 11. 10. 2011 19:56
Chce to sice novější prohlížeč, ale výrazně to šetří přenosovou kapacitu:
http://code.google.com/p/flot/
http://code.google.com/p/flotr/
Dokonce se to dá přes AJAX upravit tak, že se graf průběžně aktualizuje daty ze serveru.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 11. 10. 2011 21:03
tak jsem v koncích
dokáži toto
http://www.hrdlickovi.wz.cz/data.php
ale co když chci zobrazovat jen jednu hodnotu a ne všechny.
Umím třeba zobrazit jen první, ale jak další?
Třeba samostatně čtvrtou hodnotu?
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 11. 10. 2011 21:58
Zkus rozdělit data pomocí explode a přiřadit proměnným pomocí list
http://cz.php.net/manual/en/function.explode.php
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; //
Chce to zapisovat data aby bylo možno rozeznat jednotlivé věty a v nich jednotlivé položky.
A nebo odpočítat jednotlivé položky pole 0,1,2,3,4,5,6,7,8,9, - každá čtvrtá má je $i+3, jde $i je aktuální index pole
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 11. 10. 2011 22:07
"každá čtvrtá má je $i+3, jde $i je aktuální index pole" - koukám, že tu píšu pěkný nesmysly, budu radši koukat na fotbal
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 12. 10. 2011 17:22
Prosím zde ještě jednou příznivcw tohoto fora.
zapisuji do souboru teploty.txt takto
<?php
//
$raw_udaje["T01"] = htmlspecialchars($_GET['T01'], ENT_QUOTES, "UTF-8");
$raw_udaje["T02"] = htmlspecialchars($_GET['T02'], ENT_QUOTES, "UTF-8");
$raw_udaje["T03"] = htmlspecialchars($_GET['T03'], ENT_QUOTES, "UTF-8");
$raw_udaje["T04"] = htmlspecialchars($_GET['T04'], ENT_QUOTES, "UTF-8");
$raw_udaje["T05"] = htmlspecialchars($_GET['T05'], ENT_QUOTES, "UTF-8");
$raw_udaje["T06"] = htmlspecialchars($_GET['T06'], ENT_QUOTES, "UTF-8");
$raw_udaje["T07"] = htmlspecialchars($_GET['T07'], ENT_QUOTES, "UTF-8");
$raw_udaje["T08"] = htmlspecialchars($_GET['T08'], ENT_QUOTES, "UTF-8");
$raw_udaje["T09"] = htmlspecialchars($_GET['T09'], ENT_QUOTES, "UTF-8");
$raw_udaje["T10"] = htmlspecialchars($_GET['T10'], ENT_QUOTES, "UTF-8");
$raw_udaje["T11"] = htmlspecialchars($_GET['T11'], ENT_QUOTES, "UTF-8");
$raw_udaje["T12"] = htmlspecialchars($_GET['T12'], ENT_QUOTES, "UTF-8");
$raw_udaje["T13"] = htmlspecialchars($_GET['T13'], ENT_QUOTES, "UTF-8");
$raw_udaje["T14"] = htmlspecialchars($_GET['T14'], ENT_QUOTES, "UTF-8");
$raw_udaje["T15"] = htmlspecialchars($_GET['T15'], ENT_QUOTES, "UTF-8");
$raw_udaje["T16"] = htmlspecialchars($_GET['T16'], ENT_QUOTES, "UTF-8");
if ($raw_udaje["T01"])
{
$plny_cas = date("j.n.Y H:i:s");
$text= //$plny_cas . ";" .
($raw_udaje["T01"]/100) . ";" .
($raw_udaje["T02"]/100) . ";" .
($raw_udaje["T03"]/100) . ";" .
($raw_udaje["T04"]/100) . ";" .
($raw_udaje["T05"]/100) . ";" .
($raw_udaje["T06"]/100) . ";" .
($raw_udaje["T07"]/100) . ";" .
($raw_udaje["T08"]/100) . ";" .
($raw_udaje["T09"]/100) . ";" .
($raw_udaje["T10"]/100) . ";" .
($raw_udaje["T11"]/100) . ";" .
($raw_udaje["T12"]/100) . ";" .
($raw_udaje["T13"]/100) . ";" .
($raw_udaje["T14"]/100) . ";" .
($raw_udaje["T15"]/100) . ";" .
($raw_udaje["T16"]/100) . ";";
$handle = fopen("teploty.txt", "w+");
$načteno = fread($handle, 50);
fwrite($handle,$text);
fclose($handle);
};
?>
ale teploty se mi zapisují do řádku odělené středníkem.
Potřeboval bych aby se mi zapisovaly do sloupce. (pod sebe)
soubor vyčítám takto
<?php
$filename = FOpen ("teploty.txt","r");
fseek($filename,6);
$txt = FGetS($filename,5);
echo $txt;
FClose($filex);
?>
ale pokud má teplota hdnotu př. 12.3, to je tříciferné číslo
tak mi to rozhází čtení. Protože čtu čtyřcifern á čísla.
Snad jsem to napsal srozumitelně
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 12. 10. 2011 20:13
Také jsem si myslel, že jsem napsal dostatečně srozumitelně, že máš místo fseek() používat funkci split(), že s tím nebudeš mít potíže.
<?php
$fd=FOpen ("teploty.txt","r");
$line=fgets($fd);
$arr=split(trim($line));
echo $arr[1];
FClose($fd);
?>
Tohle bude fungovat pro 12.35 i pro 12.3.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 12. 10. 2011 20:32
list($t01, $t02, $t03, $t04, $t05,$t06, $t07, $t08, $t09, $t10,$t11, $t12, $t13, $t14, $t15, $t16) =split(";", trim($line), 16);
Není lepší použít expolode?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 12. 10. 2011 20:57
Díky Ti, ale příště piš program přímo.
Trvalo mi dlouho, než jsem zjistil že
$arr=split(trim($line)); se musí přepsat na $arr=split(";",($line));
ale alespoň jsem se něco naučil. Díky (prozatim)
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 12. 10. 2011 21:03
Nauč se hledat v php.net, možná to pak půjde rychleji
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 12. 10. 2011 21:25
ds: Jasně, explode() je lepší a rychlejší. Jen jsem si na něj nemohl narychlo vzpomenout.
Jiri Hrdlicka: Kdyby ses podíval na dřívější mé příspěvky, tak bys to tam našel správně. Psal jsem to z hlavy a zrovna když jsem to psal asi už počtvrté, tak jsem se holt spletl. Už mi docela vadí, že všechno musím psát každý den od začátku. To je tak těžké si to vlákno přečíst znovu? Vše už tady bylo.
Zrovna jsem si vzpomněl na film "50krát a stále poprvé". Snad to není tvůj případ.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 12. 10. 2011 21:31
Zkoušel jsem vše zadávat mnohokrát, všude možně.
Sedím již pátý den u PC od cca 16:00 do cca 24:00 a zkouším.
Myslím, že tomu věnuji času dost.
PHP je pro mě prostě nová věc. Věnuji se tomu teprve pár dní.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 12. 10. 2011 21:44
Předělal jsem split() na explode(), tak na to mrkni:
http://lisp.wz.cz/hrdlickovi.php
Odpovídají ty názvy?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 12. 10. 2011 21:53
Nazvy odpovidaji, ale takhle mi to je k ničemu.
Potřeboval jsem vyčitat jednotlive hodnoty z řetězce v souboru teploty.txt
na toto http://hrdlickovi.wz.cz/
zatim jen vodni panely.
zbytek dodělám to zvládnu, ještě ty grafy.
narazil jsem na toto http://jpgraph.net/features/gallery.php#line1
klikneš na graf a ukaze se ti skript
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 12. 10. 2011 21:59
Ty odkazy, které jsem poslal, jsou na grafy, které se vykreslují až v prohlížeči. Ty na WZ budou fungovat. V případě grafů, které se vytvářejí na serveru, si nejsem jist.
Vytvářet grafy na klientovi je lepší, protože to šetří přenosovou kapacitu a snižuje zatížení serveru.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 12. 10. 2011 22:04
No vždyť ti nic nebrání. Misto cyklu:
foreach($nazvy as $key=>$nazev){...
který vypíše všechno z pole se odkážeš je na jednotlivé položky v poli.
Možná by měla být data ukládána jinak - to záleží na tom jak budeš chtít malovat ty grafy. Respektive můžeš transformovat ten cyklus, který má ve skriptu Kit tak aby vytvořil při průchodu z jednoho pole potřebný počet nových polí, které se pak použijí pro vykreslení grafu
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 12. 10. 2011 22:13
Proto jsem tam ponechal ten vnější cyklus. Počítám s tím, že Jiří bude časem data přidávat místo přepisování, případně je bude ukládat do databáze. SQLite je stále mým favoritem, pro tento účel přímo skvělým. Jen bude vhodné vstupní data trochu předkousat kvůli splnění aspoň 1NF. Tabulka pak bude mít strukturu, kterou Jiří požaduje: Timestamp, senzor, teplota. Všechno má svůj čas.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 12. 10. 2011 22:38
Databáze začne být zajímavá ve chvíli, kdy počet záznamů překročí cca 10000 a je nutné v těch záznamech vyhledávat. MySQL je vhodná tam, kde se často aktualizuje a málo čte. SQLite naopak - občas změna, časté čtení - typické pro webové aplikace.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 12. 10. 2011 22:54
a co kdybych měl k dispozici CSV data. Posílám již své hodnoty na jistý server, který si je ukládá a generuje CSV data
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 12. 10. 2011 22:57
Nejde o teploty ale o hodnoty z elektroměru, vodoměru a plynoměru.
časové hodnoty a spotřebované množství energií.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 12. 10. 2011 23:08
CSV se v PHP obvykle dá také bez problémů zpracovat podobným způsobem jako data z databáze. Jen je nutné znát jejich strukturu.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 13. 10. 2011 01:18
Prosím trofl by si někdo na toto?
http://109.80.22.31/xml.xml
udělat PHP skript pro zobrazování techto udaju?
Abych si mohl navolit který řádek chci zobrazit?
Samozřejmě jen to černé.
Kit asi ví co bych potřeboval
Asi to bude podobné co jsi mi již posilal na Tvem webu.
Díky
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 09:57
XML se zpracovává trochu jinak. Zkus se podívat např. na
http://php.net/manual/en/book.simplexml.php
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 12:44
A co vlastně je to "černé"?
Když se dívám dívám na ten soubor, tak jeho autor asi moc nepochopil, jak XML funguje. Dávat měrné jednotky do stejné položky s naměřenými hodnotami a ještě tu značku nazvat <text>, to je vážně úlet.
Nevhodný formát:
<name>Elektroměr</name>
<text>317.960 kWh</text>
<money>1907.76 CZK</money>
<aname>aktual. výkon:</aname>
<act>0.539 kW/hod</act>
Vhodnější formát, který mě zrovna napadl:
<spotreba name="Elektroměr" mj="kWh">317.960</spotreba>
<money name="Cena" mj="CZK">1907.76</money>
<vykon name="Aktuální výkon" mj="kW">0.539</vykon>
S takovým XML je pak radost pracovat. Nehledě k tomu, že jednotka kW/hod neexistuje.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 14:04
A i když se XML zpracovává trochu jinak, je možné to v PHP přečíst jako každý jiný textový soubor, který má nějakou strukturu, a potřebné údaje z toho "vykousat".
PS: To černé se dá samozřejmě přečíst i tímto způsobem:
http://ds.mysteria.cz/st.php
<?php
$obsah=file_get_contents("http://109.80.22.31/xml.xml");
echo strip_tags($obsah);
?>
ale to asi nebude ono, že?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 13. 10. 2011 14:42
kW/hod je prostě kWh. Jen jinak napsano. Je to prostě spotřeba Kw za hodinu Přepíšu to.
Není to přesně ono. Ale díy.
Pokusím se také něco spáchat.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 15:02
něco v tomto duchu?
http://ds.mysteria.cz/ct.php?ur=0
http://ds.mysteria.cz/ct.php?ur=1
http://ds.mysteria.cz/ct.php?ur=2
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 16:02
<?php
if(empty($_GET)){
echo "Chybi parametr s cislem radku";
}else{
$ukaz=$_GET['ur'];
$obsah=file_get_contents("http://109.80.22.31/xml.xml");
$nalezeno=true;
$i=0;
$data=array();
$trans = array("</" => "|</");
while ($nalezeno) {
$h1="<s0_$i>";$h2="</s0_$i>";
$pos1 = strpos($obsah, $h1);
if ($pos1 === false) {
$nalezeno=false;
}else{
$pos2 = strpos($obsah, $h2);
if ($pos2 === false) {
$nalezeno=false;
}else{
$posx=$pos1+strlen($h1);
$radek=substr($obsah,$posx,$pos2-$posx);
$radek= strip_tags(strtr($radek, $trans));
$data[]= substr($radek,0,strlen($radek)-1);
}
}
$i++;
}
if (array_key_exists($ukaz, $data)) {
echo $data[$ukaz];
}
}
?>
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 16:15
jestli tě zajímají jen čísla tak si uprav ten skript a místo doplnění | jako oddělovače položek si ze řádku vykousni jen ty hodnoty, které tě zajímají
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 16:49
Takže dva údaje z každého řádku?
A jak si představuješ předání dat z PHP skriptu do zdrojového kódu té stránky?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 13. 10. 2011 16:58
myslel jsem, že se mě ptáš, co chci vyčítat z toho XML.
později všechny hodnoty. (skoro)
Jsou to napěťové vstupy
16 teploměrů (momentálně používám 6), ty už čtu jinak
výstupy....
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 17:19
OK, takže ta aktuální spotřeba. Tedy to, co je označeno jako <act>...</act>
první cesta je, že ponechá ten skript tak jak je a výsledé texty se rozděli na jednotlivé položky a vybere se pak ta správná.
tedy
http://ds.mysteria.cz/ct01.php?ur=2
a
<?php
if(empty($_GET)){
echo "Chybi parametr s cislem radku";
}else{
$ukaz=$_GET['ur'];
$obsah=file_get_contents("http://109.80.22.31/xml.xml");
$nalezeno=true;
$i=0;
$data=array();
$trans = array("</" => "|</");
while ($nalezeno) {
$h1="<s0_$i>";$h2="</s0_$i>";
$pos1 = strpos($obsah, $h1);
if ($pos1 === false) {
$nalezeno=false;
}else{
$pos2 = strpos($obsah, $h2);
if ($pos2 === false) {
$nalezeno=false;
}else{
$posx=$pos1+strlen($h1);
$radek=substr($obsah,$posx,$pos2-$posx);
$radek= strip_tags(strtr($radek, $trans));
$radek= substr($radek,0,strlen($radek)-1);
$pr=array();
$pr = explode("|", $radek);
$data[]= $pr[11];
}
}
$i++;
}
if (array_key_exists($ukaz, $data)) {
echo $data[$ukaz];
}
}
?>
Druhá cesta je pak z načteného řádku přečíst přímo požadovaou hodnotu tak, že se v textovém řezězci, který vznikne po načtení řádku vyhledá poloha textů <act> a </act> a přečte se to mezi nimi.
Pak se musí ze skriptu odstranit řádky
$trans = array("</" => "|</");
a
$radek= strip_tags(strtr($radek, $trans));
a místo použití explode dopsat podmíky s funkcí strpos()
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 17:55
A kam jej zadáváš, smím-li se zeptat?
Mě tohle:
http://ds.mysteria.cz/ct01.php?ur=2
funguje. Parametr je to ur (ur je ukaž řádek)
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 18:00
Je to tam proto, že zadání bylo:
"Abych si mohl navolit který řádek chci zobrazit?"
Což mi přijde jako zbytečnost. I vzhledem k tomu jak vypadá stránka
http://hrdlickovi.wz.cz/aktualni_spotreba.html
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 18:07
a smaž
if(empty($_GET)){
echo "Chybi parametr s cislem radku";
}else{
...
a úplně poslední
}
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 18:14
Asi je bolí nožičky.
Definuj, co ve výpisu http://109.80.22.31/xml.xml je řádek 7,20 atd!
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 18:19
ale prdlajs, já jako řádek chápu to, co je mezi <s0_0> a </s0_0> a takové sekce jsouu tam 3 <s0_0>,<s0_1> a <s0_2>
Když tam nějaká další přibude, pak ji skript načte a pak třeba bude fungovat i $ukaz=3;
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 18:24
Proměnná $pr - položka řádku, mezi <s0_0> a </s0_0> je dvanáct údajů, které uložím do pole, položky pole se číslují od nuly a tak poslední položka je $pr[11]
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 18:35
Takové jedno primitivnější řešení. Pokud bys potřeboval jen jednu hodnotu, nahraď hvězdičku v XPath požadovaným tagem.
http://lisp.wz.cz/simple.php
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 18:58
Pořád máš chybně jednotky aktuálního výkonu/spotřeby.
- plyn: m3/h
- elektřina: kW
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:06
Jestli to umíš předělat, předělej i tohle:
<spotreba name="Elektroměr" mj="kWh">317.960</spotreba>
<money name="Cena" mj="CZK">1907.76</money>
<vykon name="Aktuální výkon" mj="kW">0.539</vykon>
Potom nebude nutné oddělovat hodnotu od jednotky. Chci tě dokopat k tomu, abys to udělal správně.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 19:12
Jiri Hrdlicka: máš na http://www.hrdlickovi.wz.cz/ PHP5?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:15
Má, to jsem si už ověřil. Je na stejném serveru jako lisp.wz.cz:
PHP version: 5.2.13
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:18
Jiri Hrdlicka: To přece vím. Jestli se chceš naučit používat XML, je dobré se zamyslet nad struturou dat a rozlišit informativní atribut od měřené hodnoty. Tak, aby to bylo co nejpřehlednější. Samozřejmě se XML dá vytvořit striktně pomocí tagů bez atributů, ale často je to na škodu. V každém případě je nutné oddělit hodnotu od jednotky už na úrovni XML.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 13. 10. 2011 19:21
Bohužel tento XML už je od výrobce v zařízení. S tím nic neudělám
Mohu jednotky smazat a možná tam nebudou.
Myslím tím, že tam nenapíšu nic.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:21
Proto jsem si založil doménu lisp.wz.cz, abychom měli stejné podmínky. Časem ji chci naplnit tak, aby byla hodna svého názvu.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:24
No dobrá, tak tam ty jednotky nech oddělené mezerou, ale oprav je. Jednotka "hod" vypadá blbě a měřit výkon v kWh je také nesmysl, když tam patří kW.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:25
Tak to máš přesně obráceně
Elektroměr 322.430 kW, aktual. výkon: 1.005 kWh
je špatně. Správně má být
Elektroměr 322.430 kWh, aktual. výkon: 1.005 kW
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 19:26
Kit: a to všechny nové registrace jsou už s PHP5?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:31
ds: Domény lisp.wz.cz a hrdlickovi.wz.cz jsou obě na serveru s IP adresou 88.86.113.152, tedy na serveru Nike. Je nepravděpodobné, že by na jednom serveru běželo více verzí PHP současně (i když možné to je).
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 19:33
Hvězdička v XPath nahrazuje libovolný tag. Podobně jako když si dáš výpis adresáře v Linuxu.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 19:33
myslel jsem jak se při registraci trefit do PHP5, tedy do serveru Nike
* = všechno
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 19:42
Podívej se jak jsouu informace v http://109.80.22.31/xml.xml poskládané (patří tam to, co já mám jako řádek)
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 13. 10. 2011 19:57
Už mi prosím nic nepiš, protože pak nebudu vědět co si vybrat.
Musím něčím začít přepisovat data na mých stránkách.
Chtěl jsem původně bez jednotek, ale pokud by se číslo měnilo
třeba 28,754 a já měl na stránce text jako jednotky tak by při čísle
29 byla velká mezera
28,754 m3
29 m3
nechám to dle http://lisp.wz.cz/simple2.php
jen si zobrazím co chi, to se mi líbí
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 20:07
Hodnotu můžeš vypsat napevno se 3 desetinnými místy i s jednotkou, např.
printf("%7.3f m3",$val);
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 13. 10. 2011 20:08
existují i funkce na formátování výstupů
jakou tečku?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 20:19
Tečku před číslo tam strká tag <ul>
Co je cena celkem 234,55,- ? Takový zápis neznám.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 13. 10. 2011 20:22
to je cena od začátku měření.
Do budoucna bych chtěl aby to bylo od začátku měsíce.
Myslíš tu částku 55 haléřů?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 13. 10. 2011 20:26
Ano, číslo 55 mezi čárkami a za tím spojovník. Když ',-' nahradíš ' Kč', bude to vypadat mnohem lépe a hlavně to bude správně.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 14. 10. 2011 21:08
Přesměrování meta tagem
<meta http-equiv="refresh" content="3;url=ondra.html">
viz
http://www.jakpsatweb.cz/presmerovani.html
Tip:
V souvislosti s grafy ti Kit radil Ajax - nastuduj Ajax
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 10. 2011 21:59
promiň, mě se líbí toto
http://jpgraph.net/
http://jpgraph.net/features/src/show-example.php?target=new_line1.php
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 10. 2011 22:04
Udělej si to jak chceš. A s mým názorem, že grafy je lepší vykreslovat u klienta, také nemusíš souhlasit.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 10. 2011 22:09
Já tovidím (licky) tak, že tady je skoro vše hotovo.
A s tím co jsi mi psal Ajax jQuery mi prostě nic neříká.
Moc se mi nechce učit další "jazyk"
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 10. 2011 22:22
Správně, mně se také nechtělo jQuery učit, dokud jsem nepoznal, k čemu je vlastně dobré. De facto jen kvůli zkrácení a zpřehlednění kódu v Javascriptu. Pokud Javascript nepoužíváš, nepotřebuješ ani jQuery.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 10. 2011 22:30
V Javascriptu mám akorát hodiny na úvodní obrazovce.
Jinak nic.
V tom Webbuilderu co používám jsou hotové nějaké "skripty"
Nebo jak se to píše.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 15. 10. 2011 11:06
Tak zrovna hodiny na webstránce jsou holý nesmysl. Téměř každý uživatel počítače je má v rohu obrazovky a pokud je tam nemá, tak je nechce. Navíc na některých počítačích jdou špatně.
slovo "skripty" do uvozovek dávat nemusíš.
Když tak koukám na tvoji stránku, tak vidím, že jQuery už používáš.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 15. 10. 2011 19:51
Poradíte mi tedy prosím s těmi grafy?
Předělám soubor teploty.txt, na a nebo a+ aby si uchovával
hodnoty z teploměrů.
Nebo to půjde číst z toho xml.xml a pamatovat si to bude "nějak samo"?
To asi nepůjde, že?
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 15. 10. 2011 20:44
V grafech, které se líbí tobě je něco takového:
$datay1 = array(20,15,23,15);
$datay2 = array(12,9,42,8);
$datay3 = array(5,17,32,24);
jedna čára v grafu je jedno pole. Takže nejspíš přečteš teploty.txt a načtená data uložíš do polí.
Jinak když se na něco ptáš, bylo by dobré ptát se míň obečně. Křišťálová koule mi zrovna ukazuje něco z jiné galaxie a přepínat ji je otrava.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 15. 10. 2011 20:52
Program vypadá takto
<?php // content="text/plain; charset=utf-8"
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_bar.php');
$data1y=array(47,80,40,116);
$data2y=array(61,30,82,105);
$data3y=array(115,50,70,93);
// Create the graph. These two calls are always required
$graph = new Graph(350,200,'auto');
$graph->SetScale("textlin");
$theme_class=new UniversalTheme;
$graph->SetTheme($theme_class);
$graph->yaxis->SetTickPositions(array(0,30,60,90,120,150), array(15,45,75,105,135));
$graph->SetBox(false);
$graph->ygrid->SetFill(false);
$graph->xaxis->SetTickLabels(array('A','B','C','D'));
$graph->yaxis->HideLine(false);
$graph->yaxis->HideTicks(false,false);
// Create the bar plots
$b1plot = new BarPlot($data1y);
$b2plot = new BarPlot($data2y);
$b3plot = new BarPlot($data3y);
// Create the grouped bar plot
$gbplot = new GroupBarPlot(array($b1plot,$b2plot,$b3plot));
// ...and add it to the graPH
$graph->Add($gbplot);
$b1plot->SetColor("white");
$b1plot->SetFillColor("#cc1111");
$b2plot->SetColor("white");
$b2plot->SetFillColor("#11cccc");
$b3plot->SetColor("white");
$b3plot->SetFillColor("#1111cc");
$graph->title->Set("Bar Plots");
// Display the graph
$graph->Stroke();
?>
nevím si radu s tímto.
$theme_class=new UniversalTheme;
$graph->SetTheme($theme_class);
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 15. 10. 2011 20:57
píše mi to tohle
Fatal error: Class 'UniversalTheme' not found in /3w/wz.cz/h/hrdlickovi/zkouska.php on line 13
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 15. 10. 2011 21:07
S objektovým PHP budeš muset počkat na Kita. Já jsem to spustil a normálně to funguje. V adresáři themes je soubor UniversalTheme.class.php
Ten tam máš?
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 15. 10. 2011 21:14
neukážu, mám to lokálně a WZ se to nedá zrovna překopírovat, přenos zamrzá
Soubor s php kódem vypadá takhle:
<?php // content="text/plain; charset=utf-8"
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_line.php');
$datay1 = array(20,15,23,15);
$datay2 = array(12,9,42,8);
$datay3 = array(5,17,32,24);
// Setup the graph
$graph = new Graph(300,250);
$graph->SetScale("textlin");
$theme_class=new UniversalTheme;
$graph->SetTheme($theme_class);
$graph->img->SetAntiAliasing(false);
$graph->title->Set('Filled Y-grid');
$graph->SetBox(false);
$graph->img->SetAntiAliasing();
$graph->yaxis->HideZeroLabel();
$graph->yaxis->HideLine(false);
$graph->yaxis->HideTicks(false,false);
$graph->xgrid->Show();
$graph->xgrid->SetLineStyle("solid");
$graph->xaxis->SetTickLabels(array('A','B','C','D','xx'));
$graph->xgrid->SetColor('#E3E3E3');
// Create the first line
$p1 = new LinePlot($datay1);
$graph->Add($p1);
$p1->SetColor("#6495ED");
$p1->SetLegend('Line 1');
// Create the second line
$p2 = new LinePlot($datay2);
$graph->Add($p2);
$p2->SetColor("#B22222");
$p2->SetLegend('Line 2');
// Create the third line
$p3 = new LinePlot($datay3);
$graph->Add($p3);
$p3->SetColor("#FF1493");
$p3->SetLegend('Line 3');
$graph->legend->SetFrameWeight(1);
// Output line
$graph->Stroke();
?>
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 15. 10. 2011 21:26
jde mi toto
<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(350,250,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(30,90,40,50);
$graph->xaxis->SetFont(FF_FONT1,FS_BOLD);
$graph->title->Set("Examples for graph");
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->SetLegend("Test 1");
$lineplot->SetColor("blue");
// Add the plot to the graph
$graph->Add($lineplot);
// Display the graph
$graph->Stroke();
?>
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 15. 10. 2011 21:38
Sice to funguje, ale druhá osa musí být časová, graf se musí posunovat,
ještě nastavit kolik hodnot se má ukazovat.
Ta tento je asi na prd. :-)
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 15. 10. 2011 21:41
Mě to, co mi lokálu jde, na WZ nejde. Hlásí to tu chybu
Fatal error: Class 'UniversalTheme' not found in /3w/mysteria.cz/d/ds/t/graf.php on line 13
http://ds.mysteria.cz/t/graf.php
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 17. 10. 2011 22:39
Nevím, proč se čeká na mne. Ta knihovna na WZ fungovat nemusí. Je možné, že jí chybí funkce __autoload().
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 17. 10. 2011 23:12
Čeká se na Tebe, protože jsi mi pokaždé dobře poradil.
Už mi chybí jen ty grafy.
Zkoušel jsem toho mnoho, ale pořád nic.
Kdyby to byl graf jen číselný, tak možná, ale je o graf s časovou osou.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 21. 10. 2011 21:29
Není tu oppravdu někdo kdo by napsal nějaký program na graf s časovou osou?
Data by se vyčítala ze souboru.txt.
V něm je čas a hodnoty teploměrů, které chci zobrazovat.
Stačí nějaký jednoduchý.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 21. 10. 2011 22:36
Určitě je. Takhle to tu ale nefunguje. Čím víc chcete, tím víc dostanete platí možná jen u sultána, co se nemůže zbavit dcer (a prý i v nějaké bance, ale o tom pochybuji).
Proč nezkusíš použít JpGraph pro PHP4, když to pro PHP5 nefunguje. Jak se zdá, mě to na WZ pod PHP5 funguje
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 11:49
http://ds.mysteria.cz/t/src/Examples/filledgridex1.php
pro PHP4 je skoro stejné jako to, co se ti líbilo:
http://jpgraph.net/features/src/show-example.php?target=new_line1.php
tak to použij
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 12:33
Toto jsem už také měl, jen jsem nevěděl jak s tou časovou osou.
Mám už toto http://www.hrdlickovi.wz.cz/graftesty.php
umim měnit ruzne hodnoty grafu jako - čas čtení,kolik hodnot uchovávat, zobrazit......
Momentálně se zobrazují jen náhodná čísla.
Mám jiný graf, který čte z XML souboru, tak bych to do něho chtěl napasovat.
Ale zasekl jsem se na tomto.
pokud je ve zdrojaku napsano toto:
// Load the data from the XML file
$.get('data.xml', function(xml) {
// Split the lines
var $xml = $(xml);
a soubor XML mam ulozeny u mě na webu, tak mi graf jde
ale pokud do něj zadam toto:
// Load the data from the XML file
$.get('http://highcharts.com/studies/data.xml',function(xml) {
// Split the lines
var $xml = $(xml);
tak se mi graf nezobrazí.
Přitom je to vlastně přímá cesta k XML na webu
díky za podporu
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 12:41
To je bezpečnostní opatření Javascriptu. Kdyby to fungovalo, bylo by to snadno zneužitelné a Javascript by se tím stal nepoužitelný.
Data pro Javascript si stahuj přes PHP na serveru s prezentací.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 12:56
Ano, tak to bude fungovat.
Nejlépe asi bude, pokud si ten XML na svém webu předzpracuješ, tzn. uděláš si v databázi historii hodnot. V té se pak pomocí AJAXu můžeš přehrabovat dle libosti.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 13:03
Měl jsem za to, že ten graf ktrý mám
http://www.hrdlickovi.wz.cz/graftesty.php
sice zatím generuje náhodná čísla. Upravím aby četl XML soubor, tak si "nějak" hodnoty pamatuje sám.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 13:13
Mohu se nějak chytit tohoto?
http://translate.google.com/translate?langpair=auto|cs&u=http%3A%2F%2Fapi.jquery.com%2FjQu ery.get%2F
nebo to opravdu nepůjde s tou přímou adresou?
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 17:35
Napiš, co děláš a co se nedaří.
Výrok "Nějak se mi to nedaří" je na dvě věci...
Soubory se tu už načítaly a také se do nich zapisovalo, tak klidně tímto způsobem. prostě ho z jedné adresy načteš a na druhou uložíš.
PS: Jinak pozor na nějaká online propojení. Tady to vypadá, že chčeš online přenášet data z cizího server na server WZ a ještě to vypadá, že ten aktualitovatelný graf bude naustále načítat data z Wz a přenášet je na tvůj počítač. Myslím to tak, že to na WZ nemají rádi
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 18:02
Chci si na server ukádat data z mého zařízení.
Přímá cesta je http://109.80.22.31/xml.xml
A tento XML soubor si ukládat třeba v intervalu 10 minut zde na můj web do souboru data.xml.
A ty následně vyčítat v grafu.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 18:16
V daném případě bych data raději ukládal do databáze (např. SQLite) v předzpracované (normalizované) podobě. SQLite umí z toho vygenerovat přímo XML, které budeš pro výrobu grafu potřebovat.
Pokud však budeš generovat graf v Javascriptu, může být místo XML výhodnější výstup ve formátu JSON, se kterým Javascript umí přímo pracovat.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 18:34
1.
Na té adrese, kterou jsi uvedl:
http://109.80.22.31/xml.xml
je v souboru jedna sada dat, z té žádný graf neuděláš.
2
Napsal jsi
pokud je ve zdrojaku napsano toto:
// Load the data from the XML file
$.get('data.xml', function(xml) {
// Split the lines
var $xml = $(xml);
a soubor XML mam ulozeny u mě na webu, tak mi graf jde
Obsah souboru data.xml a http://109.80.22.31/xml.xml je shodný?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 18:54
Ty data na http://109.80.22.31/xml.xml se aktualizují.
přečti si zdrojový kod tohoto grafu
http://highcharts.com/studies/data-from-xml.htm
je tam soubor data.xml
a ten samý soubor je tady
http://highcharts.com/studies/data.xml
pokud jsem v kodu změnil cestu na http://highcharts.com/studies/data.xml
tak nic nefungovalo. Tak jsem si ten soubor stáhl k sobe na web a šlo to.
Tak jsem myslel, že kdybych si stahoval svůj XML soubor na web, tak by to mělo fungovat. Samozřejmě přepsat další věci kde číst....
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 19:02
Takže jsme si úspěšně odpověděli na položené otázky a z druhé vyplývá, že soubory nejsou shodné. Z toho tedy následně vyplývá, že musíš vytvořit ze svých opakovaně aktualizovaných souborů na adrese
http://109.80.22.31/xml.xml
takový XML soubor, který bude mít stejmou strukturu jako
http://www.hrdlickovi.wz.cz/data.xml
Pak se musí náhodné generování čísel - generuje to 10 čísel - nahradit načtením 10 čísel ze souboru.
Musíš tedy
1. vytvořit soubor se sadou dat (tedy třeba 10 sad hodnot - čas a teplota)
2. nahradit náhodné genrování hodnot načtení hodnot o teplotách ze souboru.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 19:07
Vím co je třeba, ale nevím jak vytvořit soubor
http://www.hrdlickovi.wz.cz/data.xml
ten předchozí jsem si jen zkopíroval. Měl stále stejné hodnoty.
To bylo na zkoušku.
Ale ten nový by se měl aktualizovat.
Myslím tedy, že potřebuji nějaký skript, který přečte
http://109.80.22.31/xml.xml
a uloží jej na web, každých 10minut
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 19:11
Tak nějak. Jen s drobným detailem, že by se to asi neaktualizovalo po 1 s, ale méně často. V tomto případě bys mohl vystačt i bez databáze, ale při větším počtu současných přístupů by mohly nastat potíže.
Databáze má proti ukládání do souboru výhodu v tom, že řeší konkurenční přístupy a tzv. ACID.
Hlavně se přitom vyhni MySQL. Alespoň na WZ.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 19:14
Obávám se, že to bude problém.
Na WZ nic takového jako opakované spouštění skriptů (CRON) není
Nějaký free CRON, který by volal ty skripty asi nebude umožňovat spouštění po 10 minutách (ostatně i na placeném hostingu mám CRON, který se spouští po dvou hodinách)
Možná by šlo na lokálně běžím PC nechat obnovovat stránku jednou za 10 minut, pro té příležitosti by se skript vždycky spustil, ale to je divné řešení
Myslel jsem si, že chceš přímo zapisovat data na server wz - o tom byla zhruba první stovka těchto příspěvků tady.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 19:20
jojo do souboru txt zapisovat umím.
Mohu to samozřejmě vyčítat i ze stávajícího souboru teploty.txt
Do něj si posílám každou minutu nová data. Zatím jen teploty.
Samozřejmě mohu přidat spotřebu energií.....
Měl jsem za to, že pokud mám takhle již vše hotové v XML souboru, tak by to bylo lehčí.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 19:28
Tak do grafu jsem misto nahodneho generování čísel použil skript od Kita
<?php
$fd=FOpen ("teploty.txt","r");
$line=fgets($fd);
$arr=split(";",($line));
echo $arr[1];
FClose($fd);
?>
Jde to, ale přečte to jen asi 12x a pak zase generuje čísla ?
http://www.hrdlickovi.wz.cz/graftesty.php
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 19:41
Zjistil jsem, že třeba na endora.cz je k dispozici cron. Ten by se k tomuto účelu možná dal využít, desetiminutové intervaly má v nabídce.
Nejjednodušší je samozřejmě zápis do souboru CSV. Tento formát má pro daný účel spoustu výhod, každých 10 minut se prostě na konec připíše další řádek s časovým údajem a naměřenými hodnotami. Čtení je také velmi jednoduché, funkci explode() už známe. Do 10000 záznamů asi nejlepší metoda, potom začne být nevýhodné čtení dat, která pro vykreslování grafu nepotřebujeme. Což nastane zhruba po dvou měsících. Řešení se nabízí: Každý měsíc (nebo raději každý den?) nový soubor. Četlo by se pak vždy ze dvou posledních dle potřeby. Bude to rychlé a efektivní.
XML se k tomuto účelu moc nehodí, protože s rostoucí velikostí souboru rostou i problémy. Musí se totiž celý načíst, aktualizovat a zase uložit. To je nepraktické. Daleko vhodnější je zmíněný CSV nebo databáze.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 19:53
takhle zobrazuji svůj graf.
Kam mám zadat hodnotu teploměru z mého souboru?
<!DOCTYPE HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Highcharts Example</title>
<!-- 1. Add these JavaScript inclusions in the head of your page -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript" src="highcharts.js"></script>
<!-- 1a) Optional: add a theme file -->
<script type="text/javascript"src="gray.js"></script>
<!-- 1b) Optional: the exporting module -->
<script type="text/javascript" src="exporting.js"></script>
<!-- 2. Add the JavaScript to initialize the chart on document ready -->
<script type="text/javascript">
Highcharts.setOptions({
global: {
useUTC: false
}
});
var chart;
$(document).ready(function() {
chart = new Highcharts.Chart({
chart: {
renderTo: 'container',
defaultSeriesType: 'spline', //typ zobrazene krivky line, spline....
marginRight: 10, // prave odsazeni hodnot od zacatku grafu
events: {
load: function() {
// set up the updating of the chart each second
var series = this.series[0];
setInterval(function() {
var x = (new Date()).getTime(), // current time
y = Math.random();
series.addPoint([x, y], true, true); // posouváni grafu v ose X a Y true-posouva, false-neposouva
}, 2000); //cas nacitani novych hodnot v milisec
}
}
},
title: {
text: 'Teploty u Hrdličku' // nazev celeho grafu
},
xAxis: {
type: 'datetime',
tickPixelInterval: 300 // cas pro zobrazovani casu na spodni ose x pr.300=10 sec
},
yAxis: {
title: {
text: 'Teplota' // nazev svisle osy
},
plotLines: [{
value: 0,
width: 1, // tloustka cary spodni osy
color: '#808080' // barva cary spodni osy
}]
},
tooltip: {
formatter: function() {
return '<b>'+ this.series.name +'</b><br/>'+
Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) +'<br/>'+
Highcharts.numberFormat(this.y, 2);
}
},
legend: {
enabled: true //prida legendu k zobrazovanzm hodnotam
},
exporting: {
enabled: false
},
series: [{
name: 'Teplomer 1', // nazev legendy zobrazované teploty
data: (function() {
// generate an array of random data
var data = [],
time = (new Date()).getTime(),
i;
for (i = -10; i <= 0; i++) { //kolik posledních hodnot se má na grafu ukazovat
data.push({
x: time + i * 3000,
y: Math.random()
});
}
return data;
})()
}]
});
});
</script>
</head>
<body>
<!-- 3. Add the container -->
<div id="container" style="width: 1000px; height: 400px; margin: 0 auto"></div> <!-- velikost grafu -->
</body>
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 19:55
přidal jsem tam nějaké své popisky abych věděl co upravovat.
nebude to někde tady?
// generate an array of random data
var data = [],
time = (new Date()).getTime(),
i;
for (i = -10; i <= 0; i++) {
data.push({
x: time + i * 3000,
y: Math.random()
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 20:20
To bude ono. Cyklus musí nejspíš přečíst 10 hodnot ze souboru. Jestli to má být v javaskriptu, tak to neumím.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 20:24
Zkusil jsem si zprovoznit cron na endora.cz. Zatím je tam jen pár hodnot, ale zdá se, že to v pohodě funguje:
http://hrdlickovi.tode.cz/
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 20:35
cron mi nic nerika.
Říkám si, že pokud už mám tohle, tak se toho pokusím držet.
Už jen dosadit ty vyčtené hodnoty z txt, do toho skriptu.
Vždy to načte jen pár měření a pak to zase měří náhodná čísla.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 20:38
Cron je program, který umí pravidelně spouštět nějaké programy. Windows mají také něco podobného pod názvem "Plánovač úloh".
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 20:38
to Kit:
to co máš na stránkách.
Zmanená to, že si musím udělat soubor CSV na web a do něj se mi budou zapisovat data z XML?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 20:48
CSV je v daném případě nejjednodušší řešení, ale není jediné možné. Na adrese
hrdlickovi.tode.cz/data/data.csv
se od nynějška shromažďují uvedeným skriptem data z tvých měření ve formátu CSV, ale může být i jiný. Pokud bych na stejném webu měl i aplikaci na vykreslování grafů v Javascriptu, fungovalo by to. Jen bych musel přizpůsobit formáty dat, ale pravidelný sběr je již vyřešen.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 20:54
Když budeš zapisovat přimo do souboru na WZ není CRON potřeba.
Stačí když to bude textový soubor jako je teploty.txt
Jen ti musí být jasná jeho struktura vzhledem k pozdějšímu načítání.
Každý den bych udělal jeden soubor, podle systémového času při zápisu
CSV je označení pro soubor, kde jsou položky oddělené čárkou (comma separated value).
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 21:00
Mám soubory s koncovou csv. Přesně jak říkáš ty.
Každý den má jiný soubor.
jmenují se S0_26092011
S0_27092011
S0_28092011........
posílám data na jeden server, každých 15 minut (mohu až 5min.) a ten mi soubor CSV generuje. Mohu si je stahovat.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 21:06
A jak udělá bez cronu pravidelné čtení po deseti minutách?
Aha, to zařízení umí pravidelně každých 10 minut data ODESLAT. Tak v tom případě samozřejmě cron není zapotřebí.
S tím jedním souborem CSV denně souhlasím s jednou výhradou: Jedna databáze SQLite pro všechna data bude možná z dlouhodobého hlediska výhodnější, ale všechno má svůj čas.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 21:09
Kit: možná půjdou číst ty CSV: S0_27092011 - to by mohlo být nadějné
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 21:09
Nepleť do toho soubory s koncovkou csv. Ty mají možná jinou strukturu, než o jaké se bavíme. Předávej data ze zařízení na server jako dosud a teprve na serveru se rozhoduj, jak ta data budeš ukládat.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 21:12
To je totiž novinka, to jeho zařízení odesílá někam na internet už hotové soubory, podle jména by to mohl být nějaký denní souhrn - proto jsem chtěl jejich adresu
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 22. 10. 2011 21:13
Moment, ty soubory vypadají velmi nadějně. Jsou tam všechny potřebné informace, které jsem sbíral cronem. Stačí je jen otevřít v PHP a přes AJAX dodat do prohlížeče. Můžeš kreslit grafy.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 21:16
Ty soubory mám z jednoho serveru určeného pro sběr dat z mého zařízení.
Ale já už tam nic neposílám. Chci to mít u sebe.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 21:17
portal.merenienergie.cz/csv/00890001D/S0_18092011.csv
z toho by graf namalovat šel
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 22. 10. 2011 21:24
Tak potom to mozna zvladnu i ja.
Protože budu vlastne generovat graf ze souboru, kde je jasne daný čas a hodnota.
A časová osa mě nezajímá, protože se bude číst ze souboru.
Mám pravdu?
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 21:36
Ano, viz Kit:
Stačí je jen otevřít v PHP a přes AJAX dodat do prohlížeče. Můžeš kreslit grafy.
|
|
| Reagovat
|
|
Autor: ds (ds.mysteria.cz)
Datum: 22. 10. 2011 22:11
Kit: kdyš jsou data pro vypsání grafu v javascriptu ve stránce zadána takto:
data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
takže se v PHP udělá textový řetězec obsahující výše uvedený text a ten se pak vloží do těla skriptu třeba: <?php echo $textretezec; ?>
?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 23. 10. 2011 00:31
ds: Tak nějak se to dělá. Nejsnáze tak, že se předávaný objekt zabalí do JSON například funkcí json_encode(). S takovým objektem si pak Javascript snadno poradí.
Jiří: Záleží jen na tobě, kde si uděláš webhosting. Jsem na Endoře teprve týden, nemám tedy dost zkušeností s kvalitou. Spíš to beru jako další území pro své experimenty. Nefunguje mi tam např. funkce highlight_file(), musel jsem hledat náhradní řešení. Ještě jsem ani neotestoval jejich databáze. Mají jich 7, podobně jako na WZ, ale kvalitou se mohou lišit.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 23. 10. 2011 01:16
Tak jsem ten graf nějak rozchodil, ale potřebuji opakovat tanto skript
stále dokola
<?php
$fd=FOpen ("teploty.txt","r");
$line=fgets($fd);
$arr=split(";",($line));
echo $arr[3];
FClose($fd);
?>
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 24. 10. 2011 20:14
Kite, ještě prosím o radu
napsal jsi mi tento skript
<?php
header('Content-Type: text/html;charset=UTF-8');
$obsah=file_get_contents("http://109.80.22.31/xml.xml");
$xml = new SimpleXMLElement($obsah);
//echo "<ul>";
foreach(array('s0_2') as $meridlo) {
$result = $xml->xpath("/sds/snmp/$meridlo");
echo "<li>".$result[0]->act."</li>";
}
echo "</ul>\n";
?>
ale před zobrazeným číslem mi ti píše tečku.
Dá se odstranit? Díky
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 24. 10. 2011 21:22
Ta tečka se dá odstranit buď v CSS nastylování m seznamu, anebo místo <ul> použiješ jinou vhodnou konstrukci HTML.
Pokud potřebuješ jen hodnotu z měřidla s0_2, tak můžeš cyklus zrušit. Tedy místo:
$xml = new SimpleXMLElement($obsah);
echo "<ul>";
foreach(array('s0_2') as $meridlo) {
$result = $xml->xpath("/sds/snmp/$meridlo");
echo "<li>".$result[0]->act."</li>";
}
echo "</ul>\n";
napíšeš jen:
$xml = new SimpleXMLElement($obsah);
$result = $xml->xpath("/sds/snmp/s0_2");
echo "<p>".$result[0]->act."</p>";
Chce to jen vybrat správnou značku HTML. V tomto případě jsem pro změnu dal <p>, ale když to bude položka tabulky, tak tam bude <td>.
XPath se prostě používá pro dotazy XML podobně jako SELECT se používá pro dotazy SQL. Samozřejmě jsou v tom odlišnosti, ale významově je to totéž.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 08. 11. 2011 19:04
Kite prosím o pomoc
Napsal jsi mi tento skript
Skript pro periodický sběr dat
<?php
$obsah=file_get_contents("http://109.80.22.31/xml.xml");
$xml = new SimpleXMLElement($obsah);
$result = $xml->xpath('/sds/snmp/*/text');
$fd=fopen('data/data.csv','a');
$data=date('r');
foreach($result as $key => $val){
$data.=';'.$val[0];
}
fwrite($fd,$data."\n");
fclose($fd);
?>
potřeboval bych ho trochu upravit.
Tento pracuje jak má, ale potřebuji podobný
který zapisuje do souboru z xml tyto hodnoty:
<ntptime>1320782412</ntptime> a <temp_1>20.87</temp_1>
čas a teplotu jednoho teploměru, ale aby to vypadalo takto
[1320782412,20.87]
[1320782518,20.32]
..... stále pod sebe.
šlo by to? díky
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 08. 11. 2011 19:21
To víš, že by to šlo. Pomocí metody xpath() si můžeš vybrat libovolný údaj. A výstup si také můžeš naformátovat jak budeš chtít.
<?php
$obsah=file_get_contents("http://109.80.22.31/xml.xml");
$xml = new SimpleXMLElement($obsah);
$ntptime = $xml->xpath('/sds/snmp/ntptime');
$temp_1 = $xml->xpath('/sds/snmp/temp_1');
$fd=fopen('data/data.csv','a');
$data=date('r');
fwrite($fd,"[{$ntptime[0]},{$temp_1[0]}]\n");
fclose($fd);
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 08. 11. 2011 21:32
Mně to funguje. Spouštíš ho pravidelně? Máš právo zápisu do podadresáře data?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 08. 11. 2011 21:43
sem už posílám dlouho a jde to.
http://strojcomp.cz/soubory_txt/data.txt
Zkusil jsem teď něco předělat tak uvidím.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 08. 11. 2011 22:08
Logování se dělá vždy tak, že se data zapisují na konec souboru. Pokud to chceš jinak, můžeš to udělat dvěma způsoby:
- místo do logu ukládat do databáze
- logovat stejně jako dosud a při prezentaci obrátit pořadí
Každé řešení má své výhody i nevýhody. Pro velký objem dat bude výhodnější ta databáze, zejména pokud budeš chtít zobrazovat jen malou část (např. posledních 24 hodin) nebo budeš chtít zobrazit třeba průměrné teploty podle dne či hodiny. To databáze umí.
Nebo chceš psát data sekvenčně na jeden dlouhý řádek? Nedávej tam "\n".
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 02. 2012 21:57
Našel jsi tady v tomto vlákně něco o memory_limit? Ne? Tak proč to sem dáváš? Do tohoto vlákna tvůj dotaz vůbec nepatří! Hezky si to sám zjisti přes phpinfo().
|
|
| Reagovat
|
|
 |
 |