Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - (Roomba)-Plugin-Frage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] - √ - (Roomba)-Plugin-Frage

    Ich sitze gerade am Roomba und hätte da eine Frage. Das Thema ist ja nicht wirklich neu, also zumindest in Roomba-Kreisen aber wenn ich das programmiere möchte ich das zumindest ein wenig verstehen.

    Ich hänge mal wieder an Bits&Bytes vs. String&integer&Hex.
    Ich bekomme von der seriellen die Sensordaten schon mal als Liste und kann diese auch zuordnen:

    Code:
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 65, 87, 255, 61, 34, [B]10[/B], [B]109[/B], 10, 136]
    Jetzt hab ich im Netz natürlich eine python-Umsetzung des Roomba gefunden, aber ohne es zu verstehen geht es natürlich nicht . Das Rad komplett neu zu erfinden macht aber auch keinen Sinn, also hier die Inspirationshilfe:
    https://code.google.com/p/pyrobot/so...pyrobot.py#436

    Dies wären hier als Byte 23 und 24.
    Nun möchte ich also bei o.g. Antwort der Sensordaten als Byte 23 und 24 in folgender Funktion geeignet formatiert übernehmen:

    Code:
        def DecodeUnsignedShort(self, low, high):
            """Map an unsigned short from a 'high' and 'low' bytes to 'name'."""
            new1 = struct.unpack('>H', high + low)[0]
            print (_new)
    Herauskommen müsste irgendwas im mA Bereich . Nach 3 Stunden Goolge sowie try&error geb ich mich geschlagen und bitte um Hilfe. Hätte den Vorteil dass ich mir die weiteren Funktionen weiter erarbeiten könnte.

    Die SCI-Doku schweigt sich dazu folgendermaßen aus:
    Charge 2Bytes 0 – 65535 mAh
    Range: 0 – 65535
    Data type: 2 bytes, unsigned
    The current charge of Roomba’s battery in milliamp-hours (mAh).
    The charge value decreases as the battery is depleted during
    running and increases when the battery is charged.
    Ansonsten...fährt der Roomba schon via sh.py los und nach Hause .

    Grüße
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    #2
    Hi Mirko,

    probier mal:

    Code:
    def DecodeUnsignedShort(self, low, high):
            """Map an unsigned short from a 'high' and 'low' bytes to 'name'."""
            _new = struct.unpack('>H', bytes([high, low]))[0]
            print (_new)
    Bis bald

    Marcus

    Kommentar


      #3
      Hallo Marcus,

      danke für die Hilfe, den Fehler hatte ich mir gerade wieder selbst eingebaut.
      Welches Format müssten denn low und high in diesem Fall haben? Vielleicht hilft mir das schon weiter.
      Bei Bits und Bytes ist mein Abstraktionsgrad einfach am Ende. Ich arbeite zwar täglich mit Künstlern unterschiedlichster Genre aber die sind im Gegensatz zur IT wirklich bodenständig .

      Ich will doch nix weiter als aus 10 und 109 einen Integer zwischen 0 – 65535, eigentlich sollte Python anhand dieser Randbedingungen arbeiten können ... also wenn ich mir was wünschen dürfte

      Kurzweg: Passt auch nicht.
      Umgezogen? Ja! ... Fertig? Nein!
      Baustelle 2.0 !

      Kommentar


        #4
        (Roomba)-Plugin-Frage

        Int 0-255

        Morgen kann ich dir weiter helfen.

        Gute Nacht

        Marcus

        Kommentar


          #5
          Ich mach heute auch Schluss, freue mich natürlich weiter über sachdienliche Hinweise bei "Aktenzeichen Bits&Bytes ungelöst".
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            Lass die eigene Funktion weg und benutze einfach int.from_bytes(x[4:7], byteorder='little') oder Ähnliches. Und dann ggfl. Skalieren. 4. Built-in Types ? Python v3.3.2 documentation

            Kommentar


              #7
              O.K. ich habs jetzt

              Code:
                  _capacity = self.DecodeUnsignedShort(answer[25],answer[24]) #capacity
              
                  def DecodeUnsignedShort(self, low, high):
                      bytearr = bytearray([high,low])
                      value = unpack('>H', bytearr)
                      print (value[0])
                      return (value[0])
              So passt das ganz gut. Bis ich darauf kam dass unpack ein bytearray haben will hats aber auch gedauert.
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                #8
                Zitat von JuMi2006 Beitrag anzeigen
                O.K. ich habs jetzt

                Code:
                    _capacity = self.DecodeUnsignedShort(answer[25],answer[24]) #capacity
                
                    def DecodeUnsignedShort(self, low, high):
                        bytearr = bytearray([high,low])
                        value = unpack('>H', bytearr)
                        print (value[0])
                        return (value[0])
                So passt das ganz gut. Bis ich darauf kam dass unpack ein bytearray haben will hats aber auch gedauert.
                Ist dir
                Code:
                _capacity = int.from_bytes(answer[24:26], byteorder='little')
                zu einfach?

                Kommentar


                  #9
                  Hallo Robert,

                  nein aber ich brauch noch mehrere Datentypen, da ist es einfacher das Schema was ich als Vorlage nutze weiter zu verarbeiten, sonst geht die Fragerei bei unsigned long, unsigned byte etc. weiter .
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    #10
                    Nö - da gibts du ihm einfach einen entsprechend größeren/kleineren Bereich!? Also x[4:9] für 32bit oder nur x[4] für 8bit. Und signed geht damit natürlich auch. Aber wenn du magst schreib halt mehr Code.

                    Nebenbei: https://github.com/mknx/smarthome/co...bae26d1d69dc04 - da habe ich mein Plugin aus genau! demselben Grund umgestellt. Man beachte die Commit-Nachricht. Es gibt einfach keinen Sinn sich mit unleserlichen Code selbst ins Bein zu schießen wenn es FERTIGE Funktionen genau dafür gibt...

                    Kommentar


                      #11
                      Kleine Perfomance-Randnotitz:
                      struct ist schneller, zumindest bei Py3.2. Habe ich mal für das KNX-Plugin gemessen.

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        Zitat von mknx Beitrag anzeigen
                        Kleine Perfomance-Randnotitz:
                        struct ist schneller, zumindest bei Py3.2. Habe ich mal für das KNX-Plugin gemessen.

                        Bis bald

                        Marcus
                        Wenn wir jetzt über Zeit, und nicht über Les- und Wartbarkeit sinnieren: struct ist nur für Leute die zu viel Zeit haben:

                        Code:
                        root@server:~# python3 benchmark.py
                        benchmark: struct with new bytes took: 5.41s
                        benchmark: better struct took: 1.73s
                        benchmark: best struct took: 1.27s
                        benchmark: int took: 3.50s
                        benchmark: direct took: 0.75s
                        Code:
                        #!/usr/bin/env python3
                        # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
                        
                        import time
                        from struct import *
                        
                        def DecodeUnsignedShort(low, high):
                                bytearr = bytearray([high,low])
                                value = unpack('>H', bytearr)
                                #print (value[0])
                                return (value[0])
                        
                        def DecodeUnsignedShort2(bytearr):
                                value = unpack('>H', bytearr)
                                #print (value[0])
                                return (value[0])
                        
                        test = bytes(range(256))
                        for power in range(12):
                            test = test + test
                        
                        start = time.time()
                        for idx in range(0,len(test),2):
                            value = DecodeUnsignedShort(test[idx+1], test[idx])
                            #print(value)
                        print("benchmark: struct with new bytes took: {:.2f}s".format(time.time() - start))
                        
                        start = time.time()
                        for idx in range(0,len(test),2):
                            value = DecodeUnsignedShort2(test[idx:idx+2])
                            #print(value)
                        print("benchmark: better struct took: {:.2f}s".format(time.time() - start))
                        
                        start = time.time()
                        for idx in range(0,len(test),2):
                            value = unpack('>H', test[idx:idx+2])
                            #print(value)
                        print("benchmark: best struct took: {:.2f}s".format(time.time() - start))
                        
                        start = time.time()
                        for idx in range(0,len(test),2):
                            value = int.from_bytes(test[idx:idx+2], byteorder='little')
                            #print(value)
                        print("benchmark: int took: {:.2f}s".format(time.time() - start))
                        
                        start = time.time()
                        for idx in range(0,len(test),2):
                            value = test[idx] << 8 | test[idx+1];
                            #print(value)
                        print("benchmark: direct took: {:.2f}s".format(time.time() - start))

                        Kommentar


                          #13

                          Kommentar


                            #14
                            Ich geb euch dann das Plugin, dann könnt Ihr das anpassen .

                            In der Zeit bis ich den Kram verstanden habe, hab ich das dreimal getippt. Und beim Staubsauger ist mir das auch egal ob er nun 0.5 Sekunden delay hat .

                            Wenn alles fertig ist sehe ich mir das sicherlich noch mal an, ob ich das aber 2 Monate noch/wieder verstehe wage ich zu bezweifeln.

                            Ich bräuchte Ersatz für:

                            Code:
                            def DecodeUnsignedShort(self, low, high):
                            def DecodeByte(self,byte):
                            def DecodeShort(self, low, high):
                            def DecodeUnsignedByte(self, byte):
                            wobei ich das ehrlich nicht so schlimm finde, ich kann ja mal die Zeit messen die für die Werte drauf geht...aber nicht mehr heut.

                            Grüße
                            Umgezogen? Ja! ... Fertig? Nein!
                            Baustelle 2.0 !

                            Kommentar


                              #15
                              Hi Robert,

                              weil wir schon so schön offtopic sind.

                              timeit ist gut zum messen:

                              Code:
                              #!/usr/bin/env python3
                              import timeit
                              
                              def vara():
                                  pass
                              
                              def varb():
                                  pass
                              
                              print(timeit.timeit(vara, number=10000))
                              print(timeit.timeit(varb, number=10000))
                              Bis bald

                              Marcus

                              Kommentar

                              Lädt...
                              X