Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Alle Infos und Tipps speziell zu openHAB 2

Moderatoren: seppy, udo1toni

Benutzeravatar
peter-pan
Beiträge: 338
Registriert: 28. Nov 2018 12:03
Wohnort: Schwäbisch Gmünd

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von peter-pan » 1. Jun 2019 12:04

Wie Udo schon anmerkte, solltest du das Anlegen von Items nach Möglichkeit etwas strukturierter anpacken.

Die Fehlermeldungen, die du imLoggger siehst:

Code: Alles auswählen

wenn ich in /var/log/openhab2/openhab2.log schauen sehe ich das:
nach Beitrag von oben:
019-05-30 09:36:53.826 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Arbeitszimmer_Humidity' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:36:53.831 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Arbeitszimmer_Humidity' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:36:53.835 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Arbeitszimmer_Humidity' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:44:14.482 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text



gehört zum neuen Beitrag (änderung)
019-05-30 09:55:37.995 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:55:37.998 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'UG_waschkeller' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:55:38.000 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'UG_waschkeller' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:55:38.002 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'UG_waschkeller' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:55:38.005 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:55:38.007 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'GF_Balcony' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:55:38.009 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'GF_Balcony' for widget org.eclipse.smarthome.model.sitemap.Text
2019-05-30 09:55:38.011 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'GF_Balcony' for widget org.eclipse.smarthome.model.sitemap.Text
kommen daher, dass diese Items nirgends (weder PaperUI noch .items-File) angelegt sind. Das solltest du mal überprüfen.

croix-aigle
Beiträge: 8
Registriert: 20. Mai 2019 08:40

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von croix-aigle » 3. Jun 2019 18:20

Danke für die Info.

Wie heist es, ich sehe den Wald nicht vor lauter Bäumen.

Ich habe jetzt einfach mal die Werte von udo1toni eingefügt, passiert nichts. Weil meine fehler noch weiter im Items usw nicht richtig sind.

Da mir das aktuell komplex vorkommt und ich mit openhabian erst recht am Anfang stehe, gibt es ein Buch, wo ich über diese Sachen wie Bauteile einbinden und das unter Paper UI anzeigen lassen kann? Mit dem Buch Smart Home mit openhab2 von Marianne Spiller ist nicht dafür gut geeignet.

Und einfach die Lösung bekommen rein kopieren erweitern. Möchte ich auf der einen Seite auch nicht. Außer es wäre damit ein guter Anfang für mich

Benutzeravatar
peter-pan
Beiträge: 338
Registriert: 28. Nov 2018 12:03
Wohnort: Schwäbisch Gmünd

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von peter-pan » 3. Jun 2019 23:01

Bitte nicht aufgeben. Es ist gar nicht so schwierig.
Am Anfang ist das Item. Das verbindest du mit einem Channnel. Das Ergebnis siehst du dann in der Sitemap. (easy). Das ganze basiert natürlich auf dem Item-Namen.
Es gibt natürlich auch andere Möglichekeiten um einen Wert in ein Item zu bringen, z.B. mit einer Regel oder mit einer Regel/Script über einen Kanal. Es nutzt also nichts nur zwei Items zu definieren, die müssen ja mit einander kommunizieren.
Deshalb kommt auch die Info (ERROR) in der Sitemap. Du hast keine Item definiert, das du in der Sitemap sehen möchtest. Das musst du erst mal definieren.
Um das Ergebnis dann zu sehen musst du es auch erst mit einem Wert befüllen. Das kann dann wiederum über eine Regel sein, oder aber ganz einfach das "Original-Item". Das bedeutet, dass du einfach den Item-Namen, den du in deinem .items-File(oder PapuerUI) definiert hast in deinem Sitemap-File eintragen musst.
Ich kenn mich mit Python, usw. nicht aus. Ich würde einfach mal so anfangen und sehen, ob ich in der Sitemap ein Ergebnis sehe (und/oder im Logger), wenn ich das Ergebnis für den Wert "temperature_out" sehen kann. D. h. du musst dieses Item auch in der Sitemap definieren, z.B. so:

Code: Alles auswählen

Text item=temperature_out
oder so

Code: Alles auswählen

Default item=temperature_out
so wie du das auch in deinem .items-File angelegt hast.

Das mit der Umwandlung von einem String- in einen Number-Wert kannst du dann immer noch machen.

croix-aigle
Beiträge: 8
Registriert: 20. Mai 2019 08:40

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von croix-aigle » 10. Jun 2019 16:31

