Freitag, 15. Januar 2021

OpenWRT 19 und ein Edimax USB WLAN Adapter

Ich kam gerade in die Verlegenheit einen Rapsberry B+ (das erste Modell) als Open-WRT Router für Outdoor neu zu installieren und wollte dabei einen alten Edimax WLAN Adapter nutzen.

Die Installation von Open-WRT war sozusagen streight forward und glieder sich in folgenden Schritten

  • Image für den richtigen Raspberry runterladen (Raspberry Pi B+)
  • Image auf eine SD Karte brennen (dd)
  • Raspberry mit der SD Karte starten
  • Das Notebook mit einem LAN Kabel mit dem Raspberry verbinden
  • Open-WRT hat nach dem ersten Start die Adresse 192.168.0.1
  • Die Weboberfläche aufrufen mit http://192.168.0.1 und ein Passwort setzen
  • Dann den Namen des Routers, und Dinge die man in seinem Netzwerk setzen muss (Gateway, DNS, usw.)

Dann ist mir aufgefallen, dass der kleine USB Adapter vom Kernel den Open-WRT von Haus aus installiert nicht erkannt wird, bzw. kein Treiber (Kernel Modul, kmod) dafür geladen wird.

Das kann man im Punkt System -> Software recht einfach nachinstallieren ich habe folgende Module nachinstalliert.


Danach wurde der Stick erkannt und ließ sich auch konfigurieren.

Alles bestens.

Hier noch der relevante Kernel Log

[    2.984026] usb 1-1.2: New USB device found, idVendor=7392, idProduct=7811
[    2.994522] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.005349] usb 1-1.2: Product: 802.11n WLAN Adapter
[    3.013683] usb 1-1.2: Manufacturer: Realtek
[    3.021224] usb 1-1.2: SerialNumber: 00e04c000001
...

[    8.123904] rtl8192cu: Chip version 0x10
[    8.251352] rtl8192cu: Board Type 0
[    8.258084] rtl_usb: rx_max_size 15360, rx_urb_num 8, in_ep 1
[    8.266959] rtl8192cu: Loading firmware rtlwifi/rtl8192cufw_TMSC.bin
[    8.277007] ieee80211 phy0: Selected rate control algorithm 'rtl_rc'
[    8.278854] usbcore: registered new interface driver rtl8192cu

Mittwoch, 6. Januar 2021

Blynk mit ESP8266 und mycropython

IoT mit ESP8266 und Blynk

Blynk ist eine Cloud Platform um IoT Anwendungen zu benutzen und zu verbinden, es gibt dazu eine eigene APP mit der die IoT Sensoren/Actoren gesteuert werden können.

Klingt nicht schlecht, also hab ich das mal ausprobiert.

Voraussetzungen

  • ESP8266
  • DHT 22 Temperatur & Luftfeutigkeitssensor
  • Ein paar Kabel
  • Mycropython Firmware
  • Blynk Python Binding
  • Blynk App am Smartphone

Projekt Struktur Root Ordner

drwxrwxr-x 4 mesznera mesznera 4096 Jan  3 13:50 blynk-library-python
drwxrwxr-x 2 mesznera mesznera 4096 Jan  4 07:52 ESP8266
-rwxr-xr-x 1 mesznera mesznera  970 Jan  4 08:13 flash.sh
-rw-rw-r-- 1 mesznera mesznera 3865 Jan  4 11:59 main.py

Im Subdirectory ESP8266 ist die Mycropython Firmware von

http://micropython.org/download/esp8266/

esp8266-20200911-v1.13.bin

Im Subdirectory blynk-library-python

das GIT Repository von

https://github.com/vshymanskyy/blynk-library-python.git

flash.sh

Hier das Shell Script das ich unter Ubuntu verwende um den ESP8266 zu flashen.
 
#!/bin/bash
#
#
# either ESP8266 or ESP32
# corresponding subdirectory with firmware
BOARD=ESP8266
# USB port to communicate
PORT=/dev/ttyUSB0
# port speed
BAUD=460800

if [ $BOARD == "ESP8266" ]; then
    # for ESP8266
    esptool.py --port $PORT erase_flash
    esptool.py --port $PORT --baud $BAUD write_flash --flash_size=detect --verify -fm dio 0x0 $BOARD/esp8266-20200911-v1.13.bin
fi;

if [ $BOARD == "ESP32" ]; then
    # for ESP32
    esptool.py --chip esp32 --port $PORT erase_flash
    esptool.py --chip esp32 --port $PORT --baud $BAUD write_flash -z 0x1000 $BOARD/esp32-idf4-20200902-v1.13.bin
fi

echo "sleeping for 10s to wait for reset"
sleep 10

# screen communication speed
BAUD=115200
ampy -b $BAUD -p $PORT mkdir /lib
ampy -b $BAUD -p $PORT put blynk-library-python/BlynkLib.py /lib/BlynkLib.py
# ampy -b $BAUD -p $PORT put blynk-library-python/examples/hardware/ESP8266_ESP32.py main.py
ampy -b $BAUD -p $PORT put  main.py main.py
screen $PORT $BAUD

main.py

Hier ein kleines Beispiel das Daten eines DHT22 ausliest
 
Das Script ist nicht optimiert, aber es geht mir nur um die Funktion um blynk auszuprobieren.
 
Damit das funktioniert muss man noch folgendes im Programm anpassen
  • WLAN SSID
  • WLAN PSK
  • Blynk API Key - den bekommt man, wenn man ein Projekt eröffnet.

"""
Blynk is a platform with iOS and Android apps to control
Arduino, Raspberry Pi and the likes over the Internet.
You can easily build graphic interfaces for all your
projects by simply dragging and dropping widgets.

  Downloads, docs, tutorials: http://www.blynk.cc
  Sketch generator:           http://examples.blynk.cc
  Blynk community:            http://community.blynk.cc
  Social networks:            http://www.fb.com/blynkapp
                              http://twitter.com/blynk_app

This example shows how to initialize your ESP8266/ESP32 board
and connect it to Blynk.

Don't forget to change WIFI_SSID, WIFI_PASS and BLYNK_AUTH ;)
"""
import dht
import machine
import network
import time
# non std modules
import BlynkLib

#
# some constants, should be in settings.py
#
#
DEBUG = True
# depends on your own infrastructure
WIFI_SSID = 'sagichnicht'
WIFI_PASS = 'sagichauchnicht'
# you get this by creating some project
BLYNK_AUTH = 'das sag ich auch nicht'

# connecting dht22
# PIN DHT is connected to
DHT_PIN = 5 # dont use 1, this does not work
DHT = dht.DHT22(machine.Pin(DHT_PIN))
DHT_INTERVAL = 300 # 5 mins
DHT.measure()
DHT_TS = time.time()
print(DHT_TS)
print(DHT.temperature())
print(DHT.humidity())

def read_dht():
    """
    reading DHT
    only measuring, if last measurement is more than DHT_INTERVAL old
    """
    global DHT_INTERVAL
    global DHT_TS
    if (time.time() - DHT_TS) > DHT_INTERVAL:
        print("Doing re-measurement")
        DHT.measure()
        DHT_TS = time.time()
    print("Timestamp   :", DHT_TS)
    print("Temperature :", DHT.temperature())
    print("Humidity    :", DHT.humidity())

def disable_ap():
    """
    per default micropython will enable an AP SSID
    this short function will disable AP Mode on startup

    for more information go to
    http://docs.micropython.org/en/v1.8.7/esp8266/esp8266/tutorial/network_basics.html
    """
    ap_if = network.WLAN(network.AP_IF)
    ap_if.active(False)

#
# initializing network, main
#
# blynk must be created in prior of every decorator use
print("disabling WIFI AP mode")
disable_ap()
print("Connecting to WiFi...")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(WIFI_SSID, WIFI_PASS)
while not wifi.isconnected():
    pass
print('IP:', wifi.ifconfig()[0])
print("Connecting to Blynk...")
blynk = BlynkLib.Blynk(BLYNK_AUTH)

@blynk.on("connected")
def blynk_connected(ping):
    """
    called if connection to blynk is established
    """
    print('Blynk ready. Ping:', ping, 'ms')

# Register Virtual Pins
@blynk.VIRTUAL_WRITE(1)
def my_write_handler(value):
    """
    write something to this virtual pin
    """
    print("blynk rwriting virtual pin 1")
    print('Current V1 value: {}'.format(value))

@blynk.VIRTUAL_READ(2)
def my_read_handler():
    """
    read something from virtual pin
    this version only returns actual uptime
    """
    print("blynk reading virtual pin 2")
    blynk.virtual_write(2, int(time.time()))

@blynk.VIRTUAL_READ(3)
def my_read_handler():
    """
    read something from virtual pin
    """
    print("blynk reading virtual pin 3")
    read_dht()
    blynk.virtual_write(3, DHT.temperature())

@blynk.VIRTUAL_READ(4)
def my_read_handler():
    """
    read something from virtual pin
    """
    print("blynk reading virtual pin 4")
    read_dht()
    blynk.virtual_write(4, DHT.humidity())

def runLoop():
    while True:
        blynk.run()
        machine.idle()

########## main starts here ###################

# Run blynk in the main thread:
runLoop()

# Or, run blynk in a separate thread (unavailable for esp8266):
#import _thread
#_thread.stack_size(5*1024)
#_thread.start_new_thread(runLoop, ())


# Note:
# Threads are currently unavailable on some devices like esp8266
# ESP32_psRAM_LoBo has a bit different thread API:
# _thread.start_new_thread("Blynk", runLoop, ())
 
Was zu bemerken ist:
  • Blynk arbeitet mit Decoratoren
  • Nur über HTTP Requests
  • Viel Idle geht sich da wohl nicht aus

Elektronik

Den DHT 22 verbindet man wie folgt
  • DHT +   -> 3.3V
  • DHT -   -> GND
  • DHT OUT -> D1
Elektronik

 

Doing

  • Also den ESP8266 mit USB an den Computer
  • Der ESP sollte unter Ubuntu als ttyUSB0 erkannt werden
  • flash.sh laufen lassen, damit wird die Mycropython Firmware installiert
  • Dann wird main.py und die Blynk Library kopiert
  • zuletzt ein screen auf /dev/ttyUSB0

kernel (demsg) Meldungen beim anschließen des ESP8266

[126329.405898] IPv6: ADDRCONF(NETDEV_CHANGE): wlp4s0: link becomes ready
[128272.669418] usb 3-1: new full-speed USB device number 31 using xhci_hcd
[128272.822764] usb 3-1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[128272.822770] usb 3-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[128272.822773] usb 3-1: Product: USB2.0-Serial
[128272.824070] ch341 3-1:1.0: ch341-uart converter detected
[128272.824646] usb 3-1: ch341-uart converter now attached to ttyUSB0

Outut beim flashen

esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:4e:f1:45
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 7.2s
Hard resetting via RTS pin...
esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:4e:f1:45
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0240
Compressed 638928 bytes to 419659...
Wrote 638928 bytes (419659 compressed) at 0x00000000 in 9.6 seconds (effective 533.9 kbit/s)...
Hash of data verified.

Leaving...
Verifying just-written flash...
(This option is deprecated, flash contents are now always read back after flashing.)
Flash params set to 0x0240
Verifying 0x9bfd0 (638928) bytes @ 0x00000000 in flash against ESP8266/esp8266-20200911-v1.13.bin...
-- verify OK (digest matched)
Hard resetting via RTS pin...
sleeping for 10s to wait for reset
[detached from 65532.pts-1.ws00007999]
 
Am Ende habe ich screen mit Ctrl+A, Ctrl+D detached

Screen Cheat Sheet

CTRL + A, CTRL + D -> Detach

Blynk

Also die Blynk App hab ich schon installiert, dann ein Projekt eröffnet. Damit bekommt man den benötigten API Key zugeschickt.

Und so sieht das Ganze dann in der APP aus
blynk screenshot


Fazit

Eigentlich funktioniert Blynk recht einfach, man erhält eine gute APP auf allen Smartphones und muß keinen Server oder sonstiges einrichten um die Daten aufzubereiten. Für den privaten Einsatz ist die Nutzung kostenlos.
Wenn man allerdings viele Sensoren einbinden möchte, dann stößt man gleich ans Limit und muß bei blynk auch bezahlen.

Für eine kommerzielle Entwicklung ist blynk sicher eine Überlegung wert, man erspart sich den ganzen Server Part und bekommt eine APP geliefert mit der sich die IoT Devices steuern lassen. Man kann sich also um die Devices selbst kümmern.

Wenn man aber das im privaten Umfeld mit mehreren Devices, ich denk mal mehr als 10, nutzen möchte kommt man mit der gratis Version von blynk nicht mehr weit.

Montag, 16. November 2020

S3 Beispiele

Eine Sammlung einiger aws Befehle die ich schon benutzt habe.

Total Object Count ermitteln

aws --endpoint-url http://cloud.messner.click:8000 s3 ls s3://drive-replication --recursive --summarize

Ein Profil angeben

Ein Profile im .credentials File angeben, dazu einen Abschnitt einrichten.

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 ls s3://drive-replication --recursive --summarize

Ein Bucket anlegen

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 mb test-bucket

 Alle Buckets listen

aws --profile default --endpoint-url http://cloud.messner.click:8000 s3 ls

Ein Bucket mit einem anderen Bucket syncen

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 sync s3://webstorage-f6635276-9e5e-4d7a-a034-1e34293c7e28  s3://webstorage-monika

Ein Bucket rekursiv löschen

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 rb --force s3://webstorage-f6635276-9e5e-4d7a-a034-1e34293c7e28

Sonntag, 24. Mai 2020

Datenrettung von einem Synology NAS - foremost

Um aus einem beliebigen Image Daten zu rekonstruieren, empfiehlt sich das Tool foremost. Es geht die ganzen Blöcke durch und sucht nach bekannten Dateiheader.
Die gefundenen Daten werden dann in ein Output Verzeichnis kopiert.
Hat in meine Fall ca. 24 Stunde  gedauert, und im Output Directory waren dann ca. 500GB an Daten.
sudo foremost -i /dev/sdb5 -o recovery/
Das /dev/sdb5 konnte ich nicht mounten, es war als Teil eines linux-raid eingebunden.

Nachteil von foremost, es werden die Dateien nach Typ sortiert im Output Directory abgelegt, in meinem Fall waren es dann 500.000 JPG Fotos in einem Directory. Also mit nautilus kann man das kaum mehr aufmachen.
Auch werden nicht alle Dateitypen erkannt, in meinem Fall fehlten in der default Einstellung mkv Dateien.

Ansonsten scheint mir, dass es sehr viele Daten wieder hervorgebracht hat. Mal sehen ob das ursprünglichen Zustand entspricht.

Freitag, 22. Mai 2020

Datenrettung aus einem Synology NAS - ddrescue

Eine der beiden Platten läuft mal an und zeigt sich im kernel, wenn auch mit Fehlern. Als ersten Schritt versuche ich soviel wie möglich von dieser Platte zu kopieren, dazu habe ich mir eine neue 4TB USB Disk gekauft.
Den Rest kann man mit ddrescue machen
anon@anon:~/Downloads$ sudo ddrescue --force /dev/sdc /dev/sdb rescue.map
GNU ddrescue 1.23
Press Ctrl-C to interrupt
     ipos:    4840 MB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:    4840 MB, non-scraped:        0 B,  average rate:    102 MB/s
non-tried:        0 B,  bad-sector:     4096 B,    error rate:    1536 B/s
  rescued:    3000 GB,   bad areas:        1,        run time:  8h  6m 26s
pct rescued:   99.99%, read errors:        9,  remaining time:         n/a
                              time since last successful read:          2s
Finished                                      
In Summe waren es also ein bad-sector.

Danach sind die Daten vorerst sicher auf der neuen Platte und die originale kann mal verstaut werden.

Next Step - wie komm ich jetzt an die Dateien ran?

Donnerstag, 21. Mai 2020

Datenrettung aus einem Synology NAS - Overlay erzeugen

Ein Bekannter von mir ist mit einem kaputten Synology NAS gekommen,
eine Platte läuft gar nicht mehr an, die andere wird zwar erkannt aber im Kernel Log sind gleich ein paar Errors zu sehen.

[12389.196872] scsi 7:0:0:0: Direct-Access     WDC WD30 EFRX-68EUZN0     8105 PQ: 0 ANSI: 6
[12389.198196] sd 7:0:0:0: Attached scsi generic sg4 type 0
[12389.198420] sd 7:0:0:0: [sdc] Spinning up disk...
[12390.203014] ..........ready
[12399.419688] sd 7:0:0:0: [sdc] 5860533168 512-byte logical blocks: (3.00 TB/2.73 TiB)
[12399.419692] sd 7:0:0:0: [sdc] 4096-byte physical blocks
[12399.419860] sd 7:0:0:0: [sdc] Write Protect is off
[12399.419863] sd 7:0:0:0: [sdc] Mode Sense: 53 00 00 08
[12399.420185] sd 7:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[12399.420334] sd 7:0:0:0: [sdc] Optimal transfer size 33553920 bytes not a multiple of physical block size (4096 bytes)
[12399.503865]  sdc: sdc1 sdc2 sdc5
[12399.506543] sd 7:0:0:0: [sdc] Attached SCSI disk
[12400.017949] sd 7:0:0:0: [sdc] tag#3 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[12400.017952] sd 7:0:0:0: [sdc] tag#3 Sense Key : Medium Error [current] 
[12400.017953] sd 7:0:0:0: [sdc] tag#3 Add. Sense: Unrecovered read error
[12400.017955] sd 7:0:0:0: [sdc] tag#3 CDB: Read(16) 88 00 00 00 00 00 00 90 3e e8 00 00 00 08 00 00
[12400.017958] blk_update_request: critical medium error, dev sdc, sector 9453288 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
[12400.527720] sd 7:0:0:0: [sdc] tag#2 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[12400.527750] sd 7:0:0:0: [sdc] tag#2 Sense Key : Medium Error [current] 
[12400.527765] sd 7:0:0:0: [sdc] tag#2 Add. Sense: Unrecovered read error
[12400.527774] sd 7:0:0:0: [sdc] tag#2 CDB: Read(16) 88 00 00 00 00 00 00 90 3e e8 00 00 00 08 00 00
[12400.527785] blk_update_request: critical medium error, dev sdc, sector 9453288 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
[12400.527805] Buffer I/O error on dev sdc5, logical block 1, async page read
Was ich mir von der Platte merke:

