Ankündigung

Einklappen

ETS5 Sammelbestellung Vollversion

Infos unter: Link
Mehr anzeigen
Weniger anzeigen

Neues MQTT Plugin

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

    #76
    Die Fehlermeldung ist geringfügig anders:
    Code:
    2018-09-21  22:49:37 INFO     plugins.mqtt      Connecting to broker '192.168.168.44:1883'. Starting mqtt client 'smarthome'
    2018-09-21  22:49:37 ERROR    lib.plugin        Plugin 'mqtt' from section 'mqtt' exception: 'LogRecord' object has no attribute 'message'
    Traceback (most recent call last):
      File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 419, in ConnectToBroker
        self._client.connect(self.broker_ip, self.broker_port, 60)
      File "/usr/local/lib/python3.5/dist-packages/paho/mqtt/client.py", line 768, in connect
        return self.reconnect()
      File "/usr/local/lib/python3.5/dist-packages/paho/mqtt/client.py", line 895, in reconnect
        sock = socket.create_connection((self._host, self._port), source_address=(self._bind_address, 0))
      File "/usr/lib/python3.5/socket.py", line 712, in create_connection
        raise err
      File "/usr/lib/python3.5/socket.py", line 703, in create_connection
        sock.connect(sa)
    OSError: [Errno 113] Keine Route zum Zielrechner
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/plugin.py", line 129, in __init__
        plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._gtrans)
      File "/usr/local/smarthome/lib/plugin.py", line 567, in __init__
        exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
      File "<string>", line 1, in <module>
      File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 168, in __init__
        self.ConnectToBroker()
      File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 421, in ConnectToBroker
        self.logger.error(self.get_loginstance()+'Connection error:', e)
      File "/usr/lib/python3.5/logging/__init__.py", line 1309, in error
        self._log(ERROR, msg, args, **kwargs)
      File "/usr/lib/python3.5/logging/__init__.py", line 1416, in _log
        self.handle(record)
      File "/usr/lib/python3.5/logging/__init__.py", line 1426, in handle
        self.callHandlers(record)
      File "/usr/lib/python3.5/logging/__init__.py", line 1488, in callHandlers
        hdlr.handle(record)
      File "/usr/lib/python3.5/logging/__init__.py", line 856, in handle
        self.emit(record)
      File "/usr/local/smarthome/bin/smarthome.py", line 132, in emit
        self._log.add([timestamp, record.threadName, record.levelname, record.message])
    AttributeError: 'LogRecord' object has no attribute 'message'
    Meine plugin.yaml:
    Code:
    mqtt:
        class_name: Mqtt
        class_path: plugins.mqtt
        host: 192.168.168.44
        # host: localhost or 127.0.0.1
        port: 1883
        qos: 0
        # last_will_topic: 'shng/$online'
        # last_will_payload: False
        # birth_topic: 'shng/$online'
        # birth_payload: True
    
        # user: None                 # username (or None)
        # password: None             # password (or None)
        # hashed_password: 1245a9633edf47b7091f37c4d294b5be5a9936c81 ...    
        # === The following parameters are not yet implemented:
        # publish_items: no          # NEW: publish using item-path
        # items_topic_prefix: 'shng' # NEW: prefix for publishing items     
        # acl: pub                   # NEW: access control (none, pub, sub, pubsub)
        # tls: None                  # use TLS version (v1 or None)
        # ca_certs: '/etc/...'       # path to the Certificate Authority certificate files
    die Mosquitto Config:
    Code:
    pid_file /var/run/mosquitto.pid
    log_dest file /var/log/mosquitto/mosquitto.log
    # include_dir /etc/mosquitto/conf.d
    
    listener 1883 # 192.168.178.60
    persistence true
    persistence_location /var/lib/mosquitto/
    persistence_file mosquitto.db
    # remote_username <your user name>
    # remote_password <your password>
    log_dest syslog
    log_dest stdout
    log_dest topic
    log_type error
    log_type warning
    log_type notice
    log_type information
    connection_messages true
    log_timestamp true
    allow_anonymous true
    password_file /etc/mosquitto/pwfile
    und vielleicht auch mal der MQTT Broker Service Status:
    Code:
    smarthome@smarthome:~$ sudo systemctl status mosquitto.service
    ● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
       Loaded: loaded (/etc/init.d/mosquitto; generated; vendor preset: enabled)
       Active: active (exited) since Fri 2018-09-21 22:49:28 CEST; 5min ago
         Docs: man:systemd-sysv-generator(8)
      Process: 388 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
        Tasks: 0 (limit: 4915)
       CGroup: /system.slice/mosquitto.service
    
    Sep 21 22:49:28 smarthome systemd[1]: Starting LSB: mosquitto MQTT v3.1 message broker...
    Sep 21 22:49:28 smarthome mosquitto[388]: Starting network daemon:: mosquitto.
    Sep 21 22:49:28 smarthome systemd[1]: Started LSB: mosquitto MQTT v3.1 message broker.
    smarthome@smarthome:~$


    Kommentar


      #77
      Die Fehlermeldung wundert mich nicht im geringsten. Dein Mosquitto Broker ist auf IP Adresse 192.168.178.60 konfiguriert. Dem shNG Plugin hast Du aber "befohlen" einen Broker auf IP Adresse 192.168.168.44 zu kontaktieren. Da beide IP Adressen in unterschiedlichen Subnetzen liegen, müsste da schon ein Router dazwischen sein, sonst findet shNG (bzw. das betribessystem) keine Route zum Host.
      Viele Grüße
      Martin

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

      Kommentar


        #78
        Jein... Vielleicht erstmal kurz nochmal die Architektur um Missverständnisse zu vermeiden.

        192.168.178.44:
        - SmarthomeNG
        - Mosquitto MQTT Broker

        192.168.178.60:
        - Landroid Bridge (mit MQTT Interface)

        Dshalb hatte ich in der plugin.yaml zuerst 'host: localhost', dann Deinen Vorschlag umgesetzt statt local host die IP-Adresse (192.168.178.44) einzugeben. Dabei hat sein ein Tippfehler eingeschlichen (192.168.168.44), beide Rechner sind im gleichen Subnetz.

        Also kurz den Tippfehler korrigiert (Sorry für die Verwirrung!) - aber die Fehlermeldung bleibt der gleiche. Das wars also nicht, die Verwendung der IP-Adresse statt 'localhost' hat den Fehler nicht behoben.

        Bin mir nicht wirklich sicher ob es an SHNG liegt. Ich hab grad mal die Ausgabe von "sudo service mosquitto status" mit der SHNG Installationsanleitung in der Doku verglichen. Sieht ähnlich, aber doch etwas anders aus:
        Unbenannt.JPG

        'exited' vs. 'active' - und eine Zeile fehlt ganz? Hab ich evtl bei der Mosquitto Installation was falsch gemacht?

        Gruss
        Marcus

        Kommentar


          #79
          Was soll die ip Adresse 192.168.178.60 in der mosquitto config? Die hat da nichts verloren!

          Damit sagst Du dem Broker, er soll auf der ip Adresse lauschen. Da der Rchner auf dem der Broker läuft kein Netzwerk Interface mit der ip Adresse hat, kann er nicht starten.
          Viele Grüße
          Martin

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

          Kommentar


            #80
            Danke Martin. Das war es nicht direkt da die IP Adresse in der Mosquitto.conf auskommentiert war.... aber ich hatte mir die Config nochmal vorgenommen und einen ähnlichen Fall gegoogelt, bei dem auch der Broker "active (exited)" war.

            Hab die Mosquitto.conf umgestellt von "listener 1883" auf "port 1883" und jetzt läuft es.

            Hast mich definitiv auf den richtigen Weg gebracht. Danke.

            M.

            Kommentar


              #81
              Zitat von SMarcus Beitrag anzeigen
              Ich bin grade dabei meinen RasiGrasi "Landroid Workx" über das MQTT-Plugin mittels der weweave/landroid-bridge und dem Mosquitto Broker in SHNG einzubinden.
              Die Bridge scheint zu laufen (zumindest das Webinterface)
              Der MQTT Broker meldet:
              Code:
              1536421560: New client connected from 127.0.0.1 as smarthome (c1, k60).
              1536421777: Socket error on client smarthome, disconnecting.
              Im Log von SHNG finde ich folgende Fehlermeldung:
              Code:
              2018-09-21 21:37:30 INFO plugins.mqtt Connecting to broker '127.0.0.1:1883'. Starting mqtt client 'smarthome'
              2018-09-21 21:37:30 ERROR lib.plugin Plugin 'mqtt' from section 'mqtt' exception: 'LogRecord' object has no attribute 'message'
              Traceback (most recent call last):
              File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 419, in ConnectToBroker
              self._client.connect(self.broker_ip, self.broker_port, 60)
              File "/usr/local/lib/python3.5/dist-packages/paho/mqtt/client.py", line 768, in connect
              return self.reconnect()
              File "/usr/local/lib/python3.5/dist-packages/paho/mqtt/client.py", line 895, in reconnect
              sock = socket.create_connection((self._host, self._port), source_address=(self._bind_address, 0))
              File "/usr/lib/python3.5/socket.py", line 712, in create_connection
              raise err
              File "/usr/lib/python3.5/socket.py", line 703, in create_connection
              sock.connect(sa)
              ConnectionRefusedError: [Errno 111] Verbindungsaufbau abgelehnt
              
              During handling of the above exception, another exception occurred:
              
              Traceback (most recent call last):
              File "/usr/local/smarthome/lib/plugin.py", line 129, in __init__
              plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._gtrans)
              File "/usr/local/smarthome/lib/plugin.py", line 567, in __init__
              exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
              File "<string>", line 1, in <module>
              File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 168, in __init__
              self.ConnectToBroker()
              File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 421, in ConnectToBroker
              self.logger.error(self.get_loginstance()+'Connection error:', e)
              File "/usr/lib/python3.5/logging/__init__.py", line 1309, in error
              self._log(ERROR, msg, args, **kwargs)
              File "/usr/lib/python3.5/logging/__init__.py", line 1416, in _log
              self.handle(record)
              File "/usr/lib/python3.5/logging/__init__.py", line 1426, in handle
              self.callHandlers(record)
              File "/usr/lib/python3.5/logging/__init__.py", line 1488, in callHandlers
              hdlr.handle(record)
              File "/usr/lib/python3.5/logging/__init__.py", line 856, in handle
              self.emit(record)
              File "/usr/local/smarthome/bin/smarthome.py", line 132, in emit
              self._log.add([timestamp, record.threadName, record.levelname, record.message])
              AttributeError: 'LogRecord' object has no attribute 'message'

              Ich habe SHNG und Plugin Version 1.5.1.master auf Linux Debian. Der Broker läuft auf dem selben System, nur die Bridge auf einem separaten Raspberry.

              Bin nicht so der MQTT Profi (mein erstes MQTT Projekt, hoffentlich nicht mein letztes), aber kann das ein Kompatibilitätsproblem zwischen dem MQTT Broker und SHNG sein?

              Gruss
              Marcus
              Hi Marcus,

              ich bin auch gerade dabei meinen Landi in die smartVISU über weweave/landroid-bridge und dem Mosquitto Broker zu verbinden. Die Verbindung steht bei mir auch und ich kann die Status auslesen sowie auch Start (landroid/set/start) und Stop (landroid/set/stop) absetzen. Nur beim landroid/set/mow gibt es Probleme. Dort sagt mir die Bridge wenn ich
              Code:
              mosquitto_pub -h 192.168.81.79 -t landroid/set/mow -m stop
              absetze folgendes
              Code:
              [2018-11-02T08:21:08.785] [INFO] Mqtt - Incoming MQTT message to topic landroid/set/mow: stop
              [2018-11-02T08:21:08.785] [ERROR] LandroidS - Invalid MQTT payload for topic set/mow
              Hattest du das auch? Laut Anleitung soll es ja so funktionieren. Oder ist mein mosquitto_pub falsch?

              Grüße Mirko

              Kommentar


                #82
                Hallo Mirko,

                Sorry, war beruflich unterwegs. Nein, funktioniert bei mir auch nicht. Alles andere geht perfekt, aber "start" oder "stop" bei "landroid/set/mow" bringt keine Reaktion am Mäher. Habe das nicht weiter verfolgt, weil mein Mäher aufgrund der Aussentemperaturen ohnehin kaum noch Auslauf bekommt - aber schön wärs wenn es gehen würde.

                Du bist nicht zufällig in den letzten Tagen weitergekommen?

                Gruß
                Marcus

                Kommentar


                  #83
                  Hallo Marcus,

                  habe dazu auch mal den Entwickler angeschrieben. Bisher aber keine Reaktion. In der Zwischenzeit habe ich mir den Code von der Landroid Bridge angeschaut. Habe bei mir einen zusätzliches Topic landroid/set/pause eingebaut. Das schickt nun den geforderten Befehl für eine Pause zum Mäher. Nun habe ich die drei Befehle die ich für den Landi brauche so wie sie auch im App verwendet werden. Muss sie nun nur noch in die smartVISU einbauen.

                  Grüsse Mirko

                  Kommentar


                    #84
                    Hallo Mirko,

                    da wäre ich natürlich interessiert, den geänderten Bridge-Code von Dir zu benutzen..... Könnte ich den haben?

                    Welche Payload verwendest Du in dem /pause topic? Jeweils "pause" für Start/Stop oder direkt "start" / "stop"?

                    Gruss
                    Marcus

                    Kommentar


                      #85
                      Hi Marcus,

                      denke schon das es geht.

                      unter landroid-brigde/src/ in der Datei LandroidS.ts Zeile 31 die Funktion pauseMower() einbauen.

                      Code:
                      public startMower(): void {
                              this.sendMessage(1);
                          }
                      public pauseMower(): void {
                              this.sendMessage(2);
                          }
                      public stopMower(): void {
                              this.sendMessage(3);
                          }

                      und weiter unten ca. Zeile 172 in den if-Zweig fogendes hinzu.
                      Code:
                      } else if (topic === "set/stop") {
                          this.stopMower();
                      } else if (topic === "set/pause") {
                          this.pauseMower();
                      } else if (topic === "set/mow") {
                      Nach der Änderung habe ich dann noch ein npm run grunt abgesetzt.

                      Das ist jetzt aber ungetestet da ich im Moment nicht an mein System komme. Das topic landroid/set/pause verwende ich dann genauso wie landroid/set/start bzw. landroid/set/stop. Ohne eigentlichen payload.

                      Viel Erfolg.

                      Grüße
                      Mirko

                      Kommentar


                        #86
                        Hallo,

                        ich glaube, ich habe einen Bug gefunden ;-)

                        Code:
                        2018-12-22  15:18:01 ERROR    Main         Plugin 'mqtt' from section 'mqtt' exception: 'LogRecord' object has no attribute 'message'
                          File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 419, in ConnectToBroker
                          File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 839, in connect
                          File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 962, in reconnect
                          File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 168, in __init__
                          File "/usr/local/smarthome/plugins/mqtt/__init__.py", line 421, in ConnectToBroker
                        Das ist passiert, als ich gerade User und Pass für das Plugin gesetzt habe und mosquitto entsprechend konfiguriert habe. Den Fehler finde ich sicher selbst [edit: Ja, ich musste einen absoluten Pfad zum passwort-file angeben; hatte nur den Dateinamen angegeben]. Aber das Plugin soll ja nicht crashen.

                        Zeile 421 ist: https://github.com/smarthomeNG/plugi...init__.py#L421
                        Code:
                                    self.logger.error(self.get_loginstance()+'Connection error:', e)
                        Ich verstehe aber die Fehlermeldung 'LogRecord' object has no attribute 'message' nicht...
                        Aber sollte es nicht so funktionieren:
                        Code:
                                    self.logger.error(self.get_loginstance()+'Connection error: {0}'.format(e))
                        Soll ich einen PR machen?

                        Gruß,
                        Hendrik
                        Zuletzt geändert von henfri; 22.12.2018, 15:40.

                        Kommentar


                          #87
                          Hallo,

                          noch eine Frage zur Item-Konfiguration.
                          Ich steuere meine Dunstabzugshaube mit
                          Code:
                          mosquitto_pub -h localhost -t "cmnd/RfBridge/Backlog" -m "RfRaw AA B0 1B 03 04 0169 02C4 3D2C 00110011001100110011010100110010101102 55"
                          (Dies toggelt das Licht).

                          Ziel ist im nächsten Schritt mit dem Alexa-Plugin die Dunstabzugshaube zu steuern.
                          Aber wie sorge ich dafür, dass das Item immer den gleichen Wert als Message sendet? Normalerweise wird ja der Wert des Items gesendet...

                          Gruß,
                          Hendrik

                          Kommentar


                            #88
                            Kannst du nicht das Item mit einem "Value: xxx" auf einen festen Wert legen, eval_trigger auf ein anderes Item und enforce_update: yes?

                            Kommentar


                              #89
                              Hallo,

                              ich dachte, dass Value: xxx nicht dazu führen würde, dass das Item unveränderbar wird. Das müsste ich mal probieren... Aber die Dokumentation verstehe ich so:
                              https://www.smarthomeng.de/user/konf...attribute.html, wie ich es bisher auch interpretiert habe.

                              Ich frage mich, ob mein Problem nicht eins ist, welches häufig vorkommen müsste. Es wird Geräte geben, die statt True oder False z.B. Ein und Aus als Input benötigen. Oder 1/0 oder 0/1.
                              Wäre es dafür nicht sinnvoll ein Mapping angeben zu können:
                              Code:
                              mqtt_mapping: {1: True, 0: False}
                              Dann würde hieraus
                              Code:
                              if (self._connected) and (self.has_iattr(item.conf, 'mqtt_topic_out')):
                                topic = self.get_iattr_value(item.conf, 'mqtt_topic_out')
                                retain = self.get_iattr_value(item.conf, 'mqtt_retain')
                                if retain == None:
                                  retain = 'False'
                                self.logger.info(self.get_loginstance()+"Item '{}': Publishing topic '{}', payload '{}', QoS '{}', retain '{}'".format( item.id(), topic, str(item()), str(self.get_qos_forTopic(item)), retain ))
                                self._client.publish(topic=topic, payload=str(item()), qos=self.get_qos_forTopic(item), retain=(retain=='True'))
                              Dieses:
                              Code:
                              if (self._connected) and (self.has_iattr(item.conf, 'mqtt_topic_out')):
                                topic = self.get_iattr_value(item.conf, 'mqtt_topic_out')
                                retain = self.get_iattr_value(item.conf, 'mqtt_retain')
                                if retain == None:
                                  retain = 'False'
                                if (self.has_iattr(item.conf, 'mqtt_mapping')):
                                  mapping= eval(self.get_iattr_value(item.conf, 'mqtt_mapping')) #maybe better use ast.literal_eval
                                  payload= str(mapping(item()))
                                else:
                                  payload= str(item())
                                self.logger.info(self.get_loginstance()+"Item '{}': Publishing topic '{}', payload '{}', QoS '{}', retain '{}'".format( item.id(), topic, str(item()), str(self.get_qos_forTopic(item)), retain ))
                                self._client.publish(topic=topic, payload=payload, qos=self.get_qos_forTopic(item), retain=(retain=='True'))
                              Was haltet ihr davon?
                              Ich würde es wohl implementieren/testen/einen PR stellen. Würde es nur gerne erst durchdenken/sprechen.


                              Andere Frage:
                              https://www.smarthomeng.de/user/modu...highlight=mqtt
                              Sieht so aus, als würde es nur das Implementieren eines Webinterfaces erlauben. Zumindest sind nur die dafür nötigen Funktionen genannt.
                              Sollten hier nicht eher die Funktionen
                              Code:
                              publish_topic()
                              subscribe_topic()
                              subscription_callback()
                              genannt und dokumentiert werden?

                              Letztlich kann ich natürlich auch eine Logik bauen, die obiges publish_topic() nutzt.

                              Gruß,
                              Hendrik
                              Zuletzt geändert von henfri; 28.12.2018, 19:43.

                              Kommentar


                                #90
                                Einverstanden mit dem Vorschlag?

                                Kommentar

                                Lädt...
                                X