Ulanzi Smart Pixel Clock

Zu einem vernünftigen Preis zu haben ist die Ulanzi Pixel Clock, die hier https://www.mydealz.de/visit/threadbeldesc/2232719 oder über Ali zu bekommen ist und hier kurz vorgestellt wird Im verlinkten Beitrag sind die wichtigsten links bereits zu finden. Das geniale ist, dass es ein Projekt “Awtrix” gibt dass es einfach darüber geflasht wird und das Teil damit für so ziemlich alles öffnet.

Das mitgeliefert System habe ich gar nicht angeschaut und sofort Awtrix Light grflasht. Danach lässt sich das Teil über MQTT oder http oder ioBroker ansteuern. Da ich bereits ioBroker auf meiner Synology laufen habe, habe ich mich für dafür entschieden, und nach ein paar Anläufen lief das Teil.

Im Moment zeige ich den Stromverbrauch und die erzeugte Solarenergie an um z.B. hau entscheiden ob es Zeit ist die Spülmaschine o.ä. anzuwerfen.

Weiter werden die nächsten 3 Fahrten (und die Verspätungen dazu) nach München angezeigt.

Temperatur und Regenprognose folgen noch. Ebenso wie Warnhinweise auf offen gelassene Türen und Fenster.

NodeMCU deepSleep Fehler vermeiden

NodeMCU

Während meiner Versuche mit dem NodeMCU und deepSleep stieß ich auf zwei Fehler die man machen kann, aber nicht sollte. Der erste lies mich den Baustein nicht mehr mit neuem Code bespielen. Der Grund ist, dass der Baustein während er im deepSleep Mode ist, sich nicht mehr flashen lässt. Die Lösung des Problems ist hier beschrieben:

Solution: https://forum.arduino.cc/index.php?topic=613412.0

You do not say what version of ESP8266 your using but if it has two buttons on the module (maybe called Reset & Flash) then hold down the flash button, briefly press the reset button and then after a second or two release the flash button. This should put the ESP into programming mode where the built in bootloader is running instead of your sketch.

Is there any other method putting the Wemos into programming mode instead of the second (flash) button?
Connect GPIO0 (that I think is pin D3 on the D1 Mini) to GND and then press the reset button.
You may also need to remove the D0-RST link but I’m not sure.

Der andere schwierig zu findende Fehler war, (vor lauter Begeisterung vergessen 😉 ) abzufangen, falls mal keine Verbindung zustande kommt. Hier ganz einfach mit dem Zähler tries behoben. Ansonsten geht er in Endlosschleife …

//connect to your local wi-fi network
WiFi.begin(ssid, password);/check wi-fi is connected to wi-fi network
int tries = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
tries++;
if (tries > 10) {
// wenn keine verbindung gelingt
Serial.println("No WiFi! Gonig to Sleep");
ESP.deepSleep(10e7);
}}
Serial.println("");
Serial.println("WiFi connected..!");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());

Raspberry pi & waveshare 2.7 e-ink Display & python

Start with a headless raspberry, no need to connect monitor, keyboard: https://raspberrypi.stackexchange.com/questions/10251/prepare-sd-card-for-wifi-on-headless-pi

Find the raspberry in your router and connect with ssh. Useullay steps are:

sudo raspi-config
sudo reboot

(neu einloggen)

sudo apt-get update -y
sudo apt-get upgrade -y

Here’s some example python code for drawing text horizontal on the waveshare e-ink display. You’ll find also a example where to find the length of text where to break lines. This examples reads some small text from a web site and looks up a rss feed for the weather.

Install the fonts https://www.raspberrypi.org/forums/viewtopic.php?t=133772

sudo apt-get install ttf-mscorefonts-installer

Install libraries https://www.waveshare.com/wiki/Pioneer600#Libraries_Installation_for_RPi

sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
 ./build
https://www.waveshare.com/wiki/3.7inch_e-Paper_HAT


