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

  • Echo
    antwortet
    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 ;-)

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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.

    Einen Kommentar schreiben:


  • Echo
    antwortet
    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!

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Ich habe nochmal gecheckt. Ich habe alle Modifikationen auf github eingecheckt. Hast Du auch alles vom develop ausgecheckt?

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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)

    Einen Kommentar schreiben:


  • Echo
    antwortet
    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

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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!

    Einen Kommentar schreiben:


  • Echo
    antwortet
    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

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von Echo Beitrag anzeigen
    Wie bekomme ich mqtt in die Logic hinein? Muss ich es erst laden?

    Nein, das ist schon da. Hast Du das mqtt Modul in /etc/module.yaml konfiguriert?

    Einen Kommentar schreiben:


  • Echo
    antwortet
    Ich bin jetzt doch wieder bei einer Logik anstatt ein Plugin zu nutzen.
    Wie bekomme ich mqtt in die Logic hinein? Muss ich es erst laden?
    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)
    # try:
    mqtt = sh.get_module('mqtt')
    # except:
    #     mqtt = None
    # 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")
    mqtt ist immer None :-(

    Einen Kommentar schreiben:


  • Echo
    antwortet
    Zitat von Msinn Beitrag anzeigen
    Da hat sich zum Master aber kaum was verändert?
    SM startet wenn ich die Ordner umkopiere. Scheint also zu passen. Ich mache mal weiter und berichte.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von Echo Beitrag anzeigen
    ich bekomme aktuell die Abhängigkeiten des develop nicht zum laufen.
    Da hat sich zum Master aber kaum was verändert?

    Einen Kommentar schreiben:


  • Echo
    antwortet
    Danke schön.
    ich bekomme aktuell die Abhängigkeiten des develop nicht zum laufen. Nach langer Zeit (halbe Stunde oder so) bricht ein install der requirements ab :-(
    Habe gerade die Meldungen nicht zur Hand, aber ich versuche SH auf einem OrangePI mit Armbian zum fliegen zu bekommen.

    Einen Kommentar schreiben:

Lädt...
X