{"id":3163,"date":"2020-10-21T21:01:15","date_gmt":"2020-10-21T19:01:15","guid":{"rendered":"https:\/\/polluxlabs.net\/?p=3163"},"modified":"2023-11-02T18:47:36","modified_gmt":"2023-11-02T16:47:36","slug":"die-aktuelle-temperatur-per-telegram-abfragen","status":"publish","type":"post","link":"https:\/\/polluxlabs.net\/esp8266-projekte\/die-aktuelle-temperatur-per-telegram-abfragen\/","title":{"rendered":"Die aktuelle Temperatur per Telegram abfragen"},"content":{"rendered":"\n

In diesem Projekt verwendest du Telegram, um bei deinem ESP8266 nachzufragen, wie hoch die aktuelle Temperatur ist. Sobald dein ESP8266 deine Anfrage erhalten hat, fragt er die aktuelle Temperatur beim Sensor BMP180 ab und sendet sie dir auf dein Smartphone.<\/p>\n\n\n\n

Dieses Projekt ist der dritte Teil einer Serie und baut auf die Vorg\u00e4ngerprojekte auf. <\/strong>In diesem Artikel findest du alles zum Aufbau und den passenden Sketch; wir besprechen jedoch nicht alle Teile des Codes. Wenn du mehr Details erfahren m\u00f6chtest, wirf bitte einen Blick in die folgenden Projekte:<\/p>\n\n\n\n

    \n
  1. Ein stiller Alarm mit Telegram und einem ESP8266<\/a><\/li>\n\n\n\n
  2. \u00dcberwache die Temperatur mit Telegram und einem ESP8266<\/a><\/li>\n<\/ol>\n\n\n\n

    Falls du noch kein Projekt mit Telegram gebaut hast, lerne zun\u00e4chst, wie du einen Telegram-Bot erstellst<\/a>.<\/p>\n\n\n\n

    <\/div>\n\n\n\n

    <\/i> Anf\u00e4nger<\/strong><\/p>\n\n\n\n

    <\/i> 1 – 2 Stunden<\/strong><\/p>\n\n\n\n

    <\/i> ca. 12 \u20ac<\/strong><\/p>\n\n\n\n

    <\/i> F\u00fcr dieses Projekt ben\u00f6tigst du (Mengen s. Beschreibung):<\/strong><\/p>\n\n\n\n\n

    \n\n \n \n
    \n\n \n
    \n \n \"AZDelivery\n <\/a>\n
    \n AZDelivery NodeMCU Amica Modul V2 ESP8266 ESP-12F WiFi - Node MCU ESP 8266 WiFi Development Board mit CP2102 kompatibel mit Arduino - inklusive Installationsanleitung als E-Book<\/a>\n
    \n \u2705 Ma\u00dfe (LxBxH): 48 x 26 x 13 mm <\/div>\n
    \n \n \n 7,49 \u20ac<\/span>\n \n <\/a> <\/div>\n <\/div>\n <\/div>\n\n<\/div>\n\n \n \n
    \n\n Angebot<\/span>\n
    \n \n \"AZDelivery\n <\/a>\n
    \n AZDelivery GY-68 BMP180 Barometrischer Luftdruck und Temperatur Sensor kompatibel mit Arduino und Raspberry Pi inklusive E-Book!<\/a>\n
    \n <\/div>\n
    \n \n \n 3,79 \u20ac<\/span>\n \n <\/a> <\/div>\n <\/div>\n <\/div>\n\n<\/div>\n\n \n \n
    \n\n \n
    \n \n \"AZDelivery\n <\/a>\n
    \n AZDelivery Mini Breadboard 400 Pin mit 4 Stromschienen kompatibel mit Arduino und Jumper Wire Kabeln<\/a>\n
    \n \u2705 Breadboard \u2013 kaufen Sie jetzt zum Vorteilspreis!; \u2705 Steckbrett f\u00fcr schnellen... <\/div>\n
    \n \n \n 3,99 \u20ac<\/span>\n \n <\/a> <\/div>\n <\/div>\n <\/div>\n\n<\/div>\n\n \n \n
    \n\n \n
    \n \n \"AZDelivery\n <\/a>\n
    \n AZDelivery Jumper Wire Kabel 3 x 40 STK. je 20 cm M2M\/ F2M \/ F2F kompatibel mit Arduino und Raspberry Pi Breadboard inklusive E-Book!<\/a>\n
    \n <\/div>\n
    \n \n \n 6,99 \u20ac<\/span>\n \n <\/a> <\/div>\n <\/div>\n <\/div>\n\n<\/div>\n\n \n<\/div>\n\n\n\n\n

    Der Aufbau des Projekts<\/h2>\n\n\n\n

    Wenn du das Vorg\u00e4ngerprojekt aufgebaut hast, dann musst du auf Seiten der Hardware nichts weiter tun \u2013 du kannst deinen Aufbau hier einfach weiterverwenden. \ud83d\ude42<\/p>\n\n\n\n

    \"Aufbau<\/figure>\n\n\n\n
    <\/div>\n\n\n\n

    Im Sketch hat sich daf\u00fcr einiges ver\u00e4ndert:<\/p>\n\n\n\n

    Der Sketch<\/h2>\n\n\n\n

    ___STEADY_PAYWALL___<\/p>\n\n\n\n

    Kopiere den folgenden Sketch in deine Arduino IDE, erg\u00e4nze deine Daten und lade ihn auf deinen ESP8266.<\/p>\n\n\n\n

    <\/div>\n\n\n\n

    Sketch als .txt anschauen<\/a><\/p>\n\n\n\n

    \/*\n   Die Temperatur abfragen mit Telegram - polluxlabs.net\n*\/\n\n\/\/Bibliotheken\n#include <ESP8266WiFi.h>\n#include <WiFiClientSecure.h>\n#include <UniversalTelegramBot.h>\n\n#include <Wire.h>\n#include <Adafruit_BMP085.h>\n\n\/\/ Deine WLAN-Zugangsdaten\nconst char* ssid = \"NETZWERKNAME\";\nconst char* password = \"PASSWORT\";\n\n\/\/ Den Telegram-Bot initialisieren\n#define botToken \"TOKEN\"  \/\/ den Bot-Token bekommst du vom Botfather)\n\n\/\/Deine UserID\n#define userID \"USERID\"\n\nWiFiClientSecure client;\nUniversalTelegramBot bot(botToken, client);\n\nAdafruit_BMP085 bmp;\n\n\/\/Variable f\u00fcr die Temperatur\nfloat temp;\n\n\/\/Variable f\u00fcr die Anzahl der Anfragen\nint numNewRequests;\n\n\/\/Variable f\u00fcr den Text der Anfrage, die du sendest\nString text = \"\";\n\n\/\/UserID des Absenders\nString chat_id = \"\";\n\n\/\/Name des Absenders\nString from_name = \"\";\n\n\/\/Variable f\u00fcr die Willkommensnachricht\nString welcome = \"\";\n\n\/\/Funktion f\u00fcrs Verarbeiten neuer Anfragen\nvoid handleNewRequests(int numNewRequests) {\n\n  for (int i = 0; i < numNewRequests; i++) { \/\/loopt durch die neuen Anfragen\n\n    \/\/Checkt, ob du die Anfrage gesendet hast oder jemand anderes\n    chat_id = String(bot.messages[i].chat_id);\n    if (chat_id != userID) {\n      bot.sendMessage(chat_id, \"Du bist nicht autorisiert!\", \"\");\n      continue;\n    }\n\n    \/\/ Anfragetext speichern\n    text = bot.messages[i].text;\n    Serial.println(text);\n\n    from_name = bot.messages[i].from_name;\n\n    if (text == \"\/start\") {\n      welcome = \"Willkommen, \" + from_name + \".\\n\";\n      welcome += \"Mit folgendem Befehl fragst du die aktuelle Temperatur ab: \\n\\n\";\n      welcome += \"\/messen \\n\";\n      bot.sendMessage(chat_id, welcome, \"\");\n      bot.sendMessage(chat_id, \"http:\/\/gph.is\/2aLXZ8H\", \"\");\n    }\n\n    if (text == \"\/messen\") {\n      temp = bmp.readTemperature();\n      bot.sendMessage(chat_id, \"Temperatur: \" + String(temp) + \" \u00baC\", \"\");\n    }\n  }\n}\n\nvoid setup() {\n  \n  Serial.begin(115200);\n  client.setInsecure();\n\n  \/\/Verbindung zum WLAN\n  Serial.print(\"Verbinde mich mit: \");\n  Serial.println(ssid);\n\n  WiFi.begin(ssid, password);\n\n  while (WiFi.status() != WL_CONNECTED) {\n    Serial.print(\".\");\n    delay(300);\n  }\n  Serial.println(\"\");\n  Serial.println(\"Verbunden!\");\n\n  if (!bmp.begin()) {\n    Serial.println(\"Kein Sensor gefunden! Checke die Verbindung.\");\n    while (1) {}\n  }\n}\n\nvoid loop() {\n\n  \/\/checkt, ob eine neue Anfrage reinkam\n  int numNewRequests = bot.getUpdates(bot.last_message_received + 1);\n\n  while (numNewRequests) { \/\/wird ausgef\u00fchrt, wenn numNewRequests == 1\n    Serial.println(\"Anfrage erhalten\");\n    handleNewRequests(numNewRequests);\n    numNewRequests = bot.getUpdates(bot.last_message_received + 1);\n  }\n  delay(1000);\n}<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Was ist neu in diesem Sketch?<\/h2>\n\n\n\n

    In diesem Sketch l\u00e4uft einiges anders: In den zwei vorangegangenen Projekten hat dein ESP8266 nur Nachrichten gesendet, in diesem Projekt wartet er jedoch auf eine Nachricht von dir \u2013 die er dann selbst mit der aktuellen Temperatur beantwortet.<\/p>\n\n\n\n

    Daf\u00fcr muss dein ESP8266 \u2013 im Gegensatz zu den vorherigen Projekten \u2013 die ganze Zeit mit deinem WLAN verbunden sein. Deshalb wandert der Code, mit dem du die Verbindung herstellst, direkt in die Setup-Funktion:<\/p>\n\n\n\n

      Serial.print(\"Verbinde mich mit: \");\n  Serial.println(ssid);\n\n  WiFi.begin(ssid, password);\n\n  while (WiFi.status() != WL_CONNECTED) {\n    Serial.print(\".\");\n    delay(300);\n  }\n  Serial.println(\"\");\n  Serial.println(\"Verbunden!\");<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Schauen wir jetzt direkt in den Loop. Dort pr\u00fcft dein ESP8266 alle 1000 Millisekunden, ob eine neue Anfrage vorliegt:<\/p>\n\n\n\n

    int numNewRequests = bot.getUpdates(bot.last_message_received + 1);<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Wenn das der Fall ist, wird in der Variablen numNewRequests <\/strong>mithilfe der Funktion bot.getUpdates()<\/strong> die Anzahl der vorliegenden Anfragen gespeichert (im Normalfall eine 1<\/strong>, aber es k\u00f6nnen theoretisch ja auch mehrere vorliegen). <\/p>\n\n\n\n

    Das wiederum setzt den folgenden While-Loop in Gang, der die Funktion handleNewRequests()<\/strong> so oft aufruft wie Anfragen “abzuarbeiten” sind. In diesem Loop wird auch die Variable numNewRequests<\/strong> aktualisiert \u2013 sobald hier wieder eine 0<\/strong> enthalten ist, endet der Loop.<\/p>\n\n\n\n

    while (numNewRequests) {\n  handleNewRequests(numNewRequests);\n  numNewRequests = bot.getUpdates(bot.last_message_received + 1);\n  }<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Die Funktion handleNewRequests()<\/h3>\n\n\n\n

    Kommen wir zum Kernst\u00fcck des Sketchs. Diese Funktion handleNewRequests()<\/strong> erwartet bei Ihrem Aufruf ein Argument \u2013 n\u00e4mlich die Anzahl der vorliegenden Anfragen, die in der Variablen numNewRequests<\/strong> steckt. Diese hast du beim Aufruf der Funktion im While-Lopp bereits mitgegeben:<\/p>\n\n\n\n

    handleNewRequests(numNewRequests);<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Bei der Deklaration der Funktion taucht diese Variable wieder auf, um dann gleich weiterverarbeitet zu werden. Diesmal iterierst du mit einem For-Loop \u00fcber die Anzahl der Anfragen, um sie eine nach der anderen abzuarbeiten:<\/p>\n\n\n\n

    void handleNewRequests(int numNewRequests) {\n  for (int i = 0; i < numNewRequests; i++) { <\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Innerhalb des Loops findet zuerst eine sehr wichtige Pr\u00fcfung statt \u2013 n\u00e4mlich ob die Anfrage \u00fcberhaupt von einem autorisierten User (also von dir) stammt. Hierf\u00fcr speicherst du die chat_id<\/strong>, die mit jeder Anfrage \u00fcbergeben wird, in der gleichnamigen Variablen.<\/p>\n\n\n\n

    Anschlie\u00dfend pr\u00fcfst du, ob diese mit deiner eigenen UserID \u00fcbereinstimmt. Ist das nicht der Fall, erh\u00e4lt der Absender eine entsprechende Nachricht und der For-Loop wird mit continue <\/strong>abgebrochen:<\/p>\n\n\n\n

    chat_id = String(bot.messages[i].chat_id);\nif (chat_id != userID) {\n  bot.sendMessage(chat_id, \"Du bist nicht autorisiert!\", \"\");\n  continue;\n}<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Wenn die Anfrage jedoch von dir stammt, speicherst du ihren Textinhalt und den Namen des Absenders (also wiederum deinen) ab:<\/p>\n\n\n\n

    text = bot.messages[i].text;\nfrom_name = bot.messages[i].from_name;<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Fehlen nur noch zwei If-Statements. Wenn du deinen Telegram-Bot zum ersten Mal startest, machst du das mit dem Text \/start<\/strong> (den du nat\u00fcrlich auch senden kannst, wenn der Bot schon l\u00e4uft). In diesem Fall erscheint eine kleine Begr\u00fc\u00dfungsnachricht mit einer Erkl\u00e4rung: Um die aktuelle Temperatur abzufragen, musst du deinem Bot (und damit deinem ESP8266) die Nachricht \/messen<\/strong> schicken.<\/p>\n\n\n\n

    \"Begr\u00fc\u00dfung
    Du kannst auch GIFs senden<\/figcaption><\/figure>\n\n\n\n
    <\/div>\n\n\n\n

    Hier werden wieder Strings miteinander verbunden, diesmal mit dem Operator +=<\/strong>, der einfach die Variable welcome<\/strong> um weiteren Text erweitert. Auch beachtenswert: Mit \\n<\/strong> kannst du einen Zeilenumbruch einf\u00fcgen.<\/p>\n\n\n\n

    Am Ende des Statements findest du wieder die Funktion bot.sendMessage()<\/strong>, die du bereits kennengelernt hast. Diese taucht hier gleich zweimal auf: Einmal, um den String welcome<\/strong> zu senden und dann noch einmal, um ein GIF hinterherzuschicken. Wenn du spa\u00dfeshalber auch GIFs senden m\u00f6chtest, reicht daf\u00fcr einfach die entsprechende URL der Datei.<\/p>\n\n\n\n

    if (text == \"\/start\") {\n  welcome = \"Willkommen, \" + from_name + \".\\n\";\n  welcome += \"Mit folgendem Befehl fragst du die aktuelle Temperatur ab: \\n\\n\";\n  welcome += \"\/messen \\n\";\n  bot.sendMessage(chat_id, welcome, \"\");\n  bot.sendMessage(chat_id, \"http:\/\/gph.is\/2aLXZ8H\", \"\");\n}<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Die zweite Abfrage k\u00fcmmert sich um die Anfrage \/messen<\/strong>, die mit der aktuellen Temperatur beantwortet werden soll. Auch das kennst du bereits aus den vorangegangenen Projekten:<\/p>\n\n\n\n

    if (text == \"\/messen\") {\n  temp = bmp.readTemperature();\n  bot.sendMessage(chat_id, \"Temperatur: \" + String(temp) + \" \u00baC\", \"\");\n}<\/code><\/pre>\n\n\n\n
    <\/div>\n\n\n\n

    Und das war es auch schon. Du hast in dieser Lektion gelernt, wie du nicht nur Nachrichten von deinem ESP8266 an deinen Telegram-Bot senden kannst, sondern auch von dort aus Sensordaten abrufen kannst.<\/p>\n\n\n\n

    Wie geht es weiter?<\/h2>\n\n\n\n

    Du kannst nat\u00fcrlich nicht nur die Temperatur abfragen. Der Sensor BMP180 kann auch den Luftdruck ermitteln. Der Nachfolger BMP280 misst sogar die Luftfeuchtigkeit. Baue z.B. eine Wetterstation, bei der du die aktuellen Daten aus der Ferne abfragst.<\/p>\n\n\n\n

    Eine weitere M\u00f6glichkeit ist ein Feuchtigkeitssensor, den du neben eine Pflanze in die Erde steckst. Wenn du denkst, die Erde sei zu trocken, kannst du eine automatische “Gie\u00dfkanne” von deinem Smartphone aus steuern.<\/p>\n","protected":false},"excerpt":{"rendered":"

    In diesem Projekt verwendest du Telegram, um bei deinem ESP8266 nachzufragen, wie hoch die aktuelle Temperatur ist. Sobald dein ESP8266 deine Anfrage erhalten hat, fragt er die aktuelle Temperatur beim Sensor BMP180 ab und sendet sie dir auf dein Smartphone. Dieses Projekt ist der dritte Teil einer Serie und baut auf die Vorg\u00e4ngerprojekte auf. In …<\/p>\n

    Die aktuelle Temperatur per Telegram abfragen<\/span> Weiterlesen »<\/a><\/p>\n","protected":false},"author":1,"featured_media":2732,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"","site-content-layout":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[32],"tags":[48,223,47,54,144],"acf":[],"wp-worthy-pixel":{"ignored":false,"public":"68d52dd1018a49aaa9c94d8215a8b9fa","server":"vg04.met.vgwort.de","url":"https:\/\/vg04.met.vgwort.de\/na\/68d52dd1018a49aaa9c94d8215a8b9fa"},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/posts\/3163"}],"collection":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/comments?post=3163"}],"version-history":[{"count":0,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/posts\/3163\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/media\/2732"}],"wp:attachment":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/media?parent=3163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/categories?post=3163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/tags?post=3163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}