Möchte gerne Werte aus MQTT mittels Bottle auf Website anzeigen

Django, Flask, Bottle, WSGI, CGI…
Antworten
stefan87
User
Beiträge: 2
Registriert: Dienstag 26. Mai 2020, 17:24

Hallo zusammen,

ich möchte mich kurz vorstellen. Ich heiße Stefan und beschäftige mich schon lange mit Wetterbeobachtung. Jetzt habe ich eine Wetterstation erstellt die auch läuft(433 Mhz mit mehreren LCD Displays usw.). Jetzt möchte ich die Werte gerne ins Internet bringen und zumindest die Temperatur auf einer Webseite numerisch darstellen um diese z.B. von der Arbeit, Urlaub usw ablesen zu können.

Hierzu lade ich die Temperaturdaten von einem ESP8266 (LUA Bord) in eine MQTT Datenbank, als Broker arbeitet der Raspberry PI 3.
Dies geht auch einwandfrei. Als Skript für den Client als Empfänger habe ich folgendes genommen was auch funktioniert und auf der Konsole die Werte ausgibt.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import paho.mqtt.client as mqtt
 
def on_message(client, userdata, message):
    msg = str(message.payload.decode("utf-8"))
    print("message received: ", msg)
    print("message topic: ", message.topic)
 
def on_connect(client, userdata, flags, rc):
    client.subscribe('/home/data')
 
BROKER_ADDRESS = "localhost"
 
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
 
client.connect(BROKER_ADDRESS)
 
print("Connected to MQTT Broker: " + BROKER_ADDRESS)
 
client.loop_forever()
Auf diesem Kanal kann ich die Messwerte ablesen.
Jetzt habe ich mich zu dem Thema eingelesen und erfahren dass man für die Webseitenerstellung mittels Python Code ein Framework benötigt. Da habe ich mich für Bottle entschieden.
Der Beispielcode aus dem Tutorial läuft auch

Code: Alles auswählen

from bottle import route, run

@route('/hello')
def hello():
    return "Hello World!"

run(host='localhost', port=8080, debug=True)
Im Webbrowser wird im Localhost "Hello World" angezeigt.

Jetzt möchte ich gerne statt Hello world gerne den Temperaturwert angezeigt haben was wohl nicht ganz so einfach ist.
Meine Idee:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-


from bottle import route, run 
import paho.mqtt.client as mqtt
 
def on_message(client, userdata, message):
    msg = str(message.payload.decode("utf-8"))
    print("message received: ", msg)
    print("message topic: ", message.topic)
 
def on_connect(client, userdata, flags, rc):
    client.subscribe('/home/data')
 
BROKER_ADDRESS = "localhost"
 
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
 
client.connect(BROKER_ADDRESS)
 
print("Connected to MQTT Broker: " + BROKER_ADDRESS)

@route('/hello')
def hello():
    return msg

run(host='localhost', port=8080, debug=True)
 
client.loop_forever()
Dieses "Skript" lässt sich zwar kopilieren, die Anzeige im Browser gibt aber einen Fehler 500 aus. Darunter steht, dass in der Funktion hello die Variable msg nicht bekannt ist. Die Vermutung ist, dass msg nicht als globale Variable deklariert ist.
Wenn ich jedoch in der Funktion on_message eine "global msg" eintrage kommt die gleiche Meldung.

Ich muss sagen dass ich im Thema Python noch nicht sehr weit bin, dies aber intensiver lernen möchte. Aktuell bin ich das Lehrbuch von Michael Kofler am durcharbeiten. Zum Thema bottle habe ich auch schon ein online Tutorial durchgearbeitet aber noch nicht alles verstanden.

Evtl. kann mir ja jemand behilflich sein

Gruß Stefan
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe dir ja schon im raspberry-pi Forum zu Tornado geraten, und das aus gutem Grund. Ich mag bottle, aber es ist ebenfalls nicht ereignis-basiert. Man kann das in Python mit therading umgehen, anders als in PHP. Doch Threads sehen einfach aus, sind es aber nicht. Darum bevorzuge ich ereignisbasierte Programmierung. Der paho-mqtt-client unterstuetzt das:

https://github.com/eclipse/paho.mqtt.py ... op-support

Ich baue die Tage mal ein Tornado/MQTT Beispiel zusammen, ich habe selbst gerade ein Haus-Automations-Projekt begonnen.
stefan87
User
Beiträge: 2
Registriert: Dienstag 26. Mai 2020, 17:24

Hallo deets,

so klein ist die Welt :D Stimmt, das hast du. Nur gibt es zum tornado weniger Tutorials als z.B. bottle. Daher fiel die Entscheidung auf bottle.
Ich habe jetzt aber noch eine andere Möglichkeit entdeckt und die nennt sich "Node red". Damit soll es wohl auch relativ einfach gehen einen Messwert auch sogar grafisch darzustellen in dem dieser vom MQTT Server abgerufen wird und im Webbrowser dargestellt wird.
Ich werde die Tage mal wenn ich die Zeit finde mich damit befassen.

Gruß Stefan
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auch das hab ich dir ja schon vorgeschlagen: https://forum-raspberrypi.de/forum/thre ... post432802 ;)

Tutorials sind schoen und gut, nur muss es ja zum Thema passen. Einen Segelschein zu machen, wenn man einen Hubschauber fliegen will, hilft halt nicht.
Antworten