da ich keinen Ansatz habe, fellt es mir recht schwer, die zusammenhänge zu finden.
selbst wenn ich die daten auf einen anderen Py draufsetze und gewisse parameter verendere. Kommt logischwerweise nichts.
Der Log zeigt das an:
2019-06-10 15:25:46.562 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'onewiregpio.items'
2019-06-10 15:28:07.742 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'onewiregpio.things'
2019-06-10 15:29:29.580 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'haus.sitemap'
2019-06-10 15:54:43.668 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'haus.sitemap'
2019-06-10 15:54:43.799 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text
2019-06-10 15:54:43.803 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'temperature_out' for widget org.eclipse.smarthome.model.sitemap.Text
2019-06-10 15:54:43.806 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'temperature_out' for widget org.eclipse.smarthome.model.sitemap.Text
2019-06-10 15:54:43.808 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'temperature_out' for widget org.eclipse.smarthome.model.sitemap.Text
2019-06-10 16:01:01.216 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'dht22.items'
2019-06-10 16:01:02.347 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'dht22.items'
2019-06-10 16:09:51.729 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'haus.sitemap'
2019-06-10 16:19:43.026 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'dht22.things' has errors, therefore ignoring it: [1,166]: mismatched input '$' expecting '='
[2,1]: missing ']' at 'Thing'
[2,166]: mismatched input '$' expecting '='
[2,167]: mismatched input '<EOF>' expecting ']'

2019-06-10 16:19:44.088 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'dht22.things' has errors, therefore ignoring it: [1,166]: mismatched input '$' expecting '='
[2,1]: missing ']' at 'Thing'
[2,166]: mismatched input '$' expecting '='
[2,167]: mismatched input '<EOF>' expecting ']'

2019-06-10 16:21:51.691 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'dht22.things' has errors, therefore ignoring it: [1,156]: mismatched input '$' expecting '='
[2,1]: missing ']' at 'Thing'
[2,156]: mismatched input '$' expecting '='
[2,157]: mismatched input '<EOF>' expecting ']'
wenn ich klein anfangen soll, was wäre da die grundschritte?

Benutzeravatar
udo1toni
Beiträge: 1673
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von udo1toni » 13. Jun 2019 13:40

Der erste Schritt wäre, sicherzustellen, dass der Sensor funktioniert. das heißt, Du siehst, dass auf Hardwareseite ein Wert geschickt wird. Wo ist der Sensor angeschlossen?
der zweite Schritt ist dann, diesen Wert auszulesen. Falls es für die verwendete Hardware kein eigenes Binding gibt, kommt es drauf an, was die Hardware als Schnittstelle zur Verfügung stellt.. Falls es nur über die Kommandozeile geht, muss das Script auf der Kommandozeile konkrete Werte liefern.
Der dritte Schritt ist, sicherzustellen, dass man ein solches Script von openHAB aus erfolgreich ansteuern kann. Allgemein wird man das über das exec Binding tun.

Da es zwei verschiedene exec Bindings gibt, die Entwicklung aber nicht still steht: exec1 sollte man nicht mehr für Neuentwicklungen einsetzen, in openHAB3 wird exec1 nicht mehr funktionieren (bzw. man wird dafür eine OH1-Instanz im Hintergrund laufen lassen müssen - sehr unbefriedigend).

Da die exec-Konfiguration nicht trivial ist, sollte man schon im eigentlichen Script darauf achten, den Aufruf möglichst einfach zu gestalten. Ein einfaches Kommando ohne Parameter; Falls man mehrere Sensoren hat, die sich über das gleiche Script abfragen lassen, könnte man einen Parameter übergeben, der den Sensor auswählt.
Das Script sollte exakt einen Wert zurück liefern, ohne irgendwas sonst drumrum, keine Einheit, wenn Fließkommazahlen zurückgeliefert werden, bitte nach Möglichkeit den Punkt als Dezimaltrennzeichen nutzen (innerhalb eines Python Scripts ist das schnell mit eingebaut - auf openHAB-Seite macht es die ganze Sache nur unnötig kompliziert).

Der vierte Schritt ist, ein konkretes Thing für das Script anzulegen. Tipp: Man kann Things bequem über Paper UI anlegen, das hat den Vorteil, dass man die auszufüllenden Felder sieht.
Wartungsfreundlicher ist allerdings die Variante über eine oder mehrere things Dateien, dann aber bitte mit VSCode als Editor, VSCode bietet ein openHAB Plugin, mit welchem syntaktishce Fehler zuverlässig angezeigt werden, da das Plugin die laufende openHAB-Instanz zur Prüfung des Codes verwendet.
Fehlermeldungen ohne die bemängelte Konfiguration sind sinnfrei. Die Meldung

Code: Alles auswählen

Configuration model 'dht22.things' has errors, therefore ignoring it:
ist hier eindeutig genug. Nochmal auch hier der Hinweis: die Zitatfunktion ist für Zitate gedacht, nicht um Code, Konfigurationen oder auch Logs zu markieren, dafür gibt es die Code-Tags.

croix-aigle
Beiträge: 8
Registriert: 20. Mai 2019 08:40

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von croix-aigle » 13. Sep 2019 17:15

so, hab endlich mal wieder etwas Zeit gefunden.

Der Sensor Funktioniert, mit dem Befehl bekomme ich eine Auswertung:

