Seite 7 von 11

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 11. Jul 2020 21:24
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)

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 11. Jul 2020 21:54
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).

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 11. Jul 2020 22:10
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

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 11. Jul 2020 22:38
von udo1toni
:) gerne

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 11. Jul 2020 22:39
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?

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 11. Jul 2020 22:41
von udo1toni
Musst Du nicht, aber wenn Du gerne möchtest, kannst Du natürlich gerne :)

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 13. Jul 2020 20:02
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
        
}

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 13. Jul 2020 20:04
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?

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 13. Jul 2020 20:19
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

Re: Ultraschallsensor in OpenHAB intigrieren

Verfasst: 13. Jul 2020 20:22
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