Ankündigung

Einklappen
Keine Ankündigung bisher.

Netzwerkplugin SNMP

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

    [callidomus] Netzwerkplugin SNMP

    Möchte per SNMP bei Nacht & Abwesendheit bestimmte POE-Ports meines Switch abschalten. Das klappt auch unter Windows mit dem MIB Browser oder mit von Wireshark mit geschnittener Sessions ohne Probleme. Wenn ich allerdings die "Code-Sequenz" ins Netzwerkplugin eintragen, wird mir diese komplett umgestaltet von Callidomus.
    In den welchem Format müsste dies an das Pulgin weitergeben werden? Hex wird es wohl nicht sein ;-) also ASCII aber welche Codierung?
    Oder gibt es eine andere Möglichkeit SNMP-Set zu versenden?

    Gruß
    Andreas

    #2
    Hallo Andreas,

    prinzipiell sind alle Strings in Python (3) als UTF-8 kodiert. ASCII muss dediziert angegeben werden.
    Wie sieht den die Sequenz aus? Und wie sieht die Logik dazu aus?

    Alternativ könnte ich auch eine SNMP-Bibliothek integrieren (müsste ich mir noch mal genauer ansehen).
    Dann könnte man in einer Logik direkt SNMP "sprechen".

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo Marcus,

      hier mal eine der betreffenden Sequenzen in HEX:
      Code:
      30 34 02 01 00 04 07 70 72 69 76 61 74 65 a3 26 02 04 23 3c e9 d9 02 01 00 02 01 00 30 18 30 16 06 11 2b 06 01 04 01 81 2b 0a 4c 12 01 16 01 01 03 01 05 02 01 02
      Logik gib es dazu noch keine, möchte das später über die KNX GA Abwesend, Nacht usw. aktivieren bzw. deaktivieren. Die Versuche erfolgten über ein Item das per "Knopf" Widget aufgerufen wurde.

      Eine SNMP Bibliothek wäre super und sicherlich einfacher zu handhaben

      Gruß
      Andreas

      Kommentar


        #4
        muss die Sache noch mal hochholen, da es leider immer noch nicht läuft.
        Habe festgestellt das es an den Sonderzeichen liegt die man nicht in die GUI eintragen kann.

        z.B. der Anfang der Sequenz:
        HEX 30 34 02 01 00 04 07 70
        ASCII 0 4 STX SOH NUL EOT BEL p



        Für die Sonderzeichen STX, SOH, NUL, EOT, BEL & evtl. noch folgende, ist mir keine Eingabemöglichkeit in das GUI Feld bekannt. Gibt es da noch andere Eingabemöglichkeiten z.B. über die Shell direkt in eine Datei in der die Item liegen?

        Gruß
        Andreas

        Kommentar


          #5
          Hallo Andreas,

          an welcher Stelle trägst Du das den ins GUI ein?

          Bis bald

          Marcus

          Kommentar


            #6
            Hier in den Items beim Network-Plugin
            network.jpg
            Gruß
            Andreas

            Kommentar


              #7
              Hallo Andreas,

              ich habe keinen Weg gefunden, das über die GUI einzutragen.
              Ich empfehle Dir eine kleine Logik zuschreiben. Wenn Du dazu Fragen hast, gerne.

              Bis bald

              Marcus

              Kommentar


                #8
                Hallo,

                ich würde dazu bei den Items ein Attribut 'poe-switch' anlegen, und dort z.B. 'Port1' angeben.

                Die Logik würde ich an diese Items binden (Abhängigkeiten:
                Code:
                *:poe-switch
                )

                Die eigentliche Logik könnte ungefähr so aussehen:

                Code:
                commands = {
                    'Port1': b'\x11\x22...',
                }
                
                item = cd.return_item(trigger.source)
                value = commands.get(item.attr['poe-switch'])
                
                cd.nw.upd('10.10.10.10', 4711, value.decode())
                Bis bald

                Marcus
                Zuletzt geändert von callidomus; 28.12.2016, 10:48.

                Kommentar


                  #9
                  wollte das mit der Logik gerade mal testen, allerdings wird wohl das Netzwerkplugin nicht erkannt:

                  Logic: poe, File: /data/callidomus/local/logics/poe.py, Line: 8, Method: , Exception: 'CallidomusCore' object has no attribute 'nw'
                  Gruß
                  Andreas

                  Kommentar


                    #10
                    Hi,

                    schau mal nach wie du das nw plugin in deiner Konfig genannt hast. Das ist der name den du in der Pluginconfig angegeben hast. Bei Marcus steht da warscheinlich nw drin.

                    VG
                    Jürgen

                    Kommentar


                      #11
                      Danke Jürgen das war es wohl gewesen, jetzt wird leider aber "upd" nicht gefunden:

                      Logic: poe, File: /data/callidomus/local/logics/poe.py, Line: 8, Method: , Exception: 'Network' object has no attribute 'upd'
                      Gruß
                      Andreas

                      Kommentar


                        #12
                        jetzt geht es, war ein Schreibfehler in Marcus Logik upd -> udp

                        Kommentar


                          #13
                          zu früh gefreut die UTF-8 Kodierung mit ihren 128 Zeichen reicht leider nicht aus um den SNMP-Befehl richtig zu decodieren. Gibt es da noch eine andere Möglichkeit?, oder muss ich die Sequenz im Binärformat eintragen. Mit welchem Vorzeichen oder Attribute?

                          Logic: poe, File: /data/callidomus/local/logics/poe.py, Line: 9, Method: , Exception: 'utf-8' codec can't decode byte 0xa3 in position 14: invalid start byte
                          Gruß
                          Andreas
                          Zuletzt geändert von ragepw; 28.12.2016, 18:14.

                          Kommentar


                            #14
                            Hallo Andreas,

                            ok, dann verschicke es ohne das Netzwerkplugin. UDP Packet zu verschicken ist relativ einfach. Aus dem Netzwerkplugin:

                            Code:
                            def udp(host, port, data):
                                try:
                                    family, type, proto, canonname, sockaddr = socket.getaddrinfo(host, port)[0]
                                    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                                    sock.sendto(data.encode(), (sockaddr[0], sockaddr[1]))
                                    sock.close()
                                    del(sock)
                                except Exception as e:
                                    logger.warning("UDP: Problem sending data to {}:{}: ".format(host, port, e))
                                    pass
                                else:
                                    logger.debug("UDP: Sending data to {}:{}: ".format(host, port, data))
                            Das data.encode kannst Du dann weglassen.

                            Bis bald

                            Marcus

                            Kommentar


                              #15
                              so das mit dem verschicken von Hex Daten per UDP Packet klappt jetzt:

                              Code:
                              import socket
                              def udp(host, port, data):
                                  try:
                                      s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                                      s.sendto(data, (host, port))
                                      s.close()
                                      del(s)
                                  except Exception as e:
                                      logger.warning("UDP: Problem sending data to {}:{}:{} ".format(host, port, data))
                                      pass
                                  else:
                                      logger.debug("UDP: Sending data to {}:{}:{} ".format(host, port, data))
                              
                              commands = {
                                  'Port5_on': '30 34 02 01 00 04 07 70 72 69 76 61 74 65 a3 26 02 04 23 3c e9 d9 02 01 00 02 01 00 30 18 30 16 06 11 2b 06 01 04 01 81 2b 0a 4c 12 01 16 01 01 03 01 05 02 01 01',
                                  'Port5_off': '30 34 02 01 00 04 07 70 72 69 76 61 74 65 a3 26 02 04 23 3c e9 d9 02 01 00 02 01 00 30 18 30 16 06 11 2b 06 01 04 01 81 2b 0a 4c 12 01 16 01 01 03 01 05 02 01 02',
                              }
                              
                              item = cd.return_item(trigger.source)
                              value = bytearray.fromhex (commands.get(item.attr['poe_switch']))
                              
                              udp('10.10.10.3', 161, value)
                              Jetzt kann ich per GUI den Port5 einschalten aber nicht nicht mehr ausschalten. Würde das ein-/ausschalten gerne Schalter Widget + Zeitschaltuhr bedienen können. Leider ist mir nicht bewusst wie ich auf die anderen Attribut Werte (sollen noch weitere Switchports folgen) zugreifen kann bzw. wie das Item konfiguriert werden muss (evtl. mit Hilfs-Item?).

                              Hier mal das aktuelle Item:

                              Item poe_switch.png

                              Gruß
                              Andreas
                              Angehängte Dateien

                              Kommentar

                              Lädt...
                              X