Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:datenmengen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
howto:datenmengen [2018/04/01 15:09] – PR 688 jauhowto:datenmengen [2018/12/04 08:49] wf_bitplan.com
Zeile 33: Zeile 33:
 === weich === === weich ===
 Bei diesem Ansatz werden auch die Daten gelöscht. Die Daten werden immer mehr ausgedünnt je weiter man in die Vergangenheit geht. So behält man z.B. alle Daten von heute, behält von den letzten 2 Wochen nur eine Messung pro Minute und von der Zeit davor nur eine pro Viertelstunde. Bei diesem Ansatz werden auch die Daten gelöscht. Die Daten werden immer mehr ausgedünnt je weiter man in die Vergangenheit geht. So behält man z.B. alle Daten von heute, behält von den letzten 2 Wochen nur eine Messung pro Minute und von der Zeit davor nur eine pro Viertelstunde.
-Dazu steht das Script [[https://github.com/volkszaehler/volkszaehler.org/blob/master/bin/vzcompress2.php|vzcompress2.php]] zur Verfügung. Von Haus aus hat der lokale User vz keine Rechte zum Löschen in der Datenbank, das muss man vorher ändern:+Dazu steht das Script [[https://github.com/volkszaehler/volkszaehler.org/blob/master/bin/vzcompress2|vzcompress2]] zur Verfügung. Von Haus aus hat der lokale User vz keine Rechte zum Löschen in der Datenbank, das muss man vorher ändern:
 <code> <code>
 mysql --user=root -praspberry mysql --user=root -praspberry
Zeile 50: Zeile 50:
  
 <code> <code>
-0 3 * * * cd /var/www/volkszaehler.org/bin ; php vzcompress2.php >> /var/log/vzcompress.log+0 3 * * * cd /var/www/volkszaehler.org/bin ; php vzcompress2 >> /var/log/vzcompress.log
 </code> </code>
 Die Anzahl der Daten die gelöscht werden soll, sowie die Zeiträume sind frei konfigurierbar am Ende des Scriptes. Die Anzahl der Daten die gelöscht werden soll, sowie die Zeiträume sind frei konfigurierbar am Ende des Scriptes.
Zeile 65: Zeile 65:
 Die folgende Zeile aggregiert alle bestehenden Daten. Der Vorgang kann daher einige Stunden benötigen: Die folgende Zeile aggregiert alle bestehenden Daten. Der Vorgang kann daher einige Stunden benötigen:
 <code> <code>
-php /var/www/volkszaehler.org/bin/aggregate.php run -m full -l day -l hour -l minute+php /var/www/volkszaehler.org/bin/aggregate run -m full -l day -l hour -l minute
 </code> </code>
  
 Einschränken auf eine einzelne UUID mittels: Einschränken auf eine einzelne UUID mittels:
 <code> <code>
-php /var/www/volkszaehler.org/bin/aggregate.php run <UUID> -m full -l day -l hour -l minute+php /var/www/volkszaehler.org/bin/aggregate run <UUID> -m full -l day -l hour -l minute
 </code> </code>
  
Zeile 76: Zeile 76:
 Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz: Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz:
 <code> <code>
-*/10 * * * *  php /var/www/volkszaehler.org/bin/aggregate.php run -m delta -l minute >/dev/null +*/10 * * * *  php /var/www/volkszaehler.org/bin/aggregate run -m delta -l minute >/dev/null 
-1 * * * *  php /var/www/volkszaehler.org/bin/aggregate.php run -m delta -l hour >/dev/null +1 * * * *  php /var/www/volkszaehler.org/bin/aggregate run -m delta -l hour >/dev/null 
-0 1 * * *  php /var/www/volkszaehler.org/bin/aggregate.php run -m delta -l day >/dev/null+0 1 * * *  php /var/www/volkszaehler.org/bin/aggregate run -m delta -l day >/dev/null
 </code> </code>
  
Zeile 92: Zeile 92:
 der Eintrag für "minute" sieht dann also so aus: der Eintrag für "minute" sieht dann also so aus:
 <code> <code>
-*/10 * * * *  flock -n /tmp/flock-vz_aggregate.lock php /var/www/volkszaehler.org/bin/aggregate.php run -m delta -l minute >/dev/null+*/10 * * * *  flock -n /tmp/flock-vz_aggregate.lock php /var/www/volkszaehler.org/bin/aggregate run -m delta -l minute >/dev/null
 </code> </code>
 Anm.: Die Einträge für "hour" und "day" werden nicht mit sich selbst kollidieren (...); wenn diese also kollidieren, dann mit "minute"; so laufen also höchstens 3 Aggregate-Jobs gleichzeitig (minute, hour, day) Anm.: Die Einträge für "hour" und "day" werden nicht mit sich selbst kollidieren (...); wenn diese also kollidieren, dann mit "minute"; so laufen also höchstens 3 Aggregate-Jobs gleichzeitig (minute, hour, day)
Zeile 134: Zeile 134:
 ^ "sum" | Summe | zu verwenden bei Impulsen (S0) | ^ "sum" | Summe | zu verwenden bei Impulsen (S0) |
 ^ "none"| | keine Aggreagtion vornehmen, alle Daten des //channel// gehen an die Middleware | ^ "none"| | keine Aggreagtion vornehmen, alle Daten des //channel// gehen an die Middleware |
 +
 +===== Aggregieren mit mySQL =====
 +**Function channelSum**
 +Die folgende mySQL Hilfsfunktion berechnet die "Summe" von Werten für ein electric Meter über einen gegebenen Zeitraum.Dazu wird
 +der höchste und der niedrigste Wert gesucht. Es gilt sum=max - min für solche Zähler.
 +
 +Der Aggregationseffekt von channelSum hängt von der Frequenz der Datenerhebung und der Länge des Intervals ab. Bei der Erhebung eines Wertes alle 15 Minuten und einer Zeitraumbreite von einem Tag werden 15x24 = 320 x weniger Daten geliefert.
 +<code>
 +--
 +-- Volkszähler mySQL function to sum up channel data for a given time period
 +--
 +-- params
 +--    channel_id  int   - the id of the channel
 +--    from_time   date  - the time from which to sum up
 +--    to_time     date  - the time to which to sum up
 +--
 +CREATE FUNCTION channelSum(channel_id INT, from_time DATE, to_time DATE) 
 +  RETURNS DOUBLE
 +  DETERMINISTIC
 +BEGIN
 + DECLARE d_min double;
 + DECLARE d_max double;
 + SELECT min(d.value), max(d.value) INTO d_min,d_max
 + FROM data d 
 + WHERE d.timestamp between unix_timestamp(from_time)*1000 and unix_timestamp(to_time)*1000 and d.channel_id=channel_id;
 + RETURN d_max-d_min;
 +END
 +</code>
 +
 +**Daily Tabelle**
 +Das folgende mySQL Script erzeugt mit Hilfe der obigen "channelSum" Funktion eine "daily" Tabelle mit Tagessummen für Messwerte vom Typ "electric meter". Im Beispiel werden die Werte für den Zeitraum 2014-01-01 bis 2018-11-30 aufsummiert. Für die Erzeugung von 7450 Einträgen hat diese Abfrage ca. 2700 Sekunden Zeit gebraucht und dazu mehrere Millionen Einträge betrachtet. Beim zweiten Aufruf kann man statt des "CREATE Table" einen "INSERT " benutzen, sonst ist zuvor ein "DROP Table" erforderlich. 
 +
 +Als Basis diente eine SQL-Abfrage zur Erzeugung einer Liste von Tagen siehe: https://stackoverflow.com/a/53541150/1497139
 +
 +<code>
 +create table daily as
 +select 
 +  dates.from_date,e.id,format(channelSum(e.id,dates.from_date,dates.to_date),0) as diff,e.type, p.value
 +from (
 +select 
 +  date_add('2014-01-01',interval row day)   as from_date, 
 +  date_add('2014-01-01',interval row+1 day) as to_date   
 +from (
 +    SELECT @row := @row + 1 as row FROM 
 +    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
 +    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
 +    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
 +    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
 +    (SELECT @row:=-1) r
 +) sequence
 +where date_add('2014-01-01',interval row+1 day) <= '2018-01-30') dates
 +join entities   
 +join properties p on e.id=p.entity_id
 +join properties r on e.id=r.entity_id
 +where p.pkey='title' and r.pkey='resolution'
 +and e.type='electric meter';
 +</code>
  
 ===== Aufrüstung: Hardware ===== ===== Aufrüstung: Hardware =====
howto/datenmengen.txt · Zuletzt geändert: 2021/08/11 13:31 von mr.gosh