Neue Module 89_AndroidDBxx zur Steuerung von Android Devices

Begonnen von zap, 12 Mai 2021, 14:12:47

Vorheriges Thema - Nächstes Thema

zap


Es gibt nun einen Beitrag im FHEM WIKI zu diesen Modulen: https://wiki.fhem.de/wiki/AndroidDB

Die Module 89_AndroidDB und 89_AndroidDBHost erlauben die Steuerung von Android Devices über die Android Debug Bridge (ADB). Man kann Shell-Befehle auf Android Geräten ausführen, Android Geräte neu starten oder aber Tastendrücke an Android Geräte senden und so eine Fernbedienung simulieren. Getestet habe ich das mit

- Samsung Android Tablet
- SONY Android TV AF9
- Magenta TV Stick
- NVidia Shield


  • Beispiel Aufnahmetaste drücken: set myTVStick remoteControl RECORD
  • Beispiel neu starten: set myTVStick reboot
  • Beispiel installierte Apps anzeigen: set myTVStick shell pm list packages

Installation

Voraussetzungen für FHEM:

- Installation des Perl Moduls IPC::Open3
- Installation der Android Plattform Tools

Die Installation des Perl Moduls erledigt man wie gehabt mit CPAN. Die Android Plattform Tools werden unter Debian/Raspbian mit dem folgenden Befehl installiert:

apt-get install android-sdk-platform-tools

Für andere Plattformen (Windows, Linux x86, MacOS) findet man die Tools hier: https://developer.android.com/studio/releases/platform-tools

Bei der manuellen Installation der Tools von developer.android.com (MacOs und Linux) muss man darauf achten, dass der Nutzer, unter dem der FHEM Prozess läuft, den Befehl 'adb' ausführen darf. Dazu ggf. die Rechte auf read und execute für alle setzen:

chmod 755 adb

Definition eines I/O Device (das gibt es nur 1x je FHEM Instanz)

Nach der Installation aller notwendigen Komponenten definiert man zunächst ein I/O Device, das den ADB-Server repräsentiert:

define myADBServer AndroidDBHost

Wenn sich der ADB Befehl (der mit den Android Platform Tools installiert wurde) nicht im Pfad befindet, muss man den Pfad zum Befehl als Parameter angeben:

define myADBServer AndroidDBHost adb=/usr/local/platform-tools/adb

Defintion von Android Devices in FHEM

Voraussetzung: Auf jedem Android Device, das über AndroidDB gesteuert werden soll, muss der Entwicklermodus aktiviert und das USB Debugging eingeschaltet sein. Das Gerät muss nicht(!) gerootet sein.
Die Aktivierung des Entwicklermodus kann sich von Gerät zu Gerät etwas unterscheiden, ist aber meist ähnlich. Bei Android TV Geräten geht man so vor (einmalige Aktion je Gerät):

- Geräteeinstellungen > Info auswählen
- Ganz nach unten scrollen bis zu einer Angabe, die meistens "Build" oder "Version" heißt
- Auf diese Angabe wiederholt drücken. Android zeigt dann irgendwann "in X Schritten bist Du Entwickler" an. Dann noch X Mal drücken bis "Du bist jetzt Entwickler" angezeigt wird
- Nun unter Geräteeinstellungen > Entwickleroptionen das USB-Debugging einschalten (heißt zwar USB, die Verbindung erfolgt aber über das Netzwerk)

Nun kann man ein AndroidDB Gerät in FHEM definieren:

define myTV AndroidDB 192.168.1.100

Einziger Parameter ist die IP-Adresse des Android-Geräts (man sollte eine feste IP zuordnen). Beim ersten Zugriff auf das Gerät kann es sein, dass man auf dem Gerät einmal die Verbindung von FHEM zulassen muss. In dem Fall sollte man den Haken bei "Zugriff immer erlauben" setzen.

Nun kann man sein Android Gerät steuern. Eine der nützlichsten Funktionen dürfte das Senden von Tastendrücken sein. So kann man in FHEM eine Fernbedieung realisieren.

Beispiel: Home-Taste drücken

set myTV sendKey KEYCODE_HOME

Beispiel: Umschalten auf Programm 12

set myTV sendKey KEYCODE_0 KEYCODE_0 KEYCODE_1 KEYCODE_2
(die beiden führenden 0en könnte man weglassen, dann dauert das Umschalten aber länger, da das Gerät wartet, ob weitere Tasten kommen)

Eine Liste der Keycodes findet man hier: https://developer.android.com/reference/android/view/KeyEvent

Presets

Ich habe einige Presets hinterlegt (am Beispiel eines Magenta TV Sticks). Ein Preset kann mit dem Attribut 'preset' eingestellt werden. Alternativ kann man mit dem Attribut 'macro' eigene RemoteControl Befehle definieren. Ein solcher Befehl kann mehrere Tastendrücke senden.

Nach der Auswahl eines Presets kann man Befehle etwas abkürzen, z.B.:

set myTVStick remoteControl APPS
set myTVStick remoteControl EPG


Mit Macros:

attr myTV macros DasErste:KEYCODE_0,KEYCODE_0,KEYCODE_0,KEYCODE_1
set myTV remoteControl DasErste


In Arbeit:

- Laden eigener Presets aus Dateien
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

delMar

Geniale Idee dieses Modul.
Vor allem die Makros find ich spitze

Danke
Maintainer von: ZoneMinder, TA_CMI_JSON, ONKYO_AVR, DENON_AVR, CanOverEthernet, IPCAM.

Vielgenutzte Module sind die größte Motivation für Entwickler.
Bitte zumindest 'attr global sendStatistics onUpdate' setzen.
Denn: ohne 'sendStatistics' keine Zahlen.

zap

Es gibt noch 1-2 Bugs. Im Moment noch eher zum Testen. Aber och werde in den nächsten Tagen hin und wieder ein Update hochladen.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

steffen83

Hallo,

ich klinge mich hier mal rein, da ich auch schon ein Problem habe:

Nach
"define myADBServer AndroidDBHost adb=/usr/local/platform-tools/adb"

habe ich diese Fehlermeldung
ADB command not found or is not executable in

Er zieht sich auch nicht selbst den Pfad....

Gruß
Steffen
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

gamauf

Da würde ich auf ein Rechte Problem tippen:
Hat der Linux User unter dem FHEM läuft ("fhem"?) das Recht (xr) abd auszuführen?

steffen83

Das könnte natürlich sein. Wie muss der Befehl denn genau dazu lauten? Das stand natürlich oben nicht in der Besschreibung :-)
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

zap

Weißt Du denn, wo die Plattform-Tools installiert sind? Diesen Pfad musst Du natürlich angeben. Die Angabe in der Doku/Beschreibung ist nur ein Beispiel.

Wenn der adb Befehl in einem Verzeichnis /mytools/adb liegt, kannst Du die notwendigen Rechte so ändern:

chmod 755 /mytools/adb

im define heißt der Parameter adb=/mytools/adb
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

zap

Ich habe eine neue Version der beiden Module eingecheckt. Morgen per FHEM Update verfügbar.

Behobene Fehler:

  • Es gab einen Konflikt, wenn mehrere Android-Geräte angesteuert wurden
  • Kleinere Fehler in der Darstellung

Neue Funktionen:

  • Der Verbindungsstatus der AndroidDB Devices wird nun regelmäßig geprüft und in STATE aktualisiert
  • Neuer Befehl "get devices" im I/O Modul AndroidDBHost listet die verbundenen Geräte inklusive Link auf FHEM Device auf
  • Das Attribut "preset" beim Modul AndroidDB erlaubt nun die Angabe einer Datei, aus der Macros gelesen werden können. Zum Aufbau dieser Datei siehe Commandref. Achtung: Dieses Feature ist noch nicht getestet
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

zap

Ein Fehler in 89_AndroidDBHost wurde behoben, der das Laden des Moduls verhinderte. Update steht morgen per FHEM Update zur Verfügung.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

steffen83

Hallo, es ist schon eine weile her, geht dieses Projekte noch weiter?
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

TWART016

Hallo zap,

sehr cooles Modul. Ich habe es die letzten Tage ein wenig getestet.

1) Wie kann ich ein eigenes preset erstellen? Ich habe eine Nokia Streaming Box 8000. Mit den Macros kann ich zwar senden, wenn kein preset attr gesetzt ist taucht unter set kein remoteControl und somit nicht die Makros auf.

2) Kann ich auch Shell Befehle in Makros hinterlegen?

3) Ich möchte gerne Apps über shell Befehle senden. Ist dies in Makros auch möglich?

4) Ich würde gerne prüfen ob eine App läuft. Mit dem Befehl adb shell pidof de.bluegaspode.squeezeplayer
bekomme ich eine ID zurück, falls das Package laufen sollte. Diesen Wert (läuft/nicht) hätte ich gerne als Reading


zap

Ich werde bald wieder etwas Zeit in dieses Modul investieren.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

zap

Zitat von: TWART016 am 11 Dezember 2021, 04:54:50
Hallo zap,

sehr cooles Modul. Ich habe es die letzten Tage ein wenig getestet.

1) Wie kann ich ein eigenes preset erstellen? Ich habe eine Nokia Streaming Box 8000. Mit den Macros kann ich zwar senden, wenn kein preset attr gesetzt ist taucht unter set kein remoteControl und somit nicht die Makros auf.

Siehe commandref zum Attribut "preset".

Zitat
2) Kann ich auch Shell Befehle in Makros hinterlegen?

Nein. Aber man kann sich solche Makros einfach per FHEM Attribut "eventMap" zusammenbauen. Siehe auch commandref zu "eventMap". So kann man sich z.B einen Alias für einen "set xy shell" Befehl zusammenbauen, der dann unter "set" auftaucht (FHEM Basics, also kein AndroidDB Thema).

Zitat
3) Ich möchte gerne Apps über shell Befehle senden. Ist dies in Makros auch möglich?

Was meinst Du mit "Apps senden"? Installieren?
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

zap

Zitat von: steffen83 am 18 November 2021, 10:45:15
Hallo, es ist schon eine weile her, geht dieses Projekte noch weiter?

Welches Feature fehlt denn bzw. welches hättest Du gerne?
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

TWART016

Zitat von: zap am 23 Januar 2022, 12:43:45
Siehe commandref zum Attribut "preset".
In der Commandref seht
preset {<PresetName>|@<PresetFileName>}
Wenn ich das Attribut auswähle kann ich nur die 2 vorhandenen Presets auswählen. Wie kann ich ein eigenes erstellen und wo liegen die Vorlagen?

Zitat von: zap am 23 Januar 2022, 12:43:45
Nein. Aber man kann sich solche Makros einfach per FHEM Attribut "eventMap" zusammenbauen. Siehe auch commandref zu "eventMap". So kann man sich z.B einen Alias für einen "set xy shell" Befehl zusammenbauen, der dann unter "set" auftaucht (FHEM Basics, also kein AndroidDB Thema).

Im Prinzip müsste ich mit dem EventMap ein anderes set von dem Gerät ausführen. Ich habe dazu nichts gefunden.
eventmap reagiert doch auf das Event. Wenn ich set remoteControl mache, taucht davon nichts im Event Monitor auf

Zitat von: zap am 23 Januar 2022, 12:43:45

Was meinst Du mit "Apps senden"? Installieren?
Apps haben von Aktivitäten, welche gestartet werden können

#Alle Aktivitäten eines Packages anzeigen
adb shell dumpsys package | grep com.ultrastreams.velocity | grep Activity

#Aktivität starten
adb shell am start -n com.ultrastreams.velocity/com.ultrastreams.ultrastreamsiptvbox.view.activity.SplashActivity

#Aktuelle Aktivität anzeigen
adb shell "dumpsys activity activities | grep ResumedActivity"



4. Sind readings geplant?
z.B. Läutstärke vom Gerät abfragen oder prüfen ob ein Prozess läuft?
adb shell pidof de.bluegaspode.squeezeplayer
über adb shell bekommt man einen Output des Ergebnisses, dieses könnte man in ein Reading schreiben.


Sobald ich das Android Gerät neu starte, ist das FHEM Device Disconnected. Probiert das Modul automatisch ein adb connect nach einem Interval zu machen?
Ist event-on-change reading geplant? Das state reading sendet jede Minute ein 2022-01-29 15:27:35 AndroidDBHost myADBServer running
2022-01-29 15:27:35 AndroidDB AndroidDB connected