sudo apt-get install wiringpi
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
gpio -v
cd
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.59.tar.gz
tar zxvf bcm2835-1.59.tar.gz
cd bcm2835-1.59
./configure
make
sudo make check
sudo make install
  • Install Python2 libraries
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-pil
sudo apt-get install python-numpy
sudo pip install RPi.GPIO
sudo pip install spidev
  • Install Python3 libraries
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install python3-pil
sudo apt-get install python3-numpy
sudo pip3 install RPi.GPIO
sudo pip3 install spidev

pip install feedparser

(Before running the API codes we provided, you should start up the corresponding core drivers of the interfaces. In the ready-to-use system image file, both I2C and SPI are set to Enable by default, but the serial port is still in the terminal debugging function mode.)

  1. Enable the I2C function. Run the following command to configure your Raspberry Pi board:
     sudo raspi-config

    Select Advanced Interface Options -> I2C -> yes, to start up the I2C core driver. Then you also need to modify the configuration file. Run the following command to open the configuration file:

    sudo nano /etc/modules

    Add the following two lines to the configuration file

    i2c-bcm2708
    i2c-dev
    Press the keys Ctrl+X to exit, and input Y to save the settings. Then, reboot the module to make the settings take effect.
  2. Enable the serial function. The serial port of RPi is set to serial terminal debugging function mode by default. If you want the serial port services as a common IO, you should modify the settings on the RPi. When the terminal debugging function is disabled, you cannot access RPi board via the serial port any more. If you want to control the RPi, you may need to enable the debugging function of the serial port again.
    sudo raspi-config

    Select Advanced Interface Options -> Serial. Select the option no can disable the serial debugging function. And then, the serial port can be used for serial communication. And select the option yes can enable the serial debugging function. You should reboot the module to make the settings take effect.

Note: the serial port on Raspberry Pi 3 Model B is unusable, because Pin 14 and Pin 15 is connected to the on-board Bluetooth model.
  1. Start up the spi function, run the following command:
    sudo raspi-config

    Select Advanced Interface Options -> I2C -> yes, to start up I2C core driver.


Code


# coding: utf8
##
 #  width 176
 #  height 264
 ##



import epd2in7
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
import time
import urllib2
import feedparser
import datetime

def getLengthText(myTextInput, myFont, pixels):
    #font = ImageFont.truetype('/usr/share/fonts/truetype/freefont/msttcorefonts/comic.ttf', 28)
    #font = ImageFont.truetype("arial", 20)
    myText = myTextInput
    mlen = 0
    mlen = len(myText)
    w, h = myFont.getsize(myText)
    while pixels < w:
        myText = myText[0:mlen-2]
        mlen = len(myText)
        w, h = myFont.getsize(myText)
    return mlen

def addText(myImage,myText, myFont, xx,yy):
    #font = ImageFont.truetype('/usr/share/fonts/truetype/freefont/msttcorefonts/comic.ttf', 28)
    #font = ImageFont.truetype("arial", 20)
    w, h = myFont.getsize(myText)
    mask = Image.new('1', (w, h), 255)
    draw2 = ImageDraw.Draw(mask)
    draw2.text((0, 0), myText, font = myFont, fill = 0)
    mask = mask.rotate(90, expand=True)
    myImage.paste(mask, (xx,epd2in7.EPD_HEIGHT - w - yy ))

def main():
    epd = epd2in7.EPD()
    epd.init()

    image = Image.new('1', (epd2in7.EPD_WIDTH, epd2in7.EPD_HEIGHT), 255)    # 255: clear the image with white
    draw = ImageDraw.Draw(image)
    
    font = ImageFont.truetype("arial", 18)
    font2 = ImageFont.truetype("comic", 24)
    font3 = ImageFont.truetype("arial", 28)

    # get text from a feed
    #d = feedparser.parse('http://www.reddit.com/r/news/.rss')
    d = feedparser.parse('https://www.br.de/wetter/action/feeds/bayernwetter.do')
    dnr = 0
    dlen = len(d['entries'])
    #test
    oberbayern = 0
    for n in range(dlen):
        actentry = d['entries'][n]['title'].encode('utf-8').strip()
        print str(n) + " " + actentry[0:8]
        if actentry[0:8] == "Oberbaye":
            oberbayern = n
        #münchen
        if actentry[0:8] == "München":
            muenchen = n
    
    
    print d['entries'][oberbayern]['title'].encode('utf-8').strip()
    print d['entries'][muenchen]['title'].encode('utf-8').strip()
    nb = d['entries'][oberbayern]['title'].strip()
    
    # get text from a website
    ttext = "err"
    try:
            #response = urllib2.urlopen('http://4johannes.de/weather/lowest.txt')
            response = urllib2.urlopen('http://eiseler.com/perltest/tempmysqlcoldestblank.pl')
            ttext = response.read().strip()
            print(ttext)
    except:
            print("fehler2")
            ttext = "err2"

    # add to display

    # first Line
    grad = u'°'
    #entlang umgerechnet oben 1,1 nach 1,264/2
    draw.line((0, 264, 0, 0), fill = 0)
    draw.line((1, 264, 1, 0), fill = 0)
    addText(image, datetime.datetime.now().strftime("%H:%M %d.%m."), font3, 5, 6)
    addText(image, ttext + grad, font3, 5, 182)
    # horizontal unter der schrift:
    draw.line((38, 264, 38, 0), fill = 0)
    draw.line((39, 264, 39, 0), fill = 0)
    # senkrechte Linien, wenn quer gesehen
    draw.line((0, 264-180+5, 39, 264-180+5), fill = 0)
    draw.line((0, 264-180+4, 39, 264-180+4), fill = 0)
    draw.line((0, 263, 39, 263), fill = 0)
    draw.line((0, 262, 39, 262), fill = 0)

    draw.line((0, 0, 39, 0), fill = 0)
    draw.line((0, 1, 39, 1), fill = 0)


    muc = "München"
    mstr = d['entries'][muenchen]['title'].strip()
    mstr2 = mstr[mstr.find("):")+3:]

    xlen = 0
    xlen = getLengthText(mstr2,font, 264)
    mstr3 = mstr2[0:xlen]
    msRest = mstr2[xlen:]
    xlen = getLengthText(msRest,font, 264)
    mstr4 = msRest[0:xlen]

    addText(image, mstr3, font, 40, 0)
    addText(image, mstr4, font, 60, 0)
    #addText(image, "012345678901234567890123456789", font, 60, 0)

    print(nb.encode('utf-8'))
    xlen = 0
    xlen = getLengthText(nb,font, 264)
    nb1 = nb[0:xlen]
    nbRest = nb[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb2 = nbRest[0:xlen]
    nbRest = nbRest[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb3 = nbRest[0:xlen]
    nbRest = nbRest[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb4 = nbRest[0:xlen]
    nbRest = nbRest[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb5 = nbRest[0:xlen]
    
    print(nb1.encode('utf-8'))
    print(nb2.encode('utf-8'))
    print(nb3.encode('utf-8'))
    print(nb4.encode('utf-8'))
    print(nb5.encode('utf-8'))
    addText(image, nb1, font, 80, 0)
    addText(image, nb2, font, 100, 0)
    addText(image, nb3, font, 120, 0)
    addText(image, nb4, font, 140, 0)
    addText(image, nb5, font, 160, 0)
    #addText(image, "abcdef", font, 140, 0)
    #addText(image, "abcdef", font, 160, 0)


    epd.display_frame(epd.get_frame_buffer(image))
    # display images
    #epd.display_frame(epd.get_frame_buffer(Image.open('demopill2.bmp')))

if __name__ == '__main__':
    main()

Sony Radio Review: Sony XDR-P1DBP Taschenradio (DAB/DAB+)

IMG_9793

 

 

 

 

 

Mein Autoradio für’s Radl und für den Garten. Ich habe die 3 möglichen Varianten durchgetestet: UKW Rad-Radio; Handy über Streaming und DAB+. Wirklich überzeugt hat nur das DAB+. Die beiden anderen Varianten hatten einfach zu häufig Störungen als dass es wirklich Spaß gemacht hätte. Das Testgebiet war in und um München. Befestigungen am Rad? Ich benutze  2 Varianten, im Lenkerfahrradkorb wenn der sowieso dran ist, oder in der Handyhalterung, mit der ich auch sehr zufrieden bin..

Zum Radio selber:  Ungefähr in Handygröße aber wesentlich tiefer. Für die Größe ein guter Klang, findet sehr viele Sender und hat 2 Möglichkeiten seine Lieblingssender abzuspeichern. Eingebauter Akku, über Micro-USB zu laden, gefälliges Design. Nicht billig, aber seinen Preis wert.

-> Empfehlung.

 

Vodafone Kabel Receiver – kein Ton

Mein Vodafone Kabel Sagem Modem liefert keinen Ton mehr. Reboot half nicht. Was letztendlich half: Im Receiver-Menu, Ton, HDMI Dolby ausschalten.

Beim nächsten Auftreten half: Im obigen Menu hin und her, dann aus schalten. Und dann ein Reboot (vom Strom trennen).

Update: Tritt immer mal wieder auf. Zurzeit hilft, ausschalten, vom Strom trennen, und dann wieder vonv orne.

Suchbegriffe: Vodafone Kabel Ton geht nicht

Aluminum Bike Phone Holder – short Test

I recently bought Banggood: GUB G-86 CNC Aluminum Alloy Bicycle Bike Phone Holder Handbar…. (Or see below for Amazon). I had 3 rides since I mounted it on my cross bike, and my opinion till now is, that it is the best phone holder, which I ever had. Had a few problems by mounting it on my handle bar, but fixed that after 3 tries (see photo). I own a iPhone 6, having placed it in a case. The claws (don’t forget to use adhesive patches) hold it perfect, and it takes really just a part of the time to fix it than with the other holders before. – I recommend it

 

Alexa, erzähl einen Witz. 10 Wochen mit Amazon Echo

Ein kleines persönliches Review.

 

Wahrscheinlich bin ich zu guter Kunde bei Amazon, auf jeden Fall erhielt ich im November die Einladung jeweils ein Amazon Echo und ein Amazon Echo Dot zu erwerben. Trotz gewisser Bedenken habe ich einen Ruf als Gadgetexperte zu verteidigen und musste deshalb bestellen. Hier ein paar persönliche Erfahrungswerte, bezogen auf den Echo, zum Dot am Schluß noch eine Anmerkung.

Ohne viel Plastik verpackt, erwartet einen ein schwarzer wertiger Zylinder mit 8 cm Durchmesser und 24 cm Höhe. Das Format ist gut gewählt, durch die geringe Grundfläche findet sich überall ein Plätzchen. Zumindest bei mir ist es jetzt so dass “Alexa” öfters umzieht. Als Bedienelemente gibt es lediglich 2 Knöpfe und der obere Rand funktioniert gleichzeitig als Lautstärkeregler. Einer der Knöpfe schaltet das Micro ab, also Alexa aus. Der andere ist Trigger, was eigentlich das Wort “Alexa” sein sollte, also zwingt es das Teil zum Zuhören. Der Lautstärkeregler fühlt sich gut an und zeigt mittels der blau umlaufenden LED-Bandes oben seine Funktion an. Wofür den Lautstärkeregler? Braucht man wenn bei der Alexakinderparty (nur eine Episode aus der Party) die Gäste übermütig sich zu einem “Alexa, Lautstärke 10” verleitet haben, um schnell wieder runter zu kommen. Nun aber kurz zum LED Band. Es läuft um den oberen Rand, kann “laufen” und die Farbe zwischen einem satten Blau und Türkis wechseln. Wirklich it’s magic: Saugeil gemacht. (Video schau’n).

Was kann sie jetzt aber nun, die Alexa? Habt Ihr gemerkt, es ist nicht mehr der/das “Amazon Echo”, es ist die “Alexa”. Die reine Tonkennung, also das was sie mit ihren 7 Mikrophonen aufschnappt, auch wenn sie selber Musik abspielt, funktioniert sehr gut. Sie muss halt damit leben aus Unkenntnis oft angebrüllt zu werden. Die Kinder erkennt sie schwerer, aber mittlerweile haben’s auch die Kinder raus, dass man ein wenig anders sprechen muss. Hier auch mal zwischendurch der Tipp dazu: Es funktioniert am besten wenn man seinen “Befehl” durchgängig gibt, also “Alexa, Musik Radio SWR3”. Die meisten warten höflichkeitshalber auf eine Rückmeldung zwischendurch, also “Alexa” … Pause und erwarten, dass sie “ja” sagt. So funktioniert es aber nicht.

Also die Töne werden gut erkannt, aber auch die Sprache? Man kann auf einer Website das Protokoll “seiner” Alexa mitlaufen lassen und sieht, und kann bewerten wie gut sie Worte verstanden hat. Bei uns, eine erstaunlich hohe Trefferquote. Dann aber die Kür: Wie gut erkennt sie was wir von ihr wollen? Also wie gut ist Amazons Backend KI? Die Plugins werden wohl schnell mehr, aber wir haben uns bisher auf einige wenige “Use-Cases” beschränkt. Was soll ich mit einem vorgelesenen Rezept von Chefkoch.de? Was haben wir bisher probiert? “Wie ist das Wetter”: gut, “Lese mir die News vor”: zu langatmig (SPON vorlesen), Uhrzeit: gut, braucht man öfters als man denkt, Timer stellen (für Nudeln) sehr gut.
Soweit so gut unsere Highlights sind aber:
“Alexa, erzähl einen Witz” (Beispiel: Wieviel arbeiten in ihrer Abteilung? Ich schätze die Hälfte). Flachwitze, aber gut. Die Kinder lieben es.

“Alexa was hast du an?”, Selbstironie, nett: “Dasselbe wie gestern.”. Auch nett, Alexas Lieblingsfarbe: “schwarz”.

Nun aber zum Highlight eines tragbaren Lautsprechers: Musik. Rein physikalisch, Lautstärke und Klangqualität sind ok. In der Größe kann es keine Hifi-Anlage sein. Aber meistens reichts’. Natürlich muss das Teil mit einem “prime” Account verbunden sein, dann kann es aber viel. Fangen wir einfach an. “Alexa, Musik, Radio, SWR3” (ich nehme das jetzt nur als Beispiel, weil ich so gerne Verkehrsmeldungen aus meiner früheren Heimat höre). Klappt sehr gut, holt sich über tuneIn die Internetstreams. Die Amazon eigenen “Radio”sender: bekam ich vor allem angeboten, wenn ich nicht oder nicht richtig verstanden wurde. Sind leider gar nicht schlecht. Und während ich das hier schreibe höre ich eine CD, bzw. den Stream eines Künstlers den ich so kennenlernte. Und ich überlege mir die CD, bow. die mp3s zu kaufen: win, win.

Aber jetzt zu dem netten use case zusammen mit den Kindern, und zum Schluss: Ja, es gibt Menschen, die hören nur nassabgespielte LPs vom handsignierten Edison Grammophon. Ja, für Euch ist das nix. Aber für den Rest von uns, sorry leider geil! Ein Beispiel von heute? Mit den Kids Pizza belegt und gegessen. Dabei eine Reise durch die Musikgeschichte, ohne irgendwas zu bedienen: “Alexa, spiel eine kleine Nachtmusik”, “Mondscheinsonate”, “In the ghetto”, “Yellow submarine”, “Help”, “Imagine”, “Morning has broken”, “Mercedes Benz”, “Smoke on the water”, “Königin der Nacht” , boah alles gleich verstanden und abgespielt. So nen fixen DJ haste nur selten.

Epilog:

Bis 31.1. darf man das Teil zurückgeben. Mach ich nicht.

Der Dot versteht nicht ganz so gut Und der Klang naja: Als Küchenradio, oder an einen anderen Verstärker/Lautsprecher.

Fazit: Sowas hätte ich von Apple erwartet!