Ultraschallsensor in OpenHAB intigrieren

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Ultraschallsensor in OpenHAB intigrieren

Beitrag von Pepe1907 »

Servus liebe Gemeinde,
Ich habe seit Anfang dieser Woche endlich meinen Ultraschallsensor angeschlossen und am Teich installiert.
Dieser fragt die Distanz zwischen Wasser und dem Sensor ab.
Darüber möchte ich den Teich bzw seinen Wasserstand im Auge behalten.
Über folgendes Skript kann ich per Putty die Distanz abfragen.

Code: Alles auswählen

#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
 
#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
 
#GPIO Pins zuweisen
GPIO_TRIGGER = 18
GPIO_ECHO = 24
 
#Richtung der GPIO-Pins festlegen (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
 
def distanz():
    # setze Trigger auf HIGH
    GPIO.output(GPIO_TRIGGER, True)
 
    # setze Trigger nach 0.01ms aus LOW
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)
 
    StartZeit = time.time()
    StopZeit = time.time()
 
    # speichere Startzeit
    while GPIO.input(GPIO_ECHO) == 0:
        StartZeit = time.time()
 
    # speichere Ankunftszeit
    while GPIO.input(GPIO_ECHO) == 1:
        StopZeit = time.time()
 
    # Zeit Differenz zwischen Start und Ankunft
    TimeElapsed = StopZeit - StartZeit
    # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren
    # und durch 2 teilen, da hin und zurueck
    distanz = (TimeElapsed * 34300) / 2
 
    return distanz
 
if __name__ == '__main__':
    try:
        while True:
            abstand = distanz()
            print ("Gemessene Entfernung = %.1f cm" % abstand)
            time.sleep(1)
 
        # Beim Abbruch durch STRG+C resetten
    except KeyboardInterrupt:
        print("Messung vom User gestoppt")
        GPIO.cleanup()
Ich würde jetzt gerne ein Item erstellen, welches die Abfrage in einem bestimmten Intervall abfragt.
Diesen Wert würde ich mir zudem auch gerne in der Sitemap ansehen können.

Vielen Dank für eure Unterstützung
von Pepe1907 » 13. Jul 2020 20:02
So jetzt nochmal für die Nachwelt eine Zusammenfassung.
Vielen lieben Dank gehen hier nochmal an udo1toni raus, der mir (fast) alles alleine geschrieben hat. Ohne seine Hilfe würde ich heute immer noch dumm aus der Wäsche gucken.

hc.py

Code: Alles auswählen

#Bibliotheken
import RPi.GPIO as GPIO
import time
import logging
logging.basicConfig(filename='teich.log', filemode='w', level=logging.INFO)
 
#GPIO definieren (Modus, Pins, Output)
GPIO.setmode(GPIO.BCM)
GPIO_TRIGGER = 18
GPIO_ECHO = 24
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
 


def entfernung():
    # Trig High setzen
    GPIO.output(GPIO_TRIGGER, True)
 
    # Trig Low setzen (nach 0.01ms)
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)
 
    Startzeit = time.time()
    Endzeit = time.time()
 
    # Start/Stop Zeit ermitteln
    while GPIO.input(GPIO_ECHO) == 0:
        Startzeit = time.time()
 
    while GPIO.input(GPIO_ECHO) == 1:
        Endzeit = time.time()
 
    # Vergangene Zeit
    Zeitdifferenz = Endzeit - Startzeit
	
    # Schallgeschwindigkeit (34300 cm/s) einbeziehen
    entfernung = 133 - (Zeitdifferenz * 34300) / 2
    logging.info('Skript gestartet')
    return entfernung
 
if __name__ == '__main__':
            distanz = entfernung()
            print (" %.1f" % distanz)
            GPIO.cleanup()
exec.whitelist

Code: Alles auswählen

# For security reasons all commands that are used by the exec binding or transformation need to be whitelisted.
# Every command needs to be listed on a separate line belo
sudo /usr/bin/python /etc/openhab2/scripts/hc.py
teich.things

Code: Alles auswählen

Thing exec:command:teichstand [command="sudo /usr/bin/python /etc/openhab2/scripts/hc.py", interval=15, timeout=5, autorun=false]
teich.items

