.. note::

    Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

    **Warum beitreten?**

    - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
    - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
    - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
    - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
    - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

    👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!

.. _nt_mqtt_publish:

5. Cloud-Rufsystem mit @MQTT
============================================

Das Message Queuing Telemetry Transport (MQTT) ist ein einfaches Nachrichtenprotokoll. Es ist zudem das gängigste Protokoll für das Internet der Dinge (IoT).

MQTT-Protokolle legen die Art und Weise fest, wie IoT-Geräte Daten übertragen. Sie sind ereignisgesteuert und verwenden das Pub/Sub-Modell für die Vernetzung. Sender (Publisher) und Empfänger (Subscriber) kommunizieren über Topics. Ein Gerät veröffentlicht eine Nachricht zu einem spezifischen Topic, und alle Geräte, die dieses Topic abonniert haben, erhalten die Nachricht.

In diesem Abschnitt wird ein Service-Klingelsystem mit Pico W, HiveMQ (einem kostenlosen öffentlichen MQTT-Broker-Dienst) und vier Tasten vorgestellt. Die vier Tasten stehen für vier Tische im Restaurant. Über HiveMQ können Sie sehen, an welchem Tisch Gäste Bedienung benötigen, wenn ein Kunde die Taste drückt.

**1. Benötigte Komponenten**

Für dieses Projekt benötigen wir folgende Komponenten:

Ein Komplettset zu kaufen, ist definitiv praktisch. Hier ist der Link:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Bezeichnung	
        - ELEMENTE IM SET
        - LINK
    *   - Kepler-Kit	
        - 450+
        - |link_kepler_kit|

Die Einzelteile können auch separat über die untenstehenden Links erworben werden.

.. list-table::
    :widths: 5 20 5 20
    :header-rows: 1

    *   - SN
        - KOMPONENTE	
        - MENGE
        - LINK

    *   - 1
        - :ref:`cpn_pico_w`
        - 1
        - |link_picow_buy|
    *   - 2
        - Micro-USB-Kabel
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - Mehrere
        - |link_wires_buy|
    *   - 5
        - :ref:`cpn_resistor`
        - 4(10KΩ)
        - |link_resistor_buy|
    *   - 6
        - :ref:`cpn_button`
        - 4
        - |link_button_buy|
    *   - 7
        - :ref:`cpn_lipo_charger`
        - 1
        -  
    *   - 8
        - 18650 Akku
        - 1
        -  
    *   - 9
        - Batteriehalter
        - 1
        -  

**2. Schaltkreis aufbauen**

    .. warning:: 
        
        Achten Sie darauf, dass Ihr Li-Po-Ladegerät wie im Schaltplan dargestellt angeschlossen ist. Andernfalls könnte ein Kurzschluss Ihre Batterie und den Schaltkreis beschädigen.

.. image:: img/wiring/5.mqtt_pub.png
    :width: 800

**3. HiveMQ besuchen**

HiveMQ ist eine MQTT-Broker- und Client-basierte Nachrichtenplattform, die eine schnelle, effiziente und zuverlässige Datenübertragung zu IoT-Geräten ermöglicht.

1. Öffnen Sie |link_hivemq| in Ihrem Browser.

2. Verbinden Sie den Client mit dem öffentlichen Standard-Proxy.

   .. image:: img/mqtt-1.png


3. Klicken Sie auf **Neues Topic-Abonnement hinzufügen**.

   .. image:: img/mqtt-2.png


4. Tragen Sie die Topics ein, die Sie verfolgen möchten, und klicken Sie auf **Abonnieren**. Wählen Sie persönliche Topics, um Nachrichten von anderen Benutzern zu vermeiden, und achten Sie auf die Groß- und Kleinschreibung.

   .. image:: img/mqtt-3.png

**4. MQTT-Modul installieren**

Bevor wir mit dem Projekt starten können, müssen wir das MQTT-Modul für Pico W installieren.

