NEWS
Temperaturwert per GSM an Webseite senden?
-
@homoran sagte in Temperaturwert per GSM an Webseite senden?:
@feuersturm ich hatte @Beowolf so verstanden, dass er in die ioBroker SQL-Datenbank schreiben will
Nein, das ist wohl falsch rüber gekommen.
Also: Der Temperatursensor sendet seine Daten zu dieser Webseite in eine mysql Datenbank
https://www.glanemanns.de/public_html/esp-chart.php
mit diesem Arduino Programm.
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-sim800l-publish-data-to-cloud/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ // Your GPRS credentials (leave empty, if not needed) const char apn[] = ""; // APN (example: internet.vodafone.pt) use https://wiki.apnchanger.org const char gprsUser[] = ""; // GPRS User const char gprsPass[] = ""; // GPRS Password // SIM card PIN (leave empty, if not defined) const char simPIN[] = ""; // Server details // The server variable can be just a domain name or it can have a subdomain. It depends on the service you are using const char server[] = "example.com"; // domain name: example.com, maker.ifttt.com, etc const char resource[] = "/post-data.php"; // resource path, for example: /post-data.php const int port = 80; // server port number // Keep this API Key value to be compatible with the PHP code provided in the project page. // If you change the apiKeyValue value, the PHP file /post-data.php also needs to have the same key String apiKeyValue = "tPmAT5Ab3j7F9"; // TTGO T-Call pins #define MODEM_RST 5 #define MODEM_PWKEY 4 #define MODEM_POWER_ON 23 #define MODEM_TX 27 #define MODEM_RX 26 #define I2C_SDA 21 #define I2C_SCL 22 // BME280 pins #define I2C_SDA_2 18 #define I2C_SCL_2 19 // Set serial for debug console (to Serial Monitor, default speed 115200) #define SerialMon Serial // Set serial for AT commands (to SIM800 module) #define SerialAT Serial1 // Configure TinyGSM library #define TINY_GSM_MODEM_SIM800 // Modem is SIM800 #define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb // Define the serial console for debug prints, if needed //#define DUMP_AT_COMMANDS #include <Wire.h> #include <TinyGsmClient.h> #ifdef DUMP_AT_COMMANDS #include <StreamDebugger.h> StreamDebugger debugger(SerialAT, SerialMon); TinyGsm modem(debugger); #else TinyGsm modem(SerialAT); #endif #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> // I2C for SIM800 (to keep it running when powered from battery) TwoWire I2CPower = TwoWire(0); // I2C for BME280 sensor TwoWire I2CBME = TwoWire(1); Adafruit_BME280 bme; // TinyGSM Client for Internet connection TinyGsmClient client(modem); #define uS_TO_S_FACTOR 1000000UL /* Conversion factor for micro seconds to seconds */ #define TIME_TO_SLEEP 3600 /* Time ESP32 will go to sleep (in seconds) 3600 seconds = 1 hour */ #define IP5306_ADDR 0x75 #define IP5306_REG_SYS_CTL0 0x00 bool setPowerBoostKeepOn(int en){ I2CPower.beginTransmission(IP5306_ADDR); I2CPower.write(IP5306_REG_SYS_CTL0); if (en) { I2CPower.write(0x37); // Set bit1: 1 enable 0 disable boost keep on } else { I2CPower.write(0x35); // 0x37 is default reg value } return I2CPower.endTransmission() == 0; } void setup() { // Set serial monitor debugging window baud rate to 115200 SerialMon.begin(115200); // Start I2C communication I2CPower.begin(I2C_SDA, I2C_SCL, 400000); I2CBME.begin(I2C_SDA_2, I2C_SCL_2, 400000); // Keep power when running from battery bool isOk = setPowerBoostKeepOn(1); SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL")); // Set modem reset, enable, power pins pinMode(MODEM_PWKEY, OUTPUT); pinMode(MODEM_RST, OUTPUT); pinMode(MODEM_POWER_ON, OUTPUT); digitalWrite(MODEM_PWKEY, LOW); digitalWrite(MODEM_RST, HIGH); digitalWrite(MODEM_POWER_ON, HIGH); // Set GSM module baud rate and UART pins SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); delay(3000); // Restart SIM800 module, it takes quite some time // To skip it, call init() instead of restart() SerialMon.println("Initializing modem..."); modem.restart(); // use modem.init() if you don't need the complete restart // Unlock your SIM card with a PIN if needed if (strlen(simPIN) && modem.getSimStatus() != 3 ) { modem.simUnlock(simPIN); } // You might need to change the BME280 I2C address, in our case it's 0x76 if (!bme.begin(0x76, &I2CBME)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } // Configure the wake up source as timer wake up esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); } void loop() { SerialMon.print("Connecting to APN: "); SerialMon.print(apn); if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { SerialMon.println(" fail"); } else { SerialMon.println(" OK"); SerialMon.print("Connecting to "); SerialMon.print(server); if (!client.connect(server, port)) { SerialMon.println(" fail"); } else { SerialMon.println(" OK"); // Making an HTTP POST request SerialMon.println("Performing HTTP POST request..."); // Prepare your HTTP POST request data (Temperature in Celsius degrees) String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(bme.readTemperature()) + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + ""; // Prepare your HTTP POST request data (Temperature in Fahrenheit degrees) //String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(1.8 * bme.readTemperature() + 32) // + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + ""; // You can comment the httpRequestData variable above // then, use the httpRequestData variable below (for testing purposes without the BME280 sensor) //String httpRequestData = "api_key=tPmAT5Ab3j7F9&value1=24.75&value2=49.54&value3=1005.14"; client.print(String("POST ") + resource + " HTTP/1.1\r\n"); client.print(String("Host: ") + server + "\r\n"); client.println("Connection: close"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(httpRequestData.length()); client.println(); client.println(httpRequestData); unsigned long timeout = millis(); while (client.connected() && millis() - timeout < 10000L) { // Print available data (HTTP response from server) while (client.available()) { char c = client.read(); SerialMon.print(c); timeout = millis(); } } SerialMon.println(); // Close client and disconnect client.stop(); SerialMon.println(F("Server disconnected")); modem.gprsDisconnect(); SerialMon.println(F("GPRS disconnected")); } } // Put ESP32 into deep sleep mode (with timer wake up) esp_deep_sleep_start(); }
das ich von dieser Webseite
https://randomnerdtutorials.com/esp32-sim800l-publish-data-to-cloud/
habe. Dort wird eigentlich alles erklärt (ist nicht ganz so wichtig).
Jetzt möchte ich die Daten eben von der Webseite auch in ioBroker haben bzw. ioBroker soll die Daten von dort abholen und dann als Datenpunkt für die weitere Verarbeitung darstellen.
Ist das so verständlich erklärt?
Grüße
Manfred -
-
@beowolf
Wenn ich dich richtig verstehe willst du die Daten aus der Webseite im iobroker?
Klingt nach Parser und dann Webseite auslesen.
Oder du kannst dein Ardunio Programm so umbauen, dass es zusätzlich über die simple API direkt in den iobroker schreibt. -
@bommel_030 sagte in Temperaturwert per GSM an Webseite senden?:
@beowolf
Wenn ich dich richtig verstehe willst du die Daten aus der Webseite im iobroker?
Klingt nach Parser und dann Webseite auslesen.
Oder du kannst dein Ardunio Programm so umbauen, dass es zusätzlich über die simple API direkt in den iobroker schreibt.Direkt nach ioBroker wäre natürlich der beste Weg.
Aber
Man kann das bestimmt - Ich leider nicht. Ich will ja auch nicht die ioBroker Datenbank zerschießen.
Ach ja. Auf der Empfänger Webseite ist dieses Skript.
<?php /* Rui Santos Complete project details at https://RandomNerdTutorials.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ $servername = "localhost"; // REPLACE with your Database name $dbname = "REPLACE_WITH_YOUR_DATABASE_NAME"; // REPLACE with Database user $username = "REPLACE_WITH_YOUR_USERNAME"; // REPLACE with Database user password $password = "REPLACE_WITH_YOUR_PASSWORD"; // Keep this API Key value to be compatible with the ESP32 code provided in the project page. If you change this value, the ESP32 sketch needs to match $api_key_value = "tPmAT5Ab3j7F9"; $api_key = $value1 = $value2 = $value3 = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $api_key = test_input($_POST["api_key"]); if($api_key == $api_key_value) { $value1 = test_input($_POST["value1"]); $value2 = test_input($_POST["value2"]); $value3 = test_input($_POST["value3"]); // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO Sensor (value1, value2, value3) VALUES ('" . $value1 . "', '" . $value2 . "', '" . $value3 . "')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); } else { echo "Wrong API Key provided."; } } else { echo "No data posted with HTTP POST."; } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; }
-
@beowolf
Bin wahrlich kein IT-Fachmann, aber die simple API ist tatsächlich so simpel wie sie klingt...
Einzige "Hürde" ob bzw. wie dein iobroker von außen erreichbar ist. Hab es bei mir mit nem Reverse Proxy gelöst, klappt problemlos. -
Das mit dem "von außen erreichbar" möchte ich eigentlich nicht. Sicherer wäre es, wenn ioBroker es sich holt.
Reverse Proxy? Muß ich mir anschauen.
-
@beowolf
Wenn du deinen iobroker "nur" lokal nutzt dann schau dir den Parser Adapter an, damit Holst sich der iobroker die Daten ohne das irgendwas von außen geöffnet ist. Auf jeden Fall kein Portforwading, das ist böse -
Den Parser Adapter hatte ich mir schon angeschaut. Das ist im Moment noch ein Ding mit sieben Siegeln.
-
@beowolf hi, hast du hier schon eine Lösung gefunden? Stehe vor der selben Frage, wie ich remote an mein iobroker Daten senden kann.
-
Hallo,
ich habe das Projekt nicht weiter verfolgt, da sich die Notwendigkeit erledigt hatte. Ich kann dir da leider nicht weiter helfen.
-
@watcherkb man kann per Python leicht einen eigenen "Webserver" aufsetzen der die aufgerufene URL dann weiter verarbeitet.
Ich hab das mal genutzt um Werte per Befehlsaufruf an Zabbix zu senden:https://znil.net/index.php?title=Zabbix_sender_per_Web_URL-Aufruf_nutzen
wie man sieht ist das mehr als einfach, man definiert die URL und die einzelnen Abschnitte zwischen den
/
stehen als Parameter zur Verfügung.
Darüber könntest du das dann intern per Simple API etc. an ioBroker weiterleiten (oder per mosquitto_pub an einen MQTT-Broker senden)Wie man daraus einen Dienst macht habe ich auch beschrieben
Das kann man auch noch mit einer Anmeldung absichern wenn man will. Nach außen bräuchtest du halt den Port weiter geleitet (den du im Skript auch aussuchen kannst). Absicherung über einen Reverse-Proxy ginge auch.
-
@bananajoe sagte in Temperaturwert per GSM an Webseite senden?:
Das kann man auch noch mit einer Anmeldung absichern wenn man will. Nach außen bräuchtest du halt den Port weiter geleitet (den du im Skript auch aussuchen kannst). Absicherung über einen Reverse-Proxy ginge auch.
Hi, danke dir. Ich hadere noch damit, einen Port nach außen aufzumachen. Ich möchte mir nicht unnötig eine Sicherheitslücke ins System holen. Mit reverse-proxy habe ich mich bisher nicht beschäftigt. Wie aufwändig ist es denn, das aufzusetzen?
-
@watcherkb wenn du das noch nicht gemacht hast ist es aufwendig, jupp.
Ich persönlich hätte keine Bauchschmerzen einen - ggf. separaten MQTT-Broker über einen nicht Standardport von außen erreichbar machen - natürlich mit Benutzername + Passwort, eventuell auch noch SSL.
Es gibt aber auch "freie" MQTT-Broker im Internet. Dur könntest auch dorthin publishen und dir gezielt die Werte per Client wiederholen. Musst halt damit leben das jeder andere auch die Werte lesen könnte, je nach Anbieter
-
@bananajoe hey, bin dir noch eine Rückmeldung schuldig
Ich habe das jetzt folgendermaßen gelöst und es läuft bisher ganz gut.
ESP32 GSM Modul mit kostenloser SIM-Datenkarte von Netzclub. Dieser sendet einen http request an meinen reverse-proxy. Reverse-proxy ist mit Zugangsdaten abgesichert und leitet den request an iobroker und dort an die rest-api Adapter weiter.