Code: Alles auswählen

String 	teichstring  						{channel="exec:command:teichstand:output"}
Switch 	teichmessung 						{channel="exec:command:teichstand:run"}
Number 	teichstand2	"Wasserstand [%.1f cm]" <flow>
Number  teichchart
home.sitemap

Code: Alles auswählen

Frame label="Teich"{
	Switch item=teichauto
	Text item=teichstand2
}

Frame label="Teichstand" {Switch item=teichchart  label="Zeiteinheit" icon="time" mappings=[0="Stunde", 1="Tag", 2="Woche", 3="Jahr"]
	Chart item=teichstand2 period=h refresh=7200 visibility=[teichchart==0, teichchart=="Uninitialized"]
	Chart item=teichstand2 period=D refresh=14400 visibility=[teichchart==1]
	Chart item=teichstand2 period=W refresh=14400 visibility=[teichchart==2]
	Chart item=teichstand2 period=Y refresh=14400 visibility=[teichchart==3]
}
Jetzt kommen die ganzen Rules.
teichbefuellung.rules

Code: Alles auswählen

rule "Automatische Teichbefüllung"
when
	Time cron "0 0 8 * * ?"
then

	if (teichauto.state == ON && teichstand2.state < 110) {
		channel5.sendCommand(ON)
        	logInfo("Teich","Teichstand unter 1,10m. Teichbefüllung gestartet")
        	sendTelegram("bot1", "Teichstand unter 1,10m. Teichbefüllung gestartet")
	} 
	if (teichauto.state == ON && teichstand2.state > 110) {
		channel5.sendCommand(ON)
        	logInfo("Teich","Teichstand über 1,10m. Teichbefüllung nicht gestartet")
        	sendTelegram("bot1", "Teichstand über 1,10m. Teichbefüllung nicht gestartet")
	} 
end
teichvoll.rules

Code: Alles auswählen

rule "Teichvoll"
when
	Item teichstand2 received update
then
	if (teichstand2.state > 113 && channel5.state == ON) {
		channel5.sendCommand(OFF)
        	logInfo("Teich","automatische Teichbefüllung beendet")
		sendTelegram("bot1", "Teichbefüllung aufgrund der erreichten Wasserhöhe beendet")
	} 
end
teichstand.rules

Code: Alles auswählen

rule "Teichstand"
  when
     Item teichstring received update
    then
        teichstand2.postUpdate(Float::parseFloat(teichstring.state.toString)
      )
 
end
rrd4j.persist

Code: Alles auswählen

Strategies {
        everyMinute : "0 * * * * ?"
        everyHour   : "0 0 * * * ?"
        everyDay    : "0 0 0 * * ?"
        default = everyChange
}

Items {
		teichstand2 : strategy = everyMinute, restoreOnStartup
		teichauto : strategy= everyChange
        
}
Gehe zur vollständigen Antwort

sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von sonic »

Hallo,

ich habe eine ähnliche Lösung für meinen Heizöltank und die Regentonnen.
Der Ultraschallsensor ist hierbei an eine NodeMCU angeschlossen die mit Tasmota geflasht ist.
So kann man ganz einfach die Distanz via MQTT an Openhab senden.

Dies erschien mir die einfachste Lösung.

Wie ist ein Sensor angeschlossen?
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von udo1toni »

Kurze Frage dazu: Wie stellt ihr sicher, dass der Sensor nicht nass wird? Ich habe eine Regenwasserzisterne, die ebenfalls gemessen werden will. Wenn es allerdings richtig schüttet, kann das Wasser schon mal bis zum Deckel steigen (überschüssiges Wasser wird ausschließlich über Bodenversickerung abgeleitet, da an dieser Stelle kein Kanalanschluss vorhanden ist.)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von Pepe1907 »

sonic hat geschrieben: 27. Jun 2020 12:59 Hallo,

ich habe eine ähnliche Lösung für meinen Heizöltank und die Regentonnen.
Der Ultraschallsensor ist hierbei an eine NodeMCU angeschlossen die mit Tasmota geflasht ist.
So kann man ganz einfach die Distanz via MQTT an Openhab senden.

Dies erschien mir die einfachste Lösung.

