Ankündigung

Einklappen
Keine Ankündigung bisher.

Hat jemand Erfahrungen mit AS-MLV VOC Sensoren

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

    Hat jemand Erfahrungen mit AS-MLV VOC Sensoren

    Hallo Zus,

    nachdem der Winter wieder vor der Tür steht, und meine Nachbarn schon mal alle Ihre Kaminöfen vorgewärmt haben, möchte ich doch so schnell als möglich im Stande seine, dass meine KWL automatisch runterfährt, wenn der Nachbar das "räuchern" anfängt.

    Nun habe ich verschiedene Gerätschaften im High-Preis-Segment (Sauter EGQ110, Aerasgard SLQ) angesehen, finde diese aber doch recht teuer, und vor allem, sind Sie laut Datenblatt nicht mit Temperaturen < 0C° kompatibel.

    Nun habe ich von der Firma AppliedSensor aus Reutlingen den AS-MLV und AS-MLV-P gesehen, diese sind wie es scheint bezahlbar, aber halt nur der "nakte" Sensor.

    Hat jemand so ein Teil schon irgendwo im Einsatz? Und hat jemand ne Idee, wie man so ein Gerät an den misterhouse anbindet?

    Vielen Dank schon mal für Eure Hilfe

    Gruß

    colhicks

    #2
    Generell scheint die Auswertung des Sensors sehr einfach mittels 1-2 OP-Stufen möglich zu sein. Strom-Spannung, dann Wandlung auf z.B. 0-10V für eine Analogschnittstelle. Der Teufel könnte hier aber im Detail stecken: Regelung der Temperatur (das Datenblatt schweigt sich darüber aus), Aufheizzeit wenn der Sensor nicht permanent "braten" soll (finde ich auch nicht), Stromaufnahme ist etwas "seltsam" - komme schon auf 76mW für das Heizelement - steht in Wiederspruch zu den Angaben.

    Also: Mit etwas Mut, ein paar OPs, Fremdversorgung (je nach gewünschten Ausgangssignal bis 10V single-supply sollte reichen, eine "echte 0" oder "echte 10V" wird eh nicht geben) sollte was zu basteln sein.

    Oder eben mit eigenem Mikrocontroller und NCN5120 oder TPUART - flexibler, aber nicht mal eben zu machen.

    Wenn du oder jemand anderes welche von den Dingern bestellt würde ich auch einen nehmen um mir den mal anzusehen.

    Wo wir schon beim Basteln sind: Diverse Sensoren gibt es auch erheblich günstiger wenn man einen AirWick schlachtet: Geruchssensor - Air Wick Fresh Matic - Mikrocontroller.net

    Und hier das Wiki dazu: http://www.mikrocontroller.net/artic....C3.9Cbersicht - da scheint es auch eine "fertige" Möglichkeit mit 0-5V zu geben. Vielleicht reicht das, bzw. sogar mit einem einstellbaren Komparator auf einen Binäreingang.

    Grüße
    Robert

    Kommentar


      #3
      Hallo Robert,

      vielen Dank für Deinen Artikel und den Link. Nach einiger weiterer Recherche an der von Dir genannten Adresse, habe ich von Conrad den Voltcraft C020 gesehen, da ist das ganze schon fix und fertig in einem USB-Gehäuse drin.

      Ich muss mir jetzt nur noch Gedanken machen, wie ich den am sinnvollsten im Luftkanal befestige, und schon sollte das ganze machbar sein.

      Muss mir mal die Software von Conrad die es da gibt ansehen,

      Vielen Dank nochmal.

      Gruß

      colhicks

      Kommentar


        #4
        Von den Voltcraft VOC-Sensoren habe ich auch ein paar hier (bzw. die baugleichen von Sentinel), sitzen in einem USB-Ladenetzteil und funktionieren einwandfrei.

        Durch die Ampelfunktion wäre auch eine recht einfache KNX-Anbindung möglich (Tasterschnittstelle und LED-Ausgänge am Sensor abgreifen)....ich hatte so ein Teil auch mal offen, um nach einer RS232 zu suchen (ich hatte eine mögliche RS232-USB-Bridge gehofft zu finden, die man anzapfen kann), leider ohne Erfolg (soweit ich mich erinnere, wurde der USB-Anschluss direkt im µC emuliert).

        Das Teil spuckt über USB allerdings so einiges aus...da gibt es auch einen Entwicklermodus, den man in der Software freischalten kann...denkbar wäre hier z.B. eine schöne Low-Cost-Lösung mit einem Raspi, der die VOC-Daten ins Lan bringt.....
        Viele Grüße,
        Stefan

        DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

        Kommentar


          #5
          Zitat von dreamy1 Beitrag anzeigen
          Von den Voltcraft VOC-Sensoren habe ich auch ein paar hier (bzw. die baugleichen von Sentinel), sitzen in einem USB-Ladenetzteil und funktionieren einwandfrei.

          Durch die Ampelfunktion wäre auch eine recht einfache KNX-Anbindung möglich (Tasterschnittstelle und LED-Ausgänge am Sensor abgreifen)....ich hatte so ein Teil auch mal offen, um nach einer RS232 zu suchen (ich hatte eine mögliche RS232-USB-Bridge gehofft zu finden, die man anzapfen kann), leider ohne Erfolg (soweit ich mich erinnere, wurde der USB-Anschluss direkt im µC emuliert).

          Das Teil spuckt über USB allerdings so einiges aus...da gibt es auch einen Entwicklermodus, den man in der Software freischalten kann...denkbar wäre hier z.B. eine schöne Low-Cost-Lösung mit einem Raspi, der die VOC-Daten ins Lan bringt.....
          Unter:

          airsensor-linux-usb - Provides a simple Qt/libusb-based program to read out the data of an AirSensor USB-stick - Google Project Hosting

          habe ich dafür Code gefunden. Zwar für QT, aber QT kann man ja loswerden )

          Gruß

          colhicks

          Kommentar


            #6
            Nach dem "Entfernen" des QT Codes bleibt quantitativ fast nix mehr übrig. Die USB-Geschichte jedoch ist entweder umständlich (für CDC) oder deutet auf HID oder was proprietäres hin. Wie meldet sich der Stick? Als CDC-Device ("COM-Port")?

            Der Buffer sieht wiederum nach mehr oder minder ASCII mit hexadezimaler Sequenznummer aus. Die Abfragen mit den usleep nach brutalem Nachahmen einer geloggten USB-Kommunikation... These: Das geht viel einfacher...

            //edit: Okay, gewonnen, hab mir auch einen USB-Stick bestellt. Bei ebay übrigens schmerzfrei ohne (zusätzliche) Anmeldung und ohne Versandkosten für 24,95... KLICK und glücklich...

            Kommentar


              #7
              Zitat von Robert Beitrag anzeigen
              Nach dem "Entfernen" des QT Codes bleibt quantitativ fast nix mehr übrig. Die USB-Geschichte jedoch ist entweder umständlich (für CDC) oder deutet auf HID oder was proprietäres hin. Wie meldet sich der Stick? Als CDC-Device ("COM-Port")?

              Der Buffer sieht wiederum nach mehr oder minder ASCII mit hexadezimaler Sequenznummer aus. Die Abfragen mit den usleep nach brutalem Nachahmen einer geloggten USB-Kommunikation... These: Das geht viel einfacher...

              //edit: Okay, gewonnen, hab mir auch einen USB-Stick bestellt. Bei ebay übrigens schmerzfrei ohne (zusätzliche) Anmeldung und ohne Versandkosten für 24,95... KLICK und glücklich...
              cool. Dann harre ich mal Deiner Ergebnisse. Ich selber bin leider nicht so der Coder... habe unter Schmerzen meinen Steuerungs-Code für die KWL geboren )

              wäre super, wenn wir hier eine günstige und misterhouse-taugliche Lösung hätten, brauchbare VOC Werte zu bekommen.

              Gruß

              Ernst

              Kommentar


                #8
                Kann ich heute abend mal kurz schauen, wie die sich bei USB anmelden...ich glaube, dass es HID war und keine Serial Bridge. Irgendwas hat mich jedenfalls damals dazu bewegt, das Teil wieder zusammenzuschrauben...sonst wäre da schon längst ein Arduino mit XPort dran :-)
                Viele Grüße,
                Stefan

                DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

                Kommentar


                  #9
                  Ja, ist wohl HID: Voltcraft CO-20 USB-Luftqualitätssensor

                  Muss ich erst mal ne vernünftige Lib für Python ausgraben. Für Misterhouse etc. wird das aber eh nicht taugen, da ich sh.py einsetze.

                  Kommentar


                    #10
                    Für Python3 habe ich jetzt ein kurzes Programm geschrieben, was zumindest schon mal funktioniert.

                    Benötigt wird noch PyUSB, z.B. mit "apt-get install python3-setuptools | easy_install3 pyusb"

                    PHP-Code:
                    import usb.core
                    import usb
                    .util
                    import signal
                    from time import sleep

                    def signal_handler
                    (signalframe):
                        global 
                    running
                        running 
                    False

                    global running
                    running 
                    True
                    signal
                    .signal(signal.SIGINTsignal_handler)

                    # find our device
                    dev usb.core.find(idVendor=0x03ebidProduct=0x2013)
                    intf 0

                    # was it found?
                    if dev is None:
                        
                    raise ValueError('Device not found')

                    if 
                    dev.is_kernel_driver_active(intf):
                        
                    dev.detach_kernel_driver(intf)

                    if 
                    False:
                        
                    usb.util.claim_interface(devintf)
                        
                        
                    # reads the device-descriptor (bu)
                        #  bLength                18
                        #  bDescriptorType         1
                        #  bcdUSB               2.00
                        #  bDeviceClass            0 (Defined at Interface level)
                        #  bDeviceSubClass         0
                        #  bDeviceProtocol         0
                        #  bMaxPacketSize0        32
                        #  idVendor           0x03eb Atmel Corp.
                        #  idProduct          0x2013
                        #  bcdDevice           10.00
                        #  iManufacturer           1 AppliedSensor
                        #  iProduct                2 iAQ Stick
                        #  iSerial                 0
                        #  bNumConfigurations      1
                        
                    ret usb.control.get_descriptor(dev0x00000120x010x00)
                        print(
                    ret)
                        
                        
                    # reads the device-descriptor (bu)
                        #    bLength                 9
                        #    bDescriptorType         2
                        #    wTotalLength           41
                        #    bNumInterfaces          1
                        #    bConfigurationValue     1
                        #    iConfiguration          0
                        #    bmAttributes         0x80
                        #      (Bus Powered)
                        #    MaxPower              100mA
                        
                    ret usb.control.get_descriptor(dev0x00000090x020x00)
                        print(
                    ret)
                        
                        
                    # reads the device-descriptor including interface- and endpoint-descriptors
                        
                    ret usb.control.get_descriptor(dev0x00000290x020x00)
                        print(
                    ret)
                        
                        
                    usb.util.release_interface(devintf)


                    dev.set_configuration(0x01)
                    usb.util.claim_interface(devintf)

                    try:
                        
                    dev.set_interface_altsetting(intf0x00)
                        
                        
                    #  ret = usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x000000a, 0x0000000, 0x0000000, buf, 0x0000000, 1000);
                        
                    ret dev.ctrl_transfer(usb.util.CTRL_TYPE_CLASS usb.util.CTRL_RECIPIENT_INTERFACE0x0a00, [], 1000)
                        print(
                    ret)
                        
                        
                    #  ret = usb_get_descriptor(devh, 0x0000022, 0x0000000, buf, 0x0000075);
                        #ret = usb.control.get_descriptor(dev, 0x0000075, 0x22, 0x00)
                        #print(ret)
                        
                        #ret = dev.read(0x81, 0x10, intf, 1000)
                        #print(ret)
                        #ret = dev.read(0x81, 0x10, intf, 1000)
                        #print(ret)
                        
                        
                    msg1 bytearray('\x40\x68\x2a\x54\x52\x0a\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40''utf-8')
                        
                    msg2 bytearray('\x40\x30\x30\x30\x37\x46\x4c\x41\x47\x47\x45\x54\x3f\x0a\x40\x40''utf-8')
                        
                        while 
                    running:
                            
                    ret dev.write(0x02msg1intf1000)
                            
                    msg1[1] = msg1[1] + if msg1[1] < 255 else 103
                            
                    #print('write1.0 wrote {} bytes'.format(ret))
                            
                    sleep(0.5)

                            
                    ret dev.read(0x810x10intf1000)
                            
                    #print('read returned [{}]'.format(ret))

                            
                    print('ppm: {}'.format(int.from_bytes(ret[2:4], byteorder='little')))
                            
                    #print('unknown: {}'.format(int.from_bytes(ret[4:6], byteorder='little')))
                            #print('unknown2: {}'.format(int.from_bytes(ret[6:8], byteorder='little')))

                            #sleep(0.20)
                            
                    ret dev.read(0x810x10intf1000)
                            if 
                    len(ret) > 0:
                                print(
                    'read returned [{}]'.format(ret))
                            
                            
                            if 
                    True:
                                
                    ret dev.write(0x02msg2intf1000)
                                
                    # increment hex-seq
                                
                    if msg2[4] == ord('9'):
                                    
                    msg2[4] = ord('A')
                                
                    elif msg2[4] == ord('F'):
                                    
                    msg2[4] = ord('0')
                                else:
                                    
                    msg2[4] += 1
                                
                    #print('write2.0 wrote {} bytes'.format(ret))
                                
                    sleep(0.5)
                        
                                
                    ret dev.read(0x810x10intf1000)
                                
                    #print('read2.0 returned [{}]'.format(ret))
                                #sleep(0.20)
                                
                    ret dev.read(0x810x10intf1000)
                                
                    #print('read2.1 returned [{}]'.format(ret))
                                #sleep(0.20)
                                
                    ret dev.read(0x810x10intf1000)
                                
                    #print('read2.2 returned [{}]'.format(ret))
                                #sleep(0.10)

                    except Exception as e:
                            print(
                    e)

                    usb.util.release_interface(devintf
                    Folgende Probleme gibt es noch: Scheinbar wird "nur" alle 4 Sekunden ein neuer Wert berechnet - das Herstellerprogramm liest aber scheinbar jede Sekunde einen neuen Wert. Dann gelingt es mir nicht wie bei dem Qt-basierten Projekt den Descriptor 0x22 mit Länge 0x75 zu lesen. Ebenso schlagen die folgenden Endpoint-Reads fehl. Das anfängliche Lesen der Descriptoren ist hingegen nur Folklore bzw. wird wohl durch "find-usb" so oder ähnlich gemacht. Da kommt das gleiche wie bei lsusb -v raus.

                    Grüße
                    Robert

                    Kommentar


                      #11
                      Klasse!
                      Danke!

                      Kommentar


                        #12
                        Hi!

                        Für sh.py ist jetzt ein Plugin fertig mit dem man den Stick zuverlässig im Sekundentakt auslesen kann: https://knx-user-forum.de/smarthome-...t-co-20-a.html

                        Grüße
                        Robert

                        Kommentar


                          #13
                          Ersatz?

                          Ich wollte gerade so einen Stick kaufen...

                          Bei amazon und ebay nicht mehr lieferbar... Ich habe noch einen ergattern können direkt bei Conrad, aber man sagte mir "oh, da haben Sie ja einen der letzten erwischt"

                          Gibt es den baugleich woanders? Ich konnte nix finden...

                          Michael

                          Kommentar


                            #14
                            https://www.appliedsensor.com/produc...r-monitor-iam/

                            http://shop.sentinel-haus.eu/Wohnges...-Software.html

                            Kommentar


                              #15
                              zwischendurch mal 100ppm?

                              Hi,

                              habe den Stick seit gestern am Raspberry, funktioniert problemlos.

                              ABER: habt Ihr zwischendurch auch immer mal komische Werte?

                              Ich habe immer mal wieder zwischendurch Werte wie 0 oder 180 ppm, es sind aber nur einzelne Ausreisser...

                              Stick defekt? normal?

                              Danke Michael

                              Kommentar

                              Lädt...
                              X