Der Raspberry Pi eignet sich nicht nur zum Erfassen von Sensordaten, sondern auch um diese zu speichern und anschließend auszuwerten. In Projekten wie Wetterstationen oder in Verbindung mit einem ESP8266 kann ein solcher Raspberry Pi Datenlogger als zentrale Speicherstation für jegliche Daten dienen.
In einem der vorherigen Tutorials haben wir bereits Daten auf der Online-Platform ThingSpeak gespeichert. Bei sensiblen Daten oder fehlendem Internetzugriff ist dies allerdings keine Option. Daher soll es in diesem Tutorial darum gehen seine analogen oder digitalen Sensordaten in einer lokalen MySQL Datenbank zu speichern.
Zubehör
Neben einem Raspberry Pi ist im Grunde kein weiteres Zubehör zum Loggen der Daten notwendig (exkl. Stromversorgung und microSD Karte). Allerdings können verschiedene Sensoren ausgelesen werden, deren Werte gespeichert werden. Ich nutze in dieser Anleitung folgendes zum Verdeutlichen:
- DHT22 Temperatur & Luftfeuchtigkeit Sensor
- Breadboard
- Jumper Kabel
Darüber hinaus können auch Daten anderer Sensoren in der Datenbank gespeichert werden. Hier ein paar Beispiele zu bereits vorhandenen Tutorials. Der Code dieser Anleitungen muss nur minimal verändert bzw. erweitert werden, sodass die Daten geloggt werden. Wie erfährst du im Laufe dieses Artikels:
- Gas Sensor (MQ-2) konfigurieren und auslesen
- Luftdrucksensor BMP180
- GPS Ortungssystem
- Pulsmesser: Herzfrequenz messen
- Bodenfeuchtigkeit
- Waage mit Gewichtssensor HX711
- uvm.
Auch in Projekten wie dem automatischen Gewächshaus kann das Datenloggen nützlich zur Überwachung sein.
Als Sprache nutze ich übrigens in diesem Tutorial ebenfalls Python. Du kannst auf die SQL Datenbank aber auch mittels jeder anderen Programmiersprache bzw. Umgebung (PHP, Node.JS, etc.) zugreifen.
Installation
Beginnen wir mit der Installation der benötigten Pakete. In einem vorherigen Tutorial, welches die Webserver Einrichtung betraf, haben wir bereits einmal MySQL installiert. Sofern du weitere Informationen möchtest, kannst du dir jenes Tutorial einmal ansehen.
Ansonsten beginnen wir von Null mit der Installation aller Softwarepackages. Öffne ein Terminal:
sudo apt-get install mysql-server python-mysqldb --yes
Du wirst nach einem Passwort gefragt:
Vergib hier ein sicheres Passwort und merke dir dies. Wir benötigen es später, um uns mit der Datenbank zu verbinden.
Exkurs: Was sind Datenbanken / Tabellen?
Falls du damit noch nicht all zu sehr vertraut bist, hier eine kurze Erläuterung zu Datenbanken und Tabellen: Unsere Daten (IDs, Uhrzeiten, Texte, Zahlen, usw.) werden in eigenständigen Tabellen gespeichert. Ein Eintrag einer solchen Tabelle hat einen definierten Aufbau (bspw. eine ID, ein Datum und einen Wert). Da lauter solcher Einträge gespeichert werden, definiert man eine Tabelle mit jenen Spalten.
Nun kann man verschiedenene Tabellen haben, die zum gleichen Projekt gehören. Diese können auch in gewisser Weise untereinander verknüpft sein. Um diese Tabellen unter einen Hut zu bringen, definiert man sog. Datenbanken, welche viele verschiedene Tabellen enthalten.
Konkretes Beispiel gefällig? Angenommen wir haben zwei kleine Projekte mit einem DHT22 (Wetterstation, Überwachungssensor im Haus) auf unserem Raspberry Pi laufen. Beide Projekte sollen die gleichen zwei Tabellen haben und zwar mit folgenden Spalten:
- Temperaturtabelle: ID, Datum, Uhrzeit, Temperaturwert (in °C)
- Feuchtigkeitstabelle: ID, Datum, Uhrzeit, Luftfeuchte (in %), Kommentar (optimal)
Wir würden also zunächst zwei separate Datenbanken (haus, wetterstation) anlegen und in jede dieser die beiden oben genannten Tabellen. Die Daten würden wir dann in der entsprechenden Datenbank und Tabelle ablegen.
Wie dir bestimmt aufgefallen ist, sind die Datentypen auch unterschiedlich. In einem ID-Feld wird normalerweise immer nur eine Ganzzahl gespeichert, wohingegen ein Kommentar einen längeren Text enthält. Aber auch bei Zahlwerten gibt es Unterschiede. Bei einer ID möchten wir keine Nachkommastellen, bei der Angabe in Prozent hingegen schon. All diese Datentypen müssen bei der Erstellung einer SQL-Tabelle angegeben werden.
Genug der Worte. Legen wir los.
Einrichtung – Erstellen der Datenbank + Tabellen
Nachdem alles installiert wurde, können wir uns per MySQL-Client direkt per Kommandozeile verbinden. Dazu reicht folgendes:
mysql -u root -p
Gib nun das gewählte Passwort ein. Danach kannst du bereits beliebige SQL Kommandos eingeben.
Wir starten anschließend damit, indem wir eine neue Datenbank (nehmen wir das Beispiel von oben: haus) anlegen:
CREATE DATABASE haus;
Anschließend können wir die Tabellen erstellen. Bevor wir das tun, müssen wir aber noch angeben, welche der (unter Umständen vielen) Datenbanken wir in dieser Session verwenden. Das geht mit:
USE haus;
Nun geht es ans Erstellen. Ich werde in diesem Beispiel nur die erste Tabelle vom obrigen Beispiel anlegen, da das äquivalent abläuft.
CREATE TABLE temperatur_tb ( id int NOT NULL AUTO_INCREMENT, datum DATE, uhrzeit TIME, wert FLOAT, PRIMARY KEY(id) );
Nun haben wir die Struktur erstellt, aber die Tabelle hat noch keine Einträge. Dies werden wir gleich mittels dem SQL Befehlt Insert ändern. Natürlich ist es auch möglich direkt per MySQL-Shell die Daten einzutragen, aber normalerweise soll dies ja automatisiert ablaufen, weshalb ich die Nutzung per Python Skript in diesem Tutorial zeige.
Um aus dem MySQL Terminal zurück zur normalen Bash zu kehren, reicht es exit
einzugeben.
Raspberry Pi Datenlogger für Temperatur und analoge Werte
Als Beispiel nehmen wir wieder einen DHT22 Sensor, mit dem wir Temperatur und Luftfeuchte messen können. Mit ein wenig Anpassung des Skriptes kannst du auch jeden anderen Sensor verwenden. Ich gehe davon aus, dass die Adafruit Bibliothek zum Auslesen des DHT22 bereits installiert und angeschlossen ist (GPIO4).
Zunächst erstellen wir eine neue Datei:
sudo nano temp_logger.py
Hier kommt folgendes hinein (mit STRG+O speichern):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/bin/env python import Adafruit_DHT import MySQLdb sensor = Adafruit_DHT.DHT22 pin = 4 db = MySQLdb.connect("localhost", "root", "passwort", "haus") curs=db.cursor() try: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) curs.execute ("INSERT INTO temperatur_tb (datum, uhrzeit, wert) VALUES (CURRENT_DATE(), NOW(), %.2f);" % temperature) db.commit() print("Done") except: print("Error. Rolling back.") db.rollback() |
Die Angaben in Zeile 7 musst du entsprechend anpassen (ggf. User, Passwort, Datenbankname). Falls du einen DHT11 verwendest, musst du ebenfalls Zeile 5 anpassen.
Besonders die Zeile 12 ist interessant. Hier wird einfach ein SQL-Query ausgeführt. In diesem Fall führt es dazu, dass ein neuer Eintrag in der oben erstellen Tabelle mit den nachfolgend angegeben Werten angelegt wird.
Führen wir die Datei nun aus:
sudo python temp_logger.py
Sofern alles geklappt hat, können wir die Daten auch auslesen. Entweder wir verbinden uns wie oben wieder zur MySQL Shell, oder führen den SQL Befehl per Python aus:
SELECT * FROM temperatur_tb;
Per SQL-Terminal ergibt es eine solche Ausgabe:
mysql> SELECT * FROM temperatur_tb; +----+------------+----------+---------+ | id | datum | uhrzeit | wert | +----+------------+----------+---------+ | 1 | 2017-08-23 | 20:59:15 | 23.30 | +----+------------+----------+---------+ 1 row in set (0.00 sec)
Du kannst auch über Python über die Einträge eines Queries iterieren. Der relevante Teil (abgesehen von Verbindung, etc.) sähe so aus:
1 2 3 4 |
curs.execute ("SELECT * FROM temperatur_tb") for entry in curs.fetchall(): print("Gemessene Temperatur am {0} um {1} war {2}°C".format(entry[1], entry[2], entry[3])) |
Mehr Informationen zum dem Python-MySQLdb Paket, findest du hier. Falls du mehr über (My)SQL erfahren möchtest, so ist ein Blick in die offizielle Dokumentation sicher ein guter Ratgeber.
Daten online visualisieren
Nun wirst du vielleicht denken, dass bei ThingSpeak die Daten doch direkt auch visualisiert angezeigt wurden. Das ist richtig und kann natürlich auch auf unserem Raspberry Pi geschehen. Hierbei könntest du entweder ein Python Programm mit GUI erstellen oder aber – falls die Daten auch von einem anderen Computer leicht abrufbar sein sollen – über einen Webserver.
Es gibt dafür verschiedene Varianten, wie beispielweise Node.JS. Alternativ könnte auch ein Apache2 Server mit PHP installiert werden.
Darüber hinaus gibt es unterschiedliche Javascript Bibliotheken wie bspw. ChartJS, welche zum Visualisieren genutzt werden können. Andernfalls ist es auch möglich HTML Canvas zum Anzeigen zu verwenden.
44 Kommentare
Servus Felix,
Vielen Dank für die vielen hilfreichen Tutorials.
Hier bleibt ein Punkt unberücksichtigt, nämlich die begrenzten Schreibt Klebeband der SD-Karte.
Durch die vielen Datenbank Schreibzugriffe sinkt die Lebensdauer der Karte deutlich. Mir ist es schon passiert, das meine Wetterstation nach 2Jahre auf Grund dieses Fehlers nicht mehr wollte.
Daher ggf. die DB auf einen USB-Stick, etc Auslagerung.
Grüße
Flo
Danke, das ist ein guter Punkt!
Ein USB-Stick verhält sich nicht wirklich besser als eine SD Karte und ist intern auch gar nicht so unterschiedlich, bis auf die direkte USB Wandlung, die aber bei der Schreibrate keine Änderungen bringt.
Es gibt genug Firmen, die SQLite DBs auf embedded Systemen auf SD Karten laufen lassen und sich dazu vielleicht ein paar selektierte Sandisks geben lassen. Sandisk verkauft etwas bessere SDKarten indem sie etwas mehr testen/selektieren an Firmenkunden bzw. gegen Aufpreis, aber die normalen „können“ ähnlich gut/schlecht sein.
Lange Rede: Natürlich dürfen auf so einem System keine lebensnotwendigen Daten liegen oder das System darf nicht selbst essentieller Teil einer kritischen Lösung sein. Aber für normale Anwendungen ist das kein Problem, also bei einer Wetterstation hätte ich keine Bedenken und wenn es nur zwei Jahre gehalten hat, ist etwas Pech dabei.
Ich habe ein Raspberry seit Jahren laufen, der alle 5min Werte wegschreibt und bisher noch nie einen Ausfall der SD Karte erlebt.
Auch von mir zuerst einen Dank für die Arbeit. Ich habe solch einen Datenlogger schon seit Jahren laufen, musste aber sehr schnell feststellen, dass es ohne Festplatte nicht funktioniert, da bereits nach 3 Monaten die SD zerschossen war.
Moin Felix und Flo !
Ist die Problematik bei USB nicht ähnlich ?
Meien Idee wäre eher, einen RAM-Baustein dazwischen zu schalten, der zum Beispiel 100 Datensätze und nach den 100 Messungen werden diese Daten in einem Rutsch auf die SD-Karte geschrieben …
Das würde die Schreibzugriffe auf die SD-Karte deutlich verringern.
Gruß, Andreas
Warum schließen Sie ein USB Platte an der RPi. Spart ein Menge SD Zugriffe – insbesondere
für DB Zugriffe oder Daten die oft ändert?
Sali Felix.
Betrachte deinen Blog schon lange. Jeweils Top-Leistung. Mache weiter so.
Zu diesem Tutorial habe ich einen kleinen Zusatz.
Die Administration der DB geht mit phpmyadmin easy und auch das „anschauen“ der Daten ist komfortabler.
Selber habe ich mehrere Anwendungen im Einsatz welche auf die mySQL-DB zugreifen (Wetterstation, zur Speicherung aller Werte, ein Ausschnitt inkl. Verdichtung fürs Internet geht über Rrd | div Sensor Werte (Zustand) | Zustände vom Pi selber)
Gruss Dani
Hallo Daniel,
da hast du Recht und ich habe auch bereits früher ein Tutorial dazu geschrieben, nur wollte ich es möglichst kurz halten.
hallo,
ich würde eher auf eine sqlite db zurückgreifen.
aktuelle daten in den ram und die älteren daten dann auf die sd karte, einmal am tag umspeichern.
Hallo,
mySQL auf der SD-Karte ist wohl eher sub-optimal. USb-Stick oder USB-Drive sind da eindeutig vorzuziehen.
Fürs Datalogging gibt es sogenannte round-robin-datenbanken, die sind für ein Langzeitlogging sehr viel geeigneter, da die Temperaturunterschiede zwischen zwei Dekundenmessungen von vor einem Jahr niemanden mehr wirklich interessieren. Die Granularität der Daten wird mit zunehmendem Alter der Daten immer unwichtiger.
Deshalb lohnt sich ein näherer Blick auf das rrdb-tool (apt-get rrdtool) wobei auch hier die USB-Speicherung klar vorzuziehen ist.
@Felix – eventuell ein Thema für ein weiteres deiner tollen Tutorials.
Hallo Felix,
erstmals großes lob für deine tutorials – mach weiter so.
ich wollt nun die erstellte python-Datei ausführbar machen. Sobald die ausführbare Datei gestartet wird funktioniert diese nicht korrekt und die Fehlermeldung wird ausgegeben.
Wenn ich die Datei über den Interpreter starte funktioniert alles problemlos.
Wüsstest du da eine Lösung? Ist das nur bei mir so?
Vielen Dank!!!!
Kannst du die Fehlermeldung mit angeben?
Hallo,
gutes Tutorial! Danke dafür!
aber eine Frage…. nachdem ich das mySQL Paket installiert hatte
sudo apt-get install mysql-server python-mysqldb –yes
wurde ich nach keinem Passwort gefragt?
Nun kann ich mich nicht verbinden da ich kein Passwort habe?
Problem gelöst
siehe hier:
https://wiki.debian.org/de/MySql
bei dem Punkt
Wiederherstellung des root-Passworts
hmm gleich noch eine Frage….
ich kann nur mit „sudo“ eine Verbindung zur erstellten Datenbank aufbauen… Ist das normal? bzw. mir erschließt sich der Sinn dahinter nicht? Und wie kann ich das ändern?
Datenbank Befehle dürfen nur von Administratoren ausgeführt werden (entweder vor jedem Befehl ein sudo oder einmalig „sudo bash“).
Danke für dein Tutorial, habe es benutzt um mich ein bisschen in das Thema Daten loggen einzuarbeiten.
Dabei ist mir aufgefallen, dass du in deinem Python-Script in Zeile 5 folgendes stehen hast:
sensor = Adafruit_DHT.DHT11
Dabei verwendest du ja – so steht es zumindest im Text – einen DHT22 Sensor. Richtig wäre daher:
sensor = Adafruit_DHT.DHT22.
Bin darauf gekommen, weil ich immer den Wert „0“ in die SQL-Datenbank bekommen habe.
Hallo Jo,
danke für den Hinweius – du hast natürlich Recht 🙂 Ich hatte beide Sensoren ausprobiert und danach vergessen es zu ändern. Passt nun wieder.
LG, Felix
Grüß dich,
ich habe ein Problem mit dem Skript und hoffe du kannst mir helfen. Ich habe die MariaDB und das erstellen der Datenbank hat super geklappt. Aber beim Python Skript funktioniert etwas nicht.
Bekomme die folgende Fehlermeldung:
„Tracebook (most recent call last):
File „temp-logger.py“ , line 3, in
import mysql.connector as mariadb
ImportError: No module named mysql.connector“
Vielen Dank schon mal für deine Hilfe
Gruß
Thomas
Moin Felix,
Mehr ist nicht nötig??
Dumme Frage :Was ist/bedeutet pip??
pip ist der Python Installationsmanager womit man Pakete installieren kann.
Moin Felix,
und noch eine Frage.
Ich wollte auch noch die Feuchtigkeit in einer Datenbank schreiben lassen. Den Table habe ich angelegt.
Jetzt war ich so dumm und habe ins Skript folgende Zeile eingefügt:
curs.execute („INSERT INTO humidity_tb (datum, uhrzeit, wert) VALUES (CURRENT_DATE(), NOW(), %.2f);“ %humidity)
Leider hat es nicht funktioniert:
„Error. Rolling back.“
Wo ist mein Fehler?
Danke mal wieder
Hi,
vielleich mal als Lösungsansatz (Beide Werte in _eine_ Tabelle):
curs.execute („INSERT INTO sensor_01 (Datetime, Temperature, Humidity) VALUES (NOW(), %.2f, %.2f);“ % (temperature, humidity))
Vielen Dank Gimpelstein,
hat funktioniert.
was ist wenn ich nicht beide werte in einer tabelle haben möchte? muss doch auch so gehen
Da fällt mir noch eine Frage ein:
ich möchte das alle 40 Minuten ein Wert aufgezeichnet wird.
Aber wie mach ich das ohne einen Eintrag in der Crontab zu schreiben.
Habe es mit try -> while(True):
nach dem Eintrag in der DB mit
db.commit()
time.sleep(2400)
print(„Done“)
probiert. Aber das funktioniert nicht.
print(„Done“)
Was genau funktioniert nicht? Das Schreiben in die DB? Sicher, dass es nicht am Query etc. liegt, denn genau so sollte es funktionieren. Du musst natürlich jedes mal das Query neu setzen.
Grüß dich Felix,
das Skript läuft! Die Daten werden ausgelesen und in die Datenbank geschrieben. Ich habe jetzt versucht eine Schleife einzubauen, damit alles 45 Minuten ein werde in die Datenkank kommt. Dies habe ich nicht erfolgreich geschafft.
Woran hing es? Warum nicht per Cronjob?
NOW() durch CURRENT_TIME() tauschen verhindert eine „truncated data“ Warnung…
Sobald ich die Datei „temp_logger.py“ starte wird mir „[…] _mysql_exceptions.OptionalError: (1049, „Unknown Database ‚haus'“)“ angezeigt. Was soll ich tun?
Du solltest die Datenbank „haus“ erst einmal erstellen, wie beschrieben.
Hallo, super Tutorium! Ich habe allerdings ein Problem. Das python script gelangt bei mir nur bis zu Curs.execute (…) (also führt diese Zeile nicht mehr aus) und dann erhalte ich immer ein „Error, Rolling back“. Woran könnte das liegen?
Ok, Habe das Problem gefunden. Anscheinend gibt der Sensor nicht immer einen Wert zurück, sodass ich eine while Schleife eingebaut habe, die solange läfut bis ein wert erfasst wird und die temperature nicht vom Typ None ist.
Moin, wo muss ich die While Schleife einbauen und soll da was hinter stehen? wie z.B.
While temperature != None ?
weil so hab ich das probiert aber es will einfach nicht. 🙁
Hallo, eine Frage hab ich da, in welches Verzeichnis soll die „temp_logger.py“ denn erstellt werden? Das ist hier nirgends erklärt oder kann ich die in jedes beliebige Verzeichnis schreiben?
MfG
So ich hab es einfach mal ins homeverzeichnis geschrieben und hat soweit auch alles Funktioniert…. Aber ich bin gerade dabei haufen Geld zum Fenster raus zu schmeißen! Zum einen wird man hier und auch in sehr vielen anderen Tutorials animiert mit zu machen, aber leider stößt man da sehr schnell an seine eigenen Grenzen, und seien es nur die fehlenden englisch Kenntnisse. Nachdem das Projekt „Wetterstation mit OpenHAB 2“ bei mir gescheitert ist, dachte ich mir, gehe ich zum nächsten, die Daten in eine MySQL DB einzulesen. Gut das war nicht weiter schwierig nach der hier aufgeführten Anleitung. Aber was mich an diesem Tutorial stört, wie zum Teufel bekomme ich die Luftfeuchte werte in die DB? Des weiteren wie kann ich im Anschluß die Daten aus der DB graphisch in einer lokale Website aufrufen? Zwei gravierende Dinge, wo ich ernsthaft überlege alles an gekauften Sensoren, und das ist eine Menge, in den Müll zu werfen! Einmal eine komplette Anleitung zu finden ohne Verlinkung auf andere Seiten oder Projekte, ist schier unmöglich. Und dann sind da noch die ganzen Bücher, welches man nun für seine Wünsche braucht ist auch schwer zu ermitteln, einfach alle kaufen, ist mit Abstand die schlechteste Lösung, kostet nur haufen Geld und tut der Umwelt eh nicht gut.
Für eventuelle Lösungsvorschläge wäre ich Euch sehr Dankbar.
Was hab ich eigtl. vor: messen von Luftdruck, Luftfeuchte, Temperatur, Bodenfeuchte, Blattfeuchte wenn möglich Wind und Niederschlag. Das ganze sollte schon für Langzeitaufzeichnung auf nem lokalen Webserver mit DB laufen.
MfG
Hallo,
ich habe etwas ähnliches vor, will aber die Datenbank nicht auf dem Raspberry installieren sondern auf einem NAS.
Das hat den Vorteil das die SD geschont wird und ich kann z. Bsp. für Hausautomation von verschiedenen Raspis darauf zugreifen und steuern.
Ich habe leider nicht viel darüber gefunden wie ich mit Python auf MariaDB’s zugreifen kann die auf einem anderen Server liegen.
Hat da jemand Infos zu?
Moin moin,
ich möchte gerne mehrere DS18B20 auswerten und in der Datenbank speichern, allerdings komme hier jetzt nicht weiter. Wo muss ich die Fühleradressen mit den Fühlernamen eingeben?
hi Felix, hi all
ich habe eine Frage betreffend MySQL/MariaDB
die Tatsache, dass es problematisch ist, auf die SD-Karte zu schreiben
dafür habe ich eine SSD (240GB) installiert (Raspi Raspian-Stretch – /media/pi/mydisk)
die SSD ist lese- und beschreibbar, auch von extern
es ist mir nicht möglich, heraus zu finden, wie man mysql anweist, die Database und Tables dort zu speichern
ich kann lediglich feststellen, dass die DATABASE und die TABLES vorhanden sind, aber nicht dort, wo ich sie gerne haben möchte
ich hoffe, dass mir da jemand weiter helfen kann
meinen besten Dank im voraus
Max
Hey, erstmal super Tutorial wie immer 🙂
Vielleicht hatte/hat der ein oder andere ja das selbe Problem wie ich. Wenn ich versucht habe mein Passwort nach dem Befehl mysql -u root -p einzugeben kam der Error: ERROR 1698 (28000): Access denied for user ‚root’@’localhost‘ . Dies lässt sich ganz einfach beheben in dem man ein „sudo“ davor setzt also : „sudo mysql -u root -p “ (Natürlich ohne Anführungszeichen ;)). Es ist nichts großes aber falls jemand das gleiche Problem haben sollte , weis er jetzt wie er es behebt.
Ich hoffe ich konnte helfen:)
sudo apt-get install mysql-server python-mysqldb –yes.
Bei mir wird mysql-server nicht erkannt: stattdessen wird folgendes empfohlen: mariadb-server-10.0. Dabei wird aber kein Password verlangt.
Hallo,
Ich habe sehr wenig Ahnung von Rasperry, daher meine Frage an Euch: in einem großen Kugellager werden Abstände gemessen. Der an die Sensoren (3 insgesamt) angeschloßene Datenlogger hat keinen Speicher, sondern schickt die Messdaten per Handynetz an einen Server. Jetzt haben wir einen Fall wo weder ein Handynetz noch Internet vorhanden sind. Wir wollen daher die Daten speichern und in bestimmten Intervallen (wöchentlich oder monatlich) abrufen wollen. Kann man hier einen Rasperry verwenden und gibt es evtl. schon eine fertige Konfiguration?