Home-Automation-App

  • 44 Antworten
  • Letztes Antwortdatum
BulliM

BulliM

Neues Mitglied
2
Hallo liebe Android-Hilfe-Community!

Ich bin Webprogrammierer, möchte aber jetzt eine App für die Heim-Automation schreiben. Verfügbare Apps (ESPHome / Hassio) sind mir zu sperrig und ich möchte das App-Programmieren eh erlernen, also soll es eine native und spezielle Lösung für mein Android 8 Handy werden. Da der Aufbau der Heimautomation ohnehin gerade erst beginnt, bietet sich das an. Noch habe ich keine Sensoren im Haus verbaut, sie sind aber bestellt.

Für den Anfang möchte ich mit der App gern die im lokalen Netzwerk verbauten Raspberry Pi überwachen. Also Temperaturen überwachen und ob z. B. der Webserver läuft, eine Anwendung besonders hohe Last verursacht etc. Die Daten werden von den Geräten selbst gesammelt und können z. B. über ein Webinterface ausgelesen werden. Gern würde ich bei ungewöhnlichen Werten eine Push-Benachrichtigung erhalten. Also müsste die App diese Werte regelmäßig abrufen, auswerten und dann entsprechend reagieren.

Ich verwende Android Studio, das läuft bereits auf meinem Entwicklungs-PC. Allerdings sind Java bzw. Kotlin neu für mich. Da würde ich lieber Java verwenden, weil ich ggf. später auch Apps nach HarmonyOS transskipten möchte und Java auch sonst mehr Möglichkeiten bietet. Ist das eine gute Idee oder eher nicht?

Ein paar Java-Code-Beispiele habe ich ausprobiert, bekomme damit aber nicht einmal eine Datenzeile von einem PHP-Skript in einem Textfeld der App angezeigt. Probleme bereiten mir besonders Beispiele, die zu komplex sind. Die Java-Syntax verwirrt mich, weil ich die noch nicht verstehen kann.

Folgende Probleme sind für mich zu lösen:
1. Wie rufe ich über die App z. B. alle 5 Minuten Daten von einem Webserver im lokalen Netzwerk, mit der IP 192.168.5.5 ab? Ich könnte das auch über eine Domain machen, würde aber aus Sicherheitsgründen lieber im lokalen Netzwerk bleiben.
2. Wie werte ich die vom Server übergebenen Daten aus?
3. Wie löse ich bei Erreichen bestimmter Werte einen Alarm (Push-Nachricht) aus?

Für viele von euch dürften diese Aufgaben bloß eine Fingerübung sein. Für mich aber ist das eine echte Herausforderung. Ich programmiere seit ich denken kann, aber ich weiß derzeit nicht einmal genau, wie so eine App strukturiert ist. Ich hoffe, ihr könnt mir dabei helfen zu lernen.

Kann jemand ein einfaches, aktuelles und nützliches Beispiel für den ersten Arbeitsschritt verlinken oder mir einen Tipp geben, würde ich mich sehr darüber freuen. :)
 
Die App wird fehlerfrei kompiliert, ruft die (geänderte) URL leider nicht auf, das konnte ich den Serverlogs entnehmen. Natürlich habe ich in der AndroidManifest.xml den Zugriff über das Internet per...
Code:
<uses-permission android:name="android.permission.INTERNET"/>
...erlaubt. Habe ich da irgendwas vergessen oder einen Fehler eingebaut?

AndroidManifest.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testapp">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java.
Code:
package com.example.testapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String quotesString = null;
        HttpURLConnection httpURLConnection = null;
        try {
            URL url = new URL("https://domain.tlv/content.json");
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setConnectTimeout(9000);
            httpURLConnection.setReadTimeout(9000);

            InputStream stream = new BufferedInputStream(httpURLConnection.getInputStream());
            quotesString = convertStreamToString(stream);

        } catch (MalformedURLException e) {
            System.out.println("Error 1 " + e.getMessage());
        } catch (IOException e) {
            System.out.println("Error 2 " + e.getMessage());
        } catch (Exception e) {
            System.out.println("Error 3 " + e.getMessage());
        } finally {
            if (httpURLConnection != null) {
                httpURLConnection.disconnect();
            }
        }

        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText("Data: " + quotesString);

    }

    private static String convertStreamToString(InputStream is) {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
        StringBuilder stringBuilder = new StringBuilder();

        String line;
        try {
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line).append('\n');
            }
        } catch (IOException e) {
            System.out.println("Error " + e.getMessage());
            return "Error 4";
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                //e.printStackTrace();
                System.out.println("Error " + e.getMessage());
                return "Error 5";
            }
        }

        return stringBuilder.toString();
    }
}
 
Zuletzt bearbeitet:
Hallo und Willkommen im Forum.

Der Hauptgrund ist das der Code nicht geht, ist das du eine UrlConnction im UI oder auch Mainthread machen willst.
Das geht schon seit geraumer Zeit nicht mehr das letzte mal ging das noch unter Android 2.3 .


Netzwerk zugriffe immer in einen eigenen Thread was du da jetzt nimmst Thread, Runnable , AsyncTask ist dir überlassen aber nicht im UI.

Eigentlich hättest du auch eine Fehlermeldung im Log finden müssen die dir das sagt.


Connect to the network | Android Developers
Introduce network operations on a separate thread
To avoid creating an unresponsive UI, don't perform network operations on the UI thread. By default, Android 3.0 (API level 11) and higher requires you to perform network operations on a thread other than the main UI thread; if you don't, a NetworkOnMainThreadException is thrown.


The following Activity snippet uses a headless Fragment to encapsulate asynchronous network operations. Later, you will see how the Fragment implementation, NetworkFragment, accomplishes this. Your Activity should also implement the DownloadCallback interface, allowing the fragment to call back to the Activity in case it needs connectivity status or needs to send an update back to the UI.
 
Zuletzt bearbeitet:
Okay, das ist ein Hinweis, mit dem ich was anfangen kann. Danke! Eine Fehlermeldung habe ich in Android Studio nicht gesehen. Aber auch das ist neu für mich.
 
Fehlermeldung wird es schon geben ein Absturz nicht da du es mit try and catch abfängst. Du kommst aufjedenfall mit diesen Code in den catch block.
Beiträge automatisch zusammengeführt:

Ich würde wohl zu einer Lib greifen.

Volley oder auch Okhttp dann hast du es in einen Thread und die Antwort response kommt in einem listener im ui an.
 
Zuletzt bearbeitet:
Das ist alles neu für mich. Die Libraries kenne ich noch nicht. Die Bezeichnung "Volley" ist mir beim Einlesen aber schon übern Weg gelaufen. Sehe ich mir genauer an, danke.
 
Eigentlich läßt du dir deinem Fehler auch mit println ausgeben.
Macht man bei Android zwar mit einem Log und nicht mit println. Sollte aber doch in der logcat ankommen.
 
Zuletzt bearbeitet:
Ich bekomme es leider nicht hin. Ich habe tagelang das ganze Netz durchsucht und kein Beispiel für einen AsyncTask gefunden, der mit meiner Konfiguration läuft. Teilweise fehlen Dateien (MainActivity) bei den Beispielen in denen nötige Variablen definiert werden, teilweise werden ältere Befehle verwendet. Jedenfalls laufen die nicht auf meinem virtuellen Device mit Android 8.

Ich bin jetzt gerade echt genervt von Java. Ich will nicht auch noch Volley verwenden. Das ändert auch nichts daran, dass auch diese Beispiele (habe mehrere ausprobiert) für mein Setup veraltet sind. Da werden Bibliotheken nicht importiert, die verwendet werden. Volley lässt sich nicht mal über die gradle.build kompilieren.

Kann mir anhand meines recht einfachen Beispieles oben nicht jemand helfen, wie ich den Aufruf der URL einfach in eine eigene Klasse auslagern kann, ohne Volley zu verwenden oder es noch komplizierter zu machen?
 
Zuletzt bearbeitet:
Volley ist bis jetzt unter jeder Plattform gelaufen und ist auch einfach zu Handeln.

Hast du auch die lib richtig im gradle File hinzugefügt

dependencies{
//...
implementation 'com.android.volley:volley:1.1.0'
}
ohne wird das auch nicht gehen.


https://www.google.com/url?sa=t&sou...FjAEegQIAxAB&usg=AOvVaw2p3uaAhYTzHUwKGe-pAMAQ

Android - Volley | android Tutorial

Wenn du es unbedingt mit einem Asynctask machen willst dann zeige uns doch mal wie du das versucht hast.
Also die ganze Klasse und auch wie du den Task in der Activity startest. Sind von Interesse um dir helfen zu können.
 
Zuletzt bearbeitet:
Im Netz habe ich zweimal für dependencies { compile 'com.....1.0.0 } gefunden. 🤓 Die Tuts waren kein Jahr alt.

Scheint nun, als habe ich das Auslagern in eine eigene Klasse auch ohne Hilfe hinbekommen. Allerdings wird die URL mit dem Beispiel unten noch immer nicht aufgerufen. Ich bekomme zwar keine Fehler angezeigt, aber es findet nach wie vor aber auch kein Zugriff auf den Server statt.

Code:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        JSONParser jParser = new JSONParser();
        String json = jParser.getJSONFromUrl();

        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText("Daten: " + json);
    }

Die Variable json wird mir auch als "null" angezeigt. Ich werde das jetzt mal durch ein Button-Event auslösen oder als AsyncTask laufen lassen. Vermutlich ändert das etwas.
 
Zuletzt bearbeitet:
Meines Wissens arbeitet jsoup auch auf dem UI und nicht in einem Task, Thread.
Kann also auch nicht gehen habe ich auch schon mal gesagt. Gleiche Probleme wie am Anfang.
 
Zuletzt bearbeitet:
So hier dein erster Code in einen Thread .
sollte laufen habe ich nicht getestet.
Code:
public class MainActivity extends AppCompatActivity {
    String quotesString = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Thread thread = new Thread() {
            @Override
            public void run() {
                HttpURLConnection httpURLConnection = null;
                try {
                    URL url = new URL("https://domain.tlv/content.json");
                    httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setRequestMethod("GET");
                    httpURLConnection.setConnectTimeout(9000);
                    httpURLConnection.setReadTimeout(9000);

                    InputStream stream = new BufferedInputStream(httpURLConnection.getInputStream());
                    quotesString = convertStreamToString(stream);

                } catch (MalformedURLException e) {
                    System.out.println("Error 1 " + e.getMessage());
                } catch (IOException e) {
                    System.out.println("Error 2 " + e.getMessage());
                } catch (Exception e) {
                    System.out.println("Error 3 " + e.getMessage());
                } finally {
                    if (httpURLConnection != null) {
                        httpURLConnection.disconnect();
                    }
                }
            }
        };
        thread.start();

        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText("Data: " + quotesString);

    }

    private static String convertStreamToString(InputStream is) {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
        StringBuilder stringBuilder = new StringBuilder();

        String line;
        try {
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line).append('\n');
            }
        } catch (IOException e) {
            System.out.println("Error " + e.getMessage());
            return "Error 4";
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                //e.printStackTrace();
                System.out.println("Error " + e.getMessage());
                return "Error 5";
            }
        }

        return stringBuilder.toString();
    }


}
Beiträge automatisch zusammengeführt:

. compile 'com.....1.0.0"

Zur Info compile Im gradle ist älter als ein Jahr. Aber auch mit compile statt implementation solte drotzden noch gehn.
Ich habe dir die richtige Zeile genannt.[/QUOTE]
Beiträge automatisch zusammengeführt:

Im Netz habe ich zweimal für dependencies { compile 'com.....1.0.0 } gefunden. 🤓 Die Tuts waren kein Jahr alt.

Zur Info compile Im gradle ist älter als ein Jahr. Aber auch mit compile statt implementation solte drotzden noch gehn.
Ich habe dir die richtige Zeile genannt.

Bemerken möchte ich noch das wir bei der Volley Version 1.1.0 sind. Soviel zu einem Jahr alt. Ist auch in meinem Post so. Und in der IDE sollte es gelb sein und dich daraufhin weisen das es eine neue Version gibt.

So nun gutes gelingen.
 
Zuletzt bearbeitet:
Ach, so meintest du das mit dem Thread. 😁

Wie dem auch sei, ich habe deinen Code ausprobiert. Der funktioniert leider auch nicht. Auch mit einer fremden Domain nicht. Ich bekomme da nichts geliefert. Ist da womöglich irgendwo anders ein Fehler im Code?
 
Es funktioniert endlich. 🙂 Ich musste die Ausgabe nur in den Thread verlegen. Dann wäre meine nächste Frage, wie ich die Daten nun an eine andere Klasse übergeben kann, um die Daten verarbeiten zu können.

Code:
 public void run() {
                HttpURLConnection httpURLConnection = null;
                try {
                    URL url = new URL("https://domain.tlv/test.json");
                    httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setRequestMethod("GET");
                    httpURLConnection.setConnectTimeout(9000);
                    httpURLConnection.setReadTimeout(9000);

                    InputStream stream = new BufferedInputStream(httpURLConnection.getInputStream());
                    quotesString = convertStreamToString(stream);

                } catch (MalformedURLException e) {
                    System.out.println("Error 1 " + e.getMessage());
                } catch (IOException e) {
                    System.out.println("Error 2 " + e.getMessage());
                } catch (Exception e) {
                    System.out.println("Error 3 " + e.getMessage());
                } finally {
                    if (httpURLConnection != null) {
                        httpURLConnection.disconnect();
                    }
                }
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText("JSON: " + quotesString);
            }

Wahrscheinlich so?

Code:
String json = new JSONclass(quotesString);
Müsste aber auch möglich sein, dass ich erstmal an die Variable quotesString an außerhalb des Threads übergebe. Da habe ich aber keinen Plan. Alle Returnversuche erzeugen Fehler.
 
Zuletzt bearbeitet:
Hallo die Bildschirm Ausgabe in den Thread wird nicht gehen Bildschirmausgaben musst du im UI machen.

da müsstest du im Thread runOnUiThread benuten als Runnable .

How do we use runOnUiThread in Android?.

Deshalb habe ich dir Volley empfohlen denn da kommt die Response wider im UI an.
In einem Listener also Eventbasisierend
.

das es keine Anzeige gab liegt daran das die Zeile mit der Ausgabe schon abgearbeitet wurde bevor die Daten geladen wurden. Sind ja zwei Parlell laufende Threads.

Daten an andere Klasse übergeben. Code auslagern oder an eine andere Activity?
Beiträge automatisch zusammengeführt:

Code:
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://domain.tlv/content.json";

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
     
       TextView textView = (TextView) findViewById(R.id.textView);
       textView.setText("Data: " + response);
     
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
       
    }
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
 
Zuletzt bearbeitet:
Also wie gesagt würde ich gern auf Volley verzichten. Geht es denn nicht anders?

Ich habe jetzt zumindest eine Ausgabe meiner Daten. Folgender Code läuft, allerdings noch mit Fehlern. Die App stürzt beim zweiten Kompilieren ab.

Code:
E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: com.e.testapp, PID: 15902
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.


Das dürfte eben daran liegen, dass ich die abgerufenen Daten innerhalb der MainActivity-Klasse verarbeiten möchte. Da nervt Java ganz schön, weil ich einfach nicht verstehe, was und warum ich das ändern muss.

Immerhin bekomme ich die Daten jetzt angezeigt. Folgend der momentane Code und die Ausgabe dazu. Natürlich möchte ich die vie Arrays anders darstellen lassen. Habe dafür aber bisher keine Lösung gefunden. Auch soll der Thread wie im EP erwähnt regelmäßig im Hintergrund ausgeführt werden und bei überschreiten gewisser Werte eine Push-Nachricht ausgelöst werden. Ich habe also noch ein bisschen was zu tun. Erstmal muss die Fehlermeldung beim zweiten Kompilieren weg. Gäbe es dafür eine Lösung ohne Volley und Gson?

JSON:
{
  "data": [
    {
      "server": "SRV1",
      "value": "CPU Temp",
      "content": "37.49"
    },
    {
      "server": "SRV2",
      "value": "CPU Temp",
      "content": "35.62"
    },
    {
      "server": "SRV3",
      "value": "CPU Temp",
      "content": "38.61"
    },
    {
      "server": "SRV4",
      "value": "CPU Temp",
      "content": "40.36"
    }
  ]
}

Code:
try {
                    JSONObject obj = new JSONObject(quotesString);
                    JSONArray jarray = obj.getJSONArray("data");


                    ArrayList datalist = new ArrayList();
                    for(int i=0;i<jarray.length();i++){
                        HashMap<String,String> list = new HashMap<>();
                        JSONObject jobj = jarray.getJSONObject(i);
                        list.put("server",jobj.getString("server"));
                        list.put("value",jobj.getString("value"));
                        list.put("content",jobj.getString("content"));
                        datalist.add(list);
                    }

                    ArrayAdapter adapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_list_item_1, android.R.id.text1, datalist);

                    listView.setAdapter(adapter);
                  
                    System.out.println(obj);
} catch (JSONException e) {
                    System.out.println("Error 6 " + e.getMessage());
}

So sieht das auf dem virtuellen Device (Screenshot) aus:

list.png
 
Zuletzt bearbeitet:
Den Fehler den du bekommst ligt daran das du aus dem Thread eine Ausgabe auf den Bildschirm machen willst. Das geht nicht. Sagte ich dir bereits. Aber du willst ja nicht hören.
Hatte dir auch einen Link gegen wie sowas geht.
Bildschirm ausgaben immer im UI dort bist du aber nicht deshalb der Fehler.

Es wird langsam Zeit die Grundlagen von Java und Multithreading zu lernen.

Klar kannst du auch alles selber machen und Gson nicht benutzen. Aber warum willst du das Rad neu erfinden. Dann schreibe dafür einige A4 Seiten. Du wirst dabei schnell am deine Grenzen kommen und Gson benutzen.

Die App stürzt beim zweiten Kompilieren ab.
Was soll eigentlich die Aussage beim zweiten Kompilieren?
Das gibt es nicht das Programm wird einmal übersetzt und dann läuft es oder nicht.
Zur Laufzeit findet kein Komplilieren statt.

Ich denke du meist beim zweiten Start. Oder ein zweiter Durchlauf.

Netzwerkzugriff in einem Thread. Daten auf dem Bildschirm ausgeben im UI..

Übringens wenn du aus dem Thread eine deiner Methoden aufrufts wird auch diese in dem Thread ausgeführt. Das scheint dir noch nicht klar zu sein. Auch wenn deine Methode nach deiner Meinung nicht in den Thread ist. Die wird aber von dort aus aufgerufen.


Entweder benutzt du den Volley Code, hast du von mir.
Oder du machst einen Asynctask. Ob innerre oder separate Klasse ist dir überlassen.
Aber da sehe ich schon wider deine OOP Kenntnisse im Weg stehen.
Beiträge automatisch zusammengeführt:

Wenn du Volley nicht magst wie ist es mit OkHttp?

Sind alles Aysncon laufende Libs wo das ergebnis wider im UI ankommt und duauch geich eine Ausgabe machen kannst.


Threading Parallelisirung Datensynconisiren gibt es auch in anderen Sprache. Nicht nur in Java.
Als Webentwicker bist du damit wohl noch nicht in Berührung gekommen.

Die GUI in Android ist ein SingelTask innerhalb der App.

Das ist auf anderen Plattformen auch anders. Hat aber nichts mit der verwendeten Sprache zu. Sondern mit dem BS.



Weiterhin gutes gelingen.
 
Zuletzt bearbeitet:
@BulliM

Ein kleine Anmerkung zu Thema.

a) Ich würde eher einen iobroker Deamon auf dem Rasp (besser NUC) aufsetzen um Datenpunkte zu sammeln.
b) Http-Polling ist eher Old School und Resourcen fressend- hier solltest du besser ein MQTT-Subscription verwenden.

Damit bist du auch später heraus eher flexibel , wenn es um Pushs , resp. zeitnahe Zustände geht.


So habe ich es zumindest komplett in verschiedenen nativen Apps umgesetzt .
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: jogimuc
Mqtt macht Sinn nur da befürchte ich das er da auch keine Lib dafür benutzen will.
Auch WebSockets könnte eine Alternative für push Nachrichten sein.
 
Zuletzt bearbeitet:
swa00 schrieb:
@BulliM

Ein kleine Anmerkung zu Thema.

a) Ich würde eher einen iobroker Deamon auf dem Rasp (besser NUC) aufsetzen um Datenpunkte zu sammeln.
b) Http-Polling ist eher Old School und Resourcen fressend- hier solltest du besser ein MQTT-Subscription verwenden.

Damit bist du auch später heraus eher flexibel , wenn es um Pushs , resp. zeitnahe Zustände geht.


So habe ich es zumindest komplett in verschiedenen nativen Apps umgesetzt .
Das klingt interessant. Ich könnte auf einem RPi als Broker mosquitto installieren und die anfallenden Daten dort verarbeiten und ihn entsprechend reagieren lassen. Dann würde die App als Client nur noch auf dessen Aktion reagieren. Wäre jetzt nicht groß anders als eh schon geplant, aber mit dem Vorteil, dass das Polling entfallen würde.

Momentan habe ich mein Alarmsystem über Telegram und dessen Protokol gelöst. Das funktioniert ähnlich. Aber davon möchte ich weg, weil das nicht optimal ist.

Wie gesagt fange ich eben mit Java an. Darum will ich es möglichst einfach halten und die bereits vorhandene Infrastruktur nutzen. jogimuc hat insoweit auch Recht, dass mir Grundlagen von Java und Multithreading fehlen. Ich habe die Art noch nicht begriffen, wie Java arbeitet. Das scheint anynchron zu arbeiten. Da werde ich noch viel lernen müssen. Früher oder später werde ich sicherlich nochmal über MQTT stolpern. Momentan fühle ich mich bereits überfordert.
 

Ähnliche Themen

GOPRAMEDIA
Antworten
1
Aufrufe
1.062
jogimuc
J
kosmus
Antworten
24
Aufrufe
17.510
jep
J
Zurück
Oben Unten