Regenwassertank Füllstand anzeigen mit Raspberry Pi, Teil 2

UPDATE: neuere Version des Beitrags unter: Regenwassertank Füllstand messen mit Raspberry Pi; Version 2020

Hier der Code für eine Anzeige des Füllstands.

Wir lesen den letzten Wert aus der Datenbank aus.

 

 <?php #ini_set('display_errors', 1); #ini_set('display_startup_errors', 1); #error_reporting(E_ALL); $servername = "localhost"; $username = "regenwasseruser"; $password = "Passwort_Hier"; $dbname = "regenwasser"; $max_volume = 5853; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT volume, datetime FROM volumen order by id DESC limit 1";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$volume = $row["volume"];
$datetime = substr($row["datetime"],0,-3);
#$datetime = strtotime($row["datetime"]);
$datetime = date("d.m.Y H:i", strtotime($row["datetime"]));
$percent = round($volume / $max_volume * 100 ,2);
//if ($result->num_rows > 0) {
    // output data of each row
 //   while($row = $result->fetch_assoc()) {
 //       echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "
";
 //   }
//} else {
 //   echo "0 results";
//}
$conn->close();
?> 
<label for="fuel">Regenwassertank: </label>

<meter id="fuel" name="fuel"
       min="0" max="<?php echo $max_volume?>"
       low="2000" high="<?php echo $max_volume?>" optimum="<?php echo $max_volume?>"
       value="<?php print "$volume";?>">
    </meter>

    <?php print "$datetime <b>$percent</b>"?>%

Hier gehts zurück zu Teil 1, dem Setup des Sensors: http://bitsnbites.astrids.bplaced.net/?p=99

Weiter geht es mit dem Versuch, von der Webseite aus das python Script anzustarten.

Füllstand in Regenwassertank, Teil 0

 

UPDATE: neuere Version des Beitrags unter: Regenwassertank Füllstand messen mit Raspberry Pi; Version 2020

 

Beim Herumprobieren hab ich mir mein Raspbian zerschossen, deshalb hier die Installationsanleitung für das System, weil ich ja von vorne anfangen muss.

Raspbian ISO auf die SD-Karte, anstarten.

sudo raspi-config

Passwort und Locale ändern nach Bedarf. SSH aktivieren und Serial Zugriff deaktivieren (das kommt im Hauptteil noch einmal vor).

Danach LAMP installieren, aber ohne den FTP Teil:

https://pchelp.ricmedia.com/setup-lamp-server-raspberry-pi-3-complete-diy-guide/3/

Ftp braucht niemand, sftp funktioniert und SSH haben wir ja schon.

mysql_secure_installation

CREATE USER ‚root2’@’localhost‘ IDENTIFIED BY ‚NewPassword‘; #Hier ein eigenes Passwort vergeben!

GRANT ALL PRIVILEGES ON * . * to ‚root2’@’localhost‘  WITH GRANT OPTION;

Datenbank regenwasser anlegen, Benutzer regenwasseruser, Rechte vergeben, Tabelle Volume mit3 Spalten: id als INT mit auto_increment, datetime mit Format datetime und volume als INT.

apt-get install python-mysqldb

 

SNOM D345 Reset und Passwort

Factory Reset, also Werkseinstellungen laden, klingt ja harmlos.

Ich habe das heute bei einem SNOM D345 gemacht, und mich damit elegant ausgesperrt. Das Telefon hat sich zurückgesetzt und mich aus der Weboberfläche ausgesperrt.

Unter anderem eine komplett neue Firmware aufgespielt per http: https://helpdesk.snom.com/support/solutions/articles/6000071238-how-to-reset-a-desktop-phone-to-the-factory-defaults-via-network-recovery

Nach langem Suchen im Internet war ich schon am verzweifeln. Die üblichen Benutzername / Passwort Kombinationen haben alle nicht funktioniert.

Dann habe ich aus Verzweiflung den Netzwerkverkehr abgehorcht, und da war das Telefon richtig aktiv mit einer IP in Deutschland am plaudern.

Also erst mal die IP (109.68.97.203) in der Firewall gesperrt.

WHOIS aufgerufen, dann Firmenname und SNOM im Internet gesucht. Siehe da, da kommt was. Und dann sogar noch eine Seite gefunden mit den Passwörtern.

https://nfonag.zendesk.com/hc/de/articles/205588031-Wie-f%C3%BChre-ich-einen-Factory-Default-Reset-FDR-am-Snom-Telefon-durch-

Für mich hat dann 8746 / 8746 funktioniert.

Regenwassertank Füllstand messen mit Raspberry Pi, Teil 1

UPDATE: neuere Version des Beitrags unter: Regenwassertank Füllstand messen mit Raspberry Pi; Version 2020

Hardware:

Raspberry Pi
DYP-ME007Y

 

Software:

Am Ende wurde es: python und mysql

Vorwort zum DYP-ME007Y: hier gibt es wohl verschiedene Versionen, die beste Erklärung dazu habe ich hier gefunden: JSN-SR04T-2.0.pdf

Ich verwende die Variante ohne Widerstand, also die simple Variante.

Dazu habe ich mal ein Script zum antesten gesucht und auch gleich was gefunden.

http://town-und-country.taunustörtchen.de/ueberwachung-der-zisterne-mit-dem-raspberry-pi/

ABER: die Berechnung gilt für einen Tank der über die gesamte Tiefe einen konstanten Querschnitt hat. Mein Tank ist aber ein liegender Zylinder, was bedeutet, dass 10 cm Unterschied im Wasserstand viel mehr Volumen hat als der selbe Unterschied ganz oben oder ganz unten.

Also mal auf die Suche gemacht nach einer verwendbar einfachen Formel.
Der zweite Treffer in der Online-Suche war

Methode 3 klingt ja schon gut. Erst mal zur Kontrolle und zum Verständnis ein Beispiel gerechnet, klappt. Also rein damit in das Python Script.
Nach einem ersten Test zeigt sich: das System ist nicht zuverlässig, der Sensor misst nicht immer die gleichen Werte. Abweichungen von 20cm sind zu viel. Deshalb (um die Fehlerquelle auszuschließen) die Volt des Echo-Signals reduziert. Siehe Schaltplan im ersten Post hier: https://forum-raspberrypi.de/forum/thread/23946-dyp-me007y-ultraschall-sensormodul/?pageNo=1
Leider keine Verbesserung. Es könnte sein, dass das Script zu langsam reagiert zwischen Trigger und Echo. Ich habe kontrolliert, dass das Script nicht zu langsam ist, zwischen Trigger und Echo dreht das Script ein paar Runden in der while-Schleife.
Ich werde noch einen anderen Modus der Platine testen und einen 120K Ohm Widerstand einlöten um ein serielles Signal zu bekommen. Fortsetzung folgt…
Weiter gehts:
Widerstand eingelötet mit einem kleinen Kabel, da ein „normaler“ Widerstand mit Beinchen viel zu groß ist.
apt-get install python-serial
Disable the login shell on the serial port in the interfacing options of „sudo raspi-config“, and reboot. For B+ that may be all that is required.
Später…
Mit dem 120kOhm Widerstand habe ich es nicht geschafft die Platine zum laufen zu bringen, vorerst.
Also 47kOhm Widerstand besorgt, damit startet die Platine sofort an und sendet ununterbrochen Signale. Damit konnte ich die Verdrahtung für das Auslesen kontrollieren, Signale kommen an.
Aber es sind nicht alle Messungen richtig, darum kümmere ich mich später.
Wieder den 120kOhm Widerstand eingebaut, und endlich das Geheimnis um das 0X55 Kommando mit viel probieren gelöst. Und dann noch mehr probiert, denn nirgends ist dokumentiert, dass man noch einmal ein Kommando senden muss um die Platine wieder zu deaktivieren.
Dann einen Codeblock gebaut, der Werte die zu weit außer dem Mittelwert sind verwirft und noch einmal einen neuen Mittelwert bildet.
Dann ein Codeblock der die komplette Messreihe verwirft wenn das Ergebnis nicht plausiebel ist, also außerhalb der Größe des Tanks.
Dann ein Code der vom Abstand umrechnet auf die Füllmenge des Tanks. Mein Tank sieht wie eine liegende Tonne aus, also sind Füllstand und Volumen nicht linear.
Dann das Ergebnis in eine Datenbank schreiben. Endlich fertig.
Und hier der komplette Code:
</pre>

#!/usr/bin/python
# coding=utf8
import time
import math
import sys
import RPi.GPIO as GPIO

#################### select mode ######################
# mode 1 = analog (R27 empty)
# mode 2 = serial, running continuous (R27 = 47kOhm)
# mode 3 = serial with trigger from script (R27 = 120kOhm)
mode=3 

#################### Tank settings ####################
voll=70 # 70 cm von Sensor bis Wasseroberfläche = voll
leer=230 # 230 cm von Sensor bis Wasseroberfläche= leer
laenge=230 #230 cm Länge des Tanks
radius=90 #90 Radius Tank
korr= 0 # 20 wird zur Entfernung addiert
echo_time = 2 # delay between measurements in seconds ### make sure no echo is left
allowed_dev = 0.1 # filter out wrong measurements

#################### serial settings ####################
if (mode == 3) or (mode == 2):
	import serial
	#seriellen Port einstellen
	ser = serial.Serial("/dev/ttyAMA0", baudrate=9600) #, timeout=3.0
	ser = serial.Serial(
               port='/dev/ttyAMA0',
               baudrate = 9600,
               parity=serial.PARITY_NONE,
               stopbits=serial.STOPBITS_ONE,
               bytesize=serial.EIGHTBITS,
               timeout=1
           )
#################### analog settings ####################
elif (mode == 1):
	GPIO.setmode(GPIO.BOARD)
	trig=13
	echo=15
	GPIO.setup(echo,GPIO.IN)
	GPIO.setup(trig,GPIO.OUT)
else:
	print "Mode falsch."
	print >> sys.stderr, "Mode falsch."
	GPIO.cleanup()
	sys.exit(1)

###### main ###############
entfernung=0
gesamt=0
entf_array = {}
for i in range(0,10):
	if (mode == 1): ### analog
		GPIO.output(trig,True)
		time.sleep(0.00001)
		GPIO.output(trig,False)
		j = 0
		while GPIO.input(echo) == 0:
			pass
		start=time.time();
		while GPIO.input(echo) == 1:
			pass
		ende = time.time();
		entfernung=(((ende - start) * 34300) / 2)+korr
	elif (mode == 2): ### serial cont.
		ser.flushInput()
		#import pdb
		#pdb.set_trace()
		#ser.write(bytes([0x55]))
		#startbyte = ord(ser.read(1))
		startbyte = 1
		while startbyte != 255:
			read = ser.read(1)
			print read
			if len(read) == 0:
				continue
			else:
				startbyte = ord(read)
			hbyte = ord(ser.read(1))
			lbyte = ord(ser.read(1))
			sbyte = ord(ser.read(1))
		entfernung = (hbyte * 256 + lbyte)/10 + korr
		summe = startbyte + hbyte + lbyte
		summe = summe - (int(summe/256) * 256)
		if summe != sbyte:
			entfernung = 0
		print(startbyte, hbyte, lbyte, sbyte, entfernung)
	elif (mode == 3): ### serial standby
		ser.flushInput()
		ser.write(chr(0X55))
		#startbyte = ord(ser.read(1))
		#import pdb
		#pdb.set_trace()
		startbyte = None
		while startbyte != 255:
			read = ser.read(1)
			if len(read) == 0:
				ser.flushInput()
				continue
			else:
				startbyte = ord(read)
				hbyte = ord(ser.read(1))
				lbyte = ord(ser.read(1))
				sbyte = ord(ser.read(1))
				ser.flushInput()
			ser.write(chr(0X55))
		ser.write(chr(0X55))
		entfernung = (hbyte * 256 + lbyte)/10 + korr
		summe = startbyte + hbyte + lbyte
		summe = summe - (int(summe/256) * 256)
		if summe != sbyte:
			entfernung = 0
		#print (i)
		#print(startbyte, hbyte, lbyte, sbyte, entfernung)
	print entfernung
	entf_array[i] = entfernung
	gesamt=gesamt+entfernung
	time.sleep(echo_time)
mittelwert=gesamt/(i+1)

##### filter mismatching measurements
i = 0
gesamt = 0
for entf in entf_array:
	if entf_array[entf] < mittelwert*(1+allowed_dev) and entf_array[entf] > mittelwert*(1-allowed_dev):
		gesamt=gesamt+entf_array[entf]
		i=i+1
mittelwert=gesamt/(i)
##### discard if median is outside full or empty
if (mittelwert < voll or mittelwert > leer):
	print "Messung ausserhalb Bereich: " + str(mittelwert)
	print >> sys.stderr, "Messung ausserhalb Bereich: " + str(mittelwert)
	mittelwert = None
	volumen = None
	#if (mode == 1):
	#	GPIO.cleanup()
	#sys.exit(1)
else:
	##### convert distance to round tank volume
	print "Entfernung: ",  mittelwert, " cm"
	hoehe = (leer - mittelwert)
	acosval = (radius - hoehe)/float(radius) # float needed else python rounds to int
	alpha = 2*math.acos(acosval)
	volumen = int(round(laenge * radius*radius/2*(alpha -math.sin(alpha))))
	check = False
	if check:
		print "leer: ",  leer, " cm"
		print "radius: ",  radius, " cm"
		print "laenge: ",  laenge, " cm"
		print "hoehe: ",  hoehe, " cm"
		print "acosval: ",  acosval, ""
		print "alpha: ",  alpha, " rad"
		print "Volumen: ", volumen, " cm³"
	print "Volumen: ", volumen/1000, " Liter"
	print "- - - - - - - - - - - - - - - - - - - - - "
#f1=open('/var/scripts/regentank_check/entfernung.txt','w')
#print >> f1, '%d' % (mittelwert)
#f1.close()

#f2=open('/var/scripts/regentank_check/volumen.txt','w')
#print >> f2, '%d' %(volumen)
#f2.close()

#f1l=open('/var/scripts/regentank_check/entfernung.txt','r')
#f2l=open('/var/scripts/regentank_check/volumen.txt','r')

#serverftp = ftplib.FTP('ftp.server.de', 'user', 'pass')
#serverftp.storbinary('Stor entfernung.txt', f1l)
#serverftp.storbinary('Stor volumen.txt', f2l)
#serverftp.quit()

import MySQLdb
db = MySQLdb.connect(host="localhost",    # your host, usually localhost
                     user="regenwasseruser",         # your username
                     passwd="password",  # your password
                     db="regenwasser")        # name of the data base

# you must create a Cursor object. It will let
#  you execute all the queries you need
cur = db.cursor()

# Use all the SQL you like
if volumen:
	vol_string = str(int(round(volumen/1000,0)))
else:
	vol_string = "Null"
cur.execute("INSERT INTO volumen (`datetime`,`volume`) VALUES (now()," + vol_string + ")")

db.commit()
db.close()

#### clean up after using GPIO mode
if (mode == 1):
	GPIO.cleanup()
<pre>

Und zu guter letzt, noch meine Skizzen von der Verkabelung, für Modus 1, 2 und 3:

Modus 1, analog, kein Widerstand:

Modus 2, seriell Dauer, 47kOhm Widerstand:

Modus 3, seriell Standby, 120kOhm Widerstand:

 

Und noch eine Warnung: ich hatte einen Schlauch quer durch den Tank liegen von der Wasserpumpe. Der Sensor hat, als der Wassertand viel, den Schlauch erfasst. Unbedingt darauf achten, dass die Richtung in die der Sensor misst auch wirklich frei ist.

Ich lasse das script jetzt einmal pro Tag per crontab laufen.

Hier gehts zum Setup des Systems: http://bitsnbites.astrids.bplaced.net/?p=145

Oder weiterlesen beim erstellen der Anzeige des Füllstands mit html und php:

Alpha Home Kühlung aktivieren

Der Punkt Kühlung ist in den Anleitungen leider nur oberflächlich beschrieben.

Wichtigster Punkt der bei mir gefehlt hat. Man muss in der Wärmepumpe nicht nur den Heizkreis für Smart freigeben sondern auch den (bei mir gar nicht real vorhandenen) Mischkreis 1, der dann plötzlich für die Kühlung zuständig ist.

Dann im Setup bei den Räumen die Kreise für Heizen und Kühlen eintragen. Auswählen und speichern, auch wenn evtl. der Browser beim speichern nicht richtig anzeigt sollte dann in der Übersicht bei Heizen und Kühlen ein Eintrag stehen. Detail am Rande: Wenn das erledigt ist taucht der Punkt auch plötzlich im Profi-Menü auf. Dort kann man Kühlen pro Raum deaktivieren, aktivieren aber vermutlich nicht.

Und dann noch in der App die Räume auch noch für kühlen freigeben.

 

Katastrophale Umsetzung das alles einzustellen.

Läuft dann aber überraschend gut.

 

Alpha Home Reset Chaos

Warum ich den Reset gemacht habe ist Thema für einen anderen Eintrag.

Aber falls ihr mal in die Versuchung kommt: überlegt euch das GAAANZ genau.

Nach dem Reset von Gateway und Control Box sind leider nicht wirklich alle Einstellungen weg. Nur sieht man das nicht. Man muss zum Beispiel die Raumsensoren (die gar nicht mehr gelistet sind) noch einmal abmelden, bevor man sie neu anmelden kann.

Steinel L 600 CAM

Eine Außenbeleuchtung mit Bewegungsmelder, Kamera und Sprechanlage.

Klingt toll, ist es auch fast.

Die Kamera lässt sich leider nicht weit genug drehen. Bei einer Montage neben der Eingangstür bleibt ein gutes Eck vor der Tür das man nicht sieht.

Und die App zur Steuerung ist zwischen mittelmäßig und schlecht. Ich bin daran gescheitert, dass die Software scheinbar mit extrem langen WLAN-Passwörtern nicht umgehen kann. Epic fail. Ich werd die Lampe zurückgeben.

Garmin Drivesmart 55 schlechte Karten und schwache Punkte

Nur zur Info falls mal wer überlegt ein Garmin Navi für das navigieren mit dem Auto zu kaufen.

War ein gutes Angebot vom Elektrofachmarkt. Die Infos online und in den Tests waren nicht so detailliert wie ich es gerne gehabt hätte. Hier die Punkte die mich stören, ich werde das Ding vermutlich zurückgeben versuchen.

De Kartenqualität, zumindest dort wo ich fahre ist im Vergleich zu Tomtom oder Openstreetmap richtig schlecht.

Verkehrsfunk gibt es bei dem Modell über App oder Ladegerät.
ABER: die App funktioniert erst ab Android 6.0
und das Ladegerät ist wirklich das Ladegerät, also kein Zwischenkabel. Das heisst, man muss wirklich genau das mitgelieferte Ladegerät verwenden

Medion GoPal P4440 mit MioPocket und Mapfactor Navigator

Ich hab den Medion vor Jahren umgestellt auf MioPocket und Mapfactor Navigator. Leider ist seit kurzem das Ding nicht mehr verwendbar, weil die Navigator Software abstürzt, sobald die Route gefunden wurde.

 

Hier mein Tagebuch was ich versucht habe:

Als erstes Mal im internen Speicher die Commands.txt geändert, damit die navigator.exe nicht automatisch startet und dafür automatisch explorer.exe gestartet.

Dann mal im navigator Verzeichnis eine .exe ausgeführt die die Software auf Werkseinstellungen setzt.

Commands.exe wieder zurück, damit wieder navigator.exe gestartet wird.

GPS-Einstellungen neu gemacht: Sirfnavdrv, 9600 Baud; das funktioniert; Baud Rate stimmt nicht, weiterlesen.

TMC: COM2, 9600 Baud, Open TMC; Das stimmt schon mal nicht.
COM5, 38400 Baud, GNS: vielleicht geht das. Auch nicht, siehe weiter unten.

Damit funktioniert die Navigation erst mal wieder. Der Tag ist gerettet.

Jetzt noch ein paar Einstellungen ändern die leider wieder nicht in der GUI in den Einstellungen zu finden sind. Also mal per Texteditor in die settings.xml reingeschaut.

Leider ist dort auch nichts drin, womit man die Tastentöne abdrehen könnte.

Vielleicht eine Einstellung im Windows?

Auch dort nichts gefunden. Vorerst bleiben wohl die Tastentöne.

Und wieder stürzt die Software ab. Also neuer Versuch. Zur Kontrolle mal die Original-Software getestet. Die funktioniert. Also kein Problem des Chips oder von Win CE. Mapfactor Navigator ist also mein Problem.
UND: in der Software war eine Einstellung für Tastentöne.
Damit konnte ich die Tastentöne tatsächlich systemweit abdrehen. na wenigstens was.

Jetzt kommt die Suche nach einer neuen Navi-Software. Kriterium: gratis.

Ich versuchs mal mit Navit…

Erkenntnis: Navit muss massiv konfiguriert werden bevor irgendwas funktioniert. Nicht das was ich suche.

Zwischendurch die Hardware-Details gefunden:

https://www.gopal-navigator.de/wiki/P4x40

Neuer Versuch mit NAVeGIS. Download und Install funktioniert. Install von der runtime erst mal nicht. Zu wenig Arbeitsspeicher evtl. Keine Ahnung wie man das installieren sollte.

Zurück zu mapfactor Navigator. Programm- und Kartenordner gelöscht und komplett neu angefangen. HAHA jetzt geht gar nichts mehr.

Hinweis hier auf fehlende Treiber https://www.gopal-navigator.de/wiki/Kompatible_Software und irgendwo der Vermerk, dass man die aus MioPocket rauskopieren kann. Das versuch ich mal. Nicht MioPocket starten sondern am PC die Ordner durchsuchen!

COMMCTRL.DLL klappt

conversion.dll liegt schon im Ordner von Navigator

COREDLL.DLL nicht gefunden, coredl2.dll kopiert

WININET.DLL klappt

ZLIB.DLL klappt

ABER aus MioPocket heraus kann ich Mapfactor Navigator starten, die Treiber sind also irgendwo vorhanden und geladen. Aber Navigator stürzt trotzdem ab. Wieder mal genug versucht für heute.

Neuer Tag, neues Glück.

Heute in einem Forum gelesen, dass evlt. weitere Treiber notwendig sind.

aygshell.dll and cellcore.dll, klappen beide zu kopieren.

UND ACHTUNG: MioPocket gibt es nicht mehr als Download.

Jetzt versuch ich erstmal Navigator wieder direkt zu starten. Das klappt wieder. Pfuh. Aber die Software crasht trotzdem sobald eine Route berechnet wird. Mal warten ob eine Update der Software irgendwann wieder ein brauchbares Gerät produziert.

Passiver Audiomixer für 2 Quellen

Ich hab eine alte Stereoanlage ausgegraben.

Schöne große Lautsprecher, satter Klang. Aber zu wenige Audio-Eingänge.

Also rasch mal im Inernet gesucht und eine schöne Anleitung gefunden.

 

Das Schema ist hier zu sehen, ganz einfach http://simon.mooli.org.uk/AF/article/GOODWIN/mixpix/Mixer.png

Ich hab wie in der Anleitung 2 Stück 10k lineare Potentiometer verwendet.

Damit kann ich jetzt 2 Quellen auf einen Audioeingang hängen und die Lautstärke der beiden Quellen aufeinander abstimmen.

Zum nachlesen hier der Link zum kompletten Original-Artikel http://simon.mooli.org.uk/AF/article/GOODWIN/GW01.HTML