Die Platte ist eine 4TB WD Red und wird als sdc erkannt, es werden darauf 3 Partitionen angezeigt sdc1, sdc2 und sdc5

GNU Parted 3.3
/dev/sdc wird verwendet
Willkommen zu GNU Parted! Rufen Sie »help« auf, um eine Liste der verfügbaren Befehle zu erhalten.
(parted) print                                                            
Modell: WDC WD30 EFRX-68EUZN0 (scsi)
Festplatte  /dev/sdc:  3001GB
Sektorgröße (logisch/physisch): 512B/4096B
Partitionstabelle: gpt
Disk-Flags: 

Nummer  Anfang  Ende    Größe   Dateisystem     Name  Flags
 1      131kB   2550MB  2550MB  ext4                  RAID
 2      2550MB  4698MB  2147MB  linux-swap(v1)        RAID
 5      4840MB  3001GB  2996GB                        RAID
Damit die Platte nun nicht noch mehr zerstört wird, leg ich mal zuerst ein Overlay an, damit alle veruche was zu reparieren nicht direkt auf die Platte geschrieben werden.
Als erstes benötige ich die größe der Platte in Blocks

sudo blockdev --getsize /dev/sdc
5860533168
Dann leg ich noch ein 4TB Sparse File an. Sparse Files werden zwar mit einer Größe von 4TB angezeigt, belegen aber nur den Platz der beschrieben wird. In dem Sparse File sollen dann die Änderungen geschrieben werden. Sozusagen als Snapshot File.

truncate -s4000g overlay-sdb.ovr
Als nächstes leg ich ein Loopback Device an, welches das File als Grundlage hat.
sudo losetup -f --show -- overlay-sdc.ovr
Jetzt habe ich sozusagen ein /dev/loop20 Device erstellt das auch das erstellt File zeigt.
Als nächstes binde ich das original Device /dev/sdc mit dem darüber gelegten Loopback device ein. Alle Schreibvorgänge landen damit im Overlay File.

echo 0 5860533168 snapshot /dev/sdc /dev/loop20 P 8 | sudo dmsetup create sdc

Damit wurde dann ein neues Device unter /dev/mapper/ erstellt:
ls /dev/mapper/
control  sdc
Das so erstellte /dev/mapper/sdc kann man wie ein normales Blockdevice verwenden.

So kann mal der darunterliegenden Platte nicht mehr passieren, als ihr schon passiert ist.

Sonntag, 10. Mai 2020

Esp8266 programmieren - first steps und hello world

Im letzten Post hab ich beschrieben wie man ein micropython image auf den Controller kopiert und Kontakt mit dem micropython Interpreter mittels USB aufnimmt. Aber da gibt es mehr zu wissen.

Der ESP8266 startet automatisch einen Access Point, wenn man nach dem Reset (oder einfach USB Kabel ziehen) die Access Point Liste anschaut wir man einen neuen finden.

Unter Linux kann man sich die Daten zu den Access Point wie folgt anschauen

sudo iwlist wlp4s0 scanning

