NEWS
MQTT Remote Commands für OwnTracks-Adapter
-
Hallo,
wenn ich zu Hause die Owntracks-App auf dem Smartphone laufen habe, braucht sie viel Energie. Schalte ich den Monitoring-Mode auf "Signifikante Änderungen", so braucht sie viel weniger. Aber wer denkt schon ständig daran den Mode anzupassen? Es gibt vielleicht einen Weg das zu automatisieren - mit MQTT Remote Commands. Ein Script auf dem ioBroker sendet, sobald das Phone zu Hause ist, ein Kommando zur Änderung des Monitoring-Mode - und wenn es sich entfernt, ändert es den Modus in "Move".
Das würde ich hin bekommen, nur, wie sendet man ein solches Kommando?
Unterwegs ist das Phone ständig über VPN mit dem ioBroker verbunden.
Kann mir jemand konkret ein Beispiel sagen?
Besten Dank -
So ich habe es rausbekommen.
Also Du kannst das remote steuern in dem Du folgenden JSON in cmd losschickst.
{ "_type": "cmd", "action": "setConfiguration", "configuration": { "_type": "configuration", "monitoring": 1 } }
Das Monitoring stellst Du wie folgt ein:
monitoring Location reporting mode (iOS,Android/integer)
-1 Quiet
0 Manual
1 Significant
2 MoveHabs gerade getestet - das tut.
Die Automatisierung ist dann ja easy. Da ich NodeRed nutze, wird Dir ein Flow hierzu nichts nutzen.
Funktioniert nun aber auf Anhieb:
-
@mickym Krass, Vielen Dank für die schnelle Hilfe! Darf ich Dich - ohne unverschämt zu werden - fragen, wie denn
ein Java Script aussehen könnte? Mit Blockly kann ich mich überhaupt nicht anfreunden.Nochmal Danke für die schnelle und freundliche Hilfe!
Gruß Jo -
@k-nebel Ich kann mich mit Blockly auch nicht anfreunden. Ein Javascript ist mir ehrlich gesagt zu aufwändig jetzt und gerade im Fehlerfall schwierig für mich zu behandeln.
Ich könnte Dir bei einem Node-Red Flow behilflich sein - das denke ich würde ich schnell hinbekommen, wenn Du halt hier mit unterstützt. Ich nutze das halt als meine präferierte Logikmaschine.
-
@mickym Also bin der Sache etwas näher gekommen....funkt aber noch nicht.
sendTo('owntracks/0/users/devicex/cmd', 'sendMessage2Client', { "_type": "cmd", "action": "setConfiguration", "configuration": { "_type": "configuration", "monitoring": 2 } });
Divicex steht natürlich für den tatsächlichen Namen. Das Script meldet keinen Fehler, es kommt aber nichts an.
-
@k-nebel wie gesagt ich bin auch kein Javascript Guru - aber vielleicht gibts ja noch andere Hürden. Wo läuft denn Dein mqtt Broker?
Wenn Du evtl. den mqtt Adapter als Broker laufen hast, dann kann der evtl. Probleme machen. Hast Du ein Interface im iobroker so dass Du es wie ich einfach eintragen kannst?
-
@k-nebel Musst Du bei dem sendto - um die geschweiften Klammern nicht noch Anführungszeichen machen - das ganze muss ja als String weg.
sendTo('owntracks/0/users/devicex/cmd', 'sendMessage2Client','{"_type": "cmd","action": "setConfiguration","configuration": {"_type": "configuration","monitoring": 2}}');
Wenn ich mir die Syntax zu sendto anschaue:
sendTo('telegram', {user: 'UserName', text: 'Test message'});
dann ist das ja viel komplexer. Wie gesagt, wenn Du es über NodeRed machst - dann kein Problem. Und wie im letzten Posting gesagt - trag halt einfach mal den Text direkt in Deinen Datenpunkt ein.
-
@mickym Hm, ich komme im Moment nicht weiter. Habe auf Github in einem Issue gelesen, dass es bei Android zur Zeit keine cmd-Actions gibt und auch nicht geplant sind. Keine guten Aussichten. Unter Objects gibt es auch keinen cmd Eintrag.
Schade... -
@k-nebel Ehrlich gesagt kann ich das nicht glauben - die Beschreibung zeigt, dass der Parameter auch auf Android geht.
monitoring Location reporting mode (iOS,Android/integer).Ich würde mal den String direkt in Deinen cmd Datenpunkt eintragen. Mit dem sendTo weiß ich nicht ob dass das richtige Kommando ist.
Wie gesagt unter NodeRed würde ich das ja mit Dir weiterverfolgen.
Als ersten Schritt musst Du aber den String direkt in einen Datenpunkt kopieren. Dabei ist es egal, ob Du das direkt über Deinen iobroker machst, oder einem eigenen mqtt Publisher.
Und ich hab Dir ja schon unten gesagt, wenn Du den MQTT-Adapter als Broker laufen hast, kannst Du auch Probleme haben. Schau mal im Log ob das was drin steht, ob irgendwelche Nachrichten nach mehreren Retries gelöscht werden. Solange Du die Voraussetzungen nicht prüfst, ist das halt ein Stochern im Nebel.
@k-nebel sagte in MQTT Remote Commands für OwnTracks-Adapter:
Unter Objects gibt es auch keinen cmd Eintrag.
Schade...Ist das der mqtt Adapter als Broker? Ggf. halt selbst einfach einen cmd Datenpunkt anlegen.
Und falls Du den owntracks Adapter nutzt - da würde ich halt lieber auf reines mqtt wechseln.Im Prinzip solltest Du gemäß Deiner Konfig folgende Datenpunkte unter Deinem Gerät finden:
Der cmd ist für die Befehle und der event Datenpunkt signalisiert Dir wenn Du eine bekannte Location verlässt oder eintrittst - also z. Bsp. Zuhause. Das kannst Du dann als Trigger verwenden, um wie von Dir gewünscht den Modus umzuschalten.
-
@mickym Also ich nutze den Owntracks-Adapter. Dort habe ich einen Datenpunkt cmd an richtiger Stelle erzeugt und auch versucht das JSON Object direkt einzugeben - ohne Ergebnis.
Nebenher läuft natürlich der mqtt-Adapter. Fehler oder Warnungen gab es nicht.
Danke für dein Angebot mit NodeRed. Das wäre aber auch Neuland und ich würde darauf zurückkommen, wenn ich es nicht anders hin bekomme.
Bin gerade dabei das Open-Source Project von Owntracks mit Android-Studio zu bearbeiten. Es wäre nicht das erste Mal, dass es mir gelingt, eine eigene Funktion direkt in der App zu implementieren.
Werde berichten.
Gruß Jo -
@k-nebel Tja, das erzeugen der App funktioniert und ich habe in der "MapActivity.java" eine Funktion "SetMonitoringNext" gefunden. Man könnte nun einen Timer programmieren, der meinetwegen alle 5 Minuten die WLAN Verbindung checkt und - falls mit der richtigen SSID Verbunden, diese Funktion anstößt.
Problem bei der Sache: Die App ist ansonsten Komplett, aber der Open-Source-Code bietet keine Google Map Keys.
Das heisst, es wird keine Karte angezeigt. So etwas anzulegen geht, ist aber eine Prozedur. Werde mal weiter sehen.
Nur zur Info halt. -
Neues Update: App läuft, zwar ohne Map, aber die ist mir erst mal egal.
Für diejenigen die es interessiert hier die Änderungen:
AndroidManifest.xml<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
BackgroundService.java
//Check Monitoring & SSID public Handler timerHandler = new Handler(); Runnable timerRunnable = new Runnable() { @Override public void run() { SharedPreferences prefs = getSharedPreferences("save_set", 0); SharedPreferences.Editor editor = prefs.edit(); boolean auto = prefs.getBoolean("Auto", false); editor.commit(); if(auto) { //Get SSID, if Connected WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); assert mWifiManager != null; WifiInfo info = mWifiManager.getConnectionInfo(); if (info.getSSID().contains("MySSID")) { if (preferences.getMonitoring() == LocationProcessor.MONITORING_MOVE) { preferences.setMonitoring(LocationProcessor.MONITORING_SIGNIFICANT); } } else{ preferences.setMonitoring(LocationProcessor.MONITORING_MOVE); } } //Toast.makeText(getApplicationContext(), info.getSSID(), Toast.LENGTH_SHORT).show(); timerHandler.postDelayed(timerRunnable, 60000); } };
Zudem in der Funktion OnCreate()
timerHandler.postDelayed(timerRunnable, 60000);
und in der Funktion OnDestroy()
timerHandler.removeCallbacks(timerRunnable);
Ob ich mit der Map weiterkomme werde ich berichten.
Gruß
Jo -
Finales Ergebnis:
Google Maps-Key besorgt und zusätzlichen Button zum Ein/Ausschalten meiner Funktion integriert.
Wer das selber umsetzen möchte, kann mich gerne kontaktieren.
Einziger Wermutstropfen wäre, wenn die App ein automatisches Update erhält. Dann wird die eigene Version
wahrscheinlich überschrieben.
Gruß
Jo