Kategorien
Python

Raspberry Pi – Sicherer Zugriff auf WordPress mit Python wordpress-api

Wäre es nicht cool, wenn die Raspberry Pi Artikel auf meiner Webseite erstellen und verändern könnte?
Und das mit einem eigenen User (Pi o.ä.)?

Wer WordPress einsetzt, hat es relativ einfach, da seit der Version 4.8 die REST Schnittstelle standardmäßig installiert ist.
Für ältere Versionen kann man entsprechende Plugins nachrüsten.

Man kann einfach feststellen, ob die REST Schnittstelle aktiv ist, indem man der Domain ‚wp-json‘ hinzufügt.
In meinem Fall sollte http://www.henrykoch.de/wp-json
einen JSON String ahnlich dem Folgenden im Browser anzeigen.

"name":"www.HenryKoch.de","description":"","url":"http:\/\/www.henrykoch.de","home":"http:\/\/www.henrykoch.de\/de","gmt_offset":2,"timezone_string":"Europe\/Berlin"

Installation der Python wordpress-api

Für die Installation der WordPress Api für Python, bin ich dieser Anleitung gefolgt https://pypi.python.org/pypi/wordpress-api/1.2.2, was bei mir nicht auf sofort funktionierte.
Ich musste zusätzliche Pakete installieren, um die API zum Laufen zu bringen.

So funktionierte es auf der Raspberry Pi B+

sudo apt-get update
sudo apt-get install libxml2-dev
sudo apt-get build-dep python3-lxml
pip install wordpress-api

Libxml und lxml hatten bei mir gefehlt.

Authentifizierung

Damit habe ich relativ viel Zeit verbracht.
Ich wollte eine echte OAuth Autentifizierung und scheiterte mit dem REST oauth1 Plugin.
Nach langen Hin und Her habe ich folgenden Plugin installiert: WP OAuth Server

Nach der Installation, kann man im Dashboard auf der linken Seite einen ‚OAuth Server‘ Eintrag sehen.

Dort habe ich einen USER erstellt.
Danach wird der USER inklusive Client ID (consumer_key im Python script) aufgelistet.
Zusätzlich kann der Secret Key angezeigt werden, der im Python Skript bei consumer_secret angegeben wird.

erstes Test Skript

#!/usr/bin/python
# -*- coding: utf-8 -*-
from wordpress import api as wpapi
from wordpress import API
 
wpapi = API(
    url="http://ai.henrykoch.de/", #your URL
    consumer_key="xxxxxxxxxxxxx", #your key
    consumer_secret="xxxxxxxxxxxxx", #your secret key
    api="wp-json",
    version="wp/v2",
    wp_user="xxx",    #your wp User
    wp_pass="xxx"     #wp users password
)
r = wpapi.get("posts")
print r.status_code
print r.headers['content-type']
print r.encoding
print r.text
print r.json()

das Ergebnis

pi@raspberrypi:~/python/Wordpress $ python myscript.py
200
application/json; charset=UTF-8
UTF-8
[{"id":1,"date":"2017-08-08T15:25:58","date_gmt":"2017-08-08T13:25:58","guid":{"rendered":"http:\/\/ai.henrykoch.de\/?p=1"},"modified":"2017-08-08T15:38:46","modified_gmt":"2017-08-08T13:38:46","slug":
...
Kategorien
Node Red

Arduino – Node Red – MCP42010 – Steuerung des digitalen Potentiometers

Arduino – Node Red – MCP42010 – Beispiel Steuerung des digitalen Potentiometers

Im Beitrag Arduino – steuern und Test Digital Potentiometer MCP42010 auf Steckbrett habe ich dargestellt wie der MCP42010 über den seriellen Monitor der Arduino IDE gesteuert werden kann.
Jetzt will ich dieses etwas komfortabler zu tun.
Die Bedienung sollte aus dem Browser heraus erfolgen, optisch sehr ansprechend aussehen und auch mit dem Smartphone möglich sein.

Warum mit Node Red?

Node Red ist in der Standard Installation der Raspberry Pi enthalten, kostenlos und intuitiv bedienbar.
Durch die Möglichkeit den Programm Flow per drag and drop zusammen zu stellen, kommt man sehr schnell zu einem guten Ergebnis.
Für Prototypen und auch IOT Anwendungen eine echt tolle Sache.
Wo Licht ist, ist auch Schatten: Es verbraucht recht viel Ressourcen.
Dennoch kommt die Raspberry Pi 2 spielend damit zurecht und die Pi 3 logischerweise noch viel besser.

benötigte Funktionen des Flows

Der Flow soll die Eingaben, die ich im Experiment Arduino – steuern und Test Digital Potentiometer MCP42010 auf Steckbrett per Hand gemacht habe übernehmen.
Der Flow soll die Rückgabe – Werte in einem Gauge Chart darstellen.

Eingabe:
1:Wert von 0-255 -> setzt Potentiometer1 auf den Wert und gibt die Spannung an A0 zurück
2:Wert von 0-255 -> setzt Potentiometer2 auf den Wert und gibt die Spannung an A1 zurück

Der Flow

  • einfach den folgenden Flow kopieren und unter Menü (rechts oben) -> Import – Clipboard einfügen
[{"id":"ebf0e947.110038","type":"ui_slider","z":"8ec3bd3.cce4dc","tab":"147200e2.b8e19f","name":"Slider","topic":"","group":"Pot1","order":1,"min":0,"max":"255","x":225.5,"y":125,"wires":[["25bd2695.9acaf2"]]},{"id":"b755b484.2bd75","type":"ui_text","z":"8ec3bd3.cce4dc","tab":"147200e2.b8e19f","name":"Wert","group":"Pot1","order":1,"format":"{{msg.payload}}","x":636.5,"y":102,"wires":[]},{"id":"ed9f01b2.dfae38","type":"ui_gauge","z":"8ec3bd3.cce4dc","tab":"147200e2.b8e19f","name":"Spannung in V an A0","group":"Pot1","order":1,"format":"{{value}}","min":0,"max":"5","x":681.5,"y":322,"wires":[]},{"id":"25bd2695.9acaf2","type":"function","z":"8ec3bd3.cce4dc","name":"Value to Command","func":"var msg1 = { payload:\"1:\" + msg.payload +\"\\n\"};\nreturn [msg, msg1];","outputs":"2","noerr":0,"x":440.5,"y":125,"wires":[["b755b484.2bd75"],["134514.6c0042ed"]]},{"id":"134514.6c0042ed","type":"serial out","z":"8ec3bd3.cce4dc","name":"/dev/ttyUSB0","serial":"d535ccdc.123838","x":658.5,"y":148,"wires":[]},{"id":"13db30d1.da3c67","type":"serial in","z":"8ec3bd3.cce4dc","name":"/dev/ttyUSB0","serial":"43aa993f.185738","x":186.5,"y":345,"wires":[["f39416bc.0495"]]},{"id":"f39416bc.0495","type":"function","z":"8ec3bd3.cce4dc","name":"Response to value","func":"//find A0 or A1\nvar value;\nif (msg.payload.indexOf(\"A0\") != -1) {\n    value = msg.payload.split(\"A0: \");\n    value = value[1].replace(\" Volt\", \"\");\n    msg.payload = value;\n    return [msg, null];\n} else {\n    value = msg.payload.split(\"A1: \");\n    value = value[1].replace(\" Volt\", \"\");\n    msg.payload = value;\n    return [null , msg];\n}","outputs":"2","noerr":0,"x":431.5,"y":345,"wires":[["ed9f01b2.dfae38"],["ddbfff6.2bdb3"]]},{"id":"8a48ef7d.33ba9","type":"ui_slider","z":"8ec3bd3.cce4dc","tab":"147200e2.b8e19f","name":"Slider","topic":"","group":"Pot2","order":1,"min":0,"max":"255","x":224,"y":227,"wires":[["127d632d.c0419d"]]},{"id":"5a58be54.e6b8d8","type":"ui_text","z":"8ec3bd3.cce4dc","tab":"147200e2.b8e19f","name":"Wert","group":"Pot2","order":1,"format":"{{msg.payload}}","x":635,"y":204,"wires":[]},{"id":"127d632d.c0419d","type":"function","z":"8ec3bd3.cce4dc","name":"Value to Command","func":"var msg1 = { payload:\"2:\" + msg.payload +\"\\n\"};\nreturn [msg, msg1];","outputs":"2","noerr":0,"x":439,"y":227,"wires":[["5a58be54.e6b8d8"],["ee1b0407.9fbca"]]},{"id":"ee1b0407.9fbca","type":"serial out","z":"8ec3bd3.cce4dc","name":"/dev/ttyUSB0","serial":"43aa993f.185738","x":657,"y":250,"wires":[]},{"id":"ddbfff6.2bdb3","type":"ui_gauge","z":"8ec3bd3.cce4dc","tab":"147200e2.b8e19f","name":"Spannung in V an A1","group":"Pot2","order":1,"format":"{{value}}","min":0,"max":"5","x":681,"y":370,"wires":[]},{"id":"147200e2.b8e19f","type":"ui_tab","z":"","name":"Test MCP42010","icon":"dashboard","order":"1"},{"id":"d535ccdc.123838","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false},{"id":"43aa993f.185738","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false}]

Video Ansteuerung MCP42010 mit Node Red

Kategorien
Raspberry Pi

USB over IP, Netz, WLAN verlängern – über Raspberry Pi Arduino zu nutzen

USB over IP – erster Anlaufpunkt:

Aktionen auf der Server Seite – Raspberry Pi

USB über IP soll auf der Raspberry Pi ab Kernel Linux-3.17 ohne weitere Installation verfügbar sein.

Check, welchen Kernel ich habe:

17:45:46|pi@raspberrypi:~|$ uname -r
4.1.13+

Kernelversion ist höher :-)
Test:

17:49:05|pi@raspberrypi:~|$ usbip
-bash: usbip: Kommando nicht gefunden.

Satz mit x :-(

Weiter mit den Tipps aus dem Forum https://www.raspberrypi.org/forums/viewtopic.php?p=121691

usbip installieren

17:49:25|pi@raspberrypi:~|$ sudo apt-get install usbip

Kernelmodul laden

17:54:16|pi@raspberrypi:~|$ sudo modprobe usbip-host

usbip daemon starten

08:52:50|pi@raspberrypi:~|$ sudo usbipd -D

USB Geräte auflisten (ohne Arduino)

18:01:48|pi@raspberrypi:~|$ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.

USB Geräte auflisten (mit Arduino)

18:02:30|pi@raspberrypi:~|$ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter

In meinem Fall ist die ID des USB Gerätes 1a86:7523
Das selbe nochmal mit dem Programm usbip

18:05:21|pi@raspberrypi:~|$ sudo usbip list -l
Local USB devices
=================
 - busid 1-1 (0424:9512)
         1-1:1.0 -> hub
 
 - busid 1-1.1 (0424:ec00)
         1-1.1:1.0 -> smsc95xx
 
 - busid 1-1.2 (1a86:7523)
         1-1.2:1.0 -> ch341

Binden des USB Gerätes

09:22:48|pi@raspberrypi:~/deb_pakete|$ sudo usbip bind -b 1-1.2
bind device on busid 1-1.2: complete

Aktionen auf der Client Seite – in meinem Falle Laptop mit Ubuntu

download und install der passenden usbip Version

10:04:25|henry@t410:~/deb_pakete|$ wget http://ftp.de.debian.org/debian/pool/main/l/linux-tools/usbip_1.1.1+3.2.17-1_amd64.deb
--2016-02-13 10:05:51--  http://ftp.de.debian.org/debian/pool/main/l/linux-tools/usbip_1.1.1+3.2.17-1_amd64.deb
Auflösen des Hostnamen »ftp.de.debian.org (ftp.de.debian.org)«... 141.76.2.4
Verbindungsaufbau zu ftp.de.debian.org (ftp.de.debian.org)|141.76.2.4|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 52602 (51K) [application/x-debian-package]
In »»usbip_1.1.1+3.2.17-1_amd64.deb«« speichern.
 
100%[=====================================>] 52.602      --.-K/s   in 0,08s   
 
2016-02-13 10:05:51 (628 KB/s) - »»usbip_1.1.1+3.2.17-1_amd64.deb«« gespeichert [52602/52602]
 
10:05:51|henry@t410:~/deb_pakete|$ sudo dpkg -i usbip_1.1.1+3.2.17-1_amd64.deb Vormals nicht ausgewähltes Paket usbip wird gewählt.
(Lese Datenbank ... 588070 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von usbip_1.1.1+3.2.17-1_amd64.deb ...
Entpacken von usbip (1.1.1+3.2.17-1) ...
usbip (1.1.1+3.2.17-1) wird eingerichtet ...
Trigger für man-db (2.6.7.1-1ubuntu1) werden verarbeitet ...

Kernelmodul laden

10:06:22|henry@t410:~/deb_pakete|$ sudo modprobe vhci-hcd
10:08:30|henry@t410:~/deb_pakete|$ lsmod | grep vhci
vhci_hcd               33435  0 
usbip_core             27617  1 vhci_hcd

Auflisten der USB Devices, welche auf der PI zur Verfügung gestellt wurden

10:11:10|henry@t410:~/deb_pakete|$ sudo usbip list -r 192.xxx.xxx.xxx
Exportable USB devices
======================
 - 192.xxx.xxx.xxx
      1-1.2: QinHeng Electronics : HL-340 USB-Serial adapter (1a86:7523)
           : /sys/devices/platform/bcm2708_usb/usb1/1-1/1-1.2
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00)
           :  0 - Vendor Specific Class / unknown subclass / unknown protocol (ff/01/02)

Hinzufügen des USB Devices

10:24:20|henry@t410:~/deb_pakete|$ sudo usbip attach -h 192.xxx.xxx.xxx -b 1-1.2
10:24:45|henry@t410:~/deb_pakete|$ lsusb
Bus 003 Device 002: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter

Check mit Arduino Programmieroberfläche

Arduiono Remote programmiert über IP

Aktionen auf der Server Seite – Raspberry Pi

Nach Benutzung auf der Server Seite – Das USB Gerät wieder freigeben

09:22:54|pi@raspberrypi:~/deb_pakete|$ sudo usbip unbind -b 1-1.2
unbind device on busid 1-1.2: complete
Kategorien
Python

Raspberry Pi – Python – SQLite Datenbank – einfache sparsame Möglichkeit Daten professionell zu managen

Der folgende Post bietet folgende Codebeispiele in Python incl. komplett Source zum Download

  1. Erzeugen einer neuen SQLite Datenbank
  2. Anlegen einer Tabelle
  3. Anzeige aller Tabellen in einer Datenbank
  4. Werte in die Tabelle einfügen
  5. Tabelleninhalte anzeigen
  6. Code zum Download


0 Vorab zwei Links zu SQLite Beschreibungen

1 Erzeugen einer neuen SQLite Datenbank

Es reicht aus einen Connect zu einer noch nicht existierenden Datenbank zu machen und Diese wird als Datei neu angelegt.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sqlite3 as lite
import sys
 
def create_new_database(PfadzurDatenbank):
    try:
        con = lite.connect(PfadzurDatenbank) 
        con.commit()
 
    except lite.Error, e:
        if con:
            con.rollback()
            print "Error %s:" % e.args[0]
            sys.exit(1)
 
    finally:
        if con:
            con.close() 
 
create_new_database("/home/pi/sqlite3/BeispielDatenbank.db")
pi@raspberrypi ~/sqlite3 $ ls -al
insgesamt 580
drwxr-xr-x  2 pi pi   4096 Okt 21 10:02 .
drwxr-xr-x 12 pi pi   4096 Sep 27 20:26 ..
-rw-r--r--  1 pi pi      0 Okt 21 10:02 BeispielDatenbank.db

2 Anlegen einer Tabelle

Im folgenden Code Beispiel wird eine Tabelle angelegt, die Messwerte eines DS18820 Temperatursensors aufnehmen soll.
Die Tabelle besteht aus drei Spalten

  • Zeitstempel
  • minimale Temperatur
  • maximale Temperatur

Ziel ist es später jeweils einen Zeitstempel pro Stunde einzufügen und Temperaturen die innerhalb der Stunde gemessen werden, werden mit dem Maximal- und Minimalwert verglichen.
Bildschirmfoto vom 2015-10-21 11:14:11
Ist der neue Wert größer als der in der Tabelle stehende Maximalwert, wird dieser ersetzt. Ist der neue Wert kleiner als der in der Tabelle stehende Minimalwert wird der Minimalwert ersetzt.
So bleiben unabhängig von der Anzahl der Messungen (größer 1) drei Werte pro Stunde (Zeit, MinTemp, MaxTemp), was für eine normale Messungen von Raum oder Außentemperaturen vollkommen ausreichend ist.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sqlite3 as lite
import sys
 
def create_new_temperature_sensor_table(PathToDatabase, TableName):
    try:
        con = lite.connect(PathToDatabase)
        cur = con.cursor()  
        cur.executescript("""
            CREATE TABLE %s(    Timestamp INT PRIMARY KEY, 
                                Temp_MIN REAL, 
                                Temp_MAX REAL); 
            """ % TableName) 
        con.commit()
 
    except lite.Error, e:
 
        if con:
            con.rollback()
 
            print "Error %s:" % e.args[0]
            sys.exit(1)
 
    finally:
 
        if con:
            con.close() 
create_new_temperature_sensor_table("/home/pi/sqlite3/BeispielDatenbank.db", "Fuehler1")

3 Anzeige aller Tabellen in einer Datenbank

Aktuell ist erst eine Tabelle (Fuehler1) in der Datenbank angelegt, wie sich mit folgendem Script anzeigen kann.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sqlite3 as lite
import sys
def list_all_tables_in_DB(PathToDatabase):
    try:
        con = lite.connect(PathToDatabase)
 
        with con:
 
            cur = con.cursor()    
            cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
 
            rows = cur.fetchall()
 
            for row in rows:
                print row[0]
 
    except lite.Error, e:
 
        if con:
            con.rollback()
 
            print "Error %s:" % e.args[0]
            sys.exit(1)
 
    finally:
 
        if con:
            con.close() 
 
list_all_tables_in_DB("/home/pi/sqlite3/BeispielDatenbank.db")
pi@raspberrypi ~/python_scripts $ python DB_Funktionen.py 
Fuehler1

4 Werte in die Tabelle einfügen

Folgendes soll in die Tabelle Fuehler1 eingefügt werden:

  • Timestamp: 1445432400
  • Temp_MIN: 15.0
  • Temp_MAX: 17.22
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sqlite3 as lite
import sys
 
def insert_new_line_in_temperature_sensor_table(PathToDatabase, TableName, 
                                                Timestamp, Temp_MIN, Temp_MAX):
 
    try:
        con = lite.connect(PathToDatabase)
        cur = con.cursor()  
        cur.execute("""
            INSERT INTO %s 
            VALUES( %i , %.3f, %.3f)
            """ % (TableName, Timestamp, Temp_MIN, Temp_MAX))
        con.commit()
 
    except lite.Error, e:
 
        if con:
            con.rollback()
 
            print "Error %s:" % e.args[0]
            sys.exit(1)
 
    finally:
 
        if con:
            con.close() 
 
insert_new_line_in_temperature_sensor_table("/home/pi/sqlite3/BeispielDatenbank.db", 
                                            "Fuehler1", 1445432400, 15.0, 17.22)

5 Tabelleninhalte anzeigen

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sqlite3 as lite
import sys
 
def show_all_table_entries(PathToDatabase, TableName):
    try:
        con = lite.connect(PathToDatabase)
        cur = con.cursor()  
        cur.execute("SELECT * FROM %s" % TableName)
        lines = cur.fetchall()
        for line in lines:
            print line
        con.commit()
 
    except lite.Error, e:
        if con:
            con.rollback()
            print "Error %s:" % e.args[0]
            sys.exit(1)
 
    finally:
        if con:
            con.close()
show_all_table_entries("/home/pi/sqlite3/BeispielDatenbank.db", "Fuehler1")
pi@raspberrypi ~/python_scripts $ python DB_Funktionen.py 
(1445432400, 15.0, 17.22)

6 Code zum Download

Download: DB_Funktionen.py

Kategorien
Raspberry Pi

Raspberry Pi – automatischen täglichen Neustart einrichten mit cron

Ein feine Sache ist die Möglichkeit mit dem cron daemon Aktionen zeitgesteuert automatistsiert auszuführen.

Eine schöne Anleitung zum Thema cron ist hier zu finden: https://www.raspberrypi.org/documentation/linux/usage/cron.md
Wer wie ich Schwierigkeiten in der Bedienung mit vi hat, kann sich freuen, denn das nötige Kommando zur Konfiguration sudo crontab -e öffnet den nano editor.

Soll z.B. die Raspberry Pi also jeden Tag um 14:44 Uhr einen heilenden Restart machen, folgendes zur crontab des Root Users (also mit sudo) hinzufügen.

17:10:33|pi@raspberrypi:~|$ sudo crontab -e
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
44 14 * * * /sbin/shutdown -r now

Jetzt sollte das System jeden Tag 14:44 Uhr einen Reboot machen.

Kategorien
Python

Raspberry Pi – Python – (HC-SR04) Ultraschall Abstandsmessung – fehlerhafte Ergebnisse durch Statistik in den Griff bekommen – Teil1

Ausgangszustand:

Nach folgender Anleitung Entfernung messen mit Ultraschallsensor HC-SR04 habe ich relativ schnell einen HC-SR04 Ultraschall Entfernungs Sensor zum laufen gebracht und in meinem Brunnen installiert.
Der Brunnen ist nur ca. 4,5 Meter tief und wird zusätzlich über eine Drainage (Entwässerung Einfahrt, Hof) gespeist, was bedeutet, dass der Wasserspiegel bei Regen kurzfristig ansteigt.

Die Pumpe ist im Brunnen angebracht und sollte möglichst trocken bleiben.
Eine Anzeige wie hoch das Wasser steht ist dementsprechend sinnvoll.
Der Abstand zum Wasserspiegel beträgt je nach Wetterlage bis zu 3,5 Meter.
Es zeigte sich relativ schnell, dass die Messergebnisse stark schwanken.
Da der Sensor ca. 10 Meter von der Raspberry Pi angebracht ist, habe ich einen Digital Level Converter zwischen geschaltet, um diesen sauber mit 5 Volt ansteuern zu können.
An der Schwankung der Messergebnisse änderte das nichts.

Mir ist aufgefallen, dass die Messwerte genauer sind, sobald der Brunnendeckel offen ist, wodurch

  • die Luftfeuchtigkeit sinkt
  • die Reflexion des Schalls sich verändern könnte

Suche im Internet

Ein Blick auf die Messergebnisse

Einzelwert1 = 117.4 cm
Einzelwert2 = 186.5 cm
Einzelwert3 = 118.0 cm
Einzelwert4 = 120.9 cm
Einzelwert5 = 121.3 cm
Einzelwert6 = 189.0 cm
Einzelwert7 = 118.1 cm
Einzelwert8 = 122.9 cm
Einzelwert9 = 188.1 cm

Die Grün dargestellten Werte zeigen den tatsächlichen Abstand, welchen ich auch mit dem Zollstock gemessen habe.
Zwei Drittel der Messwerte sind unbrauchbar.
Der Durchschitt über diese Werte liegt bei 142,47 cm, was immer noch über 40 cm am Ziel vorbei ist. Selten kommt es auch vor, dass es extreme Sprünge in Richtung 2 oder 2,5 Meter gibt.
Ich habe mich entschieden, jeweils 11 Werte hintereinander zu messen, diese nach Größe zu ordnen und den zweitgrößten Wert in eine Datenbank zu übernehmen.
Dies erfolgt alle 10 Minuten.
Jede volle Stunde hat eine extra Zeile in der Tabelle mit dem kleinsten gemessenen Wert und den größten gemessenen Wert innerhalb einer Stunde.

import time
import numpy as np
 
def LeseWasserstandBrunnen():
    #Liefert den zweitgroessten Wert einer Messreihe aus 11 Werten zurück
    abstand = []
    for i in range(0, 11):
        abstand.append(distanz()) #Die Funktion distanz() 
                                  #liefert einen Messwert vom HC-SR04 
        time.sleep(0.1)
 
    abstand = np.sort(abstand)
 
    return "%.2f" % float(abstand[len(abstand) -2])

Die folgenden Grafiken zeigen Oben die Übernahme der Messwerte ohne Gewichtung und Unten Messwerte, bei denen ich den zweitgrößten Werte einer Serie angenommen habe.
Blau = minimal; Grün = maximal;

Dartellung_Messwerte_1
Dartellung_Messwerte_2

Beim betrachten des unteren Diagramms fällt auf, dass die Minimalwerte pro Stunde fast durchgehend genau sind.
Da ich die weiß, dass die Ausreiser nach oben und unten Messfehler sind, kann ich das Ergebnis der Tagesdarstellung auch recht gut bewerten.

Jetzt will ich diese Stundenwerte zu einem einzigen Tageswert konsolidieren, um so einen Zeitabschnitt von einem Monat darstellen zu können.
Da sollten dann auch Schwankungen des Wasserstands gut erkennbar sein.
Die ‚Blauen‘, also die Minimalen Stundenwerte erscheinen geeignet, aber ein Durchschnitt der Werte dann doch eher nicht.

Nach ein wenig suchen habe ich bei Youtube folgendes Video gefunden:

Der Zentralwert scheint für meine Ausreiser in den Minimalwerten der richtige Ansatz zu sein.

Kategorien
Python

Python – Löschen der ältesten Files in einem Verzeichnis, nur die neuesten (x) bleiben zurück

Durch das experimentieren mit der Pi Kamera und einem PIR Bewegungsmelder an der Raspberry Pi wurden schnell viele Bilder auf die SD Karte geschrieben.

Um etwas Kontrolle rein zu bringen, ist das folgende Python Script eine gute Basis.
Es gibt die Möglichkeit ein Verzeichnis und die maximale Anzahl Dateien darin anzugeben.
Übersteigt die Anzahl Dateien den definierten Wert, werden ältere Dateien gelöscht.

In meinem Fall halte ich immer maximal 1000 Bilder im Ordner.

Beispielcode:

#!/usr/bin/python
 
import os
 
path = "/home/pi/pictures/"
max_Files = 1000
 
def sorted_ls(path):
    mtime = lambda f: os.stat(os.path.join(path, f)).st_mtime
    return list(sorted(os.listdir(path), key=mtime))
 
del_list = sorted_ls(path)[0:(len(sorted_ls(path))-max_Files)]
 
for dfile in del_list:
    os.remove(path + dfile)
Kategorien
Raspberry Pi

Raspberry Pi – Eigenbau Pegelwandler für serielle Kommunikation RS232 3,3Volt zu 5Volt TTL für AVR Mikrocontroller

Da mir der unter Raspberry Pi – Serielle Schnittstelle (RS232) nutzen vorgestellte Aufbau zu sperrig war, habe ich ein wenig gesucht, ob sich nicht ein Pegelwandler zusammen löten lässt, der direkt zwischen GPIO der Pi und RX / TX Pins des Mikrocontrollers hängt.

Unter http://www.elektronik-kompendium.de/sites/praxis/bausatz_pegelwandler-mit-transistoren.htm fand ich eine brauchbare Schaltung mit Transistoren und Widerständen, die ich so ähnlich in der Werkzeugkiste hatte.

Die folgenden Bilder zeigen meinen Schaltplan und den Testaufbau.

Der erste Test funktionierte einwandfrei sowohl in die Richtung Pi als auch in Richtung AVR Mikrocontroller.

Eigenbau_Pegelwandler_2Eigenbau_PegelwandlerSchaltplan_Pegelwandler_Raspberry_Pi_TTLEigenbau_Pegelwandler_3

Das dritte Bild zeigt den verwendeten Schaltplan und das vierte Bild den Aufbau auf Lochrasterplatine.

Jetzt kann ich mein Testboard und die Pi über normale Jumper Kabel verbinden, ohne diverse Zusatzplatinen herum hängen zu haben.

Kategorien
Raspberry Pi

Raspberry Pi – Serielle Schnittstelle (RS232) nutzen

Die Raspberry Pi ist mit vielen Schnittstellen ausgestattet.
Mit dem USB Port lassen sich die Möglichkeiten diesbezüglich mehr als potenzieren.
Um mit meinen AVR Mikrocontrollern zu kommunizieren ist am besten eine serielle Schnittstelle geeignet.

Natürlich hat die Raspberry Pi Eine, aber leider nur als Pins auf der GPIO Steckerleiste.
Die benötigten Pins könnten theoretisch direkt mit dem Mikrocontroller z.B. ATMega8 verbunden werden.
Das würde aber voraussetzen, dass der Mikrocontroller mit 3,3 Volt arbeitet.
Mein Pollin Evaluationsboard arbeitet aber mit 5 Volt, bringt aber eine fertige RS232 Schnittstelle zur Kommunikation mit PC’s oder sonstigen Gerätschaften mit.
Am einfachsten wäre es, die Pi hätte ebenso eine RS232 Schnittstelle.
Beim Googlen habe ich dann die Seite Serial Port Add On gefunden.
Das dort beschriebene Serial Port to TTL Digital Converter Module, habe ich mir bei Ebay gekauft.

GPIO Header Pins
RaspberryPI_GPIO_serielle_Schnittstelle
2 4 6 8 10 12 14 16 18 20 22 24 26
1 3 5 7 9 11 13 15 17 19 21 23 25
1= 3.3V, 9= GND, 8= TX, 10= RX

Die Jumper Kabel zum Anschluss an die Raspberry Pi wurden mitgeliefert.
Ich habe das Modul, wie im Bild dargestellt mit der Pi verbunden.

Um die serielle Schnittstelle ans Laufen zu bekommen müssen noch die /etc/inittab und die /boot/cmdline.txt angepasst werden.

/etc/inittab

  • Auskommentieren der Zeile ‚T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100‘
#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

/boot/cmdline.txt

  • Löschen von: dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Bilder meiner PI inklusive ’serieller Schnittstelle‘

RaspberryPI_mit_serieller_Schnittstelle_VS RaspberryPI_GPIO_serielle_Schnittstelle1_VS RaspberryPI_GPIO_serielle_Schnittstelle2_VS RaspberryPI_GPIO_serielle_Schnittstelle3_VS RaspberryPI_GPIO_serielle_Schnittstelle4_VS

Video, zur Demonstration

Das Video kommt bereits bei meinem ‚Hello World Beispiel‘ im ATMega8 Bereich meiner Webseite zum Einsatz.
Ich habe dafür ein kleines Perl Script geschrieben.
Sicherlich wäre es auch mit Programmen wie minicom gegangen, aber da hätte ich mich auch erst mal wieder einarbeiten müssen.
Das Script ging schneller und ist am Ende des Tages flexibler.

Kategorien
Raspberry Pi

Raspberry Pi – via UMTS ins Netz – Konfiguration | Einstellungen

RaspberryPi_A_UMTS_D
Raspberry Pi Model A connected via UMTS!

Ich habe mir relativ günstig bei Ebay einen ‚Medionmobile‘ UMTS Stick ersteigert und zusätzlich bei Aldi ein Aldi Talk Starter-Paket gekauft.

Aldi bietet einen Tarif mit 150MB UMTS und danach GPRS Geschwindigkeit, für 3,99 im Monat und monatlich kündbar.
Es wird zwar ’nur‘ das Eplus Netz genutzt, aber das ist bei mir relativ gut verfügbar.

Kurzzusammenfassung: Was war nötig online zu gehen?

  1. wvdial installieren
  2. /etc/wvdial.conf anpassen
  3. ein zweizeiliges Bash Script für das Setzen der Simkarten PIN erstellen
  4. /etc/network/interfaces anpassen
  5. Verbindungsaufbau

1. wvdial installieren

pi@raspberrypi - $ sudo apt-get install wvdial
.
.
Success!  You can run "wvdial" to connect to the internet.
  (You can also change your configuration by editing /etc/wvdial.conf)
 
pi@raspberrypi - $

2. /etc/wvdial.conf anpassen

Dazu ist ein kleines bisschen Vorarbeit nötig.
Es ist wichtig den Pfad zu kennen, über den das UMTS Device angesprochen wird.
Nach dem Einstecken des Sticks – lsusb eingeben und sehen, ob der Stick erkannt wurde.

pi@raspberrypi ~ $ lsusb
Bus 001 Device 005: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
pi@raspberrypi ~ $

Achtung: Bei der Raspberry Pi Model B hat es nicht funktioniert den Stick direkt an der Pi zu betreiben, da die Stromversorgung zusammengebrochen ist. Der Betrieb über einen USB-Hub ging aber problemlos. Das Model A hält es aus, wohl weil die von Haus aus selbst weniger Strom verbraucht.

Die letzten Einträge von var/log/messages, zeigen zu welchem Pfad das UMTS Modem hinzugefügt wird. In meinem Fall /dev/ttyUSB0.

Feb 20 15:17:26 raspberrypi kernel: [   10.527167] usb 1-1.3: new high-speed USB device number 5 using dwc_otg

. . Feb 20 15:17:26 raspberrypi kernel: [ 11.313066] usbcore: registered new interface driver option Feb 20 15:17:26 raspberrypi kernel: [ 11.323480] USB Serial support registered for GSM modem (1-port) Feb 20 15:17:26 raspberrypi kernel: [ 11.334289] option 1-1.3:1.0: GSM modem (1-port) converter detected Feb 20 15:17:26 raspberrypi kernel: [ 11.345030] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0 Feb 20 15:17:26 raspberrypi kernel: [ 11.354849] option 1-1.3:1.1: GSM modem (1-port) converter detected Feb 20 15:17:26 raspberrypi kernel: [ 11.375418] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1

Nun habe ich die /etc/wvdial.conf für meinen Aldi – Medionmobile Zugang konfiguriert.

pi@raspberrypi /etc $ cat wvdial.conf 
[Dialer Defaults]
Phone = 
Username = 
Password = 
New PPPD = yes
 
[Dialer eplus]
Modem = /dev/ttyUSB0
Phone = *99#
Username = eplus
Password = gprs
Init3 = AT+CGDCONT=1,"IP","internet.eplus.de","0.0.0.0"
ISDN=0
Auto Reconnect=on
Stupid Mode=off
Idle Seconds=0
Auto DNS=on

3. ein zweizeiliges Bash Script für das Setzen der Simkarten PIN erstellen

Wer seine SIM Karte mit einer Pin gesichert hat, muss vor der Einwahl dafür sorgen, dass die PIN dem UMTS Modem auch bekannt ist.
Dazu dient folgendes Bash Script:

pi@raspberrypi /usr/local/bin $ sudo cat setPIN.sh
#!/bin/sh
echo "AT+CPIN=4711\n\r" > /dev/ttyUSB0

Und jetzt noch so absichern, dass nur Root rein schauen darf

pi@raspberrypi /usr/local/bin $ ls -al
insgesamt 352
-rwx--x--x  1 root staff     50 Feb 24 13:14 setPIN.sh

4. /etc/network/interfaces anpassen

Zum Schluss kommen noch 4 Zeilen in die /etc/network/interfaces

pi@raspberrypi - $ sudo cat /etc/network/interfaces ab auto ppp0
auto lo
 
iface lo inet loopback
iface eth0 inet dhcp
 
auto ppp0
iface ppp0 inet wvdial
provider eplus
pre-up /usr/local/bin/setPIN.sh
 
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

pre-up /usr/local/bin/setPIN.sh -> verweist auf das Script zur PIN Übergabe.

5. Verbindungsaufbau

Die Verbindung baut sich sofort nach dem booten automatisch auf, vorausgesetzt der Stick steckt.

Nachträglich kann die Verbindung mit folgenden Kommandos auf und abgebaut werden:

pi@raspberrypi - $ sudo ifup ppp0
pi@raspberrypi - $ sudo ifdown ppp0