Ankündigung

Einklappen

Hinweis

Die Forenregeln wurden überarbeitet (Stand 7.11.22). Sie sind ab sofort verbindlich. Wir bitten um Beachtung.
Mehr anzeigen
Weniger anzeigen

AVM Plugin

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

    Hallo zusammen,

    Ich habe grade versucht, meine Fritz DECT 301 von einer sehr alten config auf die neue mit structs etc. umzustellen. Leider funktioniert seitdem weder das Setzen noch das Auslesen der Temperatur. Für die DECT 200 Steckdosen klappt zumindest das Schalten, aber auch nichts weiter (z.B. auslesen der Temp).

    Was mich auch wundert ist, dass im WebIF der AVM Plugin keine Smarthome-Geräte angezeigt bekomme, so wie ich das in der online-Doku sehen kann. Ich habe nur "AVM Items", "Log Einträge" und "Plugin-API". In den "items" wiederum finde ich alles, was über die Structs hinzugefügt wird... Komisch das alles.

    Irgendwas mache ich also generell falsch, aber ich komm nicht drauf was. Hat jemand von euch eine config, in der auch DECT 301 sind und könnte derjenige das mal teilen? Muss ich "temp" und "settemp" nach "current_temperature" und "target_temperature" umbenennen? Brauch ich dann den avm_data_type noch?

    Meine Config sieht so aus:
    Code:
    %YAML 1.1
    ---
    avm:
        fritzbox:
            info:
                struct:
                  - avm.info
            reboot:
                type: bool
                visu_acl: rw
                enforce_updates: yes
    
        wlan:
            gf_wlan_1:
                type: bool
                visu_acl: rw
                avm_data_type: wlanconfig    # 2,4ghz
                knx_dpt: 1
                knx_send:   x/x/xx
                knx_listen: x/x/xx
                enforce_updates: 'true'
                avm_wlan_index: 1
    
            gf_wlan_1_ssid:
                type: str
                visu_acl: ro
                avm_data_type: wlanconfig_ssid    # 2,4ghz
                avm_wlan_index: 1
    
    
        dect:
            std_dg_buero:
                type: bool
                avm_data_type: aha_device
                avm_ain: 'xxxxx xxxxxxx' # has to be identical to id in fritzbox (also with spaces!)
                visu_acl: rw
                knx_dpt: 1
                knx_send:   x/x/xx
                knx_listen: x/x/xx
                enforce_updates: 'true'
                struct:
                    - avm.smarthome_general
                    - avm.smarthome_switch
                    - avm.smarthome_powermeter
                    - avm.smarthome_temperature_sensor
    
                do_not_switch_off_night:
                    type: bool
                    value: 0
    
            std_flex:
                type: bool
                avm_data_type: aha_device
                avm_ain: 'xxxxx xxxxxxx' # has to be identical to id in fritzbox (also with spaces!)
                visu_acl: rw
                knx_dpt: 1
                knx_send:   x/x/xx
                knx_listen: x/x/xx
                enforce_updates: 'true'
                struct:
                    - avm.smarthome_general
                    - avm.smarthome_switch
                    - avm.smarthome_powermeter
                    - avm.smarthome_temperature_sensor
    
                do_not_switch_off_night:
                    type: bool
                    value: 1
    
            bad_eg_heizkoerper:
                type: num
                avm_data_type: aha_device
                avm_ain: 'xxxxx xxxxxxx' # has to be identical to id in fritzbox (also with spaces!)
                visu_acl: rw
                struct:
                  - avm.smarthome_general
                  - avm.smarthome_hkr
                  - avm.smarthome_temperature_sensor
    
                # these items need to be child items from hkr_device
                temp:
                    type: num
                    avm_data_type: current_temperature
                    value: -1
                    visu_acl: rw
                    knx_dpt: 9
                    knx_send:   x/x/xx
                    knx_listen: x/x/xx
                    enforce_updates: 'true'
    
                settemp:
                    type: num
                    avm_data_type: target_temperature
                    value: -1
                    visu_acl: rw
                    knx_dpt: 9
                    knx_send:   x/x/xx
                    knx_listen: x/x/xx
                    enforce_updates: 'true'
                    database: 'yes'
                    
            bad_dg_heizkoerper:
                type: num
                avm_data_type: aha_device
                avm_ain: 'xxxxx xxxxxxx' # has to be identical to id in fritzbox (also with spaces!)
                visu_acl: rw
                struct:
                  - avm.smarthome_general
                  - avm.smarthome_hkr
                  - avm.smarthome_temperature_sensor
    
                # these items need to be child items from hkr_device
                temp:
                    type: num
                    avm_data_type: current_temperature
                    value: -1
                    visu_acl: rw
                    knx_dpt: 9
                    knx_send:   x/x/xx
                    knx_listen: x/x/xx
                    enforce_updates: 'true'
    
                settemp:
                    type: num
                    avm_data_type: target_temperature
                    value: -1
                    visu_acl: rw
                    knx_dpt: 9
                    knx_send:   x/x/xx
                    knx_listen: x/x/xx
                    enforce_updates: 'true'
                    database: 'yes'
    Gruß und Danke,
    //giase
    Zuletzt geändert von Giase; 02.08.2022, 15:31.

    Kommentar


      Zitat von Giase Beitrag anzeigen
      Was mich auch wundert ist, dass im WebIF der AVM Plugin keine Smarthome-Geräte angezeigt bekomme
      Die Ursache liegt vielleicht darin, dass man das AHA-Interface für die smarthome Geräte in den Einstellungen des Plugins aktivieren muss.
      Dazu AdminIF --> Plugins --> Konfigruation --> AVM --> avm_home_automation auf True

      Schau da mal nach. Dann sehen wir weiter.

      Kommentar


        Vielen Dank Sisamiwe, das war’s! Komisch, dass das nicht default auf true ist.
        Im log hab ich dazu auch nichts gesehen. Wäre vielleicht hilfreich, eine Warnung zu haben.

        Danke nochmal!
        //giase

        Kommentar


          Hi,

          Könnte mir bitte jemand helfen " get_hosts(only_active) "in eine Logic/item zu packen um es in weiterer Folge via basic.listview in SV auszugeben?
          Hab irgendwie grade keinen Plan wie ich das machen muss.

          Danke
          Markus

          Kommentar


            Ein Beispiel für eine Logik steht schon in der Doku. In Deinem Fall kannst Du auf die beiden Funktionsaufrufe für die Repeater und die entsprechenden Schleifen verzichten. Zudem musst Du die html-Tags <ul> und <li> weglassen, denn die fügt das SV-Widget basic.listview später selbst ein.

            Gruß
            Wolfram
            Zuletzt geändert von wvhn; 28.08.2022, 10:20.

            Kommentar


              Zitat von wvhn Beitrag anzeigen
              Ein Beispiel für eine Logik steht schon in der Doku. In Deinem Fall kannst Du auf die beiden Funktionsaufrufe für die Repeater und die entsprechenden Schleifen verzichten. Zudem musst Du die html-Tags <ul> und <li> weglassen, denn die fügt das SV-Widget basic.listview später selbst ein.

              Gruß
              Wolfram
              Vielen Dank für deinen Beitrag.

              2 Fragen ergeben sich:

              1)
              Code:
              string = '<ul>'
              for host in hosts:
                  device_string = '<li><strong>'+host['name']+':</strong> '+host['ip_address']+', '+host['mac_address']+'</li>'
                  string += device_string
              
              string += '</ul>'
              sh.avm.devices.device_list(string)
              wie muss hier der String aussehen wenn ich die html-Tags weglassen soll?

              2)
              Code:
              device_list:
              type: list
              mehr braucht es in diesem Item nicht?

              Sorry für meine (blöden) Fragen.

              Kommentar


                1) Du fängst mit einem leeren String an, lässt die <li> und </li> in device_string weg und lässt auch die Addition von </ul> am Ende weg.
                2) Das item im Beispiel heißt avm.devices.device_list. Also muss Dein item auch so benannt werden, oder Du änderst die Anweisung in der Logik in sh.hier_kommt_Dein_item(string). visu_acl sollte auch noch gesetzt werden, damit die Visu auf das item zugreifen kann.

                Gruß
                Wolfram

                Kommentar


                  Es klappt leider noch nicht.
                  Logic:
                  Code:
                  hosts = sh.AVMRouter.get_hosts(True)
                  hosts_eg = sh.RepeaterEG.get_hosts(True)
                  hosts_og = sh.RepeaterOG.get_hosts(True)
                  
                  for host_eg in hosts_eg:
                      new = True
                      for host in hosts:
                          if host_eg['mac_address'] == host['mac_address']:
                              new = False
                      if new:
                          hosts.append(host_eg)
                  for host_og in hosts_og:
                      new = True
                      for host in hosts:
                          if host_og['mac_address'] == host['mac_address']:
                              new = False
                      if new:
                          hosts.append(host_og)
                  
                  string = ''
                  for host in hosts:
                      device_string = host['name']+':'+host['ip_address']+', '+host['mac_address']
                      string += device_string
                  
                  sh.AVM.devices.device_list(string)
                  Item:
                  Code:
                  AVM:
                      devices:
                          device_list:
                              type: list
                              visu_acl: rw
                  Nachdem ich die Logic neu geladen und ausgelöst habe kommt:
                  Code:
                  2022-08-29  09:01:07 ERROR    logics.AVM_Hosts    In der Logik ist ein Fehler aufgetreten:
                     Logik 'AVM_Hosts', Datei '/usr/local/smarthome/logics/AVM.py', Zeile 24
                     Hauptroutine der Logik, Exception: can only concatenate str (not "NoneType") to str
                  Zeile24 = device_string = host['name']+':'+host['ip_address']+', '+host['mac_address']

                  Sobald ich in Zeile 24 nur "host['name']" verwende klappt es zwar aber ich bekomme eine andere Fehlermeldung ins LOG
                  Code:
                  WARNING  lib.item.item       Item AVM.devices.device_list: value "PC-DC-F7-56-D3-0F-80PC-192-168-0-36PC-A8-DB-03-B8-46-35PC-F8-C3-9E-15-E5-39" does not match type list. Via Logic None
                  Wo liegt der Fehler?

                  Kommentar


                    Mit der Zeile sh.AVM.devices.device_list(string) weist Du dem Item das eigentlich eine Liste sein soll einen String zu. Das scheint aber so schon in der Doku zu stehen.

                    Die Zeile 24 geht auf die Bretter, wenn ein Element des dicts mit None belegt ist. Du könntest dort schreiben

                    Code:
                    device_string = host.get('name','')+':'+host.get('ip_address','')+ ', '+host.get('mac_address','')

                    Kommentar


                      Code:
                      device_string = host.get('name','')+':'+host.get('ip_address','')+ ', '+host.get('mac_address','')
                      Zeile 24 ist nach wie vor das Problem. Ich könnte nur mit 'name' leben aber das funktioniert wegen der fehlenden list auch nicht.

                      Kommentar


                        Das folgende wird immer nur einen String liefern:
                        Zitat von fuxl66 Beitrag anzeigen
                        Code:
                        string = ''
                        for host in hosts:
                            device_string = host['name']+':'+host['ip_address']+', '+host['mac_address']
                            string += device_string
                        Die variable string wird leer vorbelegt und in der for Schleife wird für jeden host an diesesn String ein String angehängt.

                        Da musst Du schon eine Liste befüllen, wenn am Ende eine Liste rauskommen soll. z.B. so:
                        Code:
                        string = []
                        for host in hosts:
                            device_string = host['name']+':'+host['ip_address']+', '+host['mac_address']
                            string.append(device_string)
                        (Du solltest dir Variable aber vielleicht von string in string_list umbenennen)


                        Zitat von fuxl66 Beitrag anzeigen
                        Code:
                        device_string = host.get('name','')+':'+host.get('ip_address','')+ ', '+host.get('mac_address','')
                        Zeile 24 ist nach wie vor das Problem. Ich könnte nur mit 'name' leben aber das funktioniert wegen der fehlenden list auch nicht.
                        Was für ein Problem gibt es denn jetzt? Bist Du Dir sicher, dass Du die Variable hosts vorher sinnvoll initialisiert hast?
                        Um das zu überprüfen, kannst Du vor der for Schleife den Inhalt von hosts mal Loggen.
                        Viele Grüße
                        Martin

                        There is no cloud. It's only someone else's computer.

                        Kommentar


                          Hi,

                          Es klappt übrigens mit folgender Logic, aber nur wenn ich den Host Name abfrage.
                          Soblad ich IP und MAC hinzufüge bekomme ich die Fehlermeldung aus Kommentar #818
                          Ich bin aber mit dem Name zufrieden. Danke für euren Support.

                          Code:
                          hosts = sh.AVMRouter.get_hosts(True)
                          hosts_eg = sh.RepeaterEG.get_hosts(True)
                          hosts_og = sh.RepeaterOG.get_hosts(True)
                          
                          for host_eg in hosts_eg:
                              new = True
                              for host in hosts:
                                  if host_eg['mac_address'] == host['mac_address']:
                                      new = False
                              if new:
                                  hosts.append(host_eg)
                          for host_og in hosts_og:
                              new = True
                              for host in hosts:
                                  if host_og['mac_address'] == host['mac_address']:
                                      new = False
                              if new:
                                  hosts.append(host_og)
                          
                          string = []
                          for host in hosts:
                              device_string = host['name']
                              string.append(device_string)
                          
                          sh.AVM.devices.device_list(string)

                          Kommentar


                            Die Fehlermeldung besagt, dass irgendein Element beim Zusammensetzen von device_string nicht vom Typ str ist. Welches das ist, müsstest Du herausfinden und mit einer Umwandlung str() in den Griff bekommen können.

                            Gruß
                            Wolfram

                            Kommentar


                              Hallo zusammen,

                              Ich will eigentlich die aktuell laufende Diskussion nicht unterbrechen und gehe eigentlich davon aus, dass mir ein kleiner Tipp reicht um weiter zu kommen:
                              ich würde gerne über das AVM Plugin DTMF Befehle an meine SIEDLE DoorCom Anlage senden. (z.B. über "#811" den Kettenruf aktivieren.)

                              Code:
                              sh.fb.start_call("**1")
                              
                              // Hier weiss ich nicht was ich machen muss um die Folge "#811" senden zu können.
                              
                              sh.fb.cancel_call()
                              Kann mir hier jemand einen kurzen Tipp geben ob das irgendwie geht. Wenn ja, wäre es toll mir einen kleinen Schubbser in die richtige Richtung zu geben nach was ich suchen muss. Hab leider absolut nichts zu dem Thema gefunden.
                              Gruß Kex

                              Kommentar


                                Code:
                                sh.fb.start_call("**1")
                                sh.fb.start_call("#811")
                                ...
                                sh.fb.cancel_call()
                                hast Du schon probiert?

                                Kommentar

                                Lädt...
                                X