Wie ist ein Sensor angeschlossen?
Würde ungern noch ein Modul zwischenschalten da ich dort kein WLAN in der Nähe habe.
Sensor ist direkt am raspberry angeschlossen mit 40m Kabel.

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 27. Jun 2020 15:19 Kurze Frage dazu: Wie stellt ihr sicher, dass der Sensor nicht nass wird? Ich habe eine Regenwasserzisterne, die ebenfalls gemessen werden will. Wenn es allerdings richtig schüttet, kann das Wasser schon mal bis zum Deckel steigen (überschüssiges Wasser wird ausschließlich über Bodenversickerung abgeleitet, da an dieser Stelle kein Kanalanschluss vorhanden ist.)
Habe den sensor in einer ip66 verteilerdose gelegt. Und die den sensor von außen mit silikon verfügt.
Er ist unten am steg befestigt. Heißt von oben kann kein Wasser kommen von unten wenn nur Spritzwasser. Kann dir gerne Bilder zukommen lassen.

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von udo1toni »

Auch wenn der Sensor direkt am Raspberry angeschlossen ist, führt der bequemste Weg über mqtt :) Du richtest z.B. ein Python Script ein, welches alle x Minuten eine Messung vornimmt. Das Script sichert die Messung in einer lokalen Variablen und schreibt den Wert bei Änderung über mqtt.
Alternativ kannst Du natürlich auch die REST API nutzen, aber für mqtt gibt es eine fertige Bibliothek (z.B. paho mqtt) welche das Ganze echt komfortabel macht.
Oder Du schreibst ein Script, welches Du per exec Binding ausführen lässt. Das hat aber einen gewaltigen Nachteil: exec kann ausschließlich mit Strings als Rückgabewert umgehen, und es gibt auch keine Möglichkeit, das zu umgehen. Das heißt, der Rückgabewert des Scripts wird IMMER als String entgegengenommen.
Also brauchst Du in openHAB eine separate Rule, welche den Status des String Items über NumberItem.postUpdate(Float::parseFloat(StringItem.state.toString)) in ein Number Item überführt, und diese Rule muss bei jeder Änderung triggern.
Strenggenommen musst Du noch sicherstellen, dass der String auch einen gültigen Zahlenwert repräsentiert. Falls die Zahl mit Komma als Dezimaltrenner kommt, musst Du das Komma noch durch einen Punkt ersetzen usw... Und zyklisches polling aus openHAB ist bäh. ;)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

EmptySoft
Beiträge: 188
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von EmptySoft »

Ich habe auch einen Ultraschallsensor für den Wasserstand in meinem Pool verbaut (2 Löcher in den Skimmerdeckel gebohrt und den Ultraschallsensor dort reingesteckt. Zusätzlich ist der Ultraschallsensor in einem 3d gedruckten Gehäuse, Schutz von oben falls Kondenswasser herunter tropft). Der gesamte Pool inklusive Technikraum ist in einer Halle. Allerdings habe ich immer wieder grobe Fehlmessungen, kann ich also nicht empfehlen. Habe jetzt einen Drucksensor bestellt und werde mit dem versuchen den Wasserstand zu messen. Mal sehen, ob das besser funktioneirt
BYe
Harald

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 27. Jun 2020 16:02 Auch wenn der Sensor direkt am Raspberry angeschlossen ist, führt der bequemste Weg über mqtt :) Du richtest z.B. ein Python Script ein, welches alle x Minuten eine Messung vornimmt. Das Script sichert die Messung in einer lokalen Variablen und schreibt den Wert bei Änderung über mqtt.
Alternativ kannst Du natürlich auch die REST API nutzen, aber für mqtt gibt es eine fertige Bibliothek (z.B. paho mqtt) welche das Ganze echt komfortabel macht.
Das hört sich doch vielsprechend an.
Könntest du mir da bei Erstellung des scripts und der Einbindung weiter helfen?

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von udo1toni »

Das Grundgerüst kann ich Dir gleich mal raussuchen.

Gesendet von meinem SM-G973F mit Tapatalk

openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 27. Jun 2020 20:20 Das Grundgerüst kann ich Dir gleich mal raussuchen.

Gesendet von meinem SM-G973F mit Tapatalk
Bist mit Gold nicht zu bezahlen

Antworten