der passenden AP Eintrag schaut bei mir so aus

          Cell 02 - Address: 52:02:91:4E:F1:45
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    Quality=70/70  Signal level=-23 dBm 
                    Encryption key:on
                    ESSID:"MicroPython-4ef145"
                    Bit Rates:5.5 Mb/s; 11 Mb/s; 1 Mb/s; 2 Mb/s; 6 Mb/s
                              12 Mb/s; 24 Mb/s; 48 Mb/s
                    Bit Rates:54 Mb/s; 9 Mb/s; 18 Mb/s; 36 Mb/s
                    Mode:Master
                    Extra:tsf=000000002a90af71
                    Extra: Last beacon: 5944ms ago
                    IE: Unknown: 00124D6963726F507974686F6E2D346566313435
                    IE: Unknown: 01088B9682840C183060
                    IE: Unknown: 030101
                    IE: Unknown: 32046C122448
                    IE: Unknown: DD0918FE34030100000000
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : CCMP TKIP
                        Authentication Suites (1) : PSK
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : CCMP TKIP
                        Authentication Suites (1) : PSK


Mit dem kann man sich ganz einfach verbinden.
Der ESP8266 verfügt über zwei getrennte WLAN Module (oder so ähnlich), man kann also als Client als aus als Access Point gleichzeitig auftreten. Das ist eine ganz tolle Funktion, wenn man z.B. einen WLAN Repeater bauen möchte.

ACHTUNG: will man das aber nicht, dass der ESP8266 einen Access Point startet, so muss man das explizit so festlegen. 

Aber zuerst mal das Hello World in der Microcontroller Welt: Eine LED blinken lassen.
Glücklicherweise ist auf dem ESP8266 schon eine LED drauf, angeschlossen ist diese fest über den Port 2. An der Elektronik muss man als für das Hello World noch gar nichts machen.

Also mittels screen über USB Kontakt zum Controller aufbauen, dann folgendes eintippen.

>>> from machine import Pin
>>>
>>> led = Pin(2, Pin.OUT)
>>> led.on()  # die LED geht aus, aber OK

>>> led.off()  # die LED geht wieder an

Das mit dem vertauschten ON OFF hat mit der Verkabelung der LED zu tun, ist sie entweder zwischen PIN2 und Vcc (ON = Led ist dunkel, OFF Led ist hell) oder zwischen PIN2 und GND (ON = Led ist hell, OFF = Led ist dunkel)

So direkt mit dem python Interpreter was machen ist zwar für kleinere Dinge sicher nett, aber sicher nicht das was man meistens möchte. Besser ist  es sein Programm in einer Datei abzuspeichern und dieses automatisch mit dem Controller zu starten.

Micropython startet die Datei main.py, wenn es diese auf dem Filesystem findet.

Hier mal die Datei hello_world.py

import time
# mpython specific modules
import machine
import network
def disable_ap():
    """
    per default micropython will enable an AP SSID
    this short function will disable AP Mode on startup
    for more information go to
    http://docs.micropython.org/en/v1.8.7/esp8266/esp8266/tutorial/network_basics.html
    """
    ap_if = network.WLAN(network.AP_IF)
    ap_if.active(False)
def main():
    # do some work
    led = machine.Pin(2, machine.Pin.OUT)
    while True:
        led.on()  # die LED geht aus, aber OK
        time.sleep(1)
        led.off()  # die LED geht wieder an
        time.sleep(1)
if __name__ == "__main__":
    disable_ap()  # disable access point
    while True:
        try:
            main()
        except:
            pass  # ignore exception
        finally:
            time.sleep(60) # wait 60s and try again

In dem Programm ist auch schon der Abschnitt drinnen, der den AP Modus daktiviert.

Damit das flashen von Micropython und das kopieren der Datei auf den Controller als main.py etwas einfach gestaltet, verwendet ich ein Bash script flash_mpython.py

Achtung: das script flash_mpython.py muss man mit sudo ausführen

#!/bin/bash
PORT=/dev/ttyUSB0
esptool.py --port $PORT erase_flash
esptool.py --port $PORT --baud 460800 write_flash --flash_size=detect --verify -fm dio 0x0 esp8266-20190529-v1.11.bin
echo "sleeping for 10s to wait for reset"
sleep 10
ampy -b 115200 -p $PORT put hello_world.py main.py
screen $PORT 115200


Wenn alles durchläuft, so kann man den Controller kurz vom USB trennen dann wieder einstecken und nach ein paar Sekunden sollte die LED anfangen zu blinken.



 

Esp8266 programmieren - micropython installieren

Hier mal ein paar Informationen wie man einen ESP8266 über Ubuntu programmiert und überhaupt damit umgeht.

Ich beschreib hier wie man den ESP8266 mit micropython benutzt. Anleitungen für arduino IDE gibt es schon einige, dazu sag ich nicht viel.

