Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues MQTT Plugin

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

  • Msinn
    antwortet
    Die Problemstellung ist trotzdem nicht MQTT spezifisch.

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hallo,

    so funktioniert es:
    Code:
            if caller != 'Mqtt':
                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
                        self.logger.info('[mqtt_mapping] Mapping found {0}. Item is {1}'.format(mapping, item()))
                        try:
                            payload= str(mapping[item()])
                        except:
                            self.logger.info("Mapping unsuccessful. Fallback to Item Value")
                            payload= str(item())
                    else:
                        payload= str(item())
                        self.logger.info('[mqtt_mapping] no Mapping found') 
                    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'))
    Das zugehörige Item funktioniert ohne irgendwelche Hilfsitems:
    Code:
        Kueche:  
          Dunstabzugshaube:
             type: bool
             mqtt_topic_out: "cmnd/RfBridge/Backlog"
             mqtt_mapping: "{True: 'RfRaw AA B0 1D 04 04 0172 0122 02BB 3D22 00220022002200220022020200220020220203 55', False: 'RfRaw AA B0 1D 04 04 0172 0122 02BB 3D22 00220022002200220022020200220020220203 55'}"
    Ich würde dafür gerne ein PR erstellen.
    Spricht etwas dagegen?

    Gruß,
    Hendrik

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hallo,

    Ich vermute, dass ich Dein Problem nocht nicht verstanden habe, ich sehe nämlich keines.
    Es gibt kein Problem. Lösbar ist das sicher auch über die von dir geschilderten Wege.


    Zum MQTT Plugin: Da Dein Problem ein allgemeines ist, halte ich es nicht für sinnvoll das im Plugin zu lösen.
    Den Satz verstehe ich nicht.
    Gerade weil das Problem jeder haben sollte, der mqtt-Geräte nutzt, sollte das Plugin das lösen, ohne dass irgendwelche Hilfskonstrukte nötig sind.
    Oder?

    Gruß,
    Hendrik

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Ich vermute, dass ich Dein Problem nocht nicht verstanden habe, ich sehe nämlich keines.

    Wenn Du immer den gleichen Wert senden willst, musst Du diesen Wert dem Item zuweisen (mit value oder eval oder ...). Dann musst Du mit enforce_updates: True sicherstelln, dass gleichbleibende Werte auch gesendet werden. Auslösen kannst Du das Senden indem Du mit eval_trigger ein ander s Item überwachst.

    Alternativ könntest Du auch eine Lösung mit on_update bauen.

    Deine interpretation zum value Attribut ist übrigens richtig. Es setzt nur den Initialwert. Um das zu verdeutlichen kann man in der item Definition das Attribut auch initial_value nennen.

    Aber das ist nichts MQTT spezifisches, sondern das allgemeine Problem, wenn man ein Decice nur per Toggle Command ansteuern kann. Die eigentliche Herausforderung dabei ist, sicherzustellen, dass die Steuerung (hier shNG) und das Decice sich immer einig sind, ob das Device ON oder OFF ist.

    Zum MQTT Plugin: Da Dein Problem ein allgemeines ist, halte ich es nicht für sinnvoll das im Plugin zu lösen.

    Losgelöst davon wird das MQTT Plugin eine Generalüberholung erfahren, wenn die benötigten Komponenten für die Protokoll-Version 5 vorliegen. Dabei wird vermutlich der eigentliche Protokoll Teil in den shNG Core wandern. Das schafft dann die Möglichkeit Plugins zu schreiben, die MQTT einfach nutzen und ein eigenes darauf basierendes Protokoll (in der Payload) implementieren, um spezifische Devices zu unterstützen.


    Einen Kommentar schreiben:


  • henfri
    antwortet
    Einverstanden mit dem Vorschlag?

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:

Lädt...
X