Mehr ist das nicht? ich dachte das sei was Library-spezifisches. Dann könnte ich das ja auch anders nennen.
Posts by HaSch
-
-
Was genau macht denn die Funktion callback?
-
Das Beispiel demonstriert das publishen und das subscriben. Dass man selbst auf sein gepublishtes Topic subscribed ist unüblich und nicht notwendig.
Ja, das habe ich schon verstanden, ich dachte nur, dass der Beispielsketch genau das demonstrieren will.
-
So, nun habe ich es doch heute noch ausprobiert: Es funktioniert!
Ich frage mich jetzt nur, ob ich die Beschreibung des Sketches im Header falsch verstanden habe.
-
HaSch Du hast einen Denkfehler gemacht

Du füllst eine rote Kiste mit Geld (publish) , andere holen sich das Geld wieder aus der gleichen roten Kiste heraus (subscribe).
Wenn niemand die andere blaue Kiste füllt -> bleibt sie leer.
Funktioniert auch mit Bankkonten...
Na ja, ich habe den Beispielsketch einfach übernommen. Dann verstehe ich nicht, warum das nicht schon eher aufgefallen ist. Ich probiere es morgen mal aus.
-
Guten Abend in die Runde,
ich habe eine Frage an die MQTT-Spezialisten.
Ich versuche gerade mich einzuarbeiten und dabei fiel die Wahl auf den pubsubclient. Ich habe das Beispielprogramm geladen und auf einen D1mini geflasht. Der Übersichtlichkeit halber füge ich den leicht veränderten Code hier noch mal ein:
C
Display More/* Basic ESP8266 MQTT example This sketch demonstrates the capabilities of the pubsub library in combination with the ESP8266 board/library. It connects to an MQTT server then: - publishes "hello world" to the topic "outTopic" every two seconds - subscribes to the topic "inTopic", printing out any messages it receives. NB - it assumes the received payloads are strings not binary - If the first character of the topic "inTopic" is an 1, switch ON the ESP Led, else switch it off It will reconnect to the server if the connection is lost using a blocking reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to achieve the same result without blocking the main loop. To install the ESP8266 board, (using Arduino 1.6.4+): - Add the following 3rd party board manager under "File -> Preferences -> Additional Boards Manager URLs": http://arduino.esp8266.com/stable/package_esp8266com_index.json - Open the "Tools -> Board -> Board Manager" and click install for the ESP8266" - Select your ESP8266 in "Tools -> Board" */ #include <ESP8266WiFi.h> #include <PubSubClient.h> // Update these with values suitable for your network. const char* ssid = "........"; const char* password = "........"; const char* mqtt_server = "192.168.1.12"; WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; #define MSG_BUFFER_SIZE (50) char msg[MSG_BUFFER_SIZE]; int value = 0; void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); // Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level // but actually the LED is on; this is because // it is active low on the ESP-01) } else { digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic", "hello world"); // ... and resubscribe client.subscribe("inTopic"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); unsigned long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value); Serial.print("Publish message: "); Serial.println(msg); client.publish("outTopic", msg); } }Die IP-Adresse 192.168.1.12 ist der Mosquitto-Broker auf meinem Raspberry Pi, die Zeile mit if (client.connect(clientId.c_str())) habe ich ergänzt um einen User mit zugehörigem Passwort: if (client.connect(clientId.c_str(), "Test2", "uGgr54K@")) .
Wenn der Sketch läuft, erscheinen auch munter Daten unter Topic "outTopic", allerdings scheint der Callback nicht zu funktionieren. Jedenfalls finde ich nirgendwo den Topic "inTopic" und inTopic wird offensichtlich auch nicht abonniert.
Ist das ein Problem von Mosquitto? Kann mir jemand auf die Sprünge helfen?
Gruß
Hans
-
Wohl kaum. Siehe z.B. Deinen Beitrag #12.
Über #12 bin ich längst hinaus gewesen. Ich weiß auch nicht, warum das da nicht funktioniert hat, jedenfalls ging es dann. Allerdings nur ohne client.loop_forever() und mit while True: time.sleep(1). Das Thema habe ich abgehakt, es läuft fehlerfrei.
-
Das Problem scheint ja die Zeile client.loop_forever() zu sein. Wenn ich die ersetze durch while True: und time.sleep(1) funktioniert es ja. Dann muss am Anfang des Scriptes natürlich noch Import time rein.
Jetzt habe ich aber noch ein anderes Problem nämlich das mit dem Autostart. Das Script soll nur laufen, wenn auch Mosquitto läuft. Mosquitto wird mit mosquitto.service gestartet, das Script sieht so aus:
Code
Display More[Unit] Description=Mosquitto MQTT Broker Documentation=man:mosquitto.conf(5) man:mosquitto(8) After=network.target Wants=network.target [Service] Type=notify NotifyAccess=main ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto ExecStartPre=/bin/chown mosquitto /var/log/mosquitto ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto ExecStartPre=/bin/chown mosquitto /run/mosquitto [Install] WantedBy=multi-user.targetJetzt dachte ich dass es sinnvoll sei, den Start des Python Scriptes hier einzufügen. Dann ist ja sichergestellt, dass Mosquitto läuft. Lässt sich das bewerkstelligen? Was muss ich dafür wo hier einsetzen?
Ergänzung:
Sehe gerade, dass Mosquitto nach einem Neustart nicht mehr läuft, ich kann es auch nicht mehr neu starten. Was ist da los?
Code
Display Morepi@raspberrypi:~ $ sudo systemctl status mosquitto.service ● mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled) Active: failed (Result: signal) since Thu 2024-05-30 13:37:50 CEST; 20s ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Process: 1837 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 1838 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 1839 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS) Process: 1840 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS) Process: 1841 ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf (code=killed, signal=ILL) Main PID: 1841 (code=killed, signal=ILL) Mai 30 13:37:50 raspberrypi systemd[1]: mosquitto.service: Failed with result 'signal'. Mai 30 13:37:50 raspberrypi systemd[1]: Failed to start Mosquitto MQTT Broker. Mai 30 13:37:50 raspberrypi systemd[1]: mosquitto.service: Service RestartSec=100ms expired, scheduling restart. Mai 30 13:37:50 raspberrypi systemd[1]: mosquitto.service: Scheduled restart job, restart counter is at 5. Mai 30 13:37:50 raspberrypi systemd[1]: Stopped Mosquitto MQTT Broker. Mai 30 13:37:50 raspberrypi systemd[1]: mosquitto.service: Start request repeated too quickly. Mai 30 13:37:50 raspberrypi systemd[1]: mosquitto.service: Failed with result 'signal'. Mai 30 13:37:50 raspberrypi systemd[1]: Failed to start Mosquitto MQTT Broker. -
OK, ihr müsst Geduld mit mir haben, ich bin absoluter Python Anfänger. Ich hatte dann offensichtlich einen Haufen Fehlermeldungen falsch interpretiert. Was bedeutet das hier?:
Code
Display MoreTraceback (most recent call last): File "json-data2.py", line 46, in <module> main() File "json-data2.py", line 40, in main client.loop_forever() File "/home/pi/.local/lib/python3.7/site-packages/paho/mqtt/client.py", line 1756, in loop_forever rc = self._loop(timeout) File "/home/pi/.local/lib/python3.7/site-packages/paho/mqtt/client.py", line 1164, in _loop rc = self.loop_read() File "/home/pi/.local/lib/python3.7/site-packages/paho/mqtt/client.py", line 1556, in loop_read rc = self._packet_read() File "/home/pi/.local/lib/python3.7/site-packages/paho/mqtt/client.py", line 2439, in _packet_read rc = self._packet_handle() File "/home/pi/.local/lib/python3.7/site-packages/paho/mqtt/client.py", line 3039, in _packet_handle return self._handle_connack() File "/home/pi/.local/lib/python3.7/site-packages/paho/mqtt/client.py", line 3139, in _handle_connack self, self._userdata, flags_dict, result) TypeError: on_connect() missing 1 required positional argument: '_rc' -
Danke., client.loop_forever() scheint es in paho 1.6.1 auch nicht zu geben, ich habe es wieder durch
while True:
time.sleep(1)
ersetzt.
Aber das Script scheint leider nicht zu funktionieren, jedenfalls kommen keine Daten an. Es wird noch die Meldung
Connecting to broker 192.168.1.12 ausgegeben aber danach tut sich nichts.
-
also so?: client = mqtt.Client(mqtt.CallbackAPIVersion, "YUN-Sensor")
-
@__blackjack__Wow, das ist sehr übersichtlich. Leider kommt ein Fehler:
Traceback (most recent call last):
File "json-data2.py", line 41, in <module>
main()
File "json-data2.py", line 31, in main
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, "YUN-Sensor")
AttributeError: module 'paho.mqtt.client' has no attribute 'CallbackAPIVersion' -
Ich habe jetzt ein Python-Script auf demselben Pi installiert, auf dem auch Mosquitto läuft. Leider aber will das noch nicht so, wie ich das gerne möchte. Das Script holt die json-Daten ab, wandelt sie um und veröffentlich sie wieder unter einem anderen topic. Allerdings bekomme ich sie mit dem Yun nicht gelesen. Außerdem hängt sich das Script dauernd auf.
Code
Display Moreimport paho.mqtt.client as mqtt import time import json broker="192.168.1.12" def on_message(client, userdata, msg): topic=msg.topic m_decode=str(msg.payload.decode("utf-8","ignore")) print("data Received type",type(m_decode)) print("data Received",m_decode) print("Converting from Json to Object") m_in=json.loads(m_decode) #decode json data print(type(m_in)) print("power_w = ",m_in) ##["broker"]) #extract_data(m_in) extract_data_topic(m_in,topic) def extract_data_topic(data,topic): data_topic={} data_topic=data["power_w"] topic_out=topic+"/back/power_w" #modify here for the exact data element you need #extract other values as needed and then send #data_out=json.dumps(data_topic) print("sending data") client.publish(topic_out,data_topic) ## data_out if (topic==topic2): data_topic=data["soc"] #topic_out=topic+"/back/soc" topic_out="M8/back/soc" print("sending data") client.publish(topic_out,data_topic) ## data_out #don't use a wild card or you risk looping topic1="cfos_mqtt/get/M3" topic2="cfos_mqtt/get/M8" topic3="cfos_mqtt/get/M11" topic4="cfos_mqtt/get/M15" client=mqtt.Client("YUN-Sensor") client.on_message=on_message client.username_pw_set(username="YUN", password="xxxxxxxxxxxx") print("Connecting to broker",broker) client.connect(broker) client.loop_start() client.subscribe(topic1) client.subscribe(topic2) client.subscribe(topic3) client.subscribe(topic4) while True: #loop forever time.sleep(1)Ein anderes Problem in diesem Zusammenhang ist noch, dass das Script scheinbar nicht automatisch startet, wenn der Pi hoch fährt. Ich habe dazu die /etc/rc.local geändert:
chmod +x /home/pi/json-data.py
sudo nano /etc/rc.local
und dort eingefügt:
python3 /home/pi/json-data.py &
Das hilft aber nicht, wenn das Script hängt.
-
Kommt drauf an, welche Prog-Sprache Du nutzen willst.
Entweder "umwandeln" oder vielleicht besser nur die Werte, die Du wirklich brauchst, als Skalar auf jeweils eigenen Topics publischen.
Bezüglich der Prog-Sprache bin ich offen, das was am einfachsten ist.
"Nur die Werte" hört sich gut an, aber wie geht das als Skalar? Brauche da eine praktische Hilfestellung.
Am liebsten wäre es mir, wenn das alles in Mosquitto selbst ablaufen könnte: Werte aus empfangenen JSON-Daten extrahieren und unter neuem Topic veröffentlichen.
-
Auf der Linux-Seite läuft das Webinterface mit dem ich die WLAN-Verbindung machen kann. Die kümmert sich um die Kommunikation. Der Sketch läuft auf der Arduino Seite und das reicht nicht. Das ist schon knapp mit der MQTT- und TFT-Library. ArduinoJson lädt zwar aber wenn ich einen JSON String in den dafür notwendigen 1024 buffer lade kann ich ihn nicht mehr parsen.
-
Ich habe auf einem RPi eine Mosquitto Installation auf der Daten von einer Wallbox ankommen. Die Daten landen dort als JSON Strings. Nun versuche ich ein Display mit einem Arduino Yun zu betreiben, auf dem die Daten abgeholt und dargestellt werden. Mit den Daten meines heimischen Smartmeters klappt das. Die Daten der Wallbox aber kann ich leider nicht abholen. Sie müssten auf dem Yun geparst werden und dafür hat er zu wenig Speicher.
Nun hatte ich folgende Idee: Ich könnte ja über die Mosquitto Installation auf dem Raspberry Pi die Daten weiter schicken an einen anderen Topic von dem aus ich sie dann mit dem Yun abholen könnte. Dafür müssten die JSON Strings auf dem RPi geparst werden und die relevanten Daten unter einem anderen Topic publiziert werden. Hat das schon mal jemand gemacht? Wie fange ich das an?
-
Ich glaube mittlerweile, dass avahi der Übeltäter ist. Avahi stellt ja den Bonjour Dienst bereit, durch den der Pi auf dem Mac sichtbar wird. Wenn ich nun 'avahi-browse -at' auf dem Pi eingebe, bekomme ich unter anderem für den betreffenden Pi mit dem Namen RPiSIX die Ausgabe:
[font="Menlo"][font="Menlo"][font="Menlo"]+ wlan0 IPv6 RPiSIX Apple File Sharing local[/font][/font][/font]
[font="Menlo"][font="Menlo"]+ wlan0 IPv4 RPiSIX Apple File Sharing local[/font][/font]
[font="Menlo"]+ wlan0 IPv6 RPiSIX [xx:xx:xx:xx:xx:xx] Arbeitsplatzrechner local[/font]
[font="Menlo"]+ wlan0 IPv4 RPiSIX [xx:xx:xx:xx:xx:xx] Arbeitsplatzrechner local[/font]während ich bei dem Pi mit dem Namen RPiTHREE, bei dem das mit der Schaltfläche funktioniert, folgende Information bekomme:
[font="Menlo"][font="Menlo"][font="Menlo"]+ wlan0 IPv4 RPiTHREE Apple File Sharing local[/font][/font][/font]
[font="Menlo"][font="Menlo"]+ wlan0 IPv4 RPiTHREE VNC Remote Access local[/font][/font]
[font="Menlo"]+ wlan0 IPv4 RPiTHREE Remote Disk Management local[/font]
[font="Menlo"]+ wlan0 IPv4 RPiTHREE [yy:yy:yy:yy:yy:yy] Arbeitsplatzrechner local[/font][font="Menlo"]Auf RPiSIX wird also VNC Remote Access und Remote Disk Management nicht über Bonjour angeboten. Kann man das bei Avahi irgendwie einstellen dass das zur Verfügung gestellt wird? Ich habe im INet immer nur die Standard Installation bzw. den Standard Start von Avahi gefunden, bei dem man nichts einstellen kann.
[/font] -
Was sollte denn zusätzlich passieren, wenn Du "Bildschirmfreigabe" drückst. Wenn ich das richtig verstanden habe, bekommst Du ja schon ein Bild vom Pi-Desktop.Es ist halt einfacher, nur einen Button zu drücken als sich durch die Menüs hangeln zu müssen, "zusätzlich" passiert da nix.
-
Moin Hans,existiert Dein Script noch?
Der Link funktioniert leider nicht mehr.Gruß, Ralf
Danke für den Hinweis, Dropbox hat den Public Folder abgeschafft. Leider hatte ich das Thema nicht abonniert, daher meine späte Reaktion.
Gruß
Hans -
So, jetzt habe ich noch einmal RealVNC deinstalliert und TightVNC installiert. Jetzt klappt es immerhin so, dass ich mich auf dem Mac im Finder über Gehe zu -> Mit Server verbinden... mit dem RPi verbinden kann und den Desktop angezeigt bekomme. Allerdings nur so, die Schaltfläche "Bildschirmfreigabe fehlt nach wie vor. Irgend etwas ist bei der Jessie-Installation anders als bei Wheezy. Ich versuche mal zwei Bilder anzuhängen:
Edit: Wunderbar, jetzt klappt das auch mit den Bildern ohne einen Link zu einem externen Hoster, als Attachment.