Code: Alles auswählen

sudo ./AdafruitDHT.py 22 17 
GPIO 17 Pin 11

Meine Weiteren Infos sind diese hiert:
Achtung: Die Sensoren sind nur alle zwei Sekunden bereit. Achte also darauf nicht direkt jede Sekunde eine Abfrage zu starten.

Um die Raspberry Pi Luftfeuchtigkeit Bibliothek in andere (Python) Projekte einzubinden, braucht man nur folgendes:

import Adafruit_DHT
...
sensor = Adafruit_DHT.DHT11
pin = 4
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
...

Eintrag in OpenHab2

IP-Adresse:8080 ⇒ Paperui ⇒ Add-ons ⇒ Bindings ⇒ Suchen: „Exec“ ⇒ Install: „Exec Binding“

Benutzeravatar
udo1toni
Beiträge: 1673
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von udo1toni » 13. Sep 2019 18:23

Was liefert denn

Code: Alles auswählen

sudo ./AdafruitDHT.py 22 17 
zurück?

Wofür stehen 22 und 17?

Es ist in openHAB wichtig, den kompletten Pfad zum script anzugeben, außerdem sollte das exec Binding Python mit dem Script als Parameter aufrufen, das ist sauberer.

Stefan Otten
Beiträge: 64
Registriert: 11. Nov 2018 06:51

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von Stefan Otten » 13. Sep 2019 22:40

22 steht für den den Sensor DHT 22 und 17 ist der Pin, der abgerufen wird.
In der Konfiguration steht aber Pin = 4

Wenn also

Code: Alles auswählen

sudo ./AdafruitDHT.py 22 17 
funktioniert, dann muss in Deiner Konfiguration folgendes stehen:

Code: Alles auswählen

import Adafruit_DHT
...
sensor = 22
pin = 11
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
...
Grüße

Benutzeravatar
udo1toni
Beiträge: 1673
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Einbinden von DHT22 Temperatur u. Feuchtigkeitssensor

Beitrag von udo1toni » 13. Sep 2019 23:58

Soweit ich weiß, ging es darum, den Befehl von openHAB aus aufzurufen ;) und zwar per exec2 Binding.

Ich hatte das weiter oben schon mal erläutert: das exec Binding wird am besten mit keinem oder einem Parameter gefüttert. Im Gegenzug kommt dann exakt ein Wert zurück, der möglichst mit einem Punkt als Dezimaltrennzeichen verwendet, wenn denn die zurückgegebene Zahl ein Dezimalbruch ist.

exec kann sein Ergebnis nur in einem string Channel abliefern (das hängt damit zusammen, dass eben auch String als Antwort kommen könnten). Wenn man auf opeHAB-Seite also mit dem Ergebnis rechnen will, Graphen zeichnen oder sonstwie numerische Vergleiche anstellen will, muss das Ergebnis anschließend mittels Rule in ein Number Item geparsed werden.

Ein passendes Exec Thing für einen unveränderten Aufruf sähe z.B. so aus:

Code: Alles auswählen

Thing exec:command:dht22 [command="sudo /usr/bin/python /etc/openhab2/scripts/AdafruitDHT.py 22 17", interval=15, timeout=5, autorun=false]
und die passenden Items dazu wären diese hier:

Code: Alles auswählen

String MyDHT22 "[%s]" {channel="exec:command:dht22:output"}
Number dht22Temp "Temperatur [%.1f °C]"
Number dht22Hum "Luftfeuchte [%.1f %%]"
Nun muss aber die Rule nicht nur eine Zahl parsen, sondern deren zwei. Deshalb auch meine Frage nach dem Output. Grundsätzlich sieht eine Rule dann so aus:

Code: Alles auswählen

rule "parse dht22 temp and hum"
when
    Item MyDHT22 received update
then
    if(MyDHT22.state != null && MyDHT22.state.toString.contains(" ")) { // Angenommen, die beiden Werte werden durch ein Leerzeichen voneinander getrennt
        val part1 = MyDHT22.state.toString.split(" ").get(0)
        val part2 = MyDHT22.state.toString.split(" ").get(1)
        dht22Temp.postUpdate(Float::parseFloat(part1))
        dht22Hum.postUpdate(Float::parseFloat(part2))
    }
end
Immer vorausgesetzt, es kommen ausschließlich Zahlen (mit Punkt als Dezimaltrenner) in openHAB an.

sudo als Befehl verlangt normalerweise ein Passwort; um das zu umgehen, muss mittels visudo die Datei /etc/sudoers angepasst werden, damit der User openhab kein Password eingeben muss:

Code: Alles auswählen

openhab ALL=(ALL) NOPASSWORD; /usr/bin/python
Und damit reißt man natürlich ein imenses Sicherheitsloch auf, wenn openHAB jegliches Python Script mit root-Rechten starten darf.

Antworten

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 7 Gäste