1. Verbinden Sie sich mit dem Netzwerk, indem Sie ``do_connect()`` in der Shell ausführen, wie zuvor beschrieben.

    .. note::
        * Geben Sie die folgenden Befehle in die Shell ein und drücken Sie ``Enter``, um sie auszuführen.
        * Falls Sie die Skripte ``do_connect.py`` und ``secrets.py`` noch nicht auf Ihrem Pico W haben, beziehen Sie sich bitte auf :ref:`iot_access`, um sie zu erstellen.

    .. code-block:: python

        from do_connect import *
        do_connect()

2. Nach einer erfolgreichen Netzwerkverbindung importieren Sie das ``mip``-Modul in der Shell und verwenden ``mip`` zur Installation des ``umqtt.simple``-Moduls, einem vereinfachten MQTT-Client für MicroPython.

    .. code-block:: python

        import mip
        mip.install('umqtt.simple')

3. Nach Abschluss der Installation sehen Sie, dass das ``umqtt``-Modul im ``/lib/``-Pfad des Pico W installiert ist.

    .. image:: img/5_calling_system1.png

**5. Skript ausführen**

#. Öffnen Sie die Datei ``5_mqtt_publish.py`` im Verzeichnis ``kepler-kit-main/iot``.

#. Klicken Sie auf die Schaltfläche **Aktuelles Skript ausführen** oder drücken Sie F5, um es zu starten.

    .. image:: img/5_calling_system2.png

#. Kehren Sie zu |link_hivemq| zurück und sobald Sie eine der Tasten auf dem Steckbrett drücken, werden Sie die Nachrichten im HiveMQ erscheinen sehen.

    .. image:: img/mqtt-4.png

#. Falls Sie möchten, dass dieses Skript beim Hochfahren ausgeführt wird, speichern Sie es auf dem Raspberry Pi Pico W als ``main.py``.

**Wie funktioniert es?**

Das Raspberry Pi Pico W muss mit dem Internet verbunden sein, wie in :ref:`iot_access` beschrieben. Für dieses Projekt reicht das aus.

.. code-block:: python

    from do_connect import *
    do_connect()

Initialisieren Sie 4 Tasten-Pins.

.. code-block:: python

    sensor1 = Pin(16, Pin.IN)
    sensor2 = Pin(17, Pin.IN)
    sensor3 = Pin(18, Pin.IN)
    sensor4 = Pin(19, Pin.IN)

Erstellen Sie zwei Variablen, um die ``URL`` und die ``Client-ID`` des MQTT-Brokers zu speichern, mit dem wir uns verbinden werden.
Da wir einen öffentlichen Broker verwenden, wird unsere ``Client-ID`` nicht verwendet, selbst wenn eine erforderlich ist.

.. code-block:: python

    mqtt_server = 'broker.hivemq.com'
    client_id = 'Jimmy'

Verbinden Sie sich mit dem MQTT-Agenten und halten Sie die Verbindung für eine Stunde. Bei einem Fehlschlag wird der Pico W zurückgesetzt.

.. code-block:: python

    try:
        client = MQTTClient(client_id, mqtt_server, keepalive=3600)
        client.connect()
        print('Connected to %s MQTT Broker'%(mqtt_server))
    except OSError as e:
        print('Failed to connect to the MQTT Broker. Reconnecting...')
        time.sleep(5)
        machine.reset()

Erstellen Sie eine Variable ``topic``, die das Thema angibt, dem der Abonnent folgen muss. Es sollte dasselbe wie das im **Schritt 4** unter **2. HiveMQ besuchen** ausgefüllte Thema sein.
Übrigens konvertiert ``b`` hier den String in Bytes, da MQTT ein binärbasiertes Protokoll ist, bei dem die Steuerelemente Binärbytes und keine Textstrings sind.

.. code-block:: python

    topic = b'SunFounder MQTT Test'

Setzen Sie Unterbrechungen für jede Taste. Wenn eine Taste gedrückt wird, wird eine Nachricht unter ``topic`` veröffentlicht.

.. code-block:: python

    def press1(pin):
        message = b'button 1 is pressed'
        client.publish(topic, message)
        print(message)

    sensor1.irq(trigger=machine.Pin.IRQ_RISING, handler=press1)

* `UMQTT Client API  <https://pypi.org/project/micropython-umqtt.simple/>`_

.. https://www.tomshardware.com/how-to/send-and-receive-data-raspberry-pi-pico-w-mqtt
