Jump to content

techniker

Members
  • Gesamte Inhalte

    26
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von techniker

  1. Nochmals eine Frage:

    Kann man in Python 3 die Bedingungen gleicher Logik z.B != mit mehreren Variablen vergleichen, also in einer Kurzform anstatt diverse "nicht gleich" hintereinander zu schreiben. So das self.sw.get_color() nur einmal aufzuführen ist. "and self.sw.get_color() != [red, green...." geht eben nicht.

    if self.ping(self.HOST_Controller) == False and self.sw.get_color() != [red, green, purple]
    	self.sw.set_color(*blue)
    elif self.ping(self.HOST_Controller) == True and self.sw.get_color() != red and self.sw.get_color() != green and self.sw.get_color() != purple:

     

  2. Hier mal noch ein Zwischenstand. Das AirQuality Bricklet dient nur mal als Datenlieferant. Denkbar sind diverse Anwendungen um Werte oder ein Balkendiagramm anzuzeigen.

    Der Timer kann auf 1000 gesetzt werden. Sobald dieser erreicht ist wird ein Refresh ausgelöst. default mode > fill.black > draw > delta mode, evtl. auch die Farbe rot möglich je nach Einbrenn-Problematik was sich noch zeigen wird.

    Beste Grüsse

    ink.jpg

  3. Abend,

    Vielen Dank für das Code Beispiel. Obwohl ich bei der Formel [y * WIDTH + x] nicht recht verstehe was die macht.

    Gibt es en Vorteil zu der append Funktion? Evtl. die Geschwindigkeit? Ich hab beide versucht und kein offensichtlicher unterschied feststellen können.

    z.B. dies hier:

    def draw_image(self, WIDTH, HEIGHT, image):
            data = image.load()
            pixels_matrix = []
    
            for x in range(HEIGHT):
                for y in range(WIDTH):
                    pixels_matrix.append(data[y, x] != 0)
    
            self.ink.write_black_white(0, 0, WIDTH-1, HEIGHT-1, pixels_matrix)

     

  4. Hallo Zusammen

    Ich hab echt den Filmriss. Wie kann ich auf dem E-Paper einen Wert mit einem TrueType Font Zeichnen?

    Ich hab da mal das alte Oled Servo Beispiel angeschaut. Diese API hat allerdings noch eine Funktion new_window... darum gehts nicht zu adaptieren.

    Beim neuen Oled Blicklet 2.0 gibt es das Servo Beispiel leider nicht mehr. Dort wurde auch die API eher in die Richtung des E-Ink Bricklet entwickelt.

    Hier mal eine Codevariante die natürlich nicht läuft weil ich die Daten nicht in den E-Ink Buffer bekomme.

    Vielleicht kann mir jemand helfen. Natürlich müss später noch die Aktualisierung gelöst werden. z.b schwarz überschreiben.. aber das kommt später.

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    HOST = "localhost"
    PORT = 4223
    UID = "Lww" # Change XYZ to the UID of your E-Paper 296x128 Bricklet
    
    WIDTH = 296 # Columns
    HEIGHT = 128 # Rows
    
    from tinkerforge.ip_connection import IPConnection
    from tinkerforge.bricklet_e_paper_296x128 import BrickletEPaper296x128
    from PIL import Image, ImageDraw, ImageFont
    
    import math
    import time
    
    def draw_matrix(pixels):
        column_index = 0
        column = []
    
        for i in range(HEIGHT//8 - 1): # We use last 8 pixels for text
            for j in range(WIDTH):
                page = 0
                for k in range(8):
                    if pixels[i*8 + k][j] == 1:
                        page |= 1 << k
    
                if len(column) <= column_index:
                    column.append([])
    
                column[column_index].append(page)
                if len(column[column_index]) == HEIGHT:
                    column_index += 1
    
            epaper.write_black_white(0, 0, WIDTH-1, HEIGHT-1, pixels)
            
    
        
    
    
    if __name__ == "__main__":
        ipcon = IPConnection() # Create IP connection
        epaper = BrickletEPaper296x128(UID, ipcon) # Create device object
    
        ipcon.connect(HOST, PORT) # Connect to brickd
       
        while True:
            img = Image.new('1', (WIDTH, HEIGHT), 0)
            draw = ImageDraw.Draw(img)
            font = ImageFont.truetype("DejaVuSans.ttf", 25)
            draw.text((70, 22), "test", font=font, fill=1)
            data = img.load()
            pixel_matrix = [[False]*WIDTH for i in range(HEIGHT)]
            for x in range(WIDTH):
                for y in range(HEIGHT):
                    pixel_matrix[y][x] = data[x, y] == 1
    
            draw_matrix(pixel_matrix)
            
            epaper.draw()
    
            time.sleep(0.04)

    hier ein lauffähiger Code, falls jemand ein ähnliches Problem hat.

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import time
    import logging as log
    log.basicConfig(level=log.INFO)
    
    from PIL import Image, ImageDraw, ImageFont
    from tinkerforge.ip_connection import IPConnection
    from tinkerforge.ip_connection import Error
    from tinkerforge.bricklet_e_paper_296x128 import BrickletEPaper296x128
    from tinkerforge.bricklet_air_quality import BrickletAirQuality
    
    class AirQuality:
        HOST = "localhost"
        PORT = 4223
    
        ipcon = None
        ink = None
        air_quality = None
    
        def __init__(self):
            self.ipcon = IPConnection()
    
            self.t = 0
            self.h = 0
            self.p = 0
            self.ii = 0
            self.ia = ""
            self.i = -7
            self.init = True
            self.image = 0
            self.WIDTH = 296 # Columns
            self.HEIGHT = 128 # Rows
            self.color = 0
    
            while True:
                try:
                    self.ipcon.connect(AirQuality.HOST, AirQuality.PORT)
                    break
                except Error as e:
                    log.error('Connection Error: ' + str(e.description))
                    time.sleep(1)
                except socket.error as e:
                    log.error('Socket error: ' + str(e))
                    time.sleep(1)
    
            self.ipcon.register_callback(IPConnection.CALLBACK_ENUMERATE,
                                         self.cb_enumerate)
            self.ipcon.register_callback(IPConnection.CALLBACK_CONNECTED,
                                         self.cb_connected)
    
            # Enumerate Bricks and Bricklets (retry if not possible)
            while True:
                try:
                    self.ipcon.enumerate()
                    break
                except Error as e:
                    log.error('Enumerate Error: ' + str(e.description))
                    time.sleep(1)
    
        def draw_image(self, ink, start_column, start_row, column_count, row_count, image):
            image_data = image.load()
            pixels = []
    
            # Convert image pixels into 8bit pages
            for row in range(row_count):
                for column in range(column_count):
                    pixels.append(image_data[column, row] != 0)
    
            self.ink.write_black_white(0, 0, self.WIDTH-1, self.HEIGHT-1, pixels)
    
        def cb_all_values(self, iaq_index, iaq_index_accuracy, temperature, humidity, air_pressure):
            if self.init == True:
                self.color = 1
                self.image = Image.new("1", (self.WIDTH, self.HEIGHT), 0)
                self.draw = ImageDraw.Draw(self.image)
                self.font = ImageFont.truetype("DejaVuSans.ttf", 60)
                self.ink_refresh()
                self.init = False
            elif self.color == 1:
                self.t = temperature/100
            
            self.draw.text((70, 22), str(self.t), font=self.font, fill=self.color)    
            self.draw_image(self.ink, 0, 0, self.WIDTH, self.HEIGHT, self.image)
            
            if self.ink.get_draw_status() == self.ink.DRAW_STATUS_IDLE:
                self.ink.draw()
    
            if self.color == 1:
                self.color = 0
            elif self.color == 0:
                self.color = 1
                
            
        def ink_refresh(self):
            self.ink.set_update_mode(self.ink.UPDATE_MODE_DEFAULT)
            self.ink.fill_display(self.ink.COLOR_BLACK)
            self.ink.draw()
            time.sleep(5)
            self.ink.set_update_mode(self.ink.UPDATE_MODE_DELTA)
    
    
        def cb_enumerate(self, uid, connected_uid, position, hardware_version,
                         firmware_version, device_identifier, enumeration_type):
            if enumeration_type == IPConnection.ENUMERATION_TYPE_CONNECTED or \
               enumeration_type == IPConnection.ENUMERATION_TYPE_AVAILABLE:
                if device_identifier == BrickletEPaper296x128.DEVICE_IDENTIFIER:
                    try:    
                        self.ink = BrickletEPaper296x128(uid, self.ipcon)
                        log.info('Ink Display initialized')
                    except Error as e:
                        log.error('Ink Display init failed: ' + str(e.description))
                        self.ink = None
                elif device_identifier == BrickletAirQuality.DEVICE_IDENTIFIER:
                    try:
                        self.air_quality = BrickletAirQuality(uid, self.ipcon)
                        self.air_quality.set_all_values_callback_configuration(500, False)
                        self.air_quality.register_callback(self.air_quality.CALLBACK_ALL_VALUES,
                                                           self.cb_all_values)
                        log.info('Air Quality initialized')
                    except Error as e:
                        log.error('Air Quality init failed: ' + str(e.description))
                        self.air_quality = None
    
        def cb_connected(self, connected_reason):
            # Eumerate again after auto-reconnect
            if connected_reason == IPConnection.CONNECT_REASON_AUTO_RECONNECT:
                log.info('Auto Reconnect')
    
                while True:
                    try:
                        self.ipcon.enumerate()
                        self.ink_refresh()
                        break
                    except Error as e:
                        log.error('Enumerate Error: ' + str(e.description))
                        time.sleep(1)
    
    if __name__ == "__main__":
        print ("Start")
        refresh = 1000
        x = 18
        z = 7
        y0 = 8
        y1 = 128
        y = range(y0, y1, int(round((y1-y0)/z,0)))
    
    
        w = AirQuality()
        time.sleep(0.1)
        
        while True:
            time.sleep(0.1)
    
    

     

  5. Hallo Erik

    Ja dass das Script noch mehr Probleme beinhaltet hab ich im Anschluss an mein Versuch auch herausgefunden.

    Ich habs ohne Docker zum laufen gebracht.

    Auszug aus der angepassten build_environment_setup.sh / Änderungen > mono_devel und siehe unten

    Bemerkung: Das die Sphinx Leute immer mal was ändern müssen, der "SmartyPantsHTMLTranslator" ist seit der Version 1.6 nicht mehr enthalten!

    .....
    
    sudo apt-get -y install build-essential mono-complete mono-devel python3 perl default-jre default-jdk nodejs npm php-pear ruby zip curl
    
    .....
    
    # Install pip and sphinx 1.5.6, pyenchant, sphinxcontrib.spelling
    cd ~/Downloads/
    curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
    sudo python2 get-pip.py
    pip2 install sphinx==1.5.6
    pip2 install pyenchant
    pip2 install sphinxcontrib.spelling==1.4
    
    # Generate Bindings and Copy examples to documentation
    cd ~/tf/generators/
    python3 generate_all.py
    python3 copy_all.py 
    ......

    mit Docker hatte ich mal ein Versuch unternommen, aber ich habs dort gem. Dok.

    docker pull tinkerforge/build_environment_c

    ausgeführt. Dort fehlt das docker image für die doc-Git, _full kam mir nicht in den sinn. Danke für den Hinweis.

    Grüsse

    Sven

  6. Bin dem Problem auf der Spur. Scheint ein Python Versionsproblem zu sein. Im Script wird oben ja Python2 und später noch Python3 installiert. Für die generate wird sicher mal Python3 benötigt aber leider lautet der Aufruf auf python! So kanns nicht gehen. Ausser man referenziert python als python3 > eher unüblich.

    Jetzt lasse ich mal das Script laufen, abwarten.

    Vielen Dank für den Wink mit dem generate_all.py

    # Generate Bindings and Copy examples to documentation

    cd ~/tf/generators/
    python generate_all.py > python3
    python copy_all.py > python3
     
    # Install additional pygments lexers
    cd ~/tf/doc/pygments-mathematica/
    sudo python setup.py install
    cd ~/tf/doc/pygments-octave-fixed/
    sudo python setup.py install
     
    # Generate doc
    cd ~/tf/doc/
    make html
     
    # Generate brickv GUI
    cd ~/tf/brickv/src/
    python build_all_ui.py
  7. Das Erstellen einer lokalen Dokumentation funktioniert nicht.

    zuvor wurde natürlich die build_environment_setup.sh ausgeführt.

    make html ergibt diese Rückmeldung

    make[1]: Verzeichnis „/home/gus/tf/doc/de“ wird betreten
    python ../generate_tables.py
    Traceback (most recent call last):
      File "../generate_tables.py", line 12, in <module>
        from device_infos import DeviceInfo, brick_infos, bricklet_infos
    ImportError: No module named device_infos
    make[1]: *** [Makefile:34: generate] Fehler 1
    make[1]: Verzeichnis „/home/gus/tf/doc/de“ wird verlassen

    Weiss jemand wie dies zu beheben ist?

    Beste Grüsse

     

  8. Mir gelingt es nicht den Toolchain zu bauen. Die README.rst bezieht sich noch auf die SDK 1.5.3 Ihr benutzt aber doch die 2.0.0 ich wollte diese benutzen aber die Patches scheinen nicht zu funktionieren.

     

    gus@VMxubuntu:~/tf/wifi-v2-extension/software$ patch -b -N -d ../toolchain/esp-open-sdk/sdk/include -p1 < esp8266sdk-c_types.patch
    patching file c_types.h
    Hunk #1 FAILED at 6.
    1 out of 1 hunk FAILED -- saving rejects to file c_types.h.rej
    gus@VMxubuntu:~/tf/wifi-v2-extension/software$ 
    

     

    Der make Aufruf endet mit:

     

    espfs/espfs.c:244:4: error: implicit declaration of function 'heatshrink_decoder_poll' [-Werror=implicit-function-declaration]
        heatshrink_decoder_poll(dec, (uint8_t *)buff, len-decoded, &rlen);
        ^
    espfs/espfs.c:244:43: error: expected expression before ')' token
        heatshrink_decoder_poll(dec, (uint8_t *)buff, len-decoded, &rlen);
                                               ^
    cc1: all warnings being treated as errors
    Makefile:220: die Regel für Ziel „build/espfs/espfs.o“ scheiterte
    make[1]: *** [build/espfs/espfs.o] Fehler 1
    make[1]: Verzeichnis „/home/gus/tf/wifi-v2-extension/toolchain/libesphttpd“ wird verlassen
    Makefile:139: die Regel für Ziel „buildlibesphttpd“ scheiterte
    make: *** [buildlibesphttpd] Fehler 2
    gus@VMxubuntu:~/tf/wifi-v2-extension/software$ 
    

     

    Frage wäre es vielleicht möglich das Ihr euer Toolchain gepackt als zip unter http://download.tinkerforge.com/ als download bereitstellt?

    Dies könnte viel mühe ersparen der PATH müsste dann nur noch gesetzt werden.

  9. Also, ich hab da bei mir eine Lösung gefunden. Das Problem ist dass aus welchem Grund auch immer, der TCP Ausgangs Buffer Daten enthält sobald eine TCP Verbindung hergestellt wird. Darum mache ich ein Connect und Lese den Buffer, beim Lesen wird dieser gelöscht, anschliessend kann ich mit der Funktion 254 die einzelnen Module abfragen ohne doppelte Einträge zu bekommen.

     

        TCPClient.Connect;
        TCPClient.IOHandler.ReadBytes(rxBuf, -1, False);
    

     

    Beste Grüsse und viel Erfolg

  10. Hallo

     

    Ich habe da so eine Idee das im red-brick die Grundfunktionalität eines Ablaufes enthalten ist. Die Befehle kommen dann zum red-brick und dieser setzt diese dann im Rahmen seiner z.B. Wert begrenzenden Funktion um.

    Die Kommunikation soll über TCP/IP erfolgen, analog dem Ansprechen der Bricks und Bricklets.

    Das was ich da benötige währen Variablen die der red-brick im Programm bereitstellt und dann weiter verarbeitet. Es sollen Ausgaben und Eingaben möglich sein.

    Wie könnte so ein red-brick Programm aussehen?

     

    Beste Grüsse

     

  11. Hallo

     

    Ich habe ein ähnliches Verhalten bei meiner Implementierung beobachtet. Es tritt aber nur über eine TCP/IP Verbindung auf, wie auch bei dir. Weiter tritt es bei mir nur bei der ersten Verbindung auf, d.h. bei einer erneuten Abfrage werden die Master, Red, oder auch andere Bricks korrket einmal gelistet. Ich habe den Verdacht das es sich dabei um ein Problem im TCP/IP Protokoll handelt.

     

    Verbindets du mit WLAN? Weil bei mir tritt es auch nur im WLAN auf. Ev. werden dort im Protokoll noch andere Daten übertragen welche bei der ersten Verbdingung nicht richtig ausgewertet werden bzw. stören.

     

    Beste Grüsse 

  12. Besten Dank, jetzt habe ich den Fehler gefunden.

     

    im build_environment_setup.sh

     

    das php5 Paket konnte im Ubuntu 16.10 Yakkety nicht installiert werden, darum wurde die ganze apt-get Zeile nicht ausgeführt. Somit fehlte xbuild und alles andere aus dieser Anweisung.

    Leider habe ich die mono 2.0 Files nicht nachinstallieren können. Hab jetzt die von der mono 4.5 benutzt und es funktioniert.

     

    # Packages for "generators/generate_all.py"
    sudo apt-get -y install build-essential mono-complete python3 perl default-jre default-jdk nodejs npm php5 php-pear ruby zip
    sudo npm install -g browserify
    sudo ln -s /usr/bin/nodejs /usr/local/bin/node

  13. Vielen Dank, leider treten noch ein paar Probleme auf.

     

    am Ende vom generate_all.py

     

    * bricklet_voltage_current

    Traceback (most recent call last):

      File "generate_all.py", line 72, in <module>

        run_zip_generator(path, binding)

      File "generate_all.py", line 63, in run_zip_generator

        module.generate(os.path.join(path, binding))

      File "/home/gus/tf/generators/csharp/generate_csharp_zip.py", line 125, in generate

        common.generate(bindings_root_directory, 'en', CSharpZipGenerator)

      File "/home/gus/tf/generators/common.py", line 745, in generate

        generator.finish()

      File "/home/gus/tf/generators/csharp/generate_csharp_zip.py", line 110, in finish

        os.path.join(self.tmp_source_tinkerforge_dir, 'Tinkerforge.csproj')])

      File "/home/gus/tf/generators/common.py", line 620, in execute

        if subprocess.call(args, **kwargs) != 0:

      File "/usr/lib/python2.7/subprocess.py", line 523, in call

        return Popen(*popenargs, **kwargs).wait()

      File "/usr/lib/python2.7/subprocess.py", line 711, in __init__

        errread, errwrite)

      File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child

        raise child_exception

    OSError: [Errno 2] No such file or directory

     

    und dann beim ausführen des copy_all.py

     

    gus@CF-20:~/tf/generators$ sudo python2 copy_all.py

    [sudo] Passwort für gus:

     

    Copying ip_connection to brickv:

     

    Copying Python bindings to brickv:

     

    Copying 'en' documentation and examples:

    Copying 'de' documentation and examples:

     

    Copying Tinkerforge.js to doc/en:

    Traceback (most recent call last):

      File "copy_all.py", line 122, in <module>

        shutil.copy(src_file, dest_dir)

      File "/usr/lib/python2.7/shutil.py", line 119, in copy

        copyfile(src, dst)

      File "/usr/lib/python2.7/shutil.py", line 82, in copyfile

        with open(src, 'rb') as fsrc:

    IOError: [Errno 2] No such file or directory: '/home/gus/tf/generators/javascript/Tinkerforge.js'

     

  14. Hallo Zusammen

     

    Ich möchte mir gerne eine aktuelle offline Doku erstellen, aber das Ausführen des generate_all.py endet immer mit folgenden Fehler. Auch in einem osboxes-image Ubuntu 15.10 habe ich die gleichen Meldungen.

     

    gus@CF-20:~/tf/generators$ python2 generate_all.py

     

    Generating bindings for c:

    * brick_dc

    * brick_imu

    * brick_imu_v2

    * brick_master

    * brick_red

    * brick_servo

    * brick_silent_stepper (not released, not documented)

    Traceback (most recent call last):

      File "generate_all.py", line 33, in <module>

        module.generate(os.path.join(path, binding))

      File "/home/gus/tf/generators/c/generate_c_bindings.py", line 798, in generate

        common.generate(bindings_root_directory, 'en', CBindingsGenerator)

      File "/home/gus/tf/generators/common.py", line 743, in generate

        generator.generate(device)

      File "/home/gus/tf/generators/c/generate_c_bindings.py", line 790, in generate

        h.write(device.get_c_header())

      File "/home/gus/tf/generators/c/generate_c_bindings.py", line 632, in get_c_header

        header += self.get_c_function_declaration()

      File "/home/gus/tf/generators/c/generate_c_bindings.py", line 586, in get_c_function_declaration

        doc = packet.get_c_formatted_doc()

      File "/home/gus/tf/generators/c/generate_c_bindings.py", line 669, in get_c_formatted_doc

        text = self.get_device().specialize_c_doc_function_links(text)

      File "/home/gus/tf/generators/c/generate_c_bindings.py", line 44, in specialize_c_doc_function_links

        return self.specialize_doc_function_links(text, specializer)

      File "/home/gus/tf/generators/common.py", line 1410, in specialize_doc_function_links

        raise Exception('Unknown :func: found: ' + m.group(1))

    Exception: Unknown :func: found: :func:`SetStallguardCoolstepConfiguration`

     

×
×
  • Neu erstellen...