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

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von Pepe1907 »

Habe das Skript jetzt wie folgt am laufen

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__':
        while True:
            distanz = entfernung()
            print (" %.1f cm" % distanz)
            GPIO.cleanup()

DIese Fehlermeldung erhalte ich im Openhab.log

Code: Alles auswählen

2020-07-11 21:22:46.828 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Teichstand': For input string: "110.7 cm

Traceback (most recent call last):

  File "/etc/openhab2/scripts/hc.py", line 44, in <module>

    distanz = entfernung()

  File "/etc/openhab2/scripts/hc.py", line 18, in entfernung

    GPIO.output(GPIO_TRIGGER, True)

RuntimeError: Please set pin numbering mode using GPIO.setmode(GPIO.BOARD) or GPIO.setmode(GPIO.BCM)

Traceback (most recent call last):

  File "/etc/openhab2/scripts/hc.py", line 44, in <module>

    distanz = entfernung()

  File "/etc/openhab2/scripts/hc.py", line 18, in entfernung

    GPIO.output(GPIO_TRIGGER, True)

RuntimeError: Please set pin numbering mode using GPIO.setmode(GPIO.BOARD) or GPIO.setmode(GPIO.BCM)"
Also so sieht die Konsole aus nach händischer Ausführung

Code: Alles auswählen

[17:08:52] openhabian@openhab:~$ sudo python /etc/openhab2/scripts/hc.py
[sudo] Passwort für openhabian:
 110.6 cm
Traceback (most recent call last):
  File "/etc/openhab2/scripts/hc.py", line 44, in <module>
    distanz = entfernung()
  File "/etc/openhab2/scripts/hc.py", line 18, in entfernung
    GPIO.output(GPIO_TRIGGER, True)
RuntimeError: Please set pin numbering mode using GPIO.setmode(GPIO.BOARD) or GPIO.setmode(GPIO.BCM)

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

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von udo1toni »

Warum hältst Du Dich nicht an den von mir geposteten Code? Die Zeile

Code: Alles auswählen

while True:
muss aus dem Script raus! Unbedingt! Auf jeden Fall! Das Script darf nicht in einem Endlosloop laufen.

Alternativ kannst Du auch auf exec als Binding verzichten und das Script so umbauen, dass es die Daten aktiv an openHAB schickt (ob nun, wie oben beschrieben, über mqtt, über die REST API oder ein HTTP-Telegramm).
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: 11. Jul 2020 21:54 Warum hältst Du Dich nicht an den von mir geposteten Code? Die Zeile

Code: Alles auswählen

while True:
muss aus dem Script raus! Unbedingt! Auf jeden Fall! Das Script darf nicht in einem Endlosloop laufen.

Alternativ kannst Du auch auf exec als Binding verzichten und das Script so umbauen, dass es die Daten aktiv an openHAB schickt (ob nun, wie oben beschrieben, über mqtt, über die REST API oder ein HTTP-Telegramm).
Vielen Dank es klappt alles. Auch die string to number rule.
Genial bist du. Danke für deine Geduld und deine Mühe

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

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von udo1toni »

:) gerne
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: 11. Jul 2020 22:38:) gerne
Ist es gewollt dass ich alles nochmal in einem Beitrag zusammenfasse damit jemand direkt alles auf einem Blick hat?

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

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von udo1toni »

Musst Du nicht, aber wenn Du gerne möchtest, kannst Du natürlich gerne :)
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 »

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
        
}
Zuletzt geändert von Pepe1907 am 13. Jul 2020 20:05, insgesamt 1-mal geändert.

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

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von Pepe1907 »

Bevor ich das Thema abschließe, möchte ich noch wissen ob ich Fehlmessungen ignorieren kann, z.B. wenn der neue Wert zum alten Wert eine Abweichung von mehr als 1cm hat oder X%. Diesen Wert dann nicht zu speichern und auf den nächsten zu warten?

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

Re: Ultraschallsensor in OpenHAB intigrieren

Beitrag von udo1toni »

Machbar ist viel :)

Das Problem hier ist, dass die Persistence ja automatisch jeden Wert speichert. Das Ignorieren von Werten ist an dieser Stelle erst mal nicht vorgesehen. Man könnte natürlich mit einem Proxy Item arbeiten, dieses persistieren und dann in einer Rule dieses Item nur aktualisieren, wenn die Messung korrekt erscheint.

Nur ist das halt reichlich kompliziert.
Die wesentlich bessere Variante wäre, das Script dahingehend umzubauen, dass es die auf Plausibilität prüft und erst anschließend an openHAB weiter gibt.
Dazu muss das Script aber dauerhaft laufen, als Dienst.

Das hört sich jetzt schlimm an, ist es aber gar nicht. Man könnte z.B. Das Ausgangsscript (also mit der Ausgabe alle 20 Sekunden) unverändert als Dienst laufen lassen, ein Dienst ist ja nur ein Programm, welches beim Rechnerstart automatisch gestartet wird und keine Eingaben entgegennehmen muss. Wir landen also wieder bei der Variante über mqtt oder ein anderes Verfahren (mqtt ist dabei aber die einfachste Variante, welche sich am elegantesten umsetzen lässt).

Dazu muss ich aber mal kurz nachdenken... ;)


Gesendet von iPad 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 »

Au weia. Das ist zu viel Arbeit für zu wenig nutzen. Da wir den Wert nur nehmen um den Teichstabd zu überwachen. Vielen lieben Dank nochmal

Gesendet von meinem SM-G981B mit Tapatalk


Antworten