Ankündigung

Einklappen
Keine Ankündigung bisher.

Eltako FSB61NP-230V (Enocean) von smarthome.py steuern

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

    Eltako FSB61NP-230V (Enocean) von smarthome.py steuern

    Hallo,

    ich möchte gerne meine Markise mit Hilfe eines Eltako FSB61NP-230V über Enocean steuern.

    smarthomeNG.py läuft auf einem IBBcape von R. Budde.

    Die Basiskonfiguration für enocean ist vorhanden:

    plugin.conf:
    Code:
    [enocean]
        class_name = EnOcean
        class_path = plugins.enocean
        serialport = /dev/ttyS4
        tx_id = ffbad000
    item.conf:
    Code:
    [xenocean]
        [[Markise]]
            enocean_rx_id = 0500E508
            enocean_rx_eep = F6_02_01
            [[[fahren]]]
                 type = bool
                 visu = yes
                 enocean_rx_key = AI
                 knx_dpt = 1
                 knx_send = 2/0/7
                 knx_receive = 2/0/7
                 knx_init = 2/0/7
                 visu_acl = rw
             [[[stop]]]
                 type = bool
                 visu = yes
                 enocean_rx_key = AI
                 enforce_updates = true
                 knx_dpt = 1
                 knx_send = 2/1/7
                 knx_receive = 2/1/7
                 knx_init = 2/1/7
                 visu_acl = rw
    Mein Vorgehen:
    0. Aktualisierung des enocean plugins (eep_parser.py, __init.py__ neu installiert)
    1. Löschen des internen Speichers des Eltako-Aktors (CLR + 3x Rechtsanschlag)
    2. Einschalten der Rückanwort (CLR + 3x Linksanschlag)
    3. Verbindung mit dem IBBCape (Beim Aktor LRN und unterer Drehknopf auf Max):
    Im interaktiven Modus:
    Code:
    sh.enocean.send_learn_switch(0)
    Dazu musste ich den Befehl etwas anpassen:
    Code:
    def send_learn_switch(self, id_offset=0):
        if (id_offset < 0) or (id_offset > 127):
            self.logger.error("enocean: ID offset out of range (0-127). Aborting.")
                return
        self.logger.info("enocean: sending learn telegram for switch command")
        self._send_radio_packet(id_offset, 0xA5, [0xFF, 0xF8, 0x0D, 0x80])
        #self._send_radio_packet(id_offset, 0xA5, [0x01, 0x00, 0x00, 0x00])
    Dann schien die Kopplung gelungen zu sein, die LED hatte aufgehört zu blinken.

    Ich dachte nun, dass ich die Markise über
    Code:
    sh.xenocean.Markise.fahren(True)
    sh.xenocean.Markise.fahren(False)
    fahren könnte sollte, aber es passierte nichts.

    Ich habe auch einen lokalen Taster an den Eltako-Aktor angeschlossen. Wenn ich den betätige (im Modus GS2), sehe ich in smarthome.log:

    Code:
    2017-06-16  20:49:44 INFO     enocean      enocean: radio message: choice = f6 / payload = [0x02] / sender_id = 0500E508 / status = 48 / repeat = 0
    2017-06-16  20:50:55 INFO     enocean      enocean: radio message: choice = f6 / payload = [0x50] / sender_id = 0500E508 / status = 48 / repeat = 0
    2017-06-16  20:56:15 INFO     enocean      enocean: radio message: choice = a5 / payload = [0xba, 0xd0, 0x00, 0x08] / sender_id = 0500E508 / status = 0 / repeat = 0
    2017-06-16  21:01:36 INFO     enocean      enocean: radio message: choice = a5 / payload = [0x00, 0x23, 0x01, 0x0a] / sender_id = 0500E508 / status = 0 / repeat = 0
    2017-06-16  21:01:43 INFO     enocean      enocean: radio message: choice = f6 / payload = [0x02] / sender_id = 0500E508 / status = 48 / repeat = 0
    2017-06-16  21:01:47 INFO     enocean      enocean: radio message: choice = a5 / payload = [0x00, 0x27, 0x02, 0x0a] / sender_id = 0500E508 / status = 0 / repeat = 0
    Ich bin mir nicht sicher, welchen EEP ich nutzen sollte. Im Internet finde ich verschiedene Hinweise.
    In der README.md Datei finde ich Beispiele, aber leider nicht meinen Setup.

    Kann mir jemand Hilfestellung geben, wie ich den FSB61NP-230V über smarthomeNG.py ansprechen kann?

    Danke!
    Gerd

    #2
    Hallo Gerd,

    Dein Aktor wird leider noch nicht unterstützt. Du müsstest das Plugin selber noch erweitern. Ich kann Dir gerne dabei Hilfestellung geben.

    Die EEPs der Eltako Aktoren werden hier beschrieben:
    https://www.eltako.com/fileadmin/dow...pT_low_res.pdf

    Dort ist ja schon das von Dir korrekt geänderte Anlernen beschrieben. Das Sendeprofil ist EEP A5-3F-7F, ein Universaltelegramm, welches von Eltako bei Enocean beantragt wurde. Mehr Infos findest Du im Enocean EEP V2.6.3 Dokument.

    Im Plugin würdest Du festlegen, welche sub-items ein Encoean item mit EEP A5-3F-7F erwarten kann. Z.B. item command mit (0:stop, 1: auf, 2: ab).

    Viel Erfolg!

    Grüße
    Alex

    Kommentar


      #3
      Hallo Gerd,

      kurzes Update. Ich habe eben ein Update in den Develop Zweig des Gits geschoben. Dort findest Du jetzt einen send_actuator_cmd Funktion, die Du nur noch mit Leben füllen musst. Die Funktion ist schon mit der EEP A5-3F-7F verknüpft.

      Gutes Gelingen!

      Grüße
      Alex

      Kommentar


        #4
        Hallo Alex,

        vielen Dank für deine Antwort und deine Unterstützung.

        Ich habe mir den Dev Zweig geholt und bei mir den neuen Befehl folgendermaßen angepasst:
        PHP-Code:
        def send_actuator_cmd(self,id_offset=0command=0): 
          if(
        command == 0): 
            
        command_hex_code 0x00 
          elif
        (command == 1):   
            
        command_hex_code 0x01   
          elif
        (command == 2):    
            
        command_hex_code 0x02 
          
        else: 
            
        self.logger.error("enocean: sending actuator command failed: invalid command")
            return  
          
        self._send_radio_packet(id_offset0xA5, [0x000x23command_hex_code0x0a]) 
          
        self.logger.debug("enocean: sending actuator command A5_3F_7F"
        Allerdings ist mir noch nicht klar, wie das mit den Subitems läuft und ich welche Variablen übergeben kann.

        Im Item.conf habe ich:
        Code:
        [xenocean]
            [[Markise]]
                enocean_rx_id = 0500E508
                enocean_rx_eep = A5_3F_7F
                [[[fahren]]]
                     type = num
                     visu = yes
                     enocean_rx_key = COMMAND
                     knx_dpt = 1
                     knx_send = 2/0/7
                     knx_receive = 2/0/7
                     knx_init = 2/0/7
                     visu_acl = rw
        Der Aufruf im interaktiven Modus sollte dann so aussehen:
        Code:
        sh.xenocean.Markise.fahren(1)
        Noch ein kleiner Punkt: In deiner Definition der neuen Funktion
        PHP-Code:
                        elif(tx_eep == 'A5_3F_7F'):
                                
        self.logger.debug('enocean: item is A5_3F_7F type')
                                
        self.send_actuator_cmd(id_offsetitem(),0)
                                
        self.logger.debug('enocean: sent actuator command'
        könnte eine Null fehlen. Ich habe sie hier eingefügt (siehe die fette 0). Oder ist sie überflüssig?

        Danke und Grüße
        Gerd

        Kommentar


          #5
          Hallo Gerd,

          das sieht doch schon mal gut aus. Ein Fehler ist noch in der item-.conf. Dort müsste es tx_eep heißen. Die Null wird nicht benötigt, der aktuelle Funktionsrumpf von send-actuator_cmd hat nur 2 Argumente (+1 self). Es sei denn, Du willst noch weitere optionale Argumente übergeben, z.B. Laufzeit des Aktuators o.Ä. Hierzu am besten schauen, wie es für den Dimmer (ref_level) gelöst worden ist.

          Wenn das Ansteuern des Sensor klappt, müsste noch die Statusrückmeldung vom Aktuator implementiert werden. Dazu wird dann ein rx_eep definiert. Du kannst dazu das passende EEP schon mal raussuchen.

          Grüße
          Alex

          Kommentar


            #6
            Hallo Alex,

            ich bin weiter gekommen. Die Markise fährt nun in eine Richtung (Wert=2) und kann gestoppt (Wert=0) werden. Leider fährt sie nicht in die andere Richtung. Ich hatte den Eltako Aktor neu angelernt, dann gingen beide Richtungen. Ich habe aber dann den direkt angeschlossenen Taster betätigt... danach konnte ich eine Richtung nicht mehr anfahren. Grrr.
            Ich habe GS2 ausgewählt. Irgendwelche Ideen, woran das liegen könnte?

            Hier noch mein item.conf
            Code:
            [FONT=courier new][xenocean]
                [[Markise]]
                    enocean_rx_id = 0500E508
                    enocean_rx_eep = A5_3F_7F
                    [[[fahren]]]
                         enocean_tx_eep = A5_3F_7F
                         type = num
                         visu = yes
                         enocean_rx_key = DI_1[/FONT]
            und der Eintrag in __init__.py:
            Code:
            [FONT=courier new]   def send_actuator_cmd(self,id_offset=0, command=0):
                    if(command == 0):
                        command_hex_code = 0x00
                    elif(command == 1):
                        command_hex_code = 0x01
                        self.logger.debug("test: reached elif 1")
                    elif(command == 2):
                        command_hex_code = 0x02
                        self.logger.debug("test: reached elif 2")
                    else:
                        self.logger.error("enocean: sending actuator command failed: invalid command" + command)
                        return
                    self._send_radio_packet(id_offset, 0xA5, [0x00, 0x30, command_hex_code, 0x08])
                    #self._send_radio_packet(id_offset, 0xA5, [command_hex_code])
                    self.logger.debug("enocean: sending actuator command A5_3F_7F")[/FONT]
            Damit läuft der Motor 48s.

            Muss ich die Rückmeldungen unbedingt verarbeiten? Wenn ja, bietet sich wohl EEP A5_3F_7F an,

            Als nächstes muss ich dann auch sehen, wie ich die Werte 0, 1, 2 über einen KNX Taster an den Aktor liefern kann.

            Grüße
            Gerd

            Kommentar


              #7
              Hallo,

              hier ein Update zu diesem Thema.

              Mit dem Item
              Code:
              [xenocean]
                  [[Markise]]
                      enocean_rx_id = 0500xxxx
                      enocean_rx_eep = F6_02_03
                      [[[fahren]]]
                          enocean_tx_eep = A5_3F_7F
                          enocean_rtime = 60
                          type = num
                          visu = yes
                      [[[eingefahren]]]
                          name = Markise_eingefahren
                          enocean_rx_key = B
                          enforce_updates = on
                          cache = on
                          type = bool
                          visu = yes
              und dem Eintrag in der smartVISU:
              Code:
              <tr>
              <td align=left width=70%>
              <span data-role="controlgroup" data-type="horizontal">
              {{ basic.button('EG_Markise_runter', 'xenocean.Markise.fahren', 'raus','arrow-d', '2', 'midi' ) }}
              {{ basic.button('EG_Markise_stop', 'xenocean.Markise.fahren', 'stop','delete', '0', 'midi') }}
              {{ basic.button('EG_Markise_hoch', 'xenocean.Markise.fahren', 'hoch','arrow-u', '1', 'midi' ) }}
              </span>
              </td>
              </tr>
              sowie dem Eintrag in logic.conf:
              Code:
              MarkiseEinfahren]
                 filename = MarkiseEinfahren.py
                 crontab = 15 22 * *
              mit der Logik MarkiseEinfahren.py
              Code:
              if not sh.xenocean.Markise.eingefahren():
                 sh.xenocean.Markise.fahren(1)
              und der Anpassung in /usr/local/smarthome/plugins/enocean/eep_parser.py
              Code:
                  def _parse_eep_F6_02_03(self, payload, status):
                      #Repeated switch communication(RPS) Telegramm, RORG = F6 = ORG = 0x05
                      # Status command from bidirectional actors, for example eltako FSUD-230, FSVA-230V or switches (for example Gira)
                      #logger.debug("enocean: processing F6_02_03: Rocker Switch, 2 Rocker")
                      results = {}
                      #Button A1: Dimm light down
                      results['AI'] = (payload[0]) == 0x10
                      #Button A0: Dimm light up
                      results['AO'] = (payload[0]) == 0x30
                      #Button B1: Dimm light down
                      results['BI'] = (payload[0]) == 0x50
                      #Button B0: Dimm light up
                      results['BO'] = (payload[0]) == 0x70
                      if (payload[0] == 0x70):
                          results['B'] = True
                      elif (payload[0] == 0x50):
                          results['B'] = False
              [B]        elif (payload[0] == 0x02):
                          results['B'] = False[/B]
                      elif (payload[0] == 0x30):
                          results['A'] = True
                      elif (payload[0] == 0x10):
                          results['A'] = False
                      return results
              sowie den Änderungen in /usr/local/smarthome/plugins/enocean/__init.py__:
              Code:
                  def update_item(self, item, caller=None, source=None, dest=None):
                      if caller != 'EnOcean':
                          self.logger.debug('enocean: item updated externally')
                          if self._block_ext_out_msg:
                              self.logger.debug('enocean: sending manually blocked by user. Aborting')
                              return
                          if 'enocean_tx_eep' in item.conf:
                              if isinstance(item.conf['enocean_tx_eep'], str):
                                  tx_eep = item.conf['enocean_tx_eep']
                                  self.logger.debug('enocean: item has tx_eep')
                                  id_offset = 0
                                  if 'enocean_tx_id_offset' in item.conf and (isinstance(item.conf['enocean_tx_id_offset'], str)):
                                      self.logger.debug('enocean: item has valid enocean_tx_id_offset')
                                      id_offset = int(item.conf['enocean_tx_id_offset'])
                                  #Identify send command based on tx_eep coding:
                                  if(tx_eep == 'A5_20_04'):
                                      self.send_radiator_valve(id_offset)
                                      self.logger.debug('enocean: sent A5_20_04 radiator valve command')
                                  elif(tx_eep == 'A5_38_08_02'):
                                      self.logger.debug('enocean: item is A5_38_08_02 type')
                                      if not item():
                                          self.send_dim(id_offset, 0, 0)
                                          self.logger.debug('enocean: sent off command')
                                      else:
                                          if 'ref_level' in item.level.conf:
                                              dim_value = int(item.level.conf['ref_level'])
                                              self.logger.debug('enocean: ref_level found')
                                          else:
                                              dim_value = 100
                                              self.logger.debug('enocean: no ref_level found. Setting to default 100')
                                          self.send_dim(id_offset, dim_value, 0)
                                          self.logger.debug('enocean: sent dim on command')
                                  elif(tx_eep == 'A5_38_08_03'):
                                      self.logger.debug('enocean: item is A5_38_08_03 type')
                                      self.send_dim(id_offset, item(), 0)
                                      self.logger.debug('enocean: sent dim command')
                                  elif(tx_eep == 'A5_38_08_01'):
                                      self.logger.debug('enocean: item is A5_38_08_01 type')
                                      self.send_switch(id_offset, item(), 0)
                                      self.logger.debug('enocean: sent switch command')
                                  elif(tx_eep == '07_3F_7F'):
                                      self.logger.debug('enocean: item is 07_3F_7F type')
                                      self.send_rgbw_dim(id_offset, item(), 0)
                                      self.logger.debug('enocean: sent RGBW dim command')
                                  elif(tx_eep == 'A5_3F_7F'):
              [B]                        rtime=5
                                      if 'enocean_rtime' in item.conf:
                                          rtime = int(item.conf['enocean_rtime'])
                                          self.logger.debug('enocean:  enocean_rtime found')
                                      self.logger.debug('enocean: item is A5_3F_7F type')
                                      self.send_actuator_cmd(id_offset, rtime, item())
                                      self.logger.debug('enocean: sent actuator command')[/B]
                                  else:
                                      self.logger.error('enocean: error: Unknown tx eep command')
                              else:
                                  self.logger.error('enocean: tx_eep is not a string value')
                          else:
                              self.logger.debug('enocean: item has no tx_eep value')
              [...]
                  def send_actuator_cmd(self,id_offset=0, rtime=0, command=0):
              [B]        if (rtime < 0) or (rtime > 255):
                          self.logger.error("enocean: sending switch command A5_3F_7F: invalid range of rtime (0-255)")
                          return
                      if(command == 0):
                          command_hex_code = 0x00
                      elif(command == 1):
                          command_hex_code = 0x01
                          self.logger.debug("test: reached elif 1")
                      elif(command == 2):
                          command_hex_code = 0x02
                          self.logger.debug("test: reached elif 2")
                      else:
                          self.logger.error("enocean: sending actuator command failed: invalid command" + command)
                          return
                      self._send_radio_packet(id_offset, 0xA5, [0x00, rtime, command_hex_code, 0x0c])
                      #self._send_radio_packet(id_offset, 0xA5, [0x00, 0x30, command_hex_code, 0x0c])
                      #self._send_radio_packet(id_offset, 0xA5, [command_hex_code])
                      self.logger.debug("enocean: sending actuator command A5_3F_7F")[/B]
              kann ich die Markise:
              - mit dem lokalen Schalter schalten,
              - per smartVISU steuern,
              - und zeitkontrolliert die Markise einfahren (wenn ich sie mal wieder vergessen habe)

              Und hier sind noch Fragen:
              1) Rollläden können mit boolean gesteuert werden (data type boolean statt num; mir ist noch nicht klar, wie mit zwei Zuständen dann drei Befehle (auf/ab/stop) abgesetzt werden können) .
              2) Für die Rückmeldung ist hier das Protokoll F6_02_03 angepasst, was außerhalb der Spec ist. Vielleicht macht es Sinn, hierfür ein "inoffizielles" Profil zu definieren.

              Grüße
              Gerd


              Kommentar


                #8
                Hallo Gerd,

                danke Dir für die Mitarbeit. Ich habe Deine Änderungen mit minimalen Überarbeitungen ins Git in den Develop-Branch übernommen. Zu Deinen Fragen:

                Zu 2) Ich habe nochmal in die Enocean EEP Spec geschaut. Die Rückmeldung F6_02_03 ist tatsächlich mal wieder von Eltako außerhalb der Spec. Trotzdem gibt es mit dem zusätzlichen Rückgabewert 0x02 keinen Konflikt zur Spec. Deshalb habe ich deine Änderungen so direkt für EEP F6_02_03 übernommen.

                Zu 1) Ich würde bei einem Num Typ bleiben, nur so kannst Du auf, ab und stop direkt steuern. Direkt mit einem bool (fahren/nichtfahren) müsstest Du dir die letzte Fahrtrichtung merken und könnest dann mit nur einem Taster folgendes Realisieren:

                Drücken -> fahr rauf -> nochmal drücken (während der Aktor noch verfährt) -> stop -> nochmal drücken -> fahr runter

                Die Eintasterbedienung ist aber nicht sehr komfortabel, wie Du siehst.

                Viele Grüße
                Alex

                Kommentar


                  #9
                  Hallo Alex,

                  danke für die Rückmeldung und die Aufnahme in den offiziellen Code.

                  Ja, denke auch, dass der zusätzliche Wert für F6_02_03 die Spec nicht stört.

                  Da es nun so gut läuft, habe ich die nächste Herausforderung bestellt: Peha Empfänger D 451 FU-EBI PF O.T. Nr. 00364476 zur Steuerung meines Garagentors. Vielleicht wird's auch nicht so kompliziert, wenn das Einlernen über UTE funktioniert.

                  Grüße
                  Gerd

                  Kommentar


                    #10
                    Hallo,

                    zur Vollständigkeit hier noch Informationen, wie der Peha-Aktor über Enocean (eep: D2-01-07) eingebunden werden kann:

                    __init__.py:
                    Code:
                                      elif(tx_eep == 'D2_01_07'):
                                            if 'enocean_rx_id' in item.conf:
                                                rx_id = int(item.conf['enocean_rx_id'],16)
                                                self.logger.info('enocean:  enocean_rx_id found')
                                            else:
                                                rx_id=0
                                                self.logger.info('enocean:  NO enocean_rx_id found')
                                            if 'pulsewidth' in item.conf:
                                                pulsew = float(item.conf['pulsewidth'])
                                                self.logger.info('enocean:  pulsewidth found')
                                            else:
                                                pulsew=0
                                                self.logger.info('enocean:  NO pulsewidth found')
                                            self.logger.info('enocean: item is D2_01_07_01 type')
                                            self.send_switch_D2(id_offset, rx_id, pulsew, item())
                                            self.logger.info('enocean: sent switch command for D2 VLD')
                    
                    [...]
                       def send_switch_D2(self, id_offset=0, rx_id=0, pulsew=0, on=0):
                            if (id_offset < 0) or (id_offset > 127):
                                self.logger.error("enocean: ID offset out of range (0-127). Aborting.")
                                return
                            if (rx_id < 0) or (rx_id > 0xFFFFFFFF):
                                self.logger.error("enocean: ID offset out of range (0-127). Aborting.")
                                return
                            SubTel = 0x03
                            db = 0xFF
                            Secu = 0x0
                            #self._send_radio_packet(id_offset, 0xD2, [0x01, 0x1E, 0x01],[0x03, 0xFF, 0xBA, 0xD0, 0x00, 0xFF, 0x0])
                            self.logger.info("enocean: sending switch command D2_01_07")
                            if (on == 0):
                                self._send_radio_packet(id_offset, 0xD2, [0x01, 0x1E, 0x00],[0x03, rx_id, 0xFF, 0x0])
                            elif (on == 1):
                                self._send_radio_packet(id_offset, 0xD2, [0x01, 0x1E, 0x01],[0x03, rx_id, 0xFF, 0x0])
                                if (pulsew  > 0):
                                    time.sleep(pulsew)
                                    self._send_radio_packet(id_offset, 0xD2, [0x01, 0x1E, 0x00],[0x03, rx_id, 0xFF, 0x0])
                            else:
                                self.logger.error("enocean: sending command D2_01_07: error")
                    eep_parser.py:
                    Code:
                       def _parse_eep_D2_01_07(self, payload, status):
                            #ORG = 0xD2
                            #logger.debug("enocean: processing D2_01_07: VLD Switch")
                            results = {}
                            #self.logger.info('enocean: D2 Switch Feedback  0:{} 1:{} 2:{}').format(payload[0],payload[1],payload[2])
                            if (payload[2] == 0x80):               # Switch is off
                                results['STAT'] = 0
                                self.logger.info('enocean: D2 Switch off')
                            elif (payload[2] == 0xe4):             # Switch is on
                                results['STAT'] = 1
                                self.logger.info('enocean: D2 Switch on')
                            return results

                    item-Definition:
                    Code:
                        [[Garagentor]]
                            enocean_rx_id = FFDB8881
                            enocean_rx_eep = D2_01_07
                            [[[fahren]]]
                                type=bool
                                enocean_rx_key = STAT
                                enocean_tx_eep = D2_01_07
                                pulsewidth = 0.1
                                enocean_tx_id_offset = 1
                    Um den Aktor nur kurz einschalten zu können, wurde noch ein optionaler Parameter "pulsewidth" definiert. Nach dieser Zeit (Angabe in sec) schaltet der Aktor automatisch wieder aus (Taster).

                    Damit der Aktor über UTE angelernt werden konnte, musste ich noch einen Befehl scharf schalten (d.h. Kommentarzeichen wegnehmen):

                    Code:
                       def _send_UTE_response(self, data, optional):
                            choice = data[0]
                    [B]payload = data[1:-5][/B]
                            #sender_id = int.from_bytes(data[-5:-1], byteorder='big', signed=False)
                            #status = data[-1]
                            #repeater_cnt = status & 0x0F
                            SubTel = 0x03
                            db = 0xFF
                            Secu = 0x0
                    In der smartVISU dann noch:
                    Code:
                    <tr>
                    <td align=left width=50%>
                    {{basic.switch('EG_Garage_Tor','xenocean.Garagentor.fahren')}} Garagentor
                    </td>
                    </tr>
                    Ich bin mir nicht sicher, ob es nicht besser ist, im item die Statusrückmeldung vom Befehl abzutrennen, d.h. zwei items zu definieren?

                    Für die Code-Änderungen werde ich noch einen pull request stellen.

                    Gerd
                    Zuletzt geändert von GHild; 11.09.2017, 20:14.

                    Kommentar


                      #11
                      Hallo Gerd,

                      funktioniert das D2_01_07 bei Dir so wie es im vorherigen Post steht? Für mein Verständnis bekommst du bei der Item Definition
                      Code:
                      [[Garagentor]]
                      [B]        enocean_rx_id [/B]= FFDB8881
                              enocean_rx_eep = D2_01_07
                              [[[fahren]]]
                                  type=bool
                                  enocean_rx_key = STAT
                      [B]            enocean_tx_eep [/B]= D2_01_07
                                  pulsewidth = 0.1
                                  enocean_tx_id_offset = 1
                      und mit der folgenden Abfrage
                      Code:
                      elif(tx_eep == 'D2_01_07'):
                                              if 'enocean_rx_id' in item.conf:
                                                  rx_id = int(item.conf['enocean_rx_id'],16)
                                                  self.logger.info('enocean:  enocean_rx_id found')
                                              else:
                                                  rx_id=0
                                                  self.logger.info('enocean:  NO enocean_rx_id found')
                      immer 0 zurück da das enocean_tx_eep im Item Garagentor.fahren steht, die enocean_rx_id aber im Item Garagentor. Du müsstest dich also noch für die Abfrage noch ein Item nach oben hangeln?


                      Ich habe das D2_01_09 implementiert - muss allerdings auch noch den Pull Request stellen:


                      Code:
                       elif(tx_eep == 'D2_01_09'):
                                          ###############################
                                              id_item = item
                                              while (not 'enocean_rx_id' in id_item.conf):
                                                  id_item = id_item.return_parent()
                                                  if (id_item is self._sh):
                                                      self.logger.error("enocean: could not find enocean_rx_id for item {}".format(item))
                                                      return 0
                                                  rx_id = int(id_item.conf['enocean_rx_id'],16)
                                                  self.logger.debug('enocean: enocean_rx_id found: {:08X}'.format(rx_id))
                      
                                              if rx_id == 0 :
                                                  self.logger.debug('enocean: NO enocean_rx_id found')
                                          ###############################

                      Grüße,
                      Tommi
                      Zuletzt geändert von beckerth; 04.10.2017, 23:29. Grund: Merke: beim fett druck zerreißt es die Code Umgebung :)

                      Kommentar


                        #12
                        Hallo Tommi,

                        ​​​​​​bei mir funktioniert es in der Tat so wie oben beschrieben. Mir ist im Moment gar nicht mehr klar, warum ich diese Abfrage eingebaut habe... Muss ich mir nochmal genauer anschauen.

                        Mittlerweile habe ich auch eine einfache Android App, mit der ich auf das Item zugreifen und das Garagentor steuern kann. Muss ich mal posten.

                        Welchen Baustein willst du denn einbinden?

                        Grüße
                        Gerd

                        Kommentar


                          #13
                          Hallo,

                          leider funktioniert die Definition der Items wie in Post #7 nicht mehr.

                          Ohne "enocean_rx_key" scheint das Item nicht mehr prozessiert zu werden.
                          Ich musste also einen Dummy hinzufügen:
                          Code:
                              Markise:
                                  enocean_rx_id: '0500E508'
                                  enocean_rx_eep: F6_02_03
                          
                                  fahren:
                          [B]enocean_rx_key: AD_0[/B]
                                      enocean_tx_eep: A5_3F_7F
                                      enocean_rtime: 60
                                      type: num
                                      visu: 'yes'
                          
                                  eingefahren:
                                      enocean_rx_key: B
                                      enforce_updates: 'on'
                                      cache: 'on'
                                      type: bool
                                      visu: 'yes'
                          Damit kann ich die Markise wieder über shNG fahren, ich bin mir aber noch nicht sicher, ob diese Definition eine Wechselwirkung mit dem anderen Item ('eingefahren') hat. Muss ich noch testen.


                          Ein weiteres Problem: Wenn ich bei der Definition
                          Code:
                          enocean_rx_id: '0500E508'
                          die einfachen Ticks weg lasse, fällt die Verarbeitung des items in shNG auf die Nase (in /usr/local/smarthome/lib/item.py), mit der Fehlermeldung:
                          Code:
                          2018-03-16  12:11:37 ERROR    Main         Item xenocean.Markise.eingefahren: problem creating: invalid literal for int() with base 16: 'inf'
                          Traceback (most recent call last):
                            File "/usr/local/smarthome/lib/item.py", line 420, in __init__    child = Item(smarthome, self, child_path, value)
                            File "/usr/local/smarthome/lib/item.py", line 484, in __init__    update = plugin.parse_item(self)
                            File "/usr/local/smarthome/plugins/enocean/__init__.py", line 474, in parse_item    rx_id = int(id_item.conf['enocean_rx_id'],16) ValueError: invalid literal for int() with base 16: 'inf'
                          Ich nutze übrigens aktuelle Versionen (smarthomeNG 1.4.2).

                          Das erste Thema (item nur mit enocean_rx_key) ist vielleicht so gewünscht. Dann wäre ein Hinweis in der Doku gut.
                          Das zweite Thema könnte ein Bug sein. Oder übersehe ich etwas?

                          Grüße
                          Gerd

                          Kommentar

                          Lädt...
                          X