[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