Ankündigung

Einklappen
Keine Ankündigung bisher.

Nutzung des Mqtt Modules aus eigenem Plugin

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

    #16
    Bei mir sieht die Section so aus:
    Code:
    mqtt:
        module_name: mqtt
        # broker_host: smarthomeng.local
        broker_monitoring: true
        # qos: 1
        # acl: ''
        last_will_topic: devices/shng-module/$online
        last_will_payload: 'False'
        birth_topic: devices/shng-module/$online
        birth_payload: 'True'
        # bool_values: ['Falsch', 'Wahr']
        user: xxx
        password: yyy
    Die Minimalkonfiguration ist
    Code:
    mqtt:
        module_name: mqtt
    falls der Broker auf dem selben Rechner läuft. Sonst muss zumindest broker_host konfiguriert werden.

    mqtt ist None, solange keine Verbindung zum Broker besteht.
    Viele Grüße
    Martin

    Stay away from negative people. They have a problem for every solution.

    Kommentar


      #17
      Zitat von Msinn Beitrag anzeigen
      Nein, das ist schon da. Hast Du das mqtt Modul in /etc/module.yaml konfiguriert?
      Sry das du mir die Infos aus der Nase ziehen musst.
      Ja, das Modul ist geladen:
      Code:
      2020-01-05  11:47:44 INFO     Main         Modules: Loaded module 'http' (class 'Http') v1.6.0: Modul zur Implementierung von Backend-Webinterfaces für Plugins
      2020-01-05  11:47:44 INFO     Main         Loading '/usr/local/smarthome/modules/mqtt/module.yaml' to 'OrderedDict'
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': Metadata paramlist = '['broker_host', 'broker_port', 'broker_monitoring', 'qos', 'last_will_topic', 'last_will_payload', 'birt$
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': has no item-struct definitions in metadata
      2020-01-05  11:47:44 INFO     Main         Loading module 'Mqtt': args = '{'module_name': "'mqtt'"}'
      2020-01-05  11:47:44 INFO     Main         Loading '/usr/local/smarthome/modules/mqtt/locale.yaml' to 'dict'
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'broker_host' -> using default value '127.0.0.1' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'broker_port' -> using default value '1883' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'broker_monitoring' -> using default value 'False' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'qos' -> using default value '1' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'last_will_topic' -> using default value '' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'last_will_payload' -> using default value '' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'birth_topic' -> using default value '' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'birth_payload' -> using default value '' instead
      2020-01-05  11:47:44 INFO     Main         _get_definition_defaultvalue: default value is 'None*' -> None
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'bool_values' -> using default value 'None' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'user' -> using default value '' instead
      2020-01-05  11:47:44 INFO     Main         module 'mqtt': value not found in plugin configuration file for parameter 'password' -> using default value '' instead
      2020-01-05  11:47:44 INFO     Main         Connecting to broker '127.0.0.1:1883'. Starting mqtt client 'name.MQTT-module'
      2020-01-05  11:47:44 INFO     Main         Modules: Loaded module 'Mqtt' (class 'Mqtt') v1.7.0: Modul implementiert das MQTT Protokoll zur Nutzung in Logiken und Plugins
      2020-01-05  11:47:44 INFO     Main         Loaded Modules: ['Mqtt', 'http']
      2020-01-05  11:47:44 INFO     Main         Start Modules
      2020-01-05  11:47:44 INFO     Main         Init Plugins
      2020-01-05  11:47:44 INFO     Main         Loading '/usr/local/smarthome/etc/plugin.yaml' to 'OrderedDict'
      2020-01-05  11:47:44 INFO     paho_MQTT module for SmartHomeNG Connection returned result 'Connection Accepted.' (userdata=None)
      2020-01-05  11:47:44 INFO     paho_MQTT module for SmartHomeNG self.topics = {}
      2020-01-05  11:47:44 INFO     paho_MQTT module for SmartHomeNG Connected to broker 'mosquitto version 1.6.8' at address 127.0.0.1:1883
      2020-01-05  11:47:45 INFO     Main         Load plugins

      Kommentar


        #18
        Ja, das schaut gut aus. Das mqtt Objekt für die Logiken wird vom Scheduler bereit gestellt. Da kann nur None rauskommen, wenn der Scheduler das Modul mqtt nicht als initialisiertes Objekt findet. ???

        Was ich gerade in Deiner Logik sehe:
        Code:
        mqtt = sh.get_module('mqtt')
        Nimm mal die Zuweisung zu mqtt raus. Die muss None ergeben!
        Viele Grüße
        Martin

        Stay away from negative people. They have a problem for every solution.

        Kommentar


          #19
          Die Zeile habe ich inzwischen wieder auskommentiert. Und 5 Minuten nach dem Reload meiner Logik gewartet. Der Fehler erscheint leider immer noch im Log.
          Code:
          logics.TasmotaPCA9685 MQTT module is not loaded or not yet initialized
          Als aktuelle Referenz noch einmal meine Logic, die korrekt geladen wird:
          Code:
          #!/usr/bin/env python3
          from lib.item import Items
          items = Items.get_instance()
          def logic_publish_topic(logger, mqtt, logic, topic, payload):
              logger.info("Function '{}()' - called by '{}()' in logic '{}'".format(inspect.stack()[0][3], inspect.stack()[1][3], logic.name))
              if mqtt.publish_topic(logic.name, topic, payload):
                  logger.info("Function '{}()' - test-topic was published".format(inspect.stack()[0][3], inspect.stack()[1][3]))
              else:
                  logger.warning("Function '{}()' - test-topic was NOT published".format(inspect.stack()[0][3], inspect.stack()[1][3]))
          def logic_subscribe_topic(logger, mqtt, logic, topic, payload_type='str'):
              logger.info("Function '{}()' - called by '{}()' in logic '{}'".format(inspect.stack()[0][3], inspect.stack()[1][3], logic.name))
              mqtt.subscribe_topic(logic.name, topic, None, payload_type, logic.name)
          # logic main-code starts here
          logger.info("Triggered: trigger['source'] = {}, trigger[by] = {}, trigger[value] = {}".format(trigger['source'], trigger['by'], trigger['value']) )
          if mqtt is None:
              # no MQTT support available
              logger.error("MQTT module is not loaded or not yet initialized")
          elif trigger['source'] == 'mqtt':
          ... <- ab hier ist es erst einmal irrelevant

          Kommentar


            #20
            Wenn Du ein eigenes mqtt Objekt erzzeugen willst, kannst Du das zum testen folgendermaßen tun:

            Code:
            from lib.module import Modules
            mqtt2 = Modules.get_instance().get_module('mqtt')
            und dann mqtt2.publish_topic() etc. aufrufen.

            Denke bei dem Test nur daran mqtt2 beim Aufruf an die Funktionen zu übergeben (statt mqtt)
            Viele Grüße
            Martin

            Stay away from negative people. They have a problem for every solution.

            Kommentar


              #21
              Ich habe nochmal gecheckt. Ich habe alle Modifikationen auf github eingecheckt. Hast Du auch alles vom develop ausgecheckt?
              Viele Grüße
              Martin

              Stay away from negative people. They have a problem for every solution.

              Kommentar


                #22
                Zitat von Msinn Beitrag anzeigen
                Ich habe nochmal gecheckt. Ich habe alle Modifikationen auf github eingecheckt. Hast Du auch alles vom develop ausgecheckt?
                Code:
                git pull
                remote: Enumerating objects: 41, done.
                remote: Counting objects: 100% (41/41), done.
                remote: Compressing objects: 100% (5/5), done.
                Unpacking objects: 100% (26/26), done.
                remote: Total 26 (delta 21), reused 26 (delta 21), pack-reused 0
                From git://github.com/smarthomeNG/smarthome
                   c66e270..3b303e5  develop    -> origin/develop
                Updating c66e270..3b303e5
                Fast-forward
                 dev/sample_plugin/__init__.py |  6 ++++++
                 lib/model/mqttplugin.py       | 23 +++++++++++++++--------
                 lib/model/smartplugin.py      |  6 ++++++
                 lib/module.py                 |  4 +++-
                 lib/plugin.py                 |  4 +++-
                 modules/http/__init__.py      |  8 ++++----
                 modules/mqtt/__init__.py      |  6 +++---
                 7 files changed, 40 insertions(+), 17 deletions(-)
                Öhhhh. Nö :-(
                Test läuft...

                Code:
                Exception: Can't convert 'NoneType' object to str implicitly
                Traceback (most recent call last):
                  File "/usr/local/smarthome/lib/scheduler.py", line 527, in _task
                    exec(obj.bytecode)
                  File "/usr/local/smarthome/logics/tasmotaPCA9685.py", line 31, in <module>
                    logger.debug('tasmotaPCA9685 triggered by '+trigger_source)
                TypeError: Can't convert 'NoneType' object to str implicitly
                Aha. Es kann weiter gehen :-)
                Vielen, vielen Dank!

                Kommentar


                  #23
                  Schreib mal deine logeinträge anders. Das nimmt dir dann das type checking ab:
                  Code:
                  logger.debug('tasmotaPCA9685 triggered by {}'.format(trigger_soruce))
                  Ab Python 3.6 geht das mit fstrings sogar noch eleganter.
                  Viele Grüße
                  Martin

                  Stay away from negative people. They have a problem for every solution.

                  Kommentar


                    #24
                    Echo So, jetzt gibt es auch im Develop Branch eine Doku zur Nutzung des mqtt Moduls:

                    Es gibt eine von SmartPlugin abgeleitete Klasse MqttPlugin, die die Nutzung von MQTT in Plugins einfach macht: Class MqttPlugin

                    Dazu gibt es auch ein Sample Plugin

                    Damit solltest Du jetzt auch in der Lage sein nicht nur in Logiken MQTT zu nutzen.
                    Viele Grüße
                    Martin

                    Stay away from negative people. They have a problem for every solution.

                    Kommentar


                      #25
                      Super. Danke.
                      Es hat jedoch eine Planänderung bei mir gegeben. Ich werde mir noch H801 kaufen und eine LED Ansteuerung nicht mehr selber bauen. Deshalb benötige ich die Logik nicht mehr.
                      Das Gute ist aber, das ich getestet habe und MQTT aus einer Logik heraus prima funktioniert ;-)

                      Kommentar

                      Lädt...
                      X