Seite 1 von 1

Wie in script von Influx einen Maximalwert abfragen?

Verfasst: Sa Apr 18, 2020 8:54 pm
von koend
Hallo,

hatte auf meinen Wiregate ein prima funktionierendes Script für die Gartenberegnung laufen. Das benötigt allerdings direkten Zugriff auf die rrd-Datenbanken für die Erdtemperatur und -feuchtigkeit (siehe unten).

Wie kann ich nun von einem wiregate script auf die entsprechenden Influx-Datenbanken zugreifen? Ich bräuchte einen Maximalwert aus den letzten 24 Stunden.

Oder als Alternative, wie kann ich einen Logikbaustein bauen, der getriggerd durch ein knx_read() den entsprechenden Wert zurückgibt.
Und nein, ich habe keine Zeit und Lust mich in den Logikeditor einzuarbeiten. Dafür stecken zuviele Mannmonate in meinen scripts.

Vielen Dank und viele Grüße

Code: Alles auswählen

my $rrdPath = "/var/www/rrd/";
my $humidityLeftFile= $rrdPath."GardenHumiLeft.rrd";
my $humidityRightFile= $rrdPath."GardenHumiRight.rrd";
my $temperatureLeftFile= $rrdPath."GardenTempLeft.rrd";

my ($result_arr,$xsize,$ysize) = RRDs::graph($temperatureLeftFile,
	'DEF:v='.$temperatureLeftFile.':GardenTempLeft:AVERAGE',
	'VDEF:vm=v,MAXIMUM',
	'PRINT:vm:%lf'
);

Re: Wie in script von Influx einen Maximalwert abfragen?

Verfasst: So Apr 19, 2020 1:23 pm
von Chris M.
Die Login-Credentials werden auf der TWS-Portainer-Seite beim Klick auf das (i) hinter "Wie Sie aus dem Docker Container auf die Zeitreihen-Datenbank zugreifen können" angezeigt.
Damit kannst Du nun eine Query an die InfluxDB absetzten die genau das beantwortet, das ist alles HTTP, sollte als Perl auch hin bekommen.

Re: Wie in script von Influx einen Maximalwert abfragen?

Verfasst: Sa Apr 25, 2020 12:07 am
von koend
Danke Chris.

Klinkt in erster Instanz enorm logisch, Brett vor'm Kopf bei mir.

Kriege ich praktisch allerdings nicht hin:
- Debian hat kein package für Influx::HTTP
- cpan läuft auf dem plugin container nicht durch (wie schon durch andere angemerkt, die sich dann aber mit einem Debian package behelfen konnten)

Also drohen leider lange Abende und Wochenenden um mich in den kontra-intuitiven Logikeditor einzuarbeiten, die ich lieber auf andere Dinge verwenden würde. So technisch schön der auch sein mag, er ist der folgende vendor lock-in nach den plugins...

Re: Wie in script von Influx einen Maximalwert abfragen?

Verfasst: Sa Apr 25, 2020 11:06 am
von Chris M.
Du denkst zu kompliziert. Mach es einfach zu Fuß. Also einfach einen "normalen" HTTP-Request absetzen und die Antwort dann selber verarbeiten.

Eigentlich wollte ich Dir als Beispiel geben wie es die CometVisu macht (https://github.com/CometVisu/CometVisu/ ... xfetch.php) - aber ich habe gerade gesehen, dass es für eine so simple Aufgabe schon wieder viel zu komplex ist, da dort ja eine Abfrage dynamisch zusammen gebaut wird und Dir ja eine simple statische Abfrage reicht.
Aber eigentlich reicht hier die InfluxDB-Doku vollkommen aus: https://docs.influxdata.com/influxdb/v1 ... uery_data/

Re: Wie in script von Influx einen Maximalwert abfragen?

Verfasst: Di Mai 12, 2020 10:43 pm
von koend
Kompliziert kann ja auch nicht jeder... ;)

Vielen Dank für die Hinweise, die halfen nicht nur, sondern waren essentiell.

Mit Dank an viele andere Autoren (und Google) hier das Ergebnis:

Code: Alles auswählen

my $url = 'https://172.17.0.1/proxy/ts/query';
my $user = 'docker';
my $passwd = '<see TWS>';
my $timeseries = 'TS00005';

use HTTP::Response;
use LWP::UserAgent;
use URI::URL;
use MIME::Base64;
use URI::Encode qw(uri_encode);;
use JSON;

my $query = 'SELECT max(*) FROM '.$timeseries.' WHERE time > now() - 25h';

# for debugging add &pretty=true
$url = $url.'?db=timeseries_db&q='.uri_encode($query);
my $header = ['Content-Type' => 'application/vnd.flux', 'Authorization' => 'Basic '.encode_base64($user.':'.$passwd)];

my $request = HTTP::Request->new( 'GET', $url, $header);
my $ua = LWP::UserAgent->new(
  ssl_opts => { 
  		verify_hostname => '0',
  		SSL_verify_mode => '0'},
);
$ua->agent("hcat/1.0");

my $response = $ua->request($request);

plugin_log('5 ---------------------------------------------------');
my $maxTemp=decode_json($response->content)->{results}->[0]->{series}->[0]->{values}->[0][1];

plugin_log('max:'.$maxTemp);

Re: Wie in script von Influx einen Maximalwert abfragen?

Verfasst: Mi Mai 13, 2020 8:19 am
von Robert_Mini
Hallo Koend!

Super Sache! Kann mir vorstellen, dass dies ein Knochenjob war, aber dies eröffnet nun tolle Möglichkeiten!

Darf ich das als kurzen Artikel in die KB aufnehmen?

Danke und lg
Robert

Re: Wie in script von Influx einen Maximalwert abfragen?

Verfasst: Do Mai 14, 2020 11:25 am
von koend
Moin,

kannst du gerne aufnehmen, ja.

Knochenjob war OK, bis auf die nested data structures in Perl ganz am Ende...

Re: Wie in script von Influx einen Maximalwert abfragen?

Verfasst: Do Mai 14, 2020 11:44 am
von StefanW
Hallo koend,

super Sache, danke sehr für das teilen mit uns.

==> Sehe ich das richtig, das ist ein PERL-Script für die Plugin-UMgebung im "WireGate Plugin-Container" im Timberwolf Server?

Könntest Du noch bitte Deinen Footer auf Forenstandard bringen: viewtopic.php?f=8&t=331?


Merci

Stefan