<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=InfluxDB</id>
	<title>InfluxDB - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=InfluxDB"/>
	<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=InfluxDB&amp;action=history"/>
	<updated>2026-05-06T10:29:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://entorb.net//wiki/index.php?title=InfluxDB&amp;diff=5344&amp;oldid=prev</id>
		<title>Torben at 11:48, 17 October 2025</title>
		<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=InfluxDB&amp;diff=5344&amp;oldid=prev"/>
		<updated>2025-10-17T11:48:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Raspi]][[Category:Coding]][[Category:Python]]&lt;br /&gt;
==Install on Raspberry Pi in Raspbian==&lt;br /&gt;
===2025===&lt;br /&gt;
 sudo apt install influxdb influxdb-client &lt;br /&gt;
&lt;br /&gt;
Create DB and Users&lt;br /&gt;
 # 1. create admin user&lt;br /&gt;
 influx&lt;br /&gt;
 create user uadmin with password &amp;#039;password1&amp;#039; WITH ALL PRIVILEGES&lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 # 2. create DB and other users&lt;br /&gt;
 export INFLUX_USERNAME=uadmin&lt;br /&gt;
 export INFLUX_PASSWORD=password1&lt;br /&gt;
 &lt;br /&gt;
 influx&lt;br /&gt;
 USE raspi&lt;br /&gt;
 create user uwrite with password &amp;#039;password2&amp;#039;&lt;br /&gt;
 create user uread  with password &amp;#039;password3&amp;#039;&lt;br /&gt;
 grant read on raspi to uread&lt;br /&gt;
 grant write on raspi to uwrite&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
=== Old version===&lt;br /&gt;
Nice Howto: [https://www.circuits.dk/install-grafana-influxdb-raspberry/]&lt;br /&gt;
&lt;br /&gt;
 wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -&lt;br /&gt;
 source /etc/os-release&lt;br /&gt;
 test $VERSION_ID = &amp;quot;7&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;deb https://repos.influxdata.com/debian wheezy stable&amp;quot; | sudo tee /etc/apt/sources.list.d/influxdb.list&lt;br /&gt;
 test $VERSION_ID = &amp;quot;8&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;deb https://repos.influxdata.com/debian jessie stable&amp;quot; | sudo tee /etc/apt/sources.list.d/influxdb.list&lt;br /&gt;
 test $VERSION_ID = &amp;quot;9&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;deb https://repos.influxdata.com/debian stretch stable&amp;quot; | sudo tee /etc/apt/sources.list.d/influxdb.list&lt;br /&gt;
 sudo apt-get install influxdb&lt;br /&gt;
 sudo service influxdb restart&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===influxdb.conf===&lt;br /&gt;
 sudo vim /etc/influxdb/influxdb.conf&lt;br /&gt;
 &lt;br /&gt;
 [http]&lt;br /&gt;
 # Determines whether HTTP endpoint is enabled.&lt;br /&gt;
 enabled = true&lt;br /&gt;
 # require login of user&lt;br /&gt;
 auth-enabled = true&lt;br /&gt;
 # prevent logging of each HTTP request to reduce load on ssd&lt;br /&gt;
 log-enabled = false&lt;br /&gt;
 &lt;br /&gt;
 [logging]&lt;br /&gt;
 level = &amp;quot;warn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
in ~/.bashrc&lt;br /&gt;
 export INFLUX_USERNAME=admin&lt;br /&gt;
 export INFLUX_PASSWORD=password1&lt;br /&gt;
&lt;br /&gt;
Runs per default on port 8086&lt;br /&gt;
&lt;br /&gt;
==Administration==&lt;br /&gt;
===CLI: command line interface===&lt;br /&gt;
 sudo apt-get install influxdb-client&lt;br /&gt;
 influx -precision rfc3339 # for human readable time format&lt;br /&gt;
 # or &lt;br /&gt;
 influx&lt;br /&gt;
 precision rfc3339&lt;br /&gt;
&lt;br /&gt;
===User permissions===&lt;br /&gt;
user permissions are defined per database, so if you need only one level of permissions, one database might be enough&lt;br /&gt;
 CREATE DATABASE raspi&lt;br /&gt;
 USE raspi&lt;br /&gt;
suggestion: one user per permission&lt;br /&gt;
 create user uadmin with password &amp;#039;password1&amp;#039; WITH ALL PRIVILEGES&lt;br /&gt;
 create user uwrite with password &amp;#039;password2&amp;#039;&lt;br /&gt;
 create user uread  with password &amp;#039;password3&amp;#039;&lt;br /&gt;
 grant read on raspi to uread&lt;br /&gt;
 grant write on raspi to uwrite&lt;br /&gt;
&lt;br /&gt;
===Backup and Restore===&lt;br /&gt;
 influxd backup  -portable mypath&lt;br /&gt;
 influxd restore -portable mypath&lt;br /&gt;
&lt;br /&gt;
===Renaming a Database via creating a copy of its tables===&lt;br /&gt;
Attention: this will convert tags to fields is group by * missing&lt;br /&gt;
 CREATE DATABASE mydb2&lt;br /&gt;
 SELECT * INTO mydb2.autogen.table1 from mydb1.autogen.table1 group by *&lt;br /&gt;
 DROP DATABASE mydb1&lt;br /&gt;
&lt;br /&gt;
==General commands==&lt;br /&gt;
&lt;br /&gt;
===SHOW commands===&lt;br /&gt;
 SHOW DATABASES&lt;br /&gt;
 SHOW MEASUREMENTS&lt;br /&gt;
 SHOW RETENTION POLICIES&lt;br /&gt;
 # display the field types of &amp;quot;table&amp;quot; myMeasurement&lt;br /&gt;
 SHOW FIELD KEYS FROM myMeasurement&lt;br /&gt;
 # show tags&lt;br /&gt;
 SHOW TAG   KEYS FROM myMeasurement&lt;br /&gt;
 # for example to be used in Grafana variables of type Query&lt;br /&gt;
 SHOW TAG VALUES FROM myMeasurement WITH KEY =~ //&lt;br /&gt;
 # CQ&lt;br /&gt;
 SHOW CONTINUOUS QUERIES&lt;br /&gt;
&lt;br /&gt;
===SELECT statement===&lt;br /&gt;
 precision rfc3339&lt;br /&gt;
 # for human readable timeformat&lt;br /&gt;
 USE myDB&lt;br /&gt;
 SELECT * FROM myMeasurement WHERE time &amp;gt; now() - 3d&lt;br /&gt;
 SELECT * FROM myMeasurement WHERE myField &amp;gt; 12.2&lt;br /&gt;
 &lt;br /&gt;
 # cast field into different type into new measurement&lt;br /&gt;
 SELECT watt::float INTO myMeasurement2 FROM myMeasurement1&lt;br /&gt;
 &lt;br /&gt;
 # copy into new measurement: &lt;br /&gt;
 SELECT watt::float, kWh_total_in::float, kWh_total_out::float INTO tasmota_MT681 FROM tmp&lt;br /&gt;
 # use GROUP BY * to keep field types AND tags&lt;br /&gt;
 SELECT watt_now, watt_last, kWh_total INTO tmp FROM Shelly GROUP BY *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Last value per day&lt;br /&gt;
 SELECT last(&amp;quot;kWh_total_in&amp;quot;) as kWh_total_in, last(&amp;quot;kWh_total_out&amp;quot;) as kWh_total_out&lt;br /&gt;
 FROM &amp;quot;tasmota_MT681&amp;quot;&lt;br /&gt;
 WHERE 1=1&lt;br /&gt;
 -- AND time &amp;gt; now() -2d&lt;br /&gt;
 AND time &amp;lt; &amp;#039;2024-07-13T00:00:00+02:00&amp;#039;&lt;br /&gt;
 GROUP BY time(1d) fill(previous)&lt;br /&gt;
&lt;br /&gt;
===DELETE alternative===&lt;br /&gt;
DELETE is not supported in Influx V1&lt;br /&gt;
&lt;br /&gt;
alternative:&lt;br /&gt;
 # filter data into new tmp measurement and cast to float instead&lt;br /&gt;
 # use GROUP BY * to keep field types and tags&lt;br /&gt;
 SELECT watt::float, kWh_total_in, kWh_total_out INTO tmp FROM tasmota_MT681 WHERE kWh_total_in &amp;gt;0 GROUP BY *&lt;br /&gt;
 # drop original measurement&lt;br /&gt;
 DROP measurement tasmota_MT681&lt;br /&gt;
 # restore from tmp&lt;br /&gt;
 SELECT watt, kWh_total_in, kWh_total_out INTO tasmota_MT681 FROM tmp GROUP BY *&lt;br /&gt;
 # cleanup&lt;br /&gt;
 DROP MEASUREMENT tmp&lt;br /&gt;
&lt;br /&gt;
==Retention Policies==&lt;br /&gt;
 SHOW RETENTION POLICIES&lt;br /&gt;
 # keep data for 10 years instead of 6 days (default)&lt;br /&gt;
 CREATE RETENTION POLICY &amp;quot;years10&amp;quot; ON raspi DURATION 520w REPLICATION 1 DEFAULT&lt;br /&gt;
 DROP   RETENTION POLICY &amp;quot;years10&amp;quot; ON raspi&lt;br /&gt;
 &lt;br /&gt;
 # infinite &lt;br /&gt;
 CREATE RETENTION POLICY &amp;quot;inf&amp;quot; ON &amp;quot;raspi&amp;quot; DURATION INF REPLICATION 1&lt;br /&gt;
 &lt;br /&gt;
 # if switching the default RETENTION POLICY old data will require a specific select&lt;br /&gt;
 # altering the default RP:&lt;br /&gt;
 ALTER RETENTION POLICY autogen ON raspi DURATION 90d SHARD DURATION 1d REPLICATION 1 DEFAULT&lt;br /&gt;
 ALTER RETENTION POLICY autogen ON collectd DURATION 7d SHARD DURATION 1d REPLICATION 1 DEFAULT&lt;br /&gt;
&lt;br /&gt;
==Continuous Query / Auto aggregation==&lt;br /&gt;
 SHOW CONTINUOUS QUERIES&lt;br /&gt;
 &lt;br /&gt;
 CREATE CONTINUOUS QUERY &amp;quot;cq_mt681_1d&amp;quot; ON &amp;quot;raspi&amp;quot; BEGIN \&lt;br /&gt;
  INTO &amp;quot;inf&amp;quot;.&amp;quot;tasmota_MT681_day_end&amp;quot; \&lt;br /&gt;
  SELECT last(&amp;quot;kWh_total_in&amp;quot;) as kWh_total_in, last(&amp;quot;kWh_total_out&amp;quot;) as kWh_total_out \&lt;br /&gt;
  FROM &amp;quot;tasmota_MT681&amp;quot; \&lt;br /&gt;
 GROUP BY time(1d) fill(previous) \&lt;br /&gt;
 END&lt;br /&gt;
 &lt;br /&gt;
 DROP CONTINUOUS QUERY &amp;quot;cq_mt681_1d&amp;quot; ON &amp;quot;raspi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Connection via CURL==&lt;br /&gt;
 curl -G http://raspi3:8086/query -u uwrite:password2 --data-urlencode &amp;quot;q=SHOW DATABASES&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Insert via REST API and CURL===&lt;br /&gt;
 # precision=s (second) is important for performance, if higher accuracy is needed use ms, not ns which is the default!)&lt;br /&gt;
 VALUE=&amp;quot;123.123&amp;quot;&lt;br /&gt;
 curl -i \&lt;br /&gt;
        -u uwrite:password2 \&lt;br /&gt;
        -XPOST &amp;quot;http://localhost:8086/write?db=raspi&amp;amp;precision=s&amp;quot; \&lt;br /&gt;
        --data-binary &amp;quot;myTable,myTag=SourceA myValue=$VALUE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==SELECT, INSERT and UPDATE via Python==&lt;br /&gt;
===SELECT into Pandas DataFrame===&lt;br /&gt;
 def read_data() -&amp;gt; pd.DataFrame:&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;Read data from Influx DB into DataFrame.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     client = connect2_df(credentials_read)&lt;br /&gt;
     query = &amp;quot;SELECT * FROM {retention}.{measurement} WHERE ShellyNo = $ShellyNo&amp;quot;&lt;br /&gt;
     result = client.query(&lt;br /&gt;
         query.format(retention=retention, measurement=measurement),&lt;br /&gt;
         bind_params={&amp;quot;ShellyNo&amp;quot;: shelly_no},&lt;br /&gt;
     )&lt;br /&gt;
     df: pd.DataFrame = result[MEASUREMENT]  # type: ignore&lt;br /&gt;
     df.index.name = &amp;quot;time&amp;quot;&lt;br /&gt;
     client.close()&lt;br /&gt;
     return df&lt;br /&gt;
&lt;br /&gt;
===INSERT / UPDATE via Pandas DataFrame===&lt;br /&gt;
 def insert(df: pd.DataFrame) -&amp;gt; None:&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;Insert of df into Influx DB.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     client = connect2_df(credentials_write)&lt;br /&gt;
     if len(df) &amp;gt; 0:&lt;br /&gt;
         client.write_points(&lt;br /&gt;
             df,&lt;br /&gt;
             MEASUREMENT,&lt;br /&gt;
             tag_columns=[&amp;quot;room&amp;quot;],&lt;br /&gt;
             protocol=&amp;quot;line&amp;quot;,&lt;br /&gt;
             batch_size=1000,&lt;br /&gt;
             retention_policy=RETENTION,&lt;br /&gt;
             time_precision=&amp;quot;s&amp;quot;, # ns .. s&lt;br /&gt;
         )&lt;br /&gt;
     client.close()&lt;br /&gt;
&lt;br /&gt;
===INSERT JSON data via InfluxDBClient===&lt;br /&gt;
see [https://www.influxdata.com/blog/getting-started-python-influxdb/]&lt;br /&gt;
 from influxdb import InfluxDBClient&lt;br /&gt;
 client = InfluxDBClient(host=&amp;#039;192.168.178.31&amp;#039;, port=8086, username=&amp;#039;write&amp;#039;, password=&amp;#039;password2 &amp;#039;)&lt;br /&gt;
 # client.create_database(&amp;#039;raspi&amp;#039;)&lt;br /&gt;
 print(client.get_list_database())&lt;br /&gt;
 client.switch_database(&amp;#039;raspi&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
 json = [&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;measurement&amp;quot;: &amp;quot;brushEvents&amp;quot;,&lt;br /&gt;
         &amp;quot;tags&amp;quot;: {&lt;br /&gt;
             &amp;quot;user&amp;quot;: &amp;quot;Carol&amp;quot;,&lt;br /&gt;
             &amp;quot;brushId&amp;quot;: &amp;quot;6c89f539-71c6-490d-a28d-6c5d84c0ee2f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;time&amp;quot;: &amp;quot;2018-03-28T8:01:00Z&amp;quot;,&lt;br /&gt;
         &amp;quot;fields&amp;quot;: {&lt;br /&gt;
             &amp;quot;duration&amp;quot;: 127&lt;br /&gt;
         }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;measurement&amp;quot;: &amp;quot;brushEvents&amp;quot;,&lt;br /&gt;
         &amp;quot;tags&amp;quot;: {&lt;br /&gt;
             &amp;quot;user&amp;quot;: &amp;quot;Carol&amp;quot;,&lt;br /&gt;
             &amp;quot;brushId&amp;quot;: &amp;quot;6c89f539-71c6-490d-a28d-6c5d84c0ee2f&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;time&amp;quot;: &amp;quot;2018-03-29T8:04:00Z&amp;quot;,&lt;br /&gt;
         &amp;quot;fields&amp;quot;: {&lt;br /&gt;
             &amp;quot;duration&amp;quot;: 132&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 ]&lt;br /&gt;
 &lt;br /&gt;
 if client.write_points(json, time_precision=&amp;quot;s&amp;quot;) != True:&lt;br /&gt;
     print (&amp;quot;ERROR: Write to InfluxDB not successful&amp;quot;)&lt;br /&gt;
 else: &lt;br /&gt;
     print (&amp;quot;data sent&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Torben</name></author>
	</entry>
</feed>