Den ESP8266 zuerst einmal an einem USB Port anschließen, dabei darauf achten, dass man ein vollständiges USB Kabel verwendet, nicht ein Kabel das nur zum Laden gedacht ist (ja die gibt es auch noch, und das hat mich schon mal ein paar Minuten gekostet)

Nach dem anschließen sollte mittels dmesg ein neuer serieller Port auftauchen.

[  690.410618] usb 3-2: new full-speed USB device number 2 using xhci_hcd
[  690.559940] usb 3-2: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[  690.559945] usb 3-2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[  690.559947] usb 3-2: Product: USB2.0-Serial
[  690.619457] usbcore: registered new interface driver usbserial_generic
[  690.619500] usbserial: USB Serial support registered for generic
[  690.621565] usbcore: registered new interface driver ch341
[  690.621584] usbserial: USB Serial support registered for ch341-uart
[  690.621606] ch341 3-2:1.0: ch341-uart converter detected
[  690.622318] usb 3-2: ch341-uart converter now attached to ttyUSB0


Danach benötigt man noch einige Programme, damit man etwas auf den ESP8266 übtragen kann, dazu folgendes nachinstallieren.

sudo apt install esptool python3-serial screen

Dann ist noch das Modul ampy notwendig, mit dem lassen sich ganz leicht Daten mit dem ESP8266 über seriell austauschen. Das gibts aber auch bei ubuntu 20.04 noch nicht im Repository.

sudo pip3 install adafruit-ampy

So nun sollte jetzt alles installiert sein um z.B. micropython auf dem ESP8266 zu installieren, das Image findest du hier https://micropython.org/download/esp8266/

Achtung: Wer neu in der Microcontroller Welt ist es vielleicht nicht gewohnt, dass man das Board so genau wissen muß. Es gibt nicht die eine micropython Installation, die sind alle maßgeschneidert für das eine Board.

Ich verwende hier das Image esp8266-20190529-v1.11.bin, das ich mit folgender Abfolge von Befehlen auf das Board bringe:

esptool.py --port /dev/ttyUSB0 erase_flash

Ausgabe schaut so aus

esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:4e:f1:45
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 7.5s
Hard resetting via RTS pin...


Mit dem Befehl wird der Flash gelöscht.

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20190529-v1.11.bin

Mit dem Befehl wird das micropython Image nun auf das Board geschrieben, die Ausgabe schaut dann bei mir so aus

esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:4e:f1:45
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0040
Compressed 617880 bytes to 402086...
Wrote 617880 bytes (402086 compressed) at 0x00000000 in 9.2 seconds (effective 539.8 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin..


Also hab ich jetzt micropython auf meinem ESP8266 drauf, super.
Und was könnte ich jetzt damit machen ...

Mit screen kann man ganz einfach mit dem Python Interpreter am Board aufnehmen und dem mit machen was man mit einem Python Interpreter auch immer machen kann.

screen /dev/ttyUSB0 115200

Dann einfach eine Taste drücken und man ist am Prompt des Interpreters, hier starte ich den Controller dann neu und frag die Frequenz ab.

MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> machine.reset()
>>>
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 31024, room 16
tail 0
chksum 0xb4
load 0x3ffe8000, len 1104, room 8
tail 8
chksum 0x74
load 0x3ffe8450, len 824, room 0
tail 8
chksum 0x45
csum 0x45
����o�{��'<�d$l$ c��|;�$�g��o�$ ��s�d�$�d`��;�l�d�l`��{�lǟ�l$ ;l��{d���cĄc|l#��c|��Ą$dc��o�n'��dn���l��$d���$ �g����cdl䄇c���bd�c{l;dr�'�����o�߀�c{����$d�
MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> machine.freq()
80000000

Das einzige das ich hier dazu noch poste ist die Information, dass automatisch beim Start des Controllers das Fiel main.py ausgeführt  wird, aber dazu in einem anderen Post mehr

Sonntag, 19. April 2020

Raspberry pi am TV mit Auflösung 1366x768

An einem alten Philips TV hatte ich das Problem, dass der Raspberry Pi nicht die passende Auflösung zur Auswahl anzeigte, das Bild wurde zwar immer dargestellt war aber nie scharf.
Beim googeln fand ich heraus, dass der Fernseher nur 1366x768 kann.

Die ganze Anleitung gibts hier zu lesen.
https://www.elektronik-kompendium.de/sites/raspberry-pi/2101201.htm

Man kann also die HDMI Modi selbst in der config.txt einstellen, in dem Zuge hab auch gleich eingestellt, dass der Sound über HDMI ausgegeben wird.

Also bei:

# HDMI auch ohne Monitor in Betrieb nehmen (optional)
hdmi_force_hotplug=1
# Audio über HDMI ausgeben (optional)
hdmi_drive=2
# DMT-Betriebsmodus aktivieren
hdmi_group=2
# Auflösung: 1366x768 / 60 Hz
hdmi_mode=81 


Zur Info mit den CEA/DMT Modi.

Anscheinend sind die ersten (CEA) die TV Modi, die zweiten die Modi welche bei Bildschirmen am Computer benutzt werden.

Freitag, 3. April 2020

docker redis container

Beim cloudserver gibt es die Möglichkeit einen redis Server anzugeben, hab ich natürlich als docker container auf meinem Raspberrypi installiert, hier das Startscript.

#!/bin/bash
DATA_DIR="/srv/redis"
mkdir $DATA_DIR
docker run -d \
    --name redis-cloudserver \
    -p 6379:6379 \
    -v $DATA_DIR:/data \
    redis



Testen kann man das dann ganz einfach mit einem kurzen python script.




#!/usr/bin/python3
import redis

r = redis.Redis("docker")
r.set("key", "value")
print(r.get("key").decode("utf-8"))




Python modul für redis muss natürlich installiert werden mit


sudo apt install python3-redis


Ob der Cloudserver nun den redis Server verwendet bin ich mir noch nicht ganz sicher, mal schauen woran man das erkennen sollte.

Hier das neue Startscript für den cloudserver mit den Redis Variablen

#!/bin/bash
ACCESS_ID="214398ae-11fb-4fe3-b516-3b566973daffe"
ACCESS_KEY="denrichigenschreibichhiernnichthin"
DATA_DIR="/srv/s3/data"
META_DIR="/srv/s3/metadata"
docker run -d \
    --name cloudserver \
    -p 8000:8000 \
    -e SCALITY_ACCESS_KEY_ID=$ACCESS_ID \
    -e SCALITY_SECRET_ACCESS_KEY=$ACCESS_KEY \
    -v $DATA_DIR:/usr/src/app/localData \
    -v $META_DIR:/usr/src/app/localMetadata \
    -e ENDPOINT=docker \
    -e REMOTE_MANAGEMENT_DISABLE=1 \
    -e S3BACKEND=file \
    -e REDIS_HOST=docker.messsner.click \
    -e REDIS_PORT=6379 \
    cloudserver

Donnerstag, 19. März 2020

VirtualBox unter Ubuntu 19.10

VirtualBox unter Ubuntu 19.10

Homeoffice sei Dank, soll ich mir jetzt Cisco Webex Meeting und Cisco Webex Teams installieren, beides Programme die nativ unter Linux bzw. im Browser nicht so recht funktionieren.
Ich hab für solche Fälle meine Windows Workstation als virtuelle Maschine in VirtualBox laufen.

Auf der Seite findet man eigentlich alle Pakete:

https://download.virtualbox.org/virtualbox/6.1.4/

ich hab mich dazu entschieden die Version von Oracle zu verwenden, damit ich die neueste Version habe (Version 6.0.14 ist im Repository, Version 6.1.4 die aktuellste)

zuerst die Ubuntu version deinstallieren

apt remove virtualbox-*

dann die von Oracle installieren

https://download.virtualbox.org/virtualbox/6.1.4/virtualbox-6.1_6.1.4-136177~Ubuntu~eoan_amd64.deb

die Guest Additions gleich mit runter laden

https://download.virtualbox.org/virtualbox/6.1.4/VBoxGuestAdditions_6.1.4.iso

dann noch das Extention Pack, weil ich die Videokamera und das USB Mikrofon durchschleifen will

https://download.virtualbox.org/virtualbox/6.1.4/Oracle_VM_VirtualBox_Extension_Pack-6.1.4.vbox-extpack

Installation neues .deb ist gar kein Problem, ich hab danach meinen Linux Host neu gestartet, weil auch gleich den Kernel auf den letzten Stand gebracht habe.

Guest Additions dann im Windows installiert und die Extentions bei der Konfiguration von VirtualBox. Danach lassen sich USB Geräte der virtuellen Maschine zuordnen.

OpenWRT 19 und ein Edimax USB WLAN Adapter

Ich kam gerade in die Verlegenheit einen Rapsberry B+ (das erste Modell) als Open-WRT Router für Outdoor neu zu installieren und wollte dabe...