Ankündigung

Einklappen
Keine Ankündigung bisher.

eHZ auslesen im PULL Modus

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

    eHZ auslesen im PULL Modus

    Hallo,
    ich möchte gern meinen eHZ (FROETEC SIMPLEX FRB-SM-R1B) auslesen und via Plugin in smarthomeNG einbinden.
    Der Zähler liefert die Daten nur im Pull Modus, mit einer SML pullsequenz (die ich auch noch nicht genau kenne).

    Unterstützt das SML oder das easymeter Plugin auch den PullModus?
    DANKE für Eure Rückmeldung.

    #2
    Hallo,
    ich weiß jetzt was mehr.
    Senden muss ich mit 9600baud in 7E1. Das kann ich über die Schnittstelle konfigurieren.
    Dann muss ein Befehl gesendet werden, der Zähler antwortet, was wiederum per Befehl bestätigt werden muss. Dann sendet der Zähler OBIS Codes mit den gesuchten Informationen. Will sagen, die pullsequenz kenne ich jetzt.

    Kann ich das mit den vorhandenen Plugins realisieren?
    Danke.

    Kommentar


      #3
      Hallo,
      ich bin wieder ein Stück weiter und möchte mit einer Logik und dem pyserial Modul 2.6 über einen USB IR-Schreib-Lesekopf meinen Stromzähler (eHZ) auslesen. Der IR-Schreib-Lesekopf ist an ttyUSB2 verbunden.

      Um die Kommunikation mit dem Zähler aufzunehmen, muss als INIT folgendes senden:
      HEX: 2F3F210D0A
      ASCII: /?!<CR><LF>

      Der Zähler antwortet mit:
      ASCII: /ITF5FRP-SMV320090704<\r><\n>

      Ich sende innerhalb von 2 Sekunden:
      HEX: 063035300d0a
      ASCII: <ACK>050<CR><LF>

      Der Zähler antwortet mit seinen Daten.

      Nun habe ich mich an den Code versucht, scheitere aber schon an ser.write.

      Code:
      #!/usr/bin/python
      #
      #
      
      import sys
      import serial
      import time
      import string
      
      logger.info("Logik ITF : by :" + trigger['by'] )
      
      # configure the serial connections (the parameters differs on the device you are connecting to)
      ser = serial.Serial(
          port='/dev/ttyUSB2',
          baudrate=9600,
          parity=serial.PARITY_EVEN,
          stopbits=serial.STOPBITS_ONE,
          bytesize=serial.SEVENBITS
      )
      
      #ser.open()
      #ser.isOpen()
      
      #ser.write(b'2F3F210D0A')
      #ser.write('2F3F210D0A'.enode('utf-8'))
      ser.write(b'/?!<CR><LF>')
      # let's wait a short time before reading the responses
      time.sleep(1)
      out = ser.read()
      logger.info("out:" out)
      ser.write(b'<ACK>050')
      out2 = ser.read()
      logger.info("out2:" out2)
      
      
      ser.close()
      Ich habe keine Ahnung, wie ich die ASCII oder HEX Zeichenfolge eingeben muss.
      Könnt ihr hier helfen?

      DANKE

      Kommentar


        #4
        hallo,

        ggf. hilft DIr das weiter, damit lese ich Sensus WMZ aus.:
        PHP-Code:
        import logging
        import serial
        import time
        import 
        array
        import binascii


        logger
        logging.getLogger('MBus_Logger')

        class 
        MBus():
            
        def __init__(selfsmarthomecycledev):
                
        self._sh smarthome
                self
        .cycle cycle
                logger
        .debug("DEV: "str(dev))
                
        self.dev dev

            def run
        (self):
                
        self.alive True
                self
        ._sh.scheduler.add('Update_WMZ'self.Update_WMZcycle self.cycle)

            
        def stop(self):
                
        self.alive False
                self
        ._sh.scheduler.remove('Update_WMZ')

            
        def Update_WMZ(self):
                
        logger.debug("MBUS UPDATE STARTED for" str(self.dev))

                
        0        
                
        for x in self.dev:

                    
        logger.debug("MBUS UPDATE "x)
                    
        logger.debug("MBUS N: "str(n))
                    try:
                        
        logger.info("Connecting to Reader " +x)
                        
        self._port serial.Serial(port="/dev/"+xbaudrate=2400timeout=2bytesize=serial.EIGHTBITSparity=serial.PARITY_EVENstopbits=serial.STOPBITS_ONE)

                        try:
                            
        #time.sleep(2)
                            #wake up sequence
                            
        logger.info("sent wakeup "+x)
                            
        self._port.write(bytes([0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x550x55,0x55,0x55]))
                            
        time.sleep(2)
                            
        #Init
                            
        self._port.write(bytes([0x10,0x40,0x01,0x41,0x16]))
                            
        #time.sleep(1)
                            
        self._port.flushInput()
                            
        #Check if ACK=E5
                            
        Signal self._port.read(size=10)
                            
        logger.debug("WMZ-ACK: USB " ++" " str(Signal))
                            if 
        str(Signal) == "b'\\xe5'":
                                
        logger.debug("Sending request USB "+x)
                                
        self._sh.return_item("WMZ"+str(n)+".Connection")(True"MBus")
                                
        #Send Request
                                
        self._port.write(bytes([0x10,0x5B,0x01,0x5C,0x16]))
                                
        time.sleep(2)
                                
        line self._port.read(size=100)
                                
        #Energie (KW)
                                
        Energie=int(str(hex(line[21])).replace("0x","")) + int(str(hex(line[22])).replace("0x","")) * 100 int(str(hex(line[23])).replace("0x","")) *10000 int(str(hex(line[24])).replace("0x","")) *1000000                #Energie=str(hex(line[22]))# + (int(line[22])*100) + (int(line[23])*1000) + (int(line[24])*10000)
                                
        self._sh.return_item("WMZ"+str(n)+".Energie")(Energie"MBus")
                                    
        #Volumen (m3)
                                
        Volumen=int(str(hex(line[27])).replace("0x","")) + int(str(hex(line[28])).replace("0x","")) * 100 int(str(hex(line[29])).replace("0x","")) *10000 int(str(hex(line[30])).replace("0x","")) *1000000                #Energie=str(hex(line[22]))# + (int(line[22])*100) + (int(line[23])*1000) + (int(line[24])*10000)
                                
        self._sh.return_item("WMZ"+str(n)+".Volumen")(Volumen"MBus")
                                
        #Leistung (W)
                                
        Leistung=int(str(hex(line[39])).replace("0x","")) + int(str(hex(line[40])).replace("0x","")) * 100 int(str(hex(line[41])).replace("0x","")) *10000 int(str(hex(line[42])).replace("0x","")) *1000000
                                self
        ._sh.return_item("WMZ"+str(n)+".Leistung")(Leistung"MBus")
                                
        #Durchfluss (m3/h)
                                
        Durchfluss=(int(str(hex(line[33])).replace("0x","")) + int(str(hex(line[34])).replace("0x","")) * 100 int(str(hex(line[35])).replace("0x",""))* 10000 int(str(hex(line[36])).replace("0x",""))* 1000000) /1000
                                self
        ._sh.return_item("WMZ"+str(n)+".Durchfluss")(Durchfluss"MBus")
                                
        #Vorlauftemperatur
                                
        Vorlauftemperatur=int.from_bytes([line[45],line[46]], byteorder='little')/10
                                self
        ._sh.return_item("WMZ"+str(n)+".Vorlauftemperatur")(Vorlauftemperatur"MBus")
                                
        #Ruecklauftemperatur
                                
        Ruecklauftemperatur=int.from_bytes([line[49],line[50]], byteorder='little')/10
                                self
        ._sh.return_item("WMZ"+str(n)+".Ruecklauftemperatur")(Ruecklauftemperatur"MBus")
                                
        #Differenz
                                
        Differenz=int.from_bytes([line[53],line[54],line[55]], byteorder='little')/1000
                                self
        ._sh.return_item("WMZ"+str(n)+".Differenz")(Differenz"MBus")
                            else:
                                
        logger.error("WMZ "+" returned wrong signal: " str(Signal))
                        
        except:
                            
        logger.error("Could not connect to Reader "+x)
                            
        self._sh.return_item("WMZ"+str(n)+".Connection")(False"MBus")
                            
        time.sleep(10)    

                    
        except:
                        
        logger.error("No response! cannot find reader at: /dev/" +x)
                        
        self._sh.return_item("WMZ"+str(n)+".Connection")(False"MBus")
                        
        time.sleep(10)    
                    
        +
        Zuletzt geändert von Marcov; 31.03.2017, 21:59.

        Kommentar

        Lädt...
        X