Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues MQTT Plugin
Einklappen
X
-
Hallo,
so funktioniert es:
Das zugehörige Item funktioniert ohne irgendwelche Hilfsitems: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'))
Ich würde dafür gerne ein PR erstellen.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'}"
Spricht etwas dagegen?
Gruß,
Hendrik
- Likes 1
Einen Kommentar schreiben:
-
Hallo,
Es gibt kein Problem. Lösbar ist das sicher auch über die von dir geschilderten Wege.Ich vermute, dass ich Dein Problem nocht nicht verstanden habe, ich sehe nämlich keines.
Den Satz verstehe ich nicht.Zum MQTT Plugin: Da Dein Problem ein allgemeines ist, halte ich es nicht für sinnvoll das im Plugin zu lösen.
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:
-
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:
-
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:
Dann würde hierausCode:mqtt_mapping: {1: True, 0: False}
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' 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'))
Was haltet ihr davon?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'))
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
genannt und dokumentiert werden?Code:publish_topic() subscribe_topic() subscription_callback()
Letztlich kann ich natürlich auch eine Logik bauen, die obiges publish_topic() nutzt.
Gruß,
HendrikZuletzt geändert von henfri; 28.12.2018, 19:43.
Einen Kommentar schreiben:
-
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:
-
Hallo,
noch eine Frage zur Item-Konfiguration.
Ich steuere meine Dunstabzugshaube mit
(Dies toggelt das Licht).Code:mosquitto_pub -h localhost -t "cmnd/RfBridge/Backlog" -m "RfRaw AA B0 1B 03 04 0169 02C4 3D2C 00110011001100110011010100110010101102 55"
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:
-
Hallo,
ich glaube, ich habe einen Bug gefunden ;-)
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.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
Zeile 421 ist: https://github.com/smarthomeNG/plugi...init__.py#L421
Ich verstehe aber die Fehlermeldung 'LogRecord' object has no attribute 'message' nicht...Code:self.logger.error(self.get_loginstance()+'Connection error:', e)
Aber sollte es nicht so funktionieren:
Soll ich einen PR machen?Code:self.logger.error(self.get_loginstance()+'Connection error: {0}'.format(e))
Gruß,
HendrikZuletzt geändert von henfri; 22.12.2018, 15:40.
Einen Kommentar schreiben:
-
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.
Nach der Änderung habe ich dann noch ein npm run grunt abgesetzt.Code:} else if (topic === "set/stop") { this.stopMower(); } else if (topic === "set/pause") { this.pauseMower(); } else if (topic === "set/mow") {
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:
-
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:
-
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:
-
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:
-
Hi Marcus,Zitat von SMarcus Beitrag anzeigenIch 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:
Im Log von SHNG finde ich folgende Fehlermeldung:Code:1536421560: New client connected from 127.0.0.1 as smarthome (c1, k60). 1536421777: Socket error on client smarthome, disconnecting.
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
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 ichabsetze folgendesCode:mosquitto_pub -h 192.168.81.79 -t landroid/set/mow -m stop
Hattest du das auch? Laut Anleitung soll es ja so funktionieren. Oder ist mein mosquitto_pub falsch?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
Grüße Mirko
Einen Kommentar schreiben:
-
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:

Einen Kommentar schreiben: