[vz-dev] Letzten aktuellen Leitungswert einer uuid auslesen
Jakob Hirsch
jh at plonk.de
Thu Nov 15 00:14:32 CET 2012
On 14.11.2012 21:13, Sven Peitz wrote:
> Ich konnte leider noch nicht herausfinden wie ich nur den letzten Wert
> lese, und ja es sind tatsächliche Watt.
Ist nicht implementiert. Workaround wäre z.B. sowas:
curl -s
http://url/deiner/middleware.php/data/deine_UUID.csv?from=$[$(date
+%s)-300]000 | tail -n2 | head -n1 | cut -f2 -d';'
Je nachdem wie oft du Werte reingekommst, kannst du die 300 Sekunden
verkleinern oder mußt sie vergrößern.
Statt "tail -n2 | head -n1" sollte eigentlich ein "tail -n1" ausreichen,
allerdings hängt die Middleware momentan leider noch einen dummy-Wert
an, damit das Frontend den letzten echten Wert anzeigt. Das muß da raus,
das gehört in's Frontend. Demnächst...
> Die gesamte Abfrage dauert bei mir so 10-15 Sekunden.
Dann hast du wahrscheinlich keinen passenden Index in deiner
data-Tabelle. In älteren vz-Versionen war das ein Problem.
Mach mal ein "SHOW CREATE TABLE data", das sollte ungefähr so aussehen:
> CREATE TABLE `data` (
> `id` int(11) NOT NULL AUTO_INCREMENT,
> `channel_id` int(11) DEFAULT NULL,
> `timestamp` bigint(20) NOT NULL,
> `value` double NOT NULL,
> PRIMARY KEY (`id`),
> UNIQUE KEY `chan_ts_idx` (`channel_id`,`timestamp`),
> CONSTRAINT `data_ibfk_1` FOREIGN KEY (`channel_id`) REFERENCES `entities` (`id`)
> )
Falls bei dir der Index über (`channel_id`,`timestamp`) fehlt, kannst du
ihn so einrichten:
ALTER TABLE data ADD UNIQUE KEY `chan_ts_idx` (`channel_id`,`timestamp`);
Das dauert je nach Datenmenge etwas, weil die Tabelle komplett kopiert
wird und dabei noch der Index neu erstellt werden muss. Wenn du eine
Fehlermeldung wegen non-unique Werten bekommst, kannst du das "UNIQUE"
auch weglassen. Ich würde aber eher empfehlen, die Duplicate zu löschen:
1. Mit "SELECT id FROM data WHERE channel_id=CHANNEL AND
timestamp=TIMESTAMP" jeweils die IDs raussuchen.
2. Mit "DELETE FROM data WHERE id=ID" einen der beiden löschen.
Wenn du noch einen Index _nur_ auf timestamp oder sogar channel_id hast
(in der Klammer), kannst du den so löschen (weil unnötig):
ALTER TABLE data DROP KEY `key-name`;
Oder gleich beim Anlegen des ersten Index mit entsorgen, dann geht's
schneller, weil nur einmal umkopiert werden muss:
ALTER TABLE data ADD UNIQUE KEY `chan_ts_idx`
(`channel_id`,`timestamp`), DROP KEY `key-name`;
key-name übernimmst du oben von der Ausgabe von "SHOW CREATE TABLE
data", zwischen KEY und (...).
Äh, ja, wenn dir das jetzt zuviel Text war: Einfach mal die Ausgabe von
"SHOW CREATE TABLE data" posten, dann sehen wir weiter.
More information about the volkszaehler-dev
mailing list