Daten per MQTT ans Backend auf swarm.hiveeyes.org übertragen

backend
datacollection
mqtt
grafana

#1

@mhies fragte:

Ich würde gerne eine neue Version meines Setups bauen und gerne weg von meiner Architektur mit MySQL Datenbank und Auswertung mit Tableau hin zu MQTT + InfluxDB + Grafana. Die Beute steht in Hausnähe, Anschluss über WLAN und Strom ist kein Thema.

Ich habe mal auf der Hiveeyes Seite geschaut und würde gerne die Shared Platform swarm.hiveeyes.org als Backend nutzen und auf dem RPi einen MQTT Client ausprobieren.

So war es von Anfang an gedacht, dass wir an dieser Stelle etwas entwickeln und auch betreiben, das universell und robust genug ist, dass es von interessierten Imkern in beliebigen Szenarien einfach eingesetzt werden kann. Sowohl self-hosted als auch - wie Du es nun vorhast - gerne direkt, um Daten an die shared platform zu schicken, damit sie - zumindest ist das unser Ziel - im Sinne von “Open Data” auch wieder der Community und den Kollegen zur Verfügung stehen können, damit man sie gemeinsam betrachten und zukünftig vielleicht auch detaillerter analysieren kann. Wir haben ja mittlerweile auch einige Wissenschaftler hier auf der Liste, die v.a. an letzterem das meiste Interesse haben. Umso wichtiger ist es, eine robuste Infrastruktur als Arbeitspferd zu etablieren und diese kann natürlich nur durch rege Beteiligung weiter ausreifen, um alle entstehenden Anforderungen in sich aufnehmen zu können.

Spricht da was dagegen? Ist die Platform offen?

Wie oben geschrieben: Im Gegenteil, wir freuen uns! Die Plattform ist derzeit komplett offen, das heißt es gibt bislang keinerlei Authentifizierungsmechanismen. Wir werden diese Aspekte bei Bedarf nachreichen, sobald die Anforderung entsteht, dass jemand die Daten partout nicht teilen bzw. veröffentlichen will oder “mehr privacy” gefordert wird. Bis dahin verfolgen wir die “Open Data” Linie und unterstützen sie konzeptionell dadurch, dass die Daten komplett anonym übermittelt werden können, mehr Details dazu findest Du weiter unten in dieser Email. Wir würden uns freuen, wenn Du dieser Philosophie ebenfalls folgen willst.

Hat das schon jemand gemacht?

Ja! @einsiedlerkrebs hat 2016 bereits ein paar Daten mit MQTT an die Plattform übertragen und seit kurzem macht es @karsten genauso.

Hab jetzt keine genaue Anleitung gefunden, wie ich das Backend nutzen kann und das Dashboard bauen kann, könnt ihr mir da helfen?

Ja, die Dokumentation ist noch etwas fragmentiert und es gibt noch kein kohärentes “How To”, dem man Schritt für Schritt folgen kann. Hier und hier findest Du aber einen passablen Einstieg, wie das mit MQTT klappt, außerdem gibt es noch ein Komplettbeispiel mit Python, das für Deinen Einsatzzweck auf einem RaspberryPi am geeignetsten ist. Sobald man Datenpakete schickt, wird automatisch ein default Dashboard im Grafana unter angelegt, das man dann nach Belieben selber interaktiv modifizieren kann. Soweit die Idee, das klappt auch schon recht gut und hat bisher bei allen für Erfolgserlebnisse gesorgt, die sich dem Thema schon hands-on gewidmet haben. Natürlich gibt es noch unrunde Ecken und Kanten im Gesamtsystem, die wir aber Stück für Stück ausmerzen wollen.

Im Python Beispielcode findest Du einen Bereich, wo Du individuelle Adressdaten konfigurieren musst, wir haben die entsprechenden Zeilen mal für Dich vorbereitet und mit individuellen Identifizierern versehen:

# MQTT broker host
mqtt_broker = 'swarm.hiveeyes.org'

# MQTT bus topic
mqtt_topic = u'{realm}/{network}/{gateway}/{node}/data.json'.format(
    realm   = 'hiveeyes',
    network = 'c0b2ba47-cad8-4cb3-94b5-abf72d971b73',     # Imker
    gateway = 'test-42',                                  # Standort
    node    = 'node-1'                                    # Bienenstock
)

"network" ist eine individuelle UUID pro Imker, in diesem Fall haben wir Dir eine generiert. "gateway" ist ebenfalls ein frei konfigurierbarer individueller Identifizierer und ist dafür vorgesehen, wenn man als Imker unterschiedliche Standorte bedienen will. Mit "node" verhält es sich ähnlich, darüber wird der Bienenstock identifiziert. Es gibt auch noch ausführlichere Informationen über die Topologie der Adressierung.

Durch diese Art der anonymen Datenübertragung hoffen wir, dass wir mehr Teilnehmer zur gemeinsamen Datensammelei bewegen können, selbst wenn wir bislang noch keinerlei Authentifizierungsmechanismen an Bord haben. Sag gerne Bescheid, falls Du in diesem Bereich höhere Anforderungen hast, dann werden wir sehen, was wir tun können. Die Rohdaten im CSV Format bekommst Du auch wieder aus dem System heraus. Hier findest Du weitere Informationen über die vielfältigen Exportmöglichkeiten, dies hier gibt Auskunft über die Möglichkeiten, dabei den Zeitraum einzuschränken.

Wir hoffen, dass Dir die Informationen weiterhelfen und freuen uns auf Deine Beteiligung und dadurch auch Dein Mitwirken bei der Verbesserung des Gesamtsystems. Es gibt noch eine Reihe intrinsischer Details, die den Rahmen sprengen würden…

Einstweilen viel Spaß bei den ersten Schritten, melde Dich gerne jederzeit mit Fragen bei uns. Wenn Du weitergehende Wünsche hast, die über das hinausgehen, was die Plattform bisher anbietet, freuen wir uns über weitere Anregungen. Wir haben natürlich auch noch einige Dinge auf der Agenda, können uns aber nicht zerreißen: Gut Ding will Weile haben.

Herzliche Grüße, Andreas.

P.S.: Für ein allererstes Warmwerden mit der Telemetriedatenübertragung kannst Du gerne auch erstmal ohne Hardware experimentieren, dazu findest Du ein kleines Tutorial, wie man auf einfache Art und Weise ein Sägezahnsignal an die Plattform überträgt. Hier wären die passenden Adressinformationen z.B.:

# Where to send data to
export MQTT_BROKER=swarm.hiveeyes.org
export MQTT_TOPIC=hiveeyes/testdrive/foo-66/node-3

Die entsprechenden Daten sollten dann im Grafana unter https://swarm.hiveeyes.org/grafana/dashboard/db/testdrive auftauchen.

P.P.S.: Du kannst den kompletten Backend Softwarestack auch auf eigener Hardware in Betrieb nehmen, manche haben das auch schon getan. Dafür ist aber an manchen Stellen u.U. noch etwas mehr Know How notwendig, selbst wenn die initiale Hürde über die Bereitstellung von fertigen Debian Paketen schon recht niedrig ist. Wir freuen uns aber natürlich auf die kollektive Datensammelei und das klappt nunmal nur mit einer zentralen Plattform. :-)

Siehe auch Daten per HTTP und PHP ans Backend auf swarm.hiveeyes.org übertragen.


Welcome, Markus!
How do measurements flow from MQTT to Grafana?
Welcome, Karsten!
Probleme bei der Datenübertragung via Homie/MQTT
Daten per HTTP und PHP ans Backend auf swarm.hiveeyes.org übertragen
Datensätze haben suffix "_unknown"
Probleme bei der Datenübertragung via Homie/MQTT
Inbetriebnahme von node-wifi-mqtt-homie mit Hiveeyes Anbindung
Zuwachs aus Potsdam, DE
#3

Es können auch Annotations per MQTT gesetzt werden, siehe:


#4

Wunderbar, das hat geklappt - vielen Dank! Siehe:


#5

3 posts were merged into an existing topic: Probleme bei der Datenübertragung via MQTT


Probleme bei der Datenübertragung via Homie/MQTT
Inbetriebnahme von node-wifi-mqtt-homie mit Hiveeyes Anbindung
#6

Hier ein Beispiel wie man die Übertragung mit Authentifizierung unter python einrichtet:

Aufruf mit send_measurement(beutenbezeichnung, Gewicht, Temperatur, Feuchte)

def send_measurement(EYEShive, EYESweight, EYEStemp, EYEShum):

# The MQTT host
mqtt_host = 'swarm.hiveeyes.org'

mqtt_port = 1883
mqtt_user = 'XXXXX'
mqtt_pass = 'XXXXX'

# The MQTT topic
# See also: https://hiveeyes.org/docs/system/vendor/hiveeyes-one/topology.html#rationale
mqtt_topic = u'{realm}/{network}/{gateway}/{node}/message-json'.format(
    realm   = 'hiveeyes',                                   # Kollektiv
    network = 'XXXX',                 # Imker-ID
    gateway = 'XXXX',                                     # Standort
    node    = EYEShive                                      # Beute
)

# Define measurement
measurement = {
    'Gewicht':      EYESweight,
    'Temperatur (aussen)':   EYEStemp,
    'Luftfeuchte (aussen)':  EYEShum,
}

# Serialize data as JSON
payload = json.dumps(measurement)

# Publish to MQTT
pid = os.getpid()
client_id = '{}:{}'.format('hiverize', str(pid))
backend = mqtt.Client(client_id=client_id, clean_session=True)
backend.username_pw_set(mqtt_user, mqtt_pass)
backend.connect(mqtt_host, mqtt_port)
backend.publish(mqtt_topic, payload)
backend.disconnect()

Datensätze haben